@ensnode/ensnode-react 1.3.0 → 1.4.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.
package/dist/index.cjs CHANGED
@@ -266,16 +266,25 @@ function useRegistrarActions(parameters = {}) {
266
266
  // src/hooks/useResolvedIdentity.ts
267
267
  var import_ensnode_sdk2 = require("@ensnode/ensnode-sdk");
268
268
  function useResolvedIdentity(parameters) {
269
- const { identity, namespaceId, accelerate, ...args } = parameters;
269
+ const { identity, accelerate, query: _query = {} } = parameters;
270
+ const { data } = useENSNodeConfig();
271
+ const namespace = data?.ensIndexerPublicConfig.namespace;
270
272
  const {
271
273
  data: primaryNameData,
272
274
  status,
273
275
  ...query
274
276
  } = usePrimaryName({
275
277
  address: identity.address,
276
- chainId: (0, import_ensnode_sdk2.getResolvePrimaryNameChainIdParam)(identity.chainId, namespaceId),
278
+ chainId: (0, import_ensnode_sdk2.getResolvePrimaryNameChainIdParam)(
279
+ identity.chainId,
280
+ // NOTE: defaulting here for typechecking, but enabled prevents fetching before namespace is known
281
+ namespace ?? import_ensnode_sdk2.ENSNamespaceIds.Mainnet
282
+ ),
277
283
  accelerate,
278
- ...args
284
+ query: {
285
+ ..._query,
286
+ enabled: (_query.enabled ?? true) && namespace !== void 0
287
+ }
279
288
  });
280
289
  let result;
281
290
  if (status === "pending") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context.ts","../src/hooks/useENSNodeConfig.ts","../src/utils/query.ts","../src/hooks/useENSNodeSDKConfig.ts","../src/hooks/useIndexingStatus.ts","../src/hooks/useNameTokens.ts","../src/hooks/usePrimaryName.ts","../src/hooks/usePrimaryNames.ts","../src/hooks/useRecords.ts","../src/hooks/useRegistrarActions.ts","../src/hooks/useResolvedIdentity.ts","../src/hooks/useSwrQuery.ts","../src/provider.tsx"],"sourcesContent":["export type { QueryClient } from \"@tanstack/react-query\";\n\nexport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\n\nexport * from \"./context\";\nexport * from \"./hooks\";\nexport * from \"./provider\";\nexport * from \"./types\";\nexport * from \"./utils/query\";\n","import { createContext } from \"react\";\n\nimport type { ENSNodeSDKConfig } from \"./types\";\n\n/**\n * React context for ENSNode configuration\n */\nexport const ENSNodeContext = createContext<ENSNodeSDKConfig | undefined>(undefined);\n\n/**\n * Display name for debugging\n */\nENSNodeContext.displayName = \"ENSNodeContext\";\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { ConfigResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { ASSUME_IMMUTABLE_QUERY, createConfigQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseENSNodeConfigParameters = QueryParameter<ConfigResponse>;\n\nexport function useENSNodeConfig(\n parameters: WithSDKConfigParameter & UseENSNodeConfigParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createConfigQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n ...ASSUME_IMMUTABLE_QUERY,\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport type { UndefinedInitialDataOptions } from \"@tanstack/react-query\";\n\nimport {\n ENSNodeClient,\n type NameTokensRequest,\n type RegistrarActionsRequest,\n type ResolvePrimaryNameRequest,\n type ResolvePrimaryNamesRequest,\n type ResolveRecordsRequest,\n type ResolverRecordsSelection,\n} from \"@ensnode/ensnode-sdk\";\n\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Immutable query options for data that is assumed to be immutable and should only be fetched once per full page refresh per unique key.\n * Similar to SWR's immutable: true API.\n *\n * Use this for data that is assumed not to change (e.g., records for a specific name) until the next full page refresh.\n *\n * @example\n * ```tsx\n * useRecords({\n * name: \"vitalik.eth\",\n * selection: { texts: [\"avatar\"] },\n * query: ASSUME_IMMUTABLE_QUERY\n * })\n * ```\n */\nexport const ASSUME_IMMUTABLE_QUERY = {\n staleTime: Infinity,\n gcTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n refetchOnMount: false,\n} as const satisfies Partial<UndefinedInitialDataOptions>;\n\n/**\n * Query keys for hooks. Simply keys by path and arguments.\n */\nexport const queryKeys = {\n base: (url: string) => [\"ensnode\", url] as const,\n\n resolve: (url: string) => [...queryKeys.base(url), \"resolve\"] as const,\n\n records: (url: string, args: ResolveRecordsRequest<any>) =>\n [...queryKeys.resolve(url), \"records\", args] as const,\n\n primaryName: (url: string, args: ResolvePrimaryNameRequest) =>\n [...queryKeys.resolve(url), \"primary-name\", args] as const,\n\n primaryNames: (url: string, args: ResolvePrimaryNamesRequest) =>\n [...queryKeys.resolve(url), \"primary-names\", args] as const,\n\n config: (url: string) => [...queryKeys.base(url), \"config\"] as const,\n\n indexingStatus: (url: string) => [...queryKeys.base(url), \"indexing-status\"] as const,\n\n registrarActions: (url: string, args: RegistrarActionsRequest) =>\n [...queryKeys.base(url), \"registrar-actions\", args] as const,\n\n nameTokens: (url: string, args: NameTokensRequest) =>\n [...queryKeys.base(url), \"name-tokens\", args] as const,\n};\n\n/**\n * Creates query options for Records Resolution\n */\nexport function createRecordsQueryOptions<SELECTION extends ResolverRecordsSelection>(\n config: ENSNodeSDKConfig,\n args: ResolveRecordsRequest<SELECTION>,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.records(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolveRecords(args.name, args.selection, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNameQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNameRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryName(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryName(args.address, args.chainId, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNamesQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNamesRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryNames(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryNames(args.address, args);\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Config API\n */\nexport function createConfigQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.config(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.config();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Indexing Status API\n */\nexport function createIndexingStatusQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.indexingStatus(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.indexingStatus();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Registrar Actions API\n */\nexport function createRegistrarActionsQueryOptions(\n config: ENSNodeSDKConfig,\n args: RegistrarActionsRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.registrarActions(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.registrarActions(args);\n },\n };\n}\n\n/**\n * Creates query options for Name Tokens API\n */\nexport function createNameTokensQueryOptions(config: ENSNodeSDKConfig, args: NameTokensRequest) {\n return {\n enabled: true,\n queryKey: queryKeys.nameTokens(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.nameTokens(args);\n },\n };\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\n\nimport { ENSNodeContext } from \"../context\";\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Hook to access the ENSNodeSDKConfig from context or parameters.\n *\n * @param parameters - Optional config parameter that overrides context\n * @returns The ENSNode configuration\n * @throws Error if no config is available in context or parameters\n */\nexport function useENSNodeSDKConfig<TConfig extends ENSNodeSDKConfig = ENSNodeSDKConfig>(\n config: TConfig | undefined,\n): TConfig {\n const contextConfig = useContext(ENSNodeContext);\n\n // Use provided config or fall back to context\n const resolvedConfig = config ?? contextConfig;\n\n if (!resolvedConfig) {\n throw new Error(\n \"useENSNodeSDKConfig must be used within an ENSNodeProvider or you must pass a config parameter\",\n );\n }\n\n return resolvedConfig as TConfig;\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { IndexingStatusRequest, IndexingStatusResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createIndexingStatusQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseIndexingStatusParameters\n extends IndexingStatusRequest,\n QueryParameter<IndexingStatusResponse> {}\n\nexport function useIndexingStatus(\n parameters: WithSDKConfigParameter & UseIndexingStatusParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createIndexingStatusQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - indexing status changes frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { NameTokensRequest, NameTokensResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createNameTokensQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseNameTokensParameters = NameTokensRequest & QueryParameter<NameTokensResponse>;\n\n/**\n * Use Name Tokens hook\n *\n * Query ENSNode Name Tokens API.\n */\nexport function useNameTokens(parameters: WithSDKConfigParameter & UseNameTokensParameters) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createNameTokensQueryOptions(_config, parameters);\n\n return useQuery({\n ...queryOptions,\n refetchInterval: false, // no refetching - assume data is immutable until a full page refresh\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNameParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNameQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary name of a specified address (Reverse Resolution).\n *\n * The returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address is not normalized, `null` is returned as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary name\n *\n * @example\n * ```typescript\n * import { usePrimaryName } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNameAndAvatar() {\n * const { data, isLoading, error } = usePrimaryName({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * chainId: 1, // Ethereum Mainnet\n * accelerate: true, // Attempt Protocol Acceleration\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Primary Name (for Mainnet)</h3>\n * <p>{data.name ?? \"No Primary Name\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryName(parameters: UsePrimaryNameParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNameQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNamesParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNamesQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary names of a specified address across multiple chains.\n *\n * Each returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address on any chain is not normalized, `null` is returned for that chain as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary names\n *\n * @example\n * ```typescript\n * import { usePrimaryNames } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNames() {\n * const { data, isLoading, error } = usePrimaryNames({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * {Object.entries(data.names).map(([chainId, name]) => (\n * <div key={chainId}>\n * <h3>Primary Name (Chain Id: {chainId})</h3>\n * <p>{name}</p>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryNames(parameters: UsePrimaryNamesParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNamesQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\n\nimport type { UseRecordsParameters, WithSDKConfigParameter } from \"../types\";\nimport { createRecordsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves records for an ENS name (Forward Resolution).\n *\n * The returned `name` field, if set, is guaranteed to be a normalized name.\n * If the name record returned by the resolver is not normalized, `null` is returned as if no name record was set.\n *\n * @param parameters - Configuration for the ENS name resolution\n * @returns Query result with resolved records\n *\n * @example\n * ```typescript\n * import { useRecords } from \"@ensnode/ensnode-react\";\n *\n * function DisplayNameRecords() {\n * const { data, isLoading, error } = useRecords({\n * name: \"jesse.base.eth\",\n * selection: {\n * addresses: [60], // ETH CoinType\n * texts: [\"avatar\", \"com.twitter\"]\n * }\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Resolved Records for vitalik.eth</h3>\n * {data.records.addresses && (\n * <p>ETH Address: {data.records.addresses[60]}</p>\n * )}\n * {data.records.texts && (\n * <div>\n * <p>Avatar: {data.records.texts.avatar}</p>\n * <p>Twitter: {data.records.texts[\"com.twitter\"]}</p>\n * </div>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useRecords<SELECTION extends ResolverRecordsSelection>(\n parameters: UseRecordsParameters<SELECTION> & WithSDKConfigParameter,\n) {\n const { config, query = {}, name, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = name !== null;\n\n const queryOptions = canEnable\n ? createRecordsQueryOptions(_config, { ...args, name })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { RegistrarActionsRequest, RegistrarActionsResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createRegistrarActionsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseRegistrarActionsParameters\n extends RegistrarActionsRequest,\n QueryParameter<RegistrarActionsResponse> {}\n\n/**\n * Use Registrar Actions hook\n *\n * Query ENSNode Registrar Actions API.\n */\nexport function useRegistrarActions(\n parameters: WithSDKConfigParameter & UseRegistrarActionsParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createRegistrarActionsQueryOptions(_config, parameters);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - latest registrar actions change frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport {\n type ENSNamespaceId,\n getResolvePrimaryNameChainIdParam,\n type Identity,\n type NamedIdentity,\n ResolutionStatusIds,\n ResolvedIdentity,\n type UnknownIdentity,\n type UnnamedIdentity,\n type UnresolvedIdentity,\n} from \"@ensnode/ensnode-sdk\";\n\nimport { usePrimaryName } from \"./usePrimaryName\";\n\n// TODO: `namespaceId` ideally would not be a parameter for this hook.\n// Ideally it should come from the active namespace context and be a nested hook within this hook.\n// However, currently this hook lives in ENSAdmin and not in `ensnode-react`.\n/**\n * Parameters for the useResolvedIdentity hook.\n */\nexport interface UseResolvedIdentityParameters {\n identity: UnresolvedIdentity;\n namespaceId: ENSNamespaceId;\n accelerate?: boolean;\n}\n\n/**\n * Hook to perform ENSIP-19 primary name resolution to resolve an\n * {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.\n *\n * @param parameters - Configuration object for the hook\n * @param parameters.identity - An {@link UnresolvedIdentity} containing the {@link DefaultableChainId}\n * and {@link Address} to resolve.\n * @param parameters.namespaceId - The {@link ENSNamespaceId} that `identity.chainId` should be interpreted\n * through (via {@link getResolvePrimaryNameChainIdParam}) to determine the literal\n * chainId that should be used for ENSIP-19 primary name resolution.\n * @param parameters.accelerate - Whether to attempt Protocol Acceleration (default: false)\n * when resolving the primary name.\n *\n * @returns An object containing:\n * - `identity`: An {@link Identity} with one of four possible {@link ResolutionStatusIds}:\n * - {@link ResolutionStatusIds.Unresolved}: While the query is pending (loading state).\n * - {@link ResolutionStatusIds.Unknown}: If an error occurs during resolution.\n * - {@link ResolutionStatusIds.Unnamed}: If the resolution found no primary name.\n * - {@link ResolutionStatusIds.Named}: If a primary name is successfully resolved.\n * - All other properties from the underlying {@link usePrimaryName} query (e.g., `isLoading`, `error`, `refetch`, etc.)\n */\nexport function useResolvedIdentity(parameters: UseResolvedIdentityParameters) {\n const { identity, namespaceId, accelerate, ...args } = parameters;\n\n const {\n data: primaryNameData,\n status,\n ...query\n } = usePrimaryName({\n address: identity.address,\n chainId: getResolvePrimaryNameChainIdParam(identity.chainId, namespaceId),\n accelerate,\n ...args,\n });\n\n let result: Identity;\n\n if (status === \"pending\") {\n // loading state\n // return the `UnresolvedIdentity` to support loading state functionality.\n result = identity;\n } else if (status === \"error\") {\n result = {\n resolutionStatus: ResolutionStatusIds.Unknown,\n chainId: identity.chainId,\n address: identity.address,\n } satisfies UnknownIdentity;\n } else if (primaryNameData.name === null) {\n result = {\n resolutionStatus: ResolutionStatusIds.Unnamed,\n chainId: identity.chainId,\n address: identity.address,\n name: null,\n } satisfies UnnamedIdentity;\n } else {\n result = {\n resolutionStatus: ResolutionStatusIds.Named,\n chainId: identity.chainId,\n address: identity.address,\n name: primaryNameData.name,\n } satisfies NamedIdentity;\n }\n\n return {\n ...query,\n identity: result,\n };\n}\n","import {\n type DefaultError,\n type DefinedInitialDataOptions,\n type DefinedUseQueryResult,\n type QueryClient,\n type QueryKey,\n type QueryObserverSuccessResult,\n type UndefinedInitialDataOptions,\n type UseQueryOptions,\n type UseQueryResult,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\n\n/**\n * Use Stale-While-Revalidate Query\n *\n * This hooks is a proxy for {@link useQuery} with addition of the following\n * semantics:\n * - if the query has been resolved successfully just once,\n * the query result will always be success with data being the previously\n * cached result,\n * - the cached result can never go stale, or be garbage collected\n * - the cached result can be only overridden by the current result when\n * the query is successfully re-fetched (in other words,\n * the `options.queryFn` returns a resolved promise).\n *\n * Please note how there can be any number of failed queries before one\n * succeeds. In such case, no successful result has ever been cached and\n * the query fails (`isError: true`, `error` is available) until\n * the first successful resolution (`isSuccess: true`, `data` is available).\n *\n * @example\n * ```tsx\n * const swrQuery = useSwrQuery({\n * queryKey: ['data'],\n * queryFn: fetchData,\n * });\n *\n * if (swrQuery.isPending) {\n * // Show loading state while there's no cached successful result and\n * // no query attempt was finished yet.\n * return <>Loading...</>;\n * }\n *\n * if (swrQuery.isError) {\n * // Show error state when query attempt fails and\n * // no cached successful result is available.\n * return <>Error: {swrQuery.error.message}</>;\n * }\n *\n * // Otherwise, show data when the cached successful result is available.\n * return <>Data: {JSON.stringify(swrQuery.data)}</>;\n * ```\n */\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError> {\n const queryClientFromContext = useQueryClient();\n const derivedQueryClient = queryClient ?? queryClientFromContext;\n\n // cacheResult, if available, is always the last successfully resolved query data\n const cachedSuccessfulResult = derivedQueryClient.getQueryData<TData>(options.queryKey);\n\n const queryResult = useQuery(\n {\n ...options,\n // cached result can never be stale\n staleTime: cachedSuccessfulResult ? Infinity : undefined,\n // cached result can never be removed by garbage collector\n gcTime: cachedSuccessfulResult ? Infinity : undefined,\n },\n queryClient,\n );\n\n // memoize query results to avoid unnecessary UI re-rendering\n const memoizedQueryResult = useMemo(() => {\n // If the query result is error\n // and the cachedSuccessfulResult is available\n // override the query result to be success, replacing the unsuccessful\n // result with the most recent cachedSuccessfulResult\n if (queryResult.isError && cachedSuccessfulResult) {\n return {\n ...queryResult,\n // set error props\n isError: false,\n error: null,\n isRefetchError: false,\n isLoadingError: false,\n // st success props\n isSuccess: true,\n status: \"success\",\n data: cachedSuccessfulResult,\n } satisfies QueryObserverSuccessResult<TData, TError>;\n }\n\n return queryResult;\n }, [queryResult, cachedSuccessfulResult]);\n\n return memoizedQueryResult;\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: conditional hooks used correctly here */\n\"use client\";\n\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { createElement, useMemo } from \"react\";\n\nimport { ENSNodeClient } from \"@ensnode/ensnode-sdk\";\n\nimport { ENSNodeContext } from \"./context\";\nimport type { ENSNodeSDKConfig } from \"./types\";\n\nexport interface ENSNodeProviderProps {\n /** ENSNode configuration */\n config: ENSNodeSDKConfig;\n\n /**\n * Optional QueryClient instance. If provided, you must wrap your app with QueryClientProvider yourself.\n * If not provided, ENSNodeProvider will create and manage its own QueryClient internally.\n */\n queryClient?: QueryClient;\n\n /**\n * Custom query client options when auto-creating a QueryClient.\n * Only used when queryClient is not provided.\n */\n queryClientOptions?: ConstructorParameters<typeof QueryClient>[0];\n}\n\nfunction ENSNodeInternalProvider({\n children,\n config,\n}: {\n children?: React.ReactNode;\n config: ENSNodeSDKConfig;\n}) {\n // Memoize the config to prevent unnecessary re-renders\n const memoizedConfig = useMemo(() => config, [config]);\n\n return createElement(ENSNodeContext.Provider, { value: memoizedConfig }, children);\n}\n\nexport function ENSNodeProvider(parameters: React.PropsWithChildren<ENSNodeProviderProps>) {\n const { children, config, queryClient, queryClientOptions } = parameters;\n\n // Check if we're already inside a QueryClientProvider\n let hasExistingQueryClient = false;\n try {\n hasExistingQueryClient = Boolean(useQueryClient());\n } catch {\n // useQueryClient throws if not inside a QueryClientProvider\n hasExistingQueryClient = false;\n }\n\n // If user provided a queryClient, they must handle QueryClientProvider themselves\n if (queryClient) {\n if (!hasExistingQueryClient) {\n throw new Error(\n \"When providing a custom queryClient, you must wrap your app with QueryClientProvider. \" +\n \"Either remove the queryClient prop to use auto-managed setup, or wrap with QueryClientProvider.\",\n );\n }\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // If already inside a QueryClientProvider, just use that\n if (hasExistingQueryClient) {\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // Create our own QueryClient and QueryClientProvider\n const defaultQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n retry: 3,\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 30, // 30 minutes\n refetchInterval: 1000 * 10, // 10 seconds\n },\n },\n ...queryClientOptions,\n }),\n [queryClientOptions],\n );\n\n return createElement(\n QueryClientProvider,\n { client: defaultQueryClient },\n createElement(ENSNodeInternalProvider, { config, children }),\n );\n}\n\n/**\n * Helper function to create ENSNode configuration\n */\nexport function createConfig(options?: { url?: string | URL }): ENSNodeSDKConfig {\n const url = options?.url ? new URL(options.url) : ENSNodeClient.defaultOptions().url;\n\n return {\n client: {\n ...ENSNodeClient.defaultOptions(),\n url,\n },\n };\n}\n"],"mappings":"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","names":["import_react","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_ensnode_sdk","import_react_query","import_react","import_react_query","import_react","import_ensnode_sdk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/context.ts","../src/hooks/useENSNodeConfig.ts","../src/utils/query.ts","../src/hooks/useENSNodeSDKConfig.ts","../src/hooks/useIndexingStatus.ts","../src/hooks/useNameTokens.ts","../src/hooks/usePrimaryName.ts","../src/hooks/usePrimaryNames.ts","../src/hooks/useRecords.ts","../src/hooks/useRegistrarActions.ts","../src/hooks/useResolvedIdentity.ts","../src/hooks/useSwrQuery.ts","../src/provider.tsx"],"sourcesContent":["export type { QueryClient } from \"@tanstack/react-query\";\n\nexport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\n\nexport * from \"./context\";\nexport * from \"./hooks\";\nexport * from \"./provider\";\nexport * from \"./types\";\nexport * from \"./utils/query\";\n","import { createContext } from \"react\";\n\nimport type { ENSNodeSDKConfig } from \"./types\";\n\n/**\n * React context for ENSNode configuration\n */\nexport const ENSNodeContext = createContext<ENSNodeSDKConfig | undefined>(undefined);\n\n/**\n * Display name for debugging\n */\nENSNodeContext.displayName = \"ENSNodeContext\";\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { ConfigResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { ASSUME_IMMUTABLE_QUERY, createConfigQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseENSNodeConfigParameters = QueryParameter<ConfigResponse>;\n\nexport function useENSNodeConfig(\n parameters: WithSDKConfigParameter & UseENSNodeConfigParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createConfigQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n ...ASSUME_IMMUTABLE_QUERY,\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport type { UndefinedInitialDataOptions } from \"@tanstack/react-query\";\n\nimport {\n ENSNodeClient,\n type NameTokensRequest,\n type RegistrarActionsRequest,\n type ResolvePrimaryNameRequest,\n type ResolvePrimaryNamesRequest,\n type ResolveRecordsRequest,\n type ResolverRecordsSelection,\n} from \"@ensnode/ensnode-sdk\";\n\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Immutable query options for data that is assumed to be immutable and should only be fetched once per full page refresh per unique key.\n * Similar to SWR's immutable: true API.\n *\n * Use this for data that is assumed not to change (e.g., records for a specific name) until the next full page refresh.\n *\n * @example\n * ```tsx\n * useRecords({\n * name: \"vitalik.eth\",\n * selection: { texts: [\"avatar\"] },\n * query: ASSUME_IMMUTABLE_QUERY\n * })\n * ```\n */\nexport const ASSUME_IMMUTABLE_QUERY = {\n staleTime: Infinity,\n gcTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n refetchOnMount: false,\n} as const satisfies Partial<UndefinedInitialDataOptions>;\n\n/**\n * Query keys for hooks. Simply keys by path and arguments.\n */\nexport const queryKeys = {\n base: (url: string) => [\"ensnode\", url] as const,\n\n resolve: (url: string) => [...queryKeys.base(url), \"resolve\"] as const,\n\n records: (url: string, args: ResolveRecordsRequest<any>) =>\n [...queryKeys.resolve(url), \"records\", args] as const,\n\n primaryName: (url: string, args: ResolvePrimaryNameRequest) =>\n [...queryKeys.resolve(url), \"primary-name\", args] as const,\n\n primaryNames: (url: string, args: ResolvePrimaryNamesRequest) =>\n [...queryKeys.resolve(url), \"primary-names\", args] as const,\n\n config: (url: string) => [...queryKeys.base(url), \"config\"] as const,\n\n indexingStatus: (url: string) => [...queryKeys.base(url), \"indexing-status\"] as const,\n\n registrarActions: (url: string, args: RegistrarActionsRequest) =>\n [...queryKeys.base(url), \"registrar-actions\", args] as const,\n\n nameTokens: (url: string, args: NameTokensRequest) =>\n [...queryKeys.base(url), \"name-tokens\", args] as const,\n};\n\n/**\n * Creates query options for Records Resolution\n */\nexport function createRecordsQueryOptions<SELECTION extends ResolverRecordsSelection>(\n config: ENSNodeSDKConfig,\n args: ResolveRecordsRequest<SELECTION>,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.records(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolveRecords(args.name, args.selection, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNameQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNameRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryName(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryName(args.address, args.chainId, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNamesQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNamesRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryNames(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryNames(args.address, args);\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Config API\n */\nexport function createConfigQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.config(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.config();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Indexing Status API\n */\nexport function createIndexingStatusQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.indexingStatus(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.indexingStatus();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Registrar Actions API\n */\nexport function createRegistrarActionsQueryOptions(\n config: ENSNodeSDKConfig,\n args: RegistrarActionsRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.registrarActions(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.registrarActions(args);\n },\n };\n}\n\n/**\n * Creates query options for Name Tokens API\n */\nexport function createNameTokensQueryOptions(config: ENSNodeSDKConfig, args: NameTokensRequest) {\n return {\n enabled: true,\n queryKey: queryKeys.nameTokens(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.nameTokens(args);\n },\n };\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\n\nimport { ENSNodeContext } from \"../context\";\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Hook to access the ENSNodeSDKConfig from context or parameters.\n *\n * @param parameters - Optional config parameter that overrides context\n * @returns The ENSNode configuration\n * @throws Error if no config is available in context or parameters\n */\nexport function useENSNodeSDKConfig<TConfig extends ENSNodeSDKConfig = ENSNodeSDKConfig>(\n config: TConfig | undefined,\n): TConfig {\n const contextConfig = useContext(ENSNodeContext);\n\n // Use provided config or fall back to context\n const resolvedConfig = config ?? contextConfig;\n\n if (!resolvedConfig) {\n throw new Error(\n \"useENSNodeSDKConfig must be used within an ENSNodeProvider or you must pass a config parameter\",\n );\n }\n\n return resolvedConfig as TConfig;\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { IndexingStatusRequest, IndexingStatusResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createIndexingStatusQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseIndexingStatusParameters\n extends IndexingStatusRequest,\n QueryParameter<IndexingStatusResponse> {}\n\nexport function useIndexingStatus(\n parameters: WithSDKConfigParameter & UseIndexingStatusParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createIndexingStatusQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - indexing status changes frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { NameTokensRequest, NameTokensResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createNameTokensQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseNameTokensParameters = NameTokensRequest & QueryParameter<NameTokensResponse>;\n\n/**\n * Use Name Tokens hook\n *\n * Query ENSNode Name Tokens API.\n */\nexport function useNameTokens(parameters: WithSDKConfigParameter & UseNameTokensParameters) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createNameTokensQueryOptions(_config, parameters);\n\n return useQuery({\n ...queryOptions,\n refetchInterval: false, // no refetching - assume data is immutable until a full page refresh\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNameParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNameQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary name of a specified address (Reverse Resolution).\n *\n * The returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address is not normalized, `null` is returned as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary name\n *\n * @example\n * ```typescript\n * import { usePrimaryName } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNameAndAvatar() {\n * const { data, isLoading, error } = usePrimaryName({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * chainId: 1, // Ethereum Mainnet\n * accelerate: true, // Attempt Protocol Acceleration\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Primary Name (for Mainnet)</h3>\n * <p>{data.name ?? \"No Primary Name\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryName(parameters: UsePrimaryNameParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNameQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNamesParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNamesQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary names of a specified address across multiple chains.\n *\n * Each returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address on any chain is not normalized, `null` is returned for that chain as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary names\n *\n * @example\n * ```typescript\n * import { usePrimaryNames } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNames() {\n * const { data, isLoading, error } = usePrimaryNames({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * {Object.entries(data.names).map(([chainId, name]) => (\n * <div key={chainId}>\n * <h3>Primary Name (Chain Id: {chainId})</h3>\n * <p>{name}</p>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryNames(parameters: UsePrimaryNamesParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNamesQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\n\nimport type { UseRecordsParameters, WithSDKConfigParameter } from \"../types\";\nimport { createRecordsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves records for an ENS name (Forward Resolution).\n *\n * The returned `name` field, if set, is guaranteed to be a normalized name.\n * If the name record returned by the resolver is not normalized, `null` is returned as if no name record was set.\n *\n * @param parameters - Configuration for the ENS name resolution\n * @returns Query result with resolved records\n *\n * @example\n * ```typescript\n * import { useRecords } from \"@ensnode/ensnode-react\";\n *\n * function DisplayNameRecords() {\n * const { data, isLoading, error } = useRecords({\n * name: \"jesse.base.eth\",\n * selection: {\n * addresses: [60], // ETH CoinType\n * texts: [\"avatar\", \"com.twitter\"]\n * }\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Resolved Records for vitalik.eth</h3>\n * {data.records.addresses && (\n * <p>ETH Address: {data.records.addresses[60]}</p>\n * )}\n * {data.records.texts && (\n * <div>\n * <p>Avatar: {data.records.texts.avatar}</p>\n * <p>Twitter: {data.records.texts[\"com.twitter\"]}</p>\n * </div>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useRecords<SELECTION extends ResolverRecordsSelection>(\n parameters: UseRecordsParameters<SELECTION> & WithSDKConfigParameter,\n) {\n const { config, query = {}, name, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = name !== null;\n\n const queryOptions = canEnable\n ? createRecordsQueryOptions(_config, { ...args, name })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { RegistrarActionsRequest, RegistrarActionsResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createRegistrarActionsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseRegistrarActionsParameters\n extends RegistrarActionsRequest,\n QueryParameter<RegistrarActionsResponse> {}\n\n/**\n * Use Registrar Actions hook\n *\n * Query ENSNode Registrar Actions API.\n */\nexport function useRegistrarActions(\n parameters: WithSDKConfigParameter & UseRegistrarActionsParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createRegistrarActionsQueryOptions(_config, parameters);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - latest registrar actions change frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport {\n type ENSNamespaceId,\n ENSNamespaceIds,\n getResolvePrimaryNameChainIdParam,\n type Identity,\n type NamedIdentity,\n ResolutionStatusIds,\n ResolvedIdentity,\n type UnknownIdentity,\n type UnnamedIdentity,\n type UnresolvedIdentity,\n} from \"@ensnode/ensnode-sdk\";\n\nimport type { UseResolvedIdentityParameters } from \"../types\";\nimport { useENSNodeConfig } from \"./useENSNodeConfig\";\nimport { usePrimaryName } from \"./usePrimaryName\";\n\n/**\n * Hook to perform ENSIP-19 primary name resolution to resolve an\n * {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.\n *\n * @param parameters - Configuration object for the hook\n * @param parameters.identity - An {@link UnresolvedIdentity} containing the {@link DefaultableChainId}\n * and {@link Address} to resolve.\n * @param parameters.namespaceId - The {@link ENSNamespaceId} that `identity.chainId` should be interpreted\n * through (via {@link getResolvePrimaryNameChainIdParam}) to determine the literal\n * chainId that should be used for ENSIP-19 primary name resolution.\n * @param parameters.accelerate - Whether to attempt Protocol Acceleration (default: false)\n * when resolving the primary name.\n *\n * @returns An object containing:\n * - `identity`: An {@link Identity} with one of four possible {@link ResolutionStatusIds}:\n * - {@link ResolutionStatusIds.Unresolved}: While the query is pending (loading state).\n * - {@link ResolutionStatusIds.Unknown}: If an error occurs during resolution.\n * - {@link ResolutionStatusIds.Unnamed}: If the resolution found no primary name.\n * - {@link ResolutionStatusIds.Named}: If a primary name is successfully resolved.\n * - All other properties from the underlying {@link usePrimaryName} query (e.g., `isLoading`, `error`, `refetch`, etc.)\n */\nexport function useResolvedIdentity(parameters: UseResolvedIdentityParameters) {\n const { identity, accelerate, query: _query = {} } = parameters;\n\n const { data } = useENSNodeConfig();\n const namespace = data?.ensIndexerPublicConfig.namespace;\n\n const {\n data: primaryNameData,\n status,\n ...query\n } = usePrimaryName({\n address: identity.address,\n chainId: getResolvePrimaryNameChainIdParam(\n identity.chainId,\n // NOTE: defaulting here for typechecking, but enabled prevents fetching before namespace is known\n namespace ?? ENSNamespaceIds.Mainnet,\n ),\n accelerate,\n query: {\n ..._query,\n enabled: (_query.enabled ?? true) && namespace !== undefined,\n },\n });\n\n let result: Identity;\n\n if (status === \"pending\") {\n // loading state\n // return the `UnresolvedIdentity` to support loading state functionality.\n result = identity;\n } else if (status === \"error\") {\n result = {\n resolutionStatus: ResolutionStatusIds.Unknown,\n chainId: identity.chainId,\n address: identity.address,\n } satisfies UnknownIdentity;\n } else if (primaryNameData.name === null) {\n result = {\n resolutionStatus: ResolutionStatusIds.Unnamed,\n chainId: identity.chainId,\n address: identity.address,\n name: null,\n } satisfies UnnamedIdentity;\n } else {\n result = {\n resolutionStatus: ResolutionStatusIds.Named,\n chainId: identity.chainId,\n address: identity.address,\n name: primaryNameData.name,\n } satisfies NamedIdentity;\n }\n\n return {\n ...query,\n identity: result,\n };\n}\n","import {\n type DefaultError,\n type DefinedInitialDataOptions,\n type DefinedUseQueryResult,\n type QueryClient,\n type QueryKey,\n type QueryObserverSuccessResult,\n type UndefinedInitialDataOptions,\n type UseQueryOptions,\n type UseQueryResult,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\n\n/**\n * Use Stale-While-Revalidate Query\n *\n * This hooks is a proxy for {@link useQuery} with addition of the following\n * semantics:\n * - if the query has been resolved successfully just once,\n * the query result will always be success with data being the previously\n * cached result,\n * - the cached result can never go stale, or be garbage collected\n * - the cached result can be only overridden by the current result when\n * the query is successfully re-fetched (in other words,\n * the `options.queryFn` returns a resolved promise).\n *\n * Please note how there can be any number of failed queries before one\n * succeeds. In such case, no successful result has ever been cached and\n * the query fails (`isError: true`, `error` is available) until\n * the first successful resolution (`isSuccess: true`, `data` is available).\n *\n * @example\n * ```tsx\n * const swrQuery = useSwrQuery({\n * queryKey: ['data'],\n * queryFn: fetchData,\n * });\n *\n * if (swrQuery.isPending) {\n * // Show loading state while there's no cached successful result and\n * // no query attempt was finished yet.\n * return <>Loading...</>;\n * }\n *\n * if (swrQuery.isError) {\n * // Show error state when query attempt fails and\n * // no cached successful result is available.\n * return <>Error: {swrQuery.error.message}</>;\n * }\n *\n * // Otherwise, show data when the cached successful result is available.\n * return <>Data: {JSON.stringify(swrQuery.data)}</>;\n * ```\n */\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError> {\n const queryClientFromContext = useQueryClient();\n const derivedQueryClient = queryClient ?? queryClientFromContext;\n\n // cacheResult, if available, is always the last successfully resolved query data\n const cachedSuccessfulResult = derivedQueryClient.getQueryData<TData>(options.queryKey);\n\n const queryResult = useQuery(\n {\n ...options,\n // cached result can never be stale\n staleTime: cachedSuccessfulResult ? Infinity : undefined,\n // cached result can never be removed by garbage collector\n gcTime: cachedSuccessfulResult ? Infinity : undefined,\n },\n queryClient,\n );\n\n // memoize query results to avoid unnecessary UI re-rendering\n const memoizedQueryResult = useMemo(() => {\n // If the query result is error\n // and the cachedSuccessfulResult is available\n // override the query result to be success, replacing the unsuccessful\n // result with the most recent cachedSuccessfulResult\n if (queryResult.isError && cachedSuccessfulResult) {\n return {\n ...queryResult,\n // set error props\n isError: false,\n error: null,\n isRefetchError: false,\n isLoadingError: false,\n // st success props\n isSuccess: true,\n status: \"success\",\n data: cachedSuccessfulResult,\n } satisfies QueryObserverSuccessResult<TData, TError>;\n }\n\n return queryResult;\n }, [queryResult, cachedSuccessfulResult]);\n\n return memoizedQueryResult;\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: conditional hooks used correctly here */\n\"use client\";\n\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { createElement, useMemo } from \"react\";\n\nimport { ENSNodeClient } from \"@ensnode/ensnode-sdk\";\n\nimport { ENSNodeContext } from \"./context\";\nimport type { ENSNodeSDKConfig } from \"./types\";\n\nexport interface ENSNodeProviderProps {\n /** ENSNode configuration */\n config: ENSNodeSDKConfig;\n\n /**\n * Optional QueryClient instance. If provided, you must wrap your app with QueryClientProvider yourself.\n * If not provided, ENSNodeProvider will create and manage its own QueryClient internally.\n */\n queryClient?: QueryClient;\n\n /**\n * Custom query client options when auto-creating a QueryClient.\n * Only used when queryClient is not provided.\n */\n queryClientOptions?: ConstructorParameters<typeof QueryClient>[0];\n}\n\nfunction ENSNodeInternalProvider({\n children,\n config,\n}: {\n children?: React.ReactNode;\n config: ENSNodeSDKConfig;\n}) {\n // Memoize the config to prevent unnecessary re-renders\n const memoizedConfig = useMemo(() => config, [config]);\n\n return createElement(ENSNodeContext.Provider, { value: memoizedConfig }, children);\n}\n\nexport function ENSNodeProvider(parameters: React.PropsWithChildren<ENSNodeProviderProps>) {\n const { children, config, queryClient, queryClientOptions } = parameters;\n\n // Check if we're already inside a QueryClientProvider\n let hasExistingQueryClient = false;\n try {\n hasExistingQueryClient = Boolean(useQueryClient());\n } catch {\n // useQueryClient throws if not inside a QueryClientProvider\n hasExistingQueryClient = false;\n }\n\n // If user provided a queryClient, they must handle QueryClientProvider themselves\n if (queryClient) {\n if (!hasExistingQueryClient) {\n throw new Error(\n \"When providing a custom queryClient, you must wrap your app with QueryClientProvider. \" +\n \"Either remove the queryClient prop to use auto-managed setup, or wrap with QueryClientProvider.\",\n );\n }\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // If already inside a QueryClientProvider, just use that\n if (hasExistingQueryClient) {\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // Create our own QueryClient and QueryClientProvider\n const defaultQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n retry: 3,\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 30, // 30 minutes\n refetchInterval: 1000 * 10, // 10 seconds\n },\n },\n ...queryClientOptions,\n }),\n [queryClientOptions],\n );\n\n return createElement(\n QueryClientProvider,\n { client: defaultQueryClient },\n createElement(ENSNodeInternalProvider, { config, children }),\n );\n}\n\n/**\n * Helper function to create ENSNode configuration\n */\nexport function createConfig(options?: { url?: string | URL }): ENSNodeSDKConfig {\n const url = options?.url ? new URL(options.url) : ENSNodeClient.defaultOptions().url;\n\n return {\n client: {\n ...ENSNodeClient.defaultOptions(),\n url,\n },\n };\n}\n"],"mappings":"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","names":["import_react","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_ensnode_sdk","import_react_query","import_react","import_react_query","import_react","import_ensnode_sdk"]}
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ import * as _tanstack_react_query from '@tanstack/react-query';
2
2
  import { QueryObserverOptions, DefaultError, QueryKey, DefinedInitialDataOptions, QueryClient, DefinedUseQueryResult, UndefinedInitialDataOptions, UseQueryResult, UseQueryOptions } from '@tanstack/react-query';
3
3
  export { QueryClient } from '@tanstack/react-query';
4
4
  import * as _ensnode_ensnode_sdk from '@ensnode/ensnode-sdk';
5
- import { ClientOptions, ResolvePrimaryNameRequest, ResolvePrimaryNameResponse, ResolvePrimaryNamesRequest, ResolvePrimaryNamesResponse, ResolverRecordsSelection, ResolveRecordsRequest, ResolveRecordsResponse, ConfigResponse, IndexingStatusRequest, IndexingStatusResponse, NameTokensRequest, NameTokensResponse, RegistrarActionsRequest, RegistrarActionsResponse, UnresolvedIdentity, ENSNamespaceId, Identity } from '@ensnode/ensnode-sdk';
5
+ import { ClientOptions, ResolvePrimaryNameRequest, ResolvePrimaryNameResponse, ResolvePrimaryNamesRequest, ResolvePrimaryNamesResponse, ResolverRecordsSelection, ResolveRecordsRequest, ResolveRecordsResponse, AcceleratableRequest, UnresolvedIdentity, ConfigResponse, IndexingStatusRequest, IndexingStatusResponse, NameTokensRequest, NameTokensResponse, RegistrarActionsRequest, RegistrarActionsResponse, Identity } from '@ensnode/ensnode-sdk';
6
6
  export { ResolverRecordsSelection } from '@ensnode/ensnode-sdk';
7
7
  import * as react from 'react';
8
8
 
@@ -49,6 +49,12 @@ interface UsePrimaryNameParameters extends Omit<ResolvePrimaryNameRequest, "addr
49
49
  interface UsePrimaryNamesParameters extends Omit<ResolvePrimaryNamesRequest, "address">, QueryParameter<ResolvePrimaryNamesResponse> {
50
50
  address: ResolvePrimaryNamesRequest["address"] | null;
51
51
  }
52
+ /**
53
+ * Parameters for the useResolvedIdentity hook.
54
+ */
55
+ interface UseResolvedIdentityParameters extends QueryParameter<ResolvePrimaryNameResponse>, AcceleratableRequest {
56
+ identity: UnresolvedIdentity;
57
+ }
52
58
 
53
59
  /**
54
60
  * React context for ENSNode configuration
@@ -202,14 +208,6 @@ interface UseRegistrarActionsParameters extends RegistrarActionsRequest, QueryPa
202
208
  */
203
209
  declare function useRegistrarActions(parameters?: WithSDKConfigParameter & UseRegistrarActionsParameters): _tanstack_react_query.UseQueryResult<RegistrarActionsResponse, Error>;
204
210
 
205
- /**
206
- * Parameters for the useResolvedIdentity hook.
207
- */
208
- interface UseResolvedIdentityParameters {
209
- identity: UnresolvedIdentity;
210
- namespaceId: ENSNamespaceId;
211
- accelerate?: boolean;
212
- }
213
211
  /**
214
212
  * Hook to perform ENSIP-19 primary name resolution to resolve an
215
213
  * {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as _tanstack_react_query from '@tanstack/react-query';
2
2
  import { QueryObserverOptions, DefaultError, QueryKey, DefinedInitialDataOptions, QueryClient, DefinedUseQueryResult, UndefinedInitialDataOptions, UseQueryResult, UseQueryOptions } from '@tanstack/react-query';
3
3
  export { QueryClient } from '@tanstack/react-query';
4
4
  import * as _ensnode_ensnode_sdk from '@ensnode/ensnode-sdk';
5
- import { ClientOptions, ResolvePrimaryNameRequest, ResolvePrimaryNameResponse, ResolvePrimaryNamesRequest, ResolvePrimaryNamesResponse, ResolverRecordsSelection, ResolveRecordsRequest, ResolveRecordsResponse, ConfigResponse, IndexingStatusRequest, IndexingStatusResponse, NameTokensRequest, NameTokensResponse, RegistrarActionsRequest, RegistrarActionsResponse, UnresolvedIdentity, ENSNamespaceId, Identity } from '@ensnode/ensnode-sdk';
5
+ import { ClientOptions, ResolvePrimaryNameRequest, ResolvePrimaryNameResponse, ResolvePrimaryNamesRequest, ResolvePrimaryNamesResponse, ResolverRecordsSelection, ResolveRecordsRequest, ResolveRecordsResponse, AcceleratableRequest, UnresolvedIdentity, ConfigResponse, IndexingStatusRequest, IndexingStatusResponse, NameTokensRequest, NameTokensResponse, RegistrarActionsRequest, RegistrarActionsResponse, Identity } from '@ensnode/ensnode-sdk';
6
6
  export { ResolverRecordsSelection } from '@ensnode/ensnode-sdk';
7
7
  import * as react from 'react';
8
8
 
@@ -49,6 +49,12 @@ interface UsePrimaryNameParameters extends Omit<ResolvePrimaryNameRequest, "addr
49
49
  interface UsePrimaryNamesParameters extends Omit<ResolvePrimaryNamesRequest, "address">, QueryParameter<ResolvePrimaryNamesResponse> {
50
50
  address: ResolvePrimaryNamesRequest["address"] | null;
51
51
  }
52
+ /**
53
+ * Parameters for the useResolvedIdentity hook.
54
+ */
55
+ interface UseResolvedIdentityParameters extends QueryParameter<ResolvePrimaryNameResponse>, AcceleratableRequest {
56
+ identity: UnresolvedIdentity;
57
+ }
52
58
 
53
59
  /**
54
60
  * React context for ENSNode configuration
@@ -202,14 +208,6 @@ interface UseRegistrarActionsParameters extends RegistrarActionsRequest, QueryPa
202
208
  */
203
209
  declare function useRegistrarActions(parameters?: WithSDKConfigParameter & UseRegistrarActionsParameters): _tanstack_react_query.UseQueryResult<RegistrarActionsResponse, Error>;
204
210
 
205
- /**
206
- * Parameters for the useResolvedIdentity hook.
207
- */
208
- interface UseResolvedIdentityParameters {
209
- identity: UnresolvedIdentity;
210
- namespaceId: ENSNamespaceId;
211
- accelerate?: boolean;
212
- }
213
211
  /**
214
212
  * Hook to perform ENSIP-19 primary name resolution to resolve an
215
213
  * {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.
package/dist/index.js CHANGED
@@ -220,20 +220,30 @@ function useRegistrarActions(parameters = {}) {
220
220
 
221
221
  // src/hooks/useResolvedIdentity.ts
222
222
  import {
223
+ ENSNamespaceIds,
223
224
  getResolvePrimaryNameChainIdParam,
224
225
  ResolutionStatusIds
225
226
  } from "@ensnode/ensnode-sdk";
226
227
  function useResolvedIdentity(parameters) {
227
- const { identity, namespaceId, accelerate, ...args } = parameters;
228
+ const { identity, accelerate, query: _query = {} } = parameters;
229
+ const { data } = useENSNodeConfig();
230
+ const namespace = data?.ensIndexerPublicConfig.namespace;
228
231
  const {
229
232
  data: primaryNameData,
230
233
  status,
231
234
  ...query
232
235
  } = usePrimaryName({
233
236
  address: identity.address,
234
- chainId: getResolvePrimaryNameChainIdParam(identity.chainId, namespaceId),
237
+ chainId: getResolvePrimaryNameChainIdParam(
238
+ identity.chainId,
239
+ // NOTE: defaulting here for typechecking, but enabled prevents fetching before namespace is known
240
+ namespace ?? ENSNamespaceIds.Mainnet
241
+ ),
235
242
  accelerate,
236
- ...args
243
+ query: {
244
+ ..._query,
245
+ enabled: (_query.enabled ?? true) && namespace !== void 0
246
+ }
237
247
  });
238
248
  let result;
239
249
  if (status === "pending") {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/hooks/useENSNodeConfig.ts","../src/utils/query.ts","../src/hooks/useENSNodeSDKConfig.ts","../src/hooks/useIndexingStatus.ts","../src/hooks/useNameTokens.ts","../src/hooks/usePrimaryName.ts","../src/hooks/usePrimaryNames.ts","../src/hooks/useRecords.ts","../src/hooks/useRegistrarActions.ts","../src/hooks/useResolvedIdentity.ts","../src/hooks/useSwrQuery.ts","../src/provider.tsx"],"sourcesContent":["import { createContext } from \"react\";\n\nimport type { ENSNodeSDKConfig } from \"./types\";\n\n/**\n * React context for ENSNode configuration\n */\nexport const ENSNodeContext = createContext<ENSNodeSDKConfig | undefined>(undefined);\n\n/**\n * Display name for debugging\n */\nENSNodeContext.displayName = \"ENSNodeContext\";\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { ConfigResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { ASSUME_IMMUTABLE_QUERY, createConfigQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseENSNodeConfigParameters = QueryParameter<ConfigResponse>;\n\nexport function useENSNodeConfig(\n parameters: WithSDKConfigParameter & UseENSNodeConfigParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createConfigQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n ...ASSUME_IMMUTABLE_QUERY,\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport type { UndefinedInitialDataOptions } from \"@tanstack/react-query\";\n\nimport {\n ENSNodeClient,\n type NameTokensRequest,\n type RegistrarActionsRequest,\n type ResolvePrimaryNameRequest,\n type ResolvePrimaryNamesRequest,\n type ResolveRecordsRequest,\n type ResolverRecordsSelection,\n} from \"@ensnode/ensnode-sdk\";\n\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Immutable query options for data that is assumed to be immutable and should only be fetched once per full page refresh per unique key.\n * Similar to SWR's immutable: true API.\n *\n * Use this for data that is assumed not to change (e.g., records for a specific name) until the next full page refresh.\n *\n * @example\n * ```tsx\n * useRecords({\n * name: \"vitalik.eth\",\n * selection: { texts: [\"avatar\"] },\n * query: ASSUME_IMMUTABLE_QUERY\n * })\n * ```\n */\nexport const ASSUME_IMMUTABLE_QUERY = {\n staleTime: Infinity,\n gcTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n refetchOnMount: false,\n} as const satisfies Partial<UndefinedInitialDataOptions>;\n\n/**\n * Query keys for hooks. Simply keys by path and arguments.\n */\nexport const queryKeys = {\n base: (url: string) => [\"ensnode\", url] as const,\n\n resolve: (url: string) => [...queryKeys.base(url), \"resolve\"] as const,\n\n records: (url: string, args: ResolveRecordsRequest<any>) =>\n [...queryKeys.resolve(url), \"records\", args] as const,\n\n primaryName: (url: string, args: ResolvePrimaryNameRequest) =>\n [...queryKeys.resolve(url), \"primary-name\", args] as const,\n\n primaryNames: (url: string, args: ResolvePrimaryNamesRequest) =>\n [...queryKeys.resolve(url), \"primary-names\", args] as const,\n\n config: (url: string) => [...queryKeys.base(url), \"config\"] as const,\n\n indexingStatus: (url: string) => [...queryKeys.base(url), \"indexing-status\"] as const,\n\n registrarActions: (url: string, args: RegistrarActionsRequest) =>\n [...queryKeys.base(url), \"registrar-actions\", args] as const,\n\n nameTokens: (url: string, args: NameTokensRequest) =>\n [...queryKeys.base(url), \"name-tokens\", args] as const,\n};\n\n/**\n * Creates query options for Records Resolution\n */\nexport function createRecordsQueryOptions<SELECTION extends ResolverRecordsSelection>(\n config: ENSNodeSDKConfig,\n args: ResolveRecordsRequest<SELECTION>,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.records(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolveRecords(args.name, args.selection, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNameQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNameRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryName(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryName(args.address, args.chainId, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNamesQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNamesRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryNames(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryNames(args.address, args);\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Config API\n */\nexport function createConfigQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.config(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.config();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Indexing Status API\n */\nexport function createIndexingStatusQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.indexingStatus(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.indexingStatus();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Registrar Actions API\n */\nexport function createRegistrarActionsQueryOptions(\n config: ENSNodeSDKConfig,\n args: RegistrarActionsRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.registrarActions(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.registrarActions(args);\n },\n };\n}\n\n/**\n * Creates query options for Name Tokens API\n */\nexport function createNameTokensQueryOptions(config: ENSNodeSDKConfig, args: NameTokensRequest) {\n return {\n enabled: true,\n queryKey: queryKeys.nameTokens(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.nameTokens(args);\n },\n };\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\n\nimport { ENSNodeContext } from \"../context\";\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Hook to access the ENSNodeSDKConfig from context or parameters.\n *\n * @param parameters - Optional config parameter that overrides context\n * @returns The ENSNode configuration\n * @throws Error if no config is available in context or parameters\n */\nexport function useENSNodeSDKConfig<TConfig extends ENSNodeSDKConfig = ENSNodeSDKConfig>(\n config: TConfig | undefined,\n): TConfig {\n const contextConfig = useContext(ENSNodeContext);\n\n // Use provided config or fall back to context\n const resolvedConfig = config ?? contextConfig;\n\n if (!resolvedConfig) {\n throw new Error(\n \"useENSNodeSDKConfig must be used within an ENSNodeProvider or you must pass a config parameter\",\n );\n }\n\n return resolvedConfig as TConfig;\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { IndexingStatusRequest, IndexingStatusResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createIndexingStatusQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseIndexingStatusParameters\n extends IndexingStatusRequest,\n QueryParameter<IndexingStatusResponse> {}\n\nexport function useIndexingStatus(\n parameters: WithSDKConfigParameter & UseIndexingStatusParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createIndexingStatusQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - indexing status changes frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { NameTokensRequest, NameTokensResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createNameTokensQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseNameTokensParameters = NameTokensRequest & QueryParameter<NameTokensResponse>;\n\n/**\n * Use Name Tokens hook\n *\n * Query ENSNode Name Tokens API.\n */\nexport function useNameTokens(parameters: WithSDKConfigParameter & UseNameTokensParameters) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createNameTokensQueryOptions(_config, parameters);\n\n return useQuery({\n ...queryOptions,\n refetchInterval: false, // no refetching - assume data is immutable until a full page refresh\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNameParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNameQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary name of a specified address (Reverse Resolution).\n *\n * The returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address is not normalized, `null` is returned as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary name\n *\n * @example\n * ```typescript\n * import { usePrimaryName } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNameAndAvatar() {\n * const { data, isLoading, error } = usePrimaryName({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * chainId: 1, // Ethereum Mainnet\n * accelerate: true, // Attempt Protocol Acceleration\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Primary Name (for Mainnet)</h3>\n * <p>{data.name ?? \"No Primary Name\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryName(parameters: UsePrimaryNameParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNameQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNamesParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNamesQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary names of a specified address across multiple chains.\n *\n * Each returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address on any chain is not normalized, `null` is returned for that chain as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary names\n *\n * @example\n * ```typescript\n * import { usePrimaryNames } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNames() {\n * const { data, isLoading, error } = usePrimaryNames({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * {Object.entries(data.names).map(([chainId, name]) => (\n * <div key={chainId}>\n * <h3>Primary Name (Chain Id: {chainId})</h3>\n * <p>{name}</p>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryNames(parameters: UsePrimaryNamesParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNamesQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\n\nimport type { UseRecordsParameters, WithSDKConfigParameter } from \"../types\";\nimport { createRecordsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves records for an ENS name (Forward Resolution).\n *\n * The returned `name` field, if set, is guaranteed to be a normalized name.\n * If the name record returned by the resolver is not normalized, `null` is returned as if no name record was set.\n *\n * @param parameters - Configuration for the ENS name resolution\n * @returns Query result with resolved records\n *\n * @example\n * ```typescript\n * import { useRecords } from \"@ensnode/ensnode-react\";\n *\n * function DisplayNameRecords() {\n * const { data, isLoading, error } = useRecords({\n * name: \"jesse.base.eth\",\n * selection: {\n * addresses: [60], // ETH CoinType\n * texts: [\"avatar\", \"com.twitter\"]\n * }\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Resolved Records for vitalik.eth</h3>\n * {data.records.addresses && (\n * <p>ETH Address: {data.records.addresses[60]}</p>\n * )}\n * {data.records.texts && (\n * <div>\n * <p>Avatar: {data.records.texts.avatar}</p>\n * <p>Twitter: {data.records.texts[\"com.twitter\"]}</p>\n * </div>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useRecords<SELECTION extends ResolverRecordsSelection>(\n parameters: UseRecordsParameters<SELECTION> & WithSDKConfigParameter,\n) {\n const { config, query = {}, name, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = name !== null;\n\n const queryOptions = canEnable\n ? createRecordsQueryOptions(_config, { ...args, name })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { RegistrarActionsRequest, RegistrarActionsResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createRegistrarActionsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseRegistrarActionsParameters\n extends RegistrarActionsRequest,\n QueryParameter<RegistrarActionsResponse> {}\n\n/**\n * Use Registrar Actions hook\n *\n * Query ENSNode Registrar Actions API.\n */\nexport function useRegistrarActions(\n parameters: WithSDKConfigParameter & UseRegistrarActionsParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createRegistrarActionsQueryOptions(_config, parameters);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - latest registrar actions change frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport {\n type ENSNamespaceId,\n getResolvePrimaryNameChainIdParam,\n type Identity,\n type NamedIdentity,\n ResolutionStatusIds,\n ResolvedIdentity,\n type UnknownIdentity,\n type UnnamedIdentity,\n type UnresolvedIdentity,\n} from \"@ensnode/ensnode-sdk\";\n\nimport { usePrimaryName } from \"./usePrimaryName\";\n\n// TODO: `namespaceId` ideally would not be a parameter for this hook.\n// Ideally it should come from the active namespace context and be a nested hook within this hook.\n// However, currently this hook lives in ENSAdmin and not in `ensnode-react`.\n/**\n * Parameters for the useResolvedIdentity hook.\n */\nexport interface UseResolvedIdentityParameters {\n identity: UnresolvedIdentity;\n namespaceId: ENSNamespaceId;\n accelerate?: boolean;\n}\n\n/**\n * Hook to perform ENSIP-19 primary name resolution to resolve an\n * {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.\n *\n * @param parameters - Configuration object for the hook\n * @param parameters.identity - An {@link UnresolvedIdentity} containing the {@link DefaultableChainId}\n * and {@link Address} to resolve.\n * @param parameters.namespaceId - The {@link ENSNamespaceId} that `identity.chainId` should be interpreted\n * through (via {@link getResolvePrimaryNameChainIdParam}) to determine the literal\n * chainId that should be used for ENSIP-19 primary name resolution.\n * @param parameters.accelerate - Whether to attempt Protocol Acceleration (default: false)\n * when resolving the primary name.\n *\n * @returns An object containing:\n * - `identity`: An {@link Identity} with one of four possible {@link ResolutionStatusIds}:\n * - {@link ResolutionStatusIds.Unresolved}: While the query is pending (loading state).\n * - {@link ResolutionStatusIds.Unknown}: If an error occurs during resolution.\n * - {@link ResolutionStatusIds.Unnamed}: If the resolution found no primary name.\n * - {@link ResolutionStatusIds.Named}: If a primary name is successfully resolved.\n * - All other properties from the underlying {@link usePrimaryName} query (e.g., `isLoading`, `error`, `refetch`, etc.)\n */\nexport function useResolvedIdentity(parameters: UseResolvedIdentityParameters) {\n const { identity, namespaceId, accelerate, ...args } = parameters;\n\n const {\n data: primaryNameData,\n status,\n ...query\n } = usePrimaryName({\n address: identity.address,\n chainId: getResolvePrimaryNameChainIdParam(identity.chainId, namespaceId),\n accelerate,\n ...args,\n });\n\n let result: Identity;\n\n if (status === \"pending\") {\n // loading state\n // return the `UnresolvedIdentity` to support loading state functionality.\n result = identity;\n } else if (status === \"error\") {\n result = {\n resolutionStatus: ResolutionStatusIds.Unknown,\n chainId: identity.chainId,\n address: identity.address,\n } satisfies UnknownIdentity;\n } else if (primaryNameData.name === null) {\n result = {\n resolutionStatus: ResolutionStatusIds.Unnamed,\n chainId: identity.chainId,\n address: identity.address,\n name: null,\n } satisfies UnnamedIdentity;\n } else {\n result = {\n resolutionStatus: ResolutionStatusIds.Named,\n chainId: identity.chainId,\n address: identity.address,\n name: primaryNameData.name,\n } satisfies NamedIdentity;\n }\n\n return {\n ...query,\n identity: result,\n };\n}\n","import {\n type DefaultError,\n type DefinedInitialDataOptions,\n type DefinedUseQueryResult,\n type QueryClient,\n type QueryKey,\n type QueryObserverSuccessResult,\n type UndefinedInitialDataOptions,\n type UseQueryOptions,\n type UseQueryResult,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\n\n/**\n * Use Stale-While-Revalidate Query\n *\n * This hooks is a proxy for {@link useQuery} with addition of the following\n * semantics:\n * - if the query has been resolved successfully just once,\n * the query result will always be success with data being the previously\n * cached result,\n * - the cached result can never go stale, or be garbage collected\n * - the cached result can be only overridden by the current result when\n * the query is successfully re-fetched (in other words,\n * the `options.queryFn` returns a resolved promise).\n *\n * Please note how there can be any number of failed queries before one\n * succeeds. In such case, no successful result has ever been cached and\n * the query fails (`isError: true`, `error` is available) until\n * the first successful resolution (`isSuccess: true`, `data` is available).\n *\n * @example\n * ```tsx\n * const swrQuery = useSwrQuery({\n * queryKey: ['data'],\n * queryFn: fetchData,\n * });\n *\n * if (swrQuery.isPending) {\n * // Show loading state while there's no cached successful result and\n * // no query attempt was finished yet.\n * return <>Loading...</>;\n * }\n *\n * if (swrQuery.isError) {\n * // Show error state when query attempt fails and\n * // no cached successful result is available.\n * return <>Error: {swrQuery.error.message}</>;\n * }\n *\n * // Otherwise, show data when the cached successful result is available.\n * return <>Data: {JSON.stringify(swrQuery.data)}</>;\n * ```\n */\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError> {\n const queryClientFromContext = useQueryClient();\n const derivedQueryClient = queryClient ?? queryClientFromContext;\n\n // cacheResult, if available, is always the last successfully resolved query data\n const cachedSuccessfulResult = derivedQueryClient.getQueryData<TData>(options.queryKey);\n\n const queryResult = useQuery(\n {\n ...options,\n // cached result can never be stale\n staleTime: cachedSuccessfulResult ? Infinity : undefined,\n // cached result can never be removed by garbage collector\n gcTime: cachedSuccessfulResult ? Infinity : undefined,\n },\n queryClient,\n );\n\n // memoize query results to avoid unnecessary UI re-rendering\n const memoizedQueryResult = useMemo(() => {\n // If the query result is error\n // and the cachedSuccessfulResult is available\n // override the query result to be success, replacing the unsuccessful\n // result with the most recent cachedSuccessfulResult\n if (queryResult.isError && cachedSuccessfulResult) {\n return {\n ...queryResult,\n // set error props\n isError: false,\n error: null,\n isRefetchError: false,\n isLoadingError: false,\n // st success props\n isSuccess: true,\n status: \"success\",\n data: cachedSuccessfulResult,\n } satisfies QueryObserverSuccessResult<TData, TError>;\n }\n\n return queryResult;\n }, [queryResult, cachedSuccessfulResult]);\n\n return memoizedQueryResult;\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: conditional hooks used correctly here */\n\"use client\";\n\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { createElement, useMemo } from \"react\";\n\nimport { ENSNodeClient } from \"@ensnode/ensnode-sdk\";\n\nimport { ENSNodeContext } from \"./context\";\nimport type { ENSNodeSDKConfig } from \"./types\";\n\nexport interface ENSNodeProviderProps {\n /** ENSNode configuration */\n config: ENSNodeSDKConfig;\n\n /**\n * Optional QueryClient instance. If provided, you must wrap your app with QueryClientProvider yourself.\n * If not provided, ENSNodeProvider will create and manage its own QueryClient internally.\n */\n queryClient?: QueryClient;\n\n /**\n * Custom query client options when auto-creating a QueryClient.\n * Only used when queryClient is not provided.\n */\n queryClientOptions?: ConstructorParameters<typeof QueryClient>[0];\n}\n\nfunction ENSNodeInternalProvider({\n children,\n config,\n}: {\n children?: React.ReactNode;\n config: ENSNodeSDKConfig;\n}) {\n // Memoize the config to prevent unnecessary re-renders\n const memoizedConfig = useMemo(() => config, [config]);\n\n return createElement(ENSNodeContext.Provider, { value: memoizedConfig }, children);\n}\n\nexport function ENSNodeProvider(parameters: React.PropsWithChildren<ENSNodeProviderProps>) {\n const { children, config, queryClient, queryClientOptions } = parameters;\n\n // Check if we're already inside a QueryClientProvider\n let hasExistingQueryClient = false;\n try {\n hasExistingQueryClient = Boolean(useQueryClient());\n } catch {\n // useQueryClient throws if not inside a QueryClientProvider\n hasExistingQueryClient = false;\n }\n\n // If user provided a queryClient, they must handle QueryClientProvider themselves\n if (queryClient) {\n if (!hasExistingQueryClient) {\n throw new Error(\n \"When providing a custom queryClient, you must wrap your app with QueryClientProvider. \" +\n \"Either remove the queryClient prop to use auto-managed setup, or wrap with QueryClientProvider.\",\n );\n }\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // If already inside a QueryClientProvider, just use that\n if (hasExistingQueryClient) {\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // Create our own QueryClient and QueryClientProvider\n const defaultQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n retry: 3,\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 30, // 30 minutes\n refetchInterval: 1000 * 10, // 10 seconds\n },\n },\n ...queryClientOptions,\n }),\n [queryClientOptions],\n );\n\n return createElement(\n QueryClientProvider,\n { client: defaultQueryClient },\n createElement(ENSNodeInternalProvider, { config, children }),\n );\n}\n\n/**\n * Helper function to create ENSNode configuration\n */\nexport function createConfig(options?: { url?: string | URL }): ENSNodeSDKConfig {\n const url = options?.url ? new URL(options.url) : ENSNodeClient.defaultOptions().url;\n\n return {\n client: {\n ...ENSNodeClient.defaultOptions(),\n url,\n },\n };\n}\n"],"mappings":";AAAA,SAAS,qBAAqB;AAOvB,IAAM,iBAAiB,cAA4C,MAAS;AAKnF,eAAe,cAAc;;;ACZ7B,SAAS,gBAAgB;;;ACIzB;AAAA,EACE;AAAA,OAOK;AAmBA,IAAM,yBAAyB;AAAA,EACpC,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,gBAAgB;AAClB;AAKO,IAAM,YAAY;AAAA,EACvB,MAAM,CAAC,QAAgB,CAAC,WAAW,GAAG;AAAA,EAEtC,SAAS,CAAC,QAAgB,CAAC,GAAG,UAAU,KAAK,GAAG,GAAG,SAAS;AAAA,EAE5D,SAAS,CAAC,KAAa,SACrB,CAAC,GAAG,UAAU,QAAQ,GAAG,GAAG,WAAW,IAAI;AAAA,EAE7C,aAAa,CAAC,KAAa,SACzB,CAAC,GAAG,UAAU,QAAQ,GAAG,GAAG,gBAAgB,IAAI;AAAA,EAElD,cAAc,CAAC,KAAa,SAC1B,CAAC,GAAG,UAAU,QAAQ,GAAG,GAAG,iBAAiB,IAAI;AAAA,EAEnD,QAAQ,CAAC,QAAgB,CAAC,GAAG,UAAU,KAAK,GAAG,GAAG,QAAQ;AAAA,EAE1D,gBAAgB,CAAC,QAAgB,CAAC,GAAG,UAAU,KAAK,GAAG,GAAG,iBAAiB;AAAA,EAE3E,kBAAkB,CAAC,KAAa,SAC9B,CAAC,GAAG,UAAU,KAAK,GAAG,GAAG,qBAAqB,IAAI;AAAA,EAEpD,YAAY,CAAC,KAAa,SACxB,CAAC,GAAG,UAAU,KAAK,GAAG,GAAG,eAAe,IAAI;AAChD;AAKO,SAAS,0BACd,QACA,MACA;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,UAAU,QAAQ,OAAO,OAAO,IAAI,MAAM,IAAI;AAAA,IACxD,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,cAAc,OAAO,MAAM;AAC9C,aAAO,OAAO,eAAe,KAAK,MAAM,KAAK,WAAW,IAAI;AAAA,IAC9D;AAAA,EACF;AACF;AAKO,SAAS,8BACd,QACA,MACA;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,UAAU,YAAY,OAAO,OAAO,IAAI,MAAM,IAAI;AAAA,IAC5D,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,cAAc,OAAO,MAAM;AAC9C,aAAO,OAAO,mBAAmB,KAAK,SAAS,KAAK,SAAS,IAAI;AAAA,IACnE;AAAA,EACF;AACF;AAKO,SAAS,+BACd,QACA,MACA;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,UAAU,aAAa,OAAO,OAAO,IAAI,MAAM,IAAI;AAAA,IAC7D,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,cAAc,OAAO,MAAM;AAC9C,aAAO,OAAO,oBAAoB,KAAK,SAAS,IAAI;AAAA,IACtD;AAAA,EACF;AACF;AAKO,SAAS,yBAAyB,QAA0B;AACjE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,UAAU,OAAO,OAAO,OAAO,IAAI,IAAI;AAAA,IACjD,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,cAAc,OAAO,MAAM;AAC9C,aAAO,OAAO,OAAO;AAAA,IACvB;AAAA,EACF;AACF;AAKO,SAAS,iCAAiC,QAA0B;AACzE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,UAAU,eAAe,OAAO,OAAO,IAAI,IAAI;AAAA,IACzD,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,cAAc,OAAO,MAAM;AAC9C,aAAO,OAAO,eAAe;AAAA,IAC/B;AAAA,EACF;AACF;AAKO,SAAS,mCACd,QACA,MACA;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,UAAU,iBAAiB,OAAO,OAAO,IAAI,MAAM,IAAI;AAAA,IACjE,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,cAAc,OAAO,MAAM;AAE9C,aAAO,OAAO,iBAAiB,IAAI;AAAA,IACrC;AAAA,EACF;AACF;AAKO,SAAS,6BAA6B,QAA0B,MAAyB;AAC9F,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,UAAU,WAAW,OAAO,OAAO,IAAI,MAAM,IAAI;AAAA,IAC3D,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,cAAc,OAAO,MAAM;AAE9C,aAAO,OAAO,WAAW,IAAI;AAAA,IAC/B;AAAA,EACF;AACF;;;AC/KA,SAAS,kBAAkB;AAYpB,SAAS,oBACd,QACS;AACT,QAAM,gBAAgB,WAAW,cAAc;AAG/C,QAAM,iBAAiB,UAAU;AAEjC,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AFnBO,SAAS,iBACd,aAAkE,CAAC,GACnE;AACA,QAAM,EAAE,QAAQ,QAAQ,CAAC,EAAE,IAAI;AAC/B,QAAM,UAAU,oBAAoB,MAAM;AAE1C,QAAM,eAAe,yBAAyB,OAAO;AAErD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,SAAS,MAAM,WAAW,aAAa;AAAA,EACzC;AAEA,SAAO,SAAS,OAAO;AACzB;;;AG1BA,SAAS,YAAAA,iBAAgB;AAYlB,SAAS,kBACd,aAAmE,CAAC,GACpE;AACA,QAAM,EAAE,QAAQ,QAAQ,CAAC,EAAE,IAAI;AAC/B,QAAM,UAAU,oBAAoB,MAAM;AAE1C,QAAM,eAAe,iCAAiC,OAAO;AAE7D,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,iBAAiB,KAAK;AAAA;AAAA,IACtB,GAAG;AAAA,IACH,SAAS,MAAM,WAAW,aAAa;AAAA,EACzC;AAEA,SAAOC,UAAS,OAAO;AACzB;;;AC5BA,SAAS,YAAAC,iBAAgB;AAelB,SAAS,cAAc,YAA8D;AAC1F,QAAM,EAAE,QAAQ,QAAQ,CAAC,EAAE,IAAI;AAC/B,QAAM,UAAU,oBAAoB,MAAM;AAE1C,QAAM,eAAe,6BAA6B,SAAS,UAAU;AAErE,SAAOC,UAAS;AAAA,IACd,GAAG;AAAA,IACH,iBAAiB;AAAA;AAAA,IACjB,GAAG;AAAA,IACH,SAAS,MAAM,WAAW,aAAa;AAAA,EACzC,CAAC;AACH;;;ACzBA,SAAS,YAAAC,iBAAgB;AAsClB,SAAS,eAAe,YAA+D;AAC5F,QAAM,EAAE,QAAQ,QAAQ,CAAC,GAAG,SAAS,GAAG,KAAK,IAAI;AACjD,QAAM,UAAU,oBAAoB,MAAM;AAE1C,QAAM,YAAY,YAAY;AAE9B,QAAM,eAAe,YACjB,8BAA8B,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,IAC3D,EAAE,SAAS,OAAO,UAAU,CAAC,UAAU,EAAW;AAEtD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,IACH,SAAS,cAAc,MAAM,WAAW,aAAa;AAAA,EACvD;AAEA,SAAOC,UAAS,OAAO;AACzB;;;ACvDA,SAAS,YAAAC,iBAAgB;AAwClB,SAAS,gBAAgB,YAAgE;AAC9F,QAAM,EAAE,QAAQ,QAAQ,CAAC,GAAG,SAAS,GAAG,KAAK,IAAI;AACjD,QAAM,UAAU,oBAAoB,MAAM;AAE1C,QAAM,YAAY,YAAY;AAE9B,QAAM,eAAe,YACjB,+BAA+B,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,IAC5D,EAAE,SAAS,OAAO,UAAU,CAAC,UAAU,EAAW;AAEtD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,IACH,SAAS,cAAc,MAAM,WAAW,aAAa;AAAA,EACvD;AAEA,SAAOC,UAAS,OAAO;AACzB;;;ACzDA,SAAS,YAAAC,iBAAgB;AAkDlB,SAAS,WACd,YACA;AACA,QAAM,EAAE,QAAQ,QAAQ,CAAC,GAAG,MAAM,GAAG,KAAK,IAAI;AAC9C,QAAM,UAAU,oBAAoB,MAAM;AAE1C,QAAM,YAAY,SAAS;AAE3B,QAAM,eAAe,YACjB,0BAA0B,SAAS,EAAE,GAAG,MAAM,KAAK,CAAC,IACpD,EAAE,SAAS,OAAO,UAAU,CAAC,UAAU,EAAW;AAEtD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,GAAG;AAAA,IACH,SAAS,cAAc,MAAM,WAAW,aAAa;AAAA,EACvD;AAEA,SAAOC,UAAS,OAAO;AACzB;;;ACvEA,SAAS,YAAAC,iBAAgB;AAiBlB,SAAS,oBACd,aAAqE,CAAC,GACtE;AACA,QAAM,EAAE,QAAQ,QAAQ,CAAC,EAAE,IAAI;AAC/B,QAAM,UAAU,oBAAoB,MAAM;AAE1C,QAAM,eAAe,mCAAmC,SAAS,UAAU;AAE3E,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,iBAAiB,KAAK;AAAA;AAAA,IACtB,GAAG;AAAA,IACH,SAAS,MAAM,WAAW,aAAa;AAAA,EACzC;AAEA,SAAOC,UAAS,OAAO;AACzB;;;AC/BA;AAAA,EAEE;AAAA,EAGA;AAAA,OAKK;AAqCA,SAAS,oBAAoB,YAA2C;AAC7E,QAAM,EAAE,UAAU,aAAa,YAAY,GAAG,KAAK,IAAI;AAEvD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,GAAG;AAAA,EACL,IAAI,eAAe;AAAA,IACjB,SAAS,SAAS;AAAA,IAClB,SAAS,kCAAkC,SAAS,SAAS,WAAW;AAAA,IACxE;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AAED,MAAI;AAEJ,MAAI,WAAW,WAAW;AAGxB,aAAS;AAAA,EACX,WAAW,WAAW,SAAS;AAC7B,aAAS;AAAA,MACP,kBAAkB,oBAAoB;AAAA,MACtC,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS;AAAA,IACpB;AAAA,EACF,WAAW,gBAAgB,SAAS,MAAM;AACxC,aAAS;AAAA,MACP,kBAAkB,oBAAoB;AAAA,MACtC,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS;AAAA,MAClB,MAAM;AAAA,IACR;AAAA,EACF,OAAO;AACL,aAAS;AAAA,MACP,kBAAkB,oBAAoB;AAAA,MACtC,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS;AAAA,MAClB,MAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,EACZ;AACF;;;AC/FA;AAAA,EAUE,YAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AAsEjB,SAAS,YAMd,SACA,aACwC;AACxC,QAAM,yBAAyB,eAAe;AAC9C,QAAM,qBAAqB,eAAe;AAG1C,QAAM,yBAAyB,mBAAmB,aAAoB,QAAQ,QAAQ;AAEtF,QAAM,cAAcA;AAAA,IAClB;AAAA,MACE,GAAG;AAAA;AAAA,MAEH,WAAW,yBAAyB,WAAW;AAAA;AAAA,MAE/C,QAAQ,yBAAyB,WAAW;AAAA,IAC9C;AAAA,IACA;AAAA,EACF;AAGA,QAAM,sBAAsB,QAAQ,MAAM;AAKxC,QAAI,YAAY,WAAW,wBAAwB;AACjD,aAAO;AAAA,QACL,GAAG;AAAA;AAAA,QAEH,SAAS;AAAA,QACT,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,gBAAgB;AAAA;AAAA,QAEhB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,sBAAsB,CAAC;AAExC,SAAO;AACT;;;ACnIA,SAAS,aAAa,qBAAqB,kBAAAC,uBAAsB;AACjE,SAAS,eAAe,WAAAC,gBAAe;AAEvC,SAAS,iBAAAC,sBAAqB;AAsB9B,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AACF,GAGG;AAED,QAAM,iBAAiBC,SAAQ,MAAM,QAAQ,CAAC,MAAM,CAAC;AAErD,SAAO,cAAc,eAAe,UAAU,EAAE,OAAO,eAAe,GAAG,QAAQ;AACnF;AAEO,SAAS,gBAAgB,YAA2D;AACzF,QAAM,EAAE,UAAU,QAAQ,aAAa,mBAAmB,IAAI;AAG9D,MAAI,yBAAyB;AAC7B,MAAI;AACF,6BAAyB,QAAQC,gBAAe,CAAC;AAAA,EACnD,QAAQ;AAEN,6BAAyB;AAAA,EAC3B;AAGA,MAAI,aAAa;AACf,QAAI,CAAC,wBAAwB;AAC3B,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AACA,WAAO,cAAc,yBAAyB,EAAE,QAAQ,SAAS,CAAC;AAAA,EACpE;AAGA,MAAI,wBAAwB;AAC1B,WAAO,cAAc,yBAAyB,EAAE,QAAQ,SAAS,CAAC;AAAA,EACpE;AAGA,QAAM,qBAAqBD;AAAA,IACzB,MACE,IAAI,YAAY;AAAA,MACd,gBAAgB;AAAA,QACd,SAAS;AAAA,UACP,OAAO;AAAA,UACP,WAAW,MAAO,KAAK;AAAA;AAAA,UACvB,QAAQ,MAAO,KAAK;AAAA;AAAA,UACpB,iBAAiB,MAAO;AAAA;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,IACH,CAAC,kBAAkB;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,QAAQ,mBAAmB;AAAA,IAC7B,cAAc,yBAAyB,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC7D;AACF;AAKO,SAAS,aAAa,SAAoD;AAC/E,QAAM,MAAM,SAAS,MAAM,IAAI,IAAI,QAAQ,GAAG,IAAIE,eAAc,eAAe,EAAE;AAEjF,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,GAAGA,eAAc,eAAe;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;","names":["useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQueryClient","useMemo","ENSNodeClient","useMemo","useQueryClient","ENSNodeClient"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/hooks/useENSNodeConfig.ts","../src/utils/query.ts","../src/hooks/useENSNodeSDKConfig.ts","../src/hooks/useIndexingStatus.ts","../src/hooks/useNameTokens.ts","../src/hooks/usePrimaryName.ts","../src/hooks/usePrimaryNames.ts","../src/hooks/useRecords.ts","../src/hooks/useRegistrarActions.ts","../src/hooks/useResolvedIdentity.ts","../src/hooks/useSwrQuery.ts","../src/provider.tsx"],"sourcesContent":["import { createContext } from \"react\";\n\nimport type { ENSNodeSDKConfig } from \"./types\";\n\n/**\n * React context for ENSNode configuration\n */\nexport const ENSNodeContext = createContext<ENSNodeSDKConfig | undefined>(undefined);\n\n/**\n * Display name for debugging\n */\nENSNodeContext.displayName = \"ENSNodeContext\";\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { ConfigResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { ASSUME_IMMUTABLE_QUERY, createConfigQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseENSNodeConfigParameters = QueryParameter<ConfigResponse>;\n\nexport function useENSNodeConfig(\n parameters: WithSDKConfigParameter & UseENSNodeConfigParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createConfigQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n ...ASSUME_IMMUTABLE_QUERY,\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport type { UndefinedInitialDataOptions } from \"@tanstack/react-query\";\n\nimport {\n ENSNodeClient,\n type NameTokensRequest,\n type RegistrarActionsRequest,\n type ResolvePrimaryNameRequest,\n type ResolvePrimaryNamesRequest,\n type ResolveRecordsRequest,\n type ResolverRecordsSelection,\n} from \"@ensnode/ensnode-sdk\";\n\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Immutable query options for data that is assumed to be immutable and should only be fetched once per full page refresh per unique key.\n * Similar to SWR's immutable: true API.\n *\n * Use this for data that is assumed not to change (e.g., records for a specific name) until the next full page refresh.\n *\n * @example\n * ```tsx\n * useRecords({\n * name: \"vitalik.eth\",\n * selection: { texts: [\"avatar\"] },\n * query: ASSUME_IMMUTABLE_QUERY\n * })\n * ```\n */\nexport const ASSUME_IMMUTABLE_QUERY = {\n staleTime: Infinity,\n gcTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n refetchOnMount: false,\n} as const satisfies Partial<UndefinedInitialDataOptions>;\n\n/**\n * Query keys for hooks. Simply keys by path and arguments.\n */\nexport const queryKeys = {\n base: (url: string) => [\"ensnode\", url] as const,\n\n resolve: (url: string) => [...queryKeys.base(url), \"resolve\"] as const,\n\n records: (url: string, args: ResolveRecordsRequest<any>) =>\n [...queryKeys.resolve(url), \"records\", args] as const,\n\n primaryName: (url: string, args: ResolvePrimaryNameRequest) =>\n [...queryKeys.resolve(url), \"primary-name\", args] as const,\n\n primaryNames: (url: string, args: ResolvePrimaryNamesRequest) =>\n [...queryKeys.resolve(url), \"primary-names\", args] as const,\n\n config: (url: string) => [...queryKeys.base(url), \"config\"] as const,\n\n indexingStatus: (url: string) => [...queryKeys.base(url), \"indexing-status\"] as const,\n\n registrarActions: (url: string, args: RegistrarActionsRequest) =>\n [...queryKeys.base(url), \"registrar-actions\", args] as const,\n\n nameTokens: (url: string, args: NameTokensRequest) =>\n [...queryKeys.base(url), \"name-tokens\", args] as const,\n};\n\n/**\n * Creates query options for Records Resolution\n */\nexport function createRecordsQueryOptions<SELECTION extends ResolverRecordsSelection>(\n config: ENSNodeSDKConfig,\n args: ResolveRecordsRequest<SELECTION>,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.records(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolveRecords(args.name, args.selection, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNameQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNameRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryName(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryName(args.address, args.chainId, args);\n },\n };\n}\n\n/**\n * Creates query options for Primary Name Resolution\n */\nexport function createPrimaryNamesQueryOptions(\n config: ENSNodeSDKConfig,\n args: ResolvePrimaryNamesRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.primaryNames(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.resolvePrimaryNames(args.address, args);\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Config API\n */\nexport function createConfigQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.config(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.config();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Indexing Status API\n */\nexport function createIndexingStatusQueryOptions(config: ENSNodeSDKConfig) {\n return {\n enabled: true,\n queryKey: queryKeys.indexingStatus(config.client.url.href),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n return client.indexingStatus();\n },\n };\n}\n\n/**\n * Creates query options for ENSNode Registrar Actions API\n */\nexport function createRegistrarActionsQueryOptions(\n config: ENSNodeSDKConfig,\n args: RegistrarActionsRequest,\n) {\n return {\n enabled: true,\n queryKey: queryKeys.registrarActions(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.registrarActions(args);\n },\n };\n}\n\n/**\n * Creates query options for Name Tokens API\n */\nexport function createNameTokensQueryOptions(config: ENSNodeSDKConfig, args: NameTokensRequest) {\n return {\n enabled: true,\n queryKey: queryKeys.nameTokens(config.client.url.href, args),\n queryFn: async () => {\n const client = new ENSNodeClient(config.client);\n\n return client.nameTokens(args);\n },\n };\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\n\nimport { ENSNodeContext } from \"../context\";\nimport type { ENSNodeSDKConfig } from \"../types\";\n\n/**\n * Hook to access the ENSNodeSDKConfig from context or parameters.\n *\n * @param parameters - Optional config parameter that overrides context\n * @returns The ENSNode configuration\n * @throws Error if no config is available in context or parameters\n */\nexport function useENSNodeSDKConfig<TConfig extends ENSNodeSDKConfig = ENSNodeSDKConfig>(\n config: TConfig | undefined,\n): TConfig {\n const contextConfig = useContext(ENSNodeContext);\n\n // Use provided config or fall back to context\n const resolvedConfig = config ?? contextConfig;\n\n if (!resolvedConfig) {\n throw new Error(\n \"useENSNodeSDKConfig must be used within an ENSNodeProvider or you must pass a config parameter\",\n );\n }\n\n return resolvedConfig as TConfig;\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { IndexingStatusRequest, IndexingStatusResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createIndexingStatusQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseIndexingStatusParameters\n extends IndexingStatusRequest,\n QueryParameter<IndexingStatusResponse> {}\n\nexport function useIndexingStatus(\n parameters: WithSDKConfigParameter & UseIndexingStatusParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createIndexingStatusQueryOptions(_config);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - indexing status changes frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { NameTokensRequest, NameTokensResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createNameTokensQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ntype UseNameTokensParameters = NameTokensRequest & QueryParameter<NameTokensResponse>;\n\n/**\n * Use Name Tokens hook\n *\n * Query ENSNode Name Tokens API.\n */\nexport function useNameTokens(parameters: WithSDKConfigParameter & UseNameTokensParameters) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createNameTokensQueryOptions(_config, parameters);\n\n return useQuery({\n ...queryOptions,\n refetchInterval: false, // no refetching - assume data is immutable until a full page refresh\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n });\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNameParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNameQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary name of a specified address (Reverse Resolution).\n *\n * The returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address is not normalized, `null` is returned as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary name\n *\n * @example\n * ```typescript\n * import { usePrimaryName } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNameAndAvatar() {\n * const { data, isLoading, error } = usePrimaryName({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * chainId: 1, // Ethereum Mainnet\n * accelerate: true, // Attempt Protocol Acceleration\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Primary Name (for Mainnet)</h3>\n * <p>{data.name ?? \"No Primary Name\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryName(parameters: UsePrimaryNameParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNameQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { UsePrimaryNamesParameters, WithSDKConfigParameter } from \"../types\";\nimport { createPrimaryNamesQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves the primary names of a specified address across multiple chains.\n *\n * Each returned Primary Name, if set, is guaranteed to be a normalized name.\n * If the primary name set for the address on any chain is not normalized, `null` is returned for that chain as if no primary name was set.\n *\n * @param parameters - Configuration for the address resolution\n * @returns Query result with resolved primary names\n *\n * @example\n * ```typescript\n * import { usePrimaryNames } from \"@ensnode/ensnode-react\";\n *\n * function DisplayPrimaryNames() {\n * const { data, isLoading, error } = usePrimaryNames({\n * address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * {Object.entries(data.names).map(([chainId, name]) => (\n * <div key={chainId}>\n * <h3>Primary Name (Chain Id: {chainId})</h3>\n * <p>{name}</p>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrimaryNames(parameters: UsePrimaryNamesParameters & WithSDKConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = address !== null;\n\n const queryOptions = canEnable\n ? createPrimaryNamesQueryOptions(_config, { ...args, address })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\n\nimport type { UseRecordsParameters, WithSDKConfigParameter } from \"../types\";\nimport { createRecordsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\n/**\n * Resolves records for an ENS name (Forward Resolution).\n *\n * The returned `name` field, if set, is guaranteed to be a normalized name.\n * If the name record returned by the resolver is not normalized, `null` is returned as if no name record was set.\n *\n * @param parameters - Configuration for the ENS name resolution\n * @returns Query result with resolved records\n *\n * @example\n * ```typescript\n * import { useRecords } from \"@ensnode/ensnode-react\";\n *\n * function DisplayNameRecords() {\n * const { data, isLoading, error } = useRecords({\n * name: \"jesse.base.eth\",\n * selection: {\n * addresses: [60], // ETH CoinType\n * texts: [\"avatar\", \"com.twitter\"]\n * }\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <div>\n * <h3>Resolved Records for vitalik.eth</h3>\n * {data.records.addresses && (\n * <p>ETH Address: {data.records.addresses[60]}</p>\n * )}\n * {data.records.texts && (\n * <div>\n * <p>Avatar: {data.records.texts.avatar}</p>\n * <p>Twitter: {data.records.texts[\"com.twitter\"]}</p>\n * </div>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useRecords<SELECTION extends ResolverRecordsSelection>(\n parameters: UseRecordsParameters<SELECTION> & WithSDKConfigParameter,\n) {\n const { config, query = {}, name, ...args } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const canEnable = name !== null;\n\n const queryOptions = canEnable\n ? createRecordsQueryOptions(_config, { ...args, name })\n : { enabled: false, queryKey: [\"disabled\"] as const };\n\n const options = {\n ...queryOptions,\n ...query,\n enabled: canEnable && (query.enabled ?? queryOptions.enabled),\n };\n\n return useQuery(options);\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport type { RegistrarActionsRequest, RegistrarActionsResponse } from \"@ensnode/ensnode-sdk\";\n\nimport type { QueryParameter, WithSDKConfigParameter } from \"../types\";\nimport { createRegistrarActionsQueryOptions } from \"../utils/query\";\nimport { useENSNodeSDKConfig } from \"./useENSNodeSDKConfig\";\n\ninterface UseRegistrarActionsParameters\n extends RegistrarActionsRequest,\n QueryParameter<RegistrarActionsResponse> {}\n\n/**\n * Use Registrar Actions hook\n *\n * Query ENSNode Registrar Actions API.\n */\nexport function useRegistrarActions(\n parameters: WithSDKConfigParameter & UseRegistrarActionsParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeSDKConfig(config);\n\n const queryOptions = createRegistrarActionsQueryOptions(_config, parameters);\n\n const options = {\n ...queryOptions,\n refetchInterval: 10 * 1000, // 10 seconds - latest registrar actions change frequently\n ...query,\n enabled: query.enabled ?? queryOptions.enabled,\n };\n\n return useQuery(options);\n}\n","\"use client\";\n\nimport {\n type ENSNamespaceId,\n ENSNamespaceIds,\n getResolvePrimaryNameChainIdParam,\n type Identity,\n type NamedIdentity,\n ResolutionStatusIds,\n ResolvedIdentity,\n type UnknownIdentity,\n type UnnamedIdentity,\n type UnresolvedIdentity,\n} from \"@ensnode/ensnode-sdk\";\n\nimport type { UseResolvedIdentityParameters } from \"../types\";\nimport { useENSNodeConfig } from \"./useENSNodeConfig\";\nimport { usePrimaryName } from \"./usePrimaryName\";\n\n/**\n * Hook to perform ENSIP-19 primary name resolution to resolve an\n * {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.\n *\n * @param parameters - Configuration object for the hook\n * @param parameters.identity - An {@link UnresolvedIdentity} containing the {@link DefaultableChainId}\n * and {@link Address} to resolve.\n * @param parameters.namespaceId - The {@link ENSNamespaceId} that `identity.chainId` should be interpreted\n * through (via {@link getResolvePrimaryNameChainIdParam}) to determine the literal\n * chainId that should be used for ENSIP-19 primary name resolution.\n * @param parameters.accelerate - Whether to attempt Protocol Acceleration (default: false)\n * when resolving the primary name.\n *\n * @returns An object containing:\n * - `identity`: An {@link Identity} with one of four possible {@link ResolutionStatusIds}:\n * - {@link ResolutionStatusIds.Unresolved}: While the query is pending (loading state).\n * - {@link ResolutionStatusIds.Unknown}: If an error occurs during resolution.\n * - {@link ResolutionStatusIds.Unnamed}: If the resolution found no primary name.\n * - {@link ResolutionStatusIds.Named}: If a primary name is successfully resolved.\n * - All other properties from the underlying {@link usePrimaryName} query (e.g., `isLoading`, `error`, `refetch`, etc.)\n */\nexport function useResolvedIdentity(parameters: UseResolvedIdentityParameters) {\n const { identity, accelerate, query: _query = {} } = parameters;\n\n const { data } = useENSNodeConfig();\n const namespace = data?.ensIndexerPublicConfig.namespace;\n\n const {\n data: primaryNameData,\n status,\n ...query\n } = usePrimaryName({\n address: identity.address,\n chainId: getResolvePrimaryNameChainIdParam(\n identity.chainId,\n // NOTE: defaulting here for typechecking, but enabled prevents fetching before namespace is known\n namespace ?? ENSNamespaceIds.Mainnet,\n ),\n accelerate,\n query: {\n ..._query,\n enabled: (_query.enabled ?? true) && namespace !== undefined,\n },\n });\n\n let result: Identity;\n\n if (status === \"pending\") {\n // loading state\n // return the `UnresolvedIdentity` to support loading state functionality.\n result = identity;\n } else if (status === \"error\") {\n result = {\n resolutionStatus: ResolutionStatusIds.Unknown,\n chainId: identity.chainId,\n address: identity.address,\n } satisfies UnknownIdentity;\n } else if (primaryNameData.name === null) {\n result = {\n resolutionStatus: ResolutionStatusIds.Unnamed,\n chainId: identity.chainId,\n address: identity.address,\n name: null,\n } satisfies UnnamedIdentity;\n } else {\n result = {\n resolutionStatus: ResolutionStatusIds.Named,\n chainId: identity.chainId,\n address: identity.address,\n name: primaryNameData.name,\n } satisfies NamedIdentity;\n }\n\n return {\n ...query,\n identity: result,\n };\n}\n","import {\n type DefaultError,\n type DefinedInitialDataOptions,\n type DefinedUseQueryResult,\n type QueryClient,\n type QueryKey,\n type QueryObserverSuccessResult,\n type UndefinedInitialDataOptions,\n type UseQueryOptions,\n type UseQueryResult,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\n\n/**\n * Use Stale-While-Revalidate Query\n *\n * This hooks is a proxy for {@link useQuery} with addition of the following\n * semantics:\n * - if the query has been resolved successfully just once,\n * the query result will always be success with data being the previously\n * cached result,\n * - the cached result can never go stale, or be garbage collected\n * - the cached result can be only overridden by the current result when\n * the query is successfully re-fetched (in other words,\n * the `options.queryFn` returns a resolved promise).\n *\n * Please note how there can be any number of failed queries before one\n * succeeds. In such case, no successful result has ever been cached and\n * the query fails (`isError: true`, `error` is available) until\n * the first successful resolution (`isSuccess: true`, `data` is available).\n *\n * @example\n * ```tsx\n * const swrQuery = useSwrQuery({\n * queryKey: ['data'],\n * queryFn: fetchData,\n * });\n *\n * if (swrQuery.isPending) {\n * // Show loading state while there's no cached successful result and\n * // no query attempt was finished yet.\n * return <>Loading...</>;\n * }\n *\n * if (swrQuery.isError) {\n * // Show error state when query attempt fails and\n * // no cached successful result is available.\n * return <>Error: {swrQuery.error.message}</>;\n * }\n *\n * // Otherwise, show data when the cached successful result is available.\n * return <>Data: {JSON.stringify(swrQuery.data)}</>;\n * ```\n */\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError>;\nexport function useSwrQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<NoInfer<TData>, TError> {\n const queryClientFromContext = useQueryClient();\n const derivedQueryClient = queryClient ?? queryClientFromContext;\n\n // cacheResult, if available, is always the last successfully resolved query data\n const cachedSuccessfulResult = derivedQueryClient.getQueryData<TData>(options.queryKey);\n\n const queryResult = useQuery(\n {\n ...options,\n // cached result can never be stale\n staleTime: cachedSuccessfulResult ? Infinity : undefined,\n // cached result can never be removed by garbage collector\n gcTime: cachedSuccessfulResult ? Infinity : undefined,\n },\n queryClient,\n );\n\n // memoize query results to avoid unnecessary UI re-rendering\n const memoizedQueryResult = useMemo(() => {\n // If the query result is error\n // and the cachedSuccessfulResult is available\n // override the query result to be success, replacing the unsuccessful\n // result with the most recent cachedSuccessfulResult\n if (queryResult.isError && cachedSuccessfulResult) {\n return {\n ...queryResult,\n // set error props\n isError: false,\n error: null,\n isRefetchError: false,\n isLoadingError: false,\n // st success props\n isSuccess: true,\n status: \"success\",\n data: cachedSuccessfulResult,\n } satisfies QueryObserverSuccessResult<TData, TError>;\n }\n\n return queryResult;\n }, [queryResult, cachedSuccessfulResult]);\n\n return memoizedQueryResult;\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: conditional hooks used correctly here */\n\"use client\";\n\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { createElement, useMemo } from \"react\";\n\nimport { ENSNodeClient } from \"@ensnode/ensnode-sdk\";\n\nimport { ENSNodeContext } from \"./context\";\nimport type { ENSNodeSDKConfig } from \"./types\";\n\nexport interface ENSNodeProviderProps {\n /** ENSNode configuration */\n config: ENSNodeSDKConfig;\n\n /**\n * Optional QueryClient instance. If provided, you must wrap your app with QueryClientProvider yourself.\n * If not provided, ENSNodeProvider will create and manage its own QueryClient internally.\n */\n queryClient?: QueryClient;\n\n /**\n * Custom query client options when auto-creating a QueryClient.\n * Only used when queryClient is not provided.\n */\n queryClientOptions?: ConstructorParameters<typeof QueryClient>[0];\n}\n\nfunction ENSNodeInternalProvider({\n children,\n config,\n}: {\n children?: React.ReactNode;\n config: ENSNodeSDKConfig;\n}) {\n // Memoize the config to prevent unnecessary re-renders\n const memoizedConfig = useMemo(() => config, [config]);\n\n return createElement(ENSNodeContext.Provider, { value: memoizedConfig }, children);\n}\n\nexport function ENSNodeProvider(parameters: React.PropsWithChildren<ENSNodeProviderProps>) {\n const { children, config, queryClient, queryClientOptions } = parameters;\n\n // Check if we're already inside a QueryClientProvider\n let hasExistingQueryClient = false;\n try {\n hasExistingQueryClient = Boolean(useQueryClient());\n } catch {\n // useQueryClient throws if not inside a QueryClientProvider\n hasExistingQueryClient = false;\n }\n\n // If user provided a queryClient, they must handle QueryClientProvider themselves\n if (queryClient) {\n if (!hasExistingQueryClient) {\n throw new Error(\n \"When providing a custom queryClient, you must wrap your app with QueryClientProvider. \" +\n \"Either remove the queryClient prop to use auto-managed setup, or wrap with QueryClientProvider.\",\n );\n }\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // If already inside a QueryClientProvider, just use that\n if (hasExistingQueryClient) {\n return createElement(ENSNodeInternalProvider, { config, children });\n }\n\n // Create our own QueryClient and QueryClientProvider\n const defaultQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n retry: 3,\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 30, // 30 minutes\n refetchInterval: 1000 * 10, // 10 seconds\n },\n },\n ...queryClientOptions,\n }),\n [queryClientOptions],\n );\n\n return createElement(\n QueryClientProvider,\n { client: defaultQueryClient },\n createElement(ENSNodeInternalProvider, { config, children }),\n );\n}\n\n/**\n * Helper function to create ENSNode configuration\n */\nexport function createConfig(options?: { url?: string | URL }): ENSNodeSDKConfig {\n const url = options?.url ? new URL(options.url) : ENSNodeClient.defaultOptions().url;\n\n return {\n client: {\n ...ENSNodeClient.defaultOptions(),\n url,\n },\n };\n}\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQueryClient","useMemo","ENSNodeClient","useMemo","useQueryClient","ENSNodeClient"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ensnode/ensnode-react",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "description": "React hooks and providers for ENSNode",
6
6
  "license": "MIT",
@@ -34,16 +34,16 @@
34
34
  "devDependencies": {
35
35
  "@tanstack/react-query": "^5.62.14",
36
36
  "@testing-library/react": "^16.3.0",
37
- "@types/node": "^22.14.0",
37
+ "@types/node": "22.18.13",
38
38
  "@types/react": "19.2.7",
39
39
  "react": "19.2.1",
40
40
  "tsup": "^8.3.6",
41
41
  "typescript": "^5.7.3",
42
42
  "vitest": "^4.0.2",
43
- "@ensnode/shared-configs": "1.3.0"
43
+ "@ensnode/shared-configs": "1.4.0"
44
44
  },
45
45
  "dependencies": {
46
- "@ensnode/ensnode-sdk": "1.3.0"
46
+ "@ensnode/ensnode-sdk": "1.4.0"
47
47
  },
48
48
  "scripts": {
49
49
  "prepublish": "tsup",