@ensnode/ensnode-react 1.2.0 → 1.3.1
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 +56 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -10
- package/dist/index.d.ts +25 -10
- package/dist/index.js +52 -14
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -26,6 +26,7 @@ __export(index_exports, {
|
|
|
26
26
|
createConfig: () => createConfig,
|
|
27
27
|
createConfigQueryOptions: () => createConfigQueryOptions,
|
|
28
28
|
createIndexingStatusQueryOptions: () => createIndexingStatusQueryOptions,
|
|
29
|
+
createNameTokensQueryOptions: () => createNameTokensQueryOptions,
|
|
29
30
|
createPrimaryNameQueryOptions: () => createPrimaryNameQueryOptions,
|
|
30
31
|
createPrimaryNamesQueryOptions: () => createPrimaryNamesQueryOptions,
|
|
31
32
|
createRecordsQueryOptions: () => createRecordsQueryOptions,
|
|
@@ -34,6 +35,7 @@ __export(index_exports, {
|
|
|
34
35
|
useENSNodeConfig: () => useENSNodeConfig,
|
|
35
36
|
useENSNodeSDKConfig: () => useENSNodeSDKConfig,
|
|
36
37
|
useIndexingStatus: () => useIndexingStatus,
|
|
38
|
+
useNameTokens: () => useNameTokens,
|
|
37
39
|
usePrimaryName: () => usePrimaryName,
|
|
38
40
|
usePrimaryNames: () => usePrimaryNames,
|
|
39
41
|
useRecords: () => useRecords,
|
|
@@ -68,7 +70,8 @@ var queryKeys = {
|
|
|
68
70
|
primaryNames: (url, args) => [...queryKeys.resolve(url), "primary-names", args],
|
|
69
71
|
config: (url) => [...queryKeys.base(url), "config"],
|
|
70
72
|
indexingStatus: (url) => [...queryKeys.base(url), "indexing-status"],
|
|
71
|
-
registrarActions: (url, args) => [...queryKeys.base(url), "registrar-actions", args]
|
|
73
|
+
registrarActions: (url, args) => [...queryKeys.base(url), "registrar-actions", args],
|
|
74
|
+
nameTokens: (url, args) => [...queryKeys.base(url), "name-tokens", args]
|
|
72
75
|
};
|
|
73
76
|
function createRecordsQueryOptions(config, args) {
|
|
74
77
|
return {
|
|
@@ -130,6 +133,16 @@ function createRegistrarActionsQueryOptions(config, args) {
|
|
|
130
133
|
}
|
|
131
134
|
};
|
|
132
135
|
}
|
|
136
|
+
function createNameTokensQueryOptions(config, args) {
|
|
137
|
+
return {
|
|
138
|
+
enabled: true,
|
|
139
|
+
queryKey: queryKeys.nameTokens(config.client.url.href, args),
|
|
140
|
+
queryFn: async () => {
|
|
141
|
+
const client = new import_ensnode_sdk.ENSNodeClient(config.client);
|
|
142
|
+
return client.nameTokens(args);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
133
146
|
|
|
134
147
|
// src/hooks/useENSNodeSDKConfig.ts
|
|
135
148
|
var import_react2 = require("react");
|
|
@@ -174,8 +187,23 @@ function useIndexingStatus(parameters = {}) {
|
|
|
174
187
|
return (0, import_react_query2.useQuery)(options);
|
|
175
188
|
}
|
|
176
189
|
|
|
177
|
-
// src/hooks/
|
|
190
|
+
// src/hooks/useNameTokens.ts
|
|
178
191
|
var import_react_query3 = require("@tanstack/react-query");
|
|
192
|
+
function useNameTokens(parameters) {
|
|
193
|
+
const { config, query = {} } = parameters;
|
|
194
|
+
const _config = useENSNodeSDKConfig(config);
|
|
195
|
+
const queryOptions = createNameTokensQueryOptions(_config, parameters);
|
|
196
|
+
return (0, import_react_query3.useQuery)({
|
|
197
|
+
...queryOptions,
|
|
198
|
+
refetchInterval: false,
|
|
199
|
+
// no refetching - assume data is immutable until a full page refresh
|
|
200
|
+
...query,
|
|
201
|
+
enabled: query.enabled ?? queryOptions.enabled
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// src/hooks/usePrimaryName.ts
|
|
206
|
+
var import_react_query4 = require("@tanstack/react-query");
|
|
179
207
|
function usePrimaryName(parameters) {
|
|
180
208
|
const { config, query = {}, address, ...args } = parameters;
|
|
181
209
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -186,11 +214,11 @@ function usePrimaryName(parameters) {
|
|
|
186
214
|
...query,
|
|
187
215
|
enabled: canEnable && (query.enabled ?? queryOptions.enabled)
|
|
188
216
|
};
|
|
189
|
-
return (0,
|
|
217
|
+
return (0, import_react_query4.useQuery)(options);
|
|
190
218
|
}
|
|
191
219
|
|
|
192
220
|
// src/hooks/usePrimaryNames.ts
|
|
193
|
-
var
|
|
221
|
+
var import_react_query5 = require("@tanstack/react-query");
|
|
194
222
|
function usePrimaryNames(parameters) {
|
|
195
223
|
const { config, query = {}, address, ...args } = parameters;
|
|
196
224
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -201,11 +229,11 @@ function usePrimaryNames(parameters) {
|
|
|
201
229
|
...query,
|
|
202
230
|
enabled: canEnable && (query.enabled ?? queryOptions.enabled)
|
|
203
231
|
};
|
|
204
|
-
return (0,
|
|
232
|
+
return (0, import_react_query5.useQuery)(options);
|
|
205
233
|
}
|
|
206
234
|
|
|
207
235
|
// src/hooks/useRecords.ts
|
|
208
|
-
var
|
|
236
|
+
var import_react_query6 = require("@tanstack/react-query");
|
|
209
237
|
function useRecords(parameters) {
|
|
210
238
|
const { config, query = {}, name, ...args } = parameters;
|
|
211
239
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -216,11 +244,11 @@ function useRecords(parameters) {
|
|
|
216
244
|
...query,
|
|
217
245
|
enabled: canEnable && (query.enabled ?? queryOptions.enabled)
|
|
218
246
|
};
|
|
219
|
-
return (0,
|
|
247
|
+
return (0, import_react_query6.useQuery)(options);
|
|
220
248
|
}
|
|
221
249
|
|
|
222
250
|
// src/hooks/useRegistrarActions.ts
|
|
223
|
-
var
|
|
251
|
+
var import_react_query7 = require("@tanstack/react-query");
|
|
224
252
|
function useRegistrarActions(parameters = {}) {
|
|
225
253
|
const { config, query = {} } = parameters;
|
|
226
254
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -232,22 +260,31 @@ function useRegistrarActions(parameters = {}) {
|
|
|
232
260
|
...query,
|
|
233
261
|
enabled: query.enabled ?? queryOptions.enabled
|
|
234
262
|
};
|
|
235
|
-
return (0,
|
|
263
|
+
return (0, import_react_query7.useQuery)(options);
|
|
236
264
|
}
|
|
237
265
|
|
|
238
266
|
// src/hooks/useResolvedIdentity.ts
|
|
239
267
|
var import_ensnode_sdk2 = require("@ensnode/ensnode-sdk");
|
|
240
268
|
function useResolvedIdentity(parameters) {
|
|
241
|
-
const { identity,
|
|
269
|
+
const { identity, accelerate, query: _query = {} } = parameters;
|
|
270
|
+
const { data } = useENSNodeConfig();
|
|
271
|
+
const namespace = data?.ensIndexerPublicConfig.namespace;
|
|
242
272
|
const {
|
|
243
273
|
data: primaryNameData,
|
|
244
274
|
status,
|
|
245
275
|
...query
|
|
246
276
|
} = usePrimaryName({
|
|
247
277
|
address: identity.address,
|
|
248
|
-
chainId: (0, import_ensnode_sdk2.getResolvePrimaryNameChainIdParam)(
|
|
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
|
+
),
|
|
249
283
|
accelerate,
|
|
250
|
-
|
|
284
|
+
query: {
|
|
285
|
+
..._query,
|
|
286
|
+
enabled: (_query.enabled ?? true) && namespace !== void 0
|
|
287
|
+
}
|
|
251
288
|
});
|
|
252
289
|
let result;
|
|
253
290
|
if (status === "pending") {
|
|
@@ -280,13 +317,13 @@ function useResolvedIdentity(parameters) {
|
|
|
280
317
|
}
|
|
281
318
|
|
|
282
319
|
// src/hooks/useSwrQuery.ts
|
|
283
|
-
var
|
|
320
|
+
var import_react_query8 = require("@tanstack/react-query");
|
|
284
321
|
var import_react3 = require("react");
|
|
285
322
|
function useSwrQuery(options, queryClient) {
|
|
286
|
-
const queryClientFromContext = (0,
|
|
323
|
+
const queryClientFromContext = (0, import_react_query8.useQueryClient)();
|
|
287
324
|
const derivedQueryClient = queryClient ?? queryClientFromContext;
|
|
288
325
|
const cachedSuccessfulResult = derivedQueryClient.getQueryData(options.queryKey);
|
|
289
|
-
const queryResult = (0,
|
|
326
|
+
const queryResult = (0, import_react_query8.useQuery)(
|
|
290
327
|
{
|
|
291
328
|
...options,
|
|
292
329
|
// cached result can never be stale
|
|
@@ -317,7 +354,7 @@ function useSwrQuery(options, queryClient) {
|
|
|
317
354
|
}
|
|
318
355
|
|
|
319
356
|
// src/provider.tsx
|
|
320
|
-
var
|
|
357
|
+
var import_react_query9 = require("@tanstack/react-query");
|
|
321
358
|
var import_react4 = require("react");
|
|
322
359
|
var import_ensnode_sdk3 = require("@ensnode/ensnode-sdk");
|
|
323
360
|
function ENSNodeInternalProvider({
|
|
@@ -331,7 +368,7 @@ function ENSNodeProvider(parameters) {
|
|
|
331
368
|
const { children, config, queryClient, queryClientOptions } = parameters;
|
|
332
369
|
let hasExistingQueryClient = false;
|
|
333
370
|
try {
|
|
334
|
-
hasExistingQueryClient = Boolean((0,
|
|
371
|
+
hasExistingQueryClient = Boolean((0, import_react_query9.useQueryClient)());
|
|
335
372
|
} catch {
|
|
336
373
|
hasExistingQueryClient = false;
|
|
337
374
|
}
|
|
@@ -347,7 +384,7 @@ function ENSNodeProvider(parameters) {
|
|
|
347
384
|
return (0, import_react4.createElement)(ENSNodeInternalProvider, { config, children });
|
|
348
385
|
}
|
|
349
386
|
const defaultQueryClient = (0, import_react4.useMemo)(
|
|
350
|
-
() => new
|
|
387
|
+
() => new import_react_query9.QueryClient({
|
|
351
388
|
defaultOptions: {
|
|
352
389
|
queries: {
|
|
353
390
|
retry: 3,
|
|
@@ -364,7 +401,7 @@ function ENSNodeProvider(parameters) {
|
|
|
364
401
|
[queryClientOptions]
|
|
365
402
|
);
|
|
366
403
|
return (0, import_react4.createElement)(
|
|
367
|
-
|
|
404
|
+
import_react_query9.QueryClientProvider,
|
|
368
405
|
{ client: defaultQueryClient },
|
|
369
406
|
(0, import_react4.createElement)(ENSNodeInternalProvider, { config, children })
|
|
370
407
|
);
|
package/dist/index.cjs.map
CHANGED
|
@@ -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/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 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\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","\"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","\"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_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,
|
|
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
|
|
@@ -71,6 +77,14 @@ interface UseIndexingStatusParameters extends IndexingStatusRequest, QueryParame
|
|
|
71
77
|
}
|
|
72
78
|
declare function useIndexingStatus(parameters?: WithSDKConfigParameter & UseIndexingStatusParameters): _tanstack_react_query.UseQueryResult<IndexingStatusResponse, Error>;
|
|
73
79
|
|
|
80
|
+
type UseNameTokensParameters = NameTokensRequest & QueryParameter<NameTokensResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* Use Name Tokens hook
|
|
83
|
+
*
|
|
84
|
+
* Query ENSNode Name Tokens API.
|
|
85
|
+
*/
|
|
86
|
+
declare function useNameTokens(parameters: WithSDKConfigParameter & UseNameTokensParameters): _tanstack_react_query.UseQueryResult<NameTokensResponse, Error>;
|
|
87
|
+
|
|
74
88
|
/**
|
|
75
89
|
* Resolves the primary name of a specified address (Reverse Resolution).
|
|
76
90
|
*
|
|
@@ -194,14 +208,6 @@ interface UseRegistrarActionsParameters extends RegistrarActionsRequest, QueryPa
|
|
|
194
208
|
*/
|
|
195
209
|
declare function useRegistrarActions(parameters?: WithSDKConfigParameter & UseRegistrarActionsParameters): _tanstack_react_query.UseQueryResult<RegistrarActionsResponse, Error>;
|
|
196
210
|
|
|
197
|
-
/**
|
|
198
|
-
* Parameters for the useResolvedIdentity hook.
|
|
199
|
-
*/
|
|
200
|
-
interface UseResolvedIdentityParameters {
|
|
201
|
-
identity: UnresolvedIdentity;
|
|
202
|
-
namespaceId: ENSNamespaceId;
|
|
203
|
-
accelerate?: boolean;
|
|
204
|
-
}
|
|
205
211
|
/**
|
|
206
212
|
* Hook to perform ENSIP-19 primary name resolution to resolve an
|
|
207
213
|
* {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.
|
|
@@ -485,6 +491,7 @@ declare const queryKeys: {
|
|
|
485
491
|
config: (url: string) => readonly ["ensnode", string, "config"];
|
|
486
492
|
indexingStatus: (url: string) => readonly ["ensnode", string, "indexing-status"];
|
|
487
493
|
registrarActions: (url: string, args: RegistrarActionsRequest) => readonly ["ensnode", string, "registrar-actions", RegistrarActionsRequest];
|
|
494
|
+
nameTokens: (url: string, args: NameTokensRequest) => readonly ["ensnode", string, "name-tokens", NameTokensRequest];
|
|
488
495
|
};
|
|
489
496
|
/**
|
|
490
497
|
* Creates query options for Records Resolution
|
|
@@ -534,5 +541,13 @@ declare function createRegistrarActionsQueryOptions(config: ENSNodeSDKConfig, ar
|
|
|
534
541
|
queryKey: readonly ["ensnode", string, "registrar-actions", RegistrarActionsRequest];
|
|
535
542
|
queryFn: () => Promise<_ensnode_ensnode_sdk.RegistrarActionsResponse>;
|
|
536
543
|
};
|
|
544
|
+
/**
|
|
545
|
+
* Creates query options for Name Tokens API
|
|
546
|
+
*/
|
|
547
|
+
declare function createNameTokensQueryOptions(config: ENSNodeSDKConfig, args: NameTokensRequest): {
|
|
548
|
+
enabled: boolean;
|
|
549
|
+
queryKey: readonly ["ensnode", string, "name-tokens", NameTokensRequest];
|
|
550
|
+
queryFn: () => Promise<_ensnode_ensnode_sdk.NameTokensResponse>;
|
|
551
|
+
};
|
|
537
552
|
|
|
538
|
-
export { ASSUME_IMMUTABLE_QUERY, ENSNodeContext, ENSNodeProvider, type ENSNodeProviderProps, type ENSNodeSDKConfig, type QueryParameter, type UsePrimaryNameParameters, type UsePrimaryNamesParameters, type UseRecordsParameters, type UseResolvedIdentityParameters, type WithSDKConfigParameter, createConfig, createConfigQueryOptions, createIndexingStatusQueryOptions, createPrimaryNameQueryOptions, createPrimaryNamesQueryOptions, createRecordsQueryOptions, createRegistrarActionsQueryOptions, queryKeys, useENSNodeConfig, useENSNodeSDKConfig, useIndexingStatus, usePrimaryName, usePrimaryNames, useRecords, useRegistrarActions, useResolvedIdentity, useSwrQuery };
|
|
553
|
+
export { ASSUME_IMMUTABLE_QUERY, ENSNodeContext, ENSNodeProvider, type ENSNodeProviderProps, type ENSNodeSDKConfig, type QueryParameter, type UsePrimaryNameParameters, type UsePrimaryNamesParameters, type UseRecordsParameters, type UseResolvedIdentityParameters, type WithSDKConfigParameter, createConfig, createConfigQueryOptions, createIndexingStatusQueryOptions, createNameTokensQueryOptions, createPrimaryNameQueryOptions, createPrimaryNamesQueryOptions, createRecordsQueryOptions, createRegistrarActionsQueryOptions, queryKeys, useENSNodeConfig, useENSNodeSDKConfig, useIndexingStatus, useNameTokens, usePrimaryName, usePrimaryNames, useRecords, useRegistrarActions, useResolvedIdentity, useSwrQuery };
|
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,
|
|
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
|
|
@@ -71,6 +77,14 @@ interface UseIndexingStatusParameters extends IndexingStatusRequest, QueryParame
|
|
|
71
77
|
}
|
|
72
78
|
declare function useIndexingStatus(parameters?: WithSDKConfigParameter & UseIndexingStatusParameters): _tanstack_react_query.UseQueryResult<IndexingStatusResponse, Error>;
|
|
73
79
|
|
|
80
|
+
type UseNameTokensParameters = NameTokensRequest & QueryParameter<NameTokensResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* Use Name Tokens hook
|
|
83
|
+
*
|
|
84
|
+
* Query ENSNode Name Tokens API.
|
|
85
|
+
*/
|
|
86
|
+
declare function useNameTokens(parameters: WithSDKConfigParameter & UseNameTokensParameters): _tanstack_react_query.UseQueryResult<NameTokensResponse, Error>;
|
|
87
|
+
|
|
74
88
|
/**
|
|
75
89
|
* Resolves the primary name of a specified address (Reverse Resolution).
|
|
76
90
|
*
|
|
@@ -194,14 +208,6 @@ interface UseRegistrarActionsParameters extends RegistrarActionsRequest, QueryPa
|
|
|
194
208
|
*/
|
|
195
209
|
declare function useRegistrarActions(parameters?: WithSDKConfigParameter & UseRegistrarActionsParameters): _tanstack_react_query.UseQueryResult<RegistrarActionsResponse, Error>;
|
|
196
210
|
|
|
197
|
-
/**
|
|
198
|
-
* Parameters for the useResolvedIdentity hook.
|
|
199
|
-
*/
|
|
200
|
-
interface UseResolvedIdentityParameters {
|
|
201
|
-
identity: UnresolvedIdentity;
|
|
202
|
-
namespaceId: ENSNamespaceId;
|
|
203
|
-
accelerate?: boolean;
|
|
204
|
-
}
|
|
205
211
|
/**
|
|
206
212
|
* Hook to perform ENSIP-19 primary name resolution to resolve an
|
|
207
213
|
* {@link UnresolvedIdentity} into a {@link ResolvedIdentity}.
|
|
@@ -485,6 +491,7 @@ declare const queryKeys: {
|
|
|
485
491
|
config: (url: string) => readonly ["ensnode", string, "config"];
|
|
486
492
|
indexingStatus: (url: string) => readonly ["ensnode", string, "indexing-status"];
|
|
487
493
|
registrarActions: (url: string, args: RegistrarActionsRequest) => readonly ["ensnode", string, "registrar-actions", RegistrarActionsRequest];
|
|
494
|
+
nameTokens: (url: string, args: NameTokensRequest) => readonly ["ensnode", string, "name-tokens", NameTokensRequest];
|
|
488
495
|
};
|
|
489
496
|
/**
|
|
490
497
|
* Creates query options for Records Resolution
|
|
@@ -534,5 +541,13 @@ declare function createRegistrarActionsQueryOptions(config: ENSNodeSDKConfig, ar
|
|
|
534
541
|
queryKey: readonly ["ensnode", string, "registrar-actions", RegistrarActionsRequest];
|
|
535
542
|
queryFn: () => Promise<_ensnode_ensnode_sdk.RegistrarActionsResponse>;
|
|
536
543
|
};
|
|
544
|
+
/**
|
|
545
|
+
* Creates query options for Name Tokens API
|
|
546
|
+
*/
|
|
547
|
+
declare function createNameTokensQueryOptions(config: ENSNodeSDKConfig, args: NameTokensRequest): {
|
|
548
|
+
enabled: boolean;
|
|
549
|
+
queryKey: readonly ["ensnode", string, "name-tokens", NameTokensRequest];
|
|
550
|
+
queryFn: () => Promise<_ensnode_ensnode_sdk.NameTokensResponse>;
|
|
551
|
+
};
|
|
537
552
|
|
|
538
|
-
export { ASSUME_IMMUTABLE_QUERY, ENSNodeContext, ENSNodeProvider, type ENSNodeProviderProps, type ENSNodeSDKConfig, type QueryParameter, type UsePrimaryNameParameters, type UsePrimaryNamesParameters, type UseRecordsParameters, type UseResolvedIdentityParameters, type WithSDKConfigParameter, createConfig, createConfigQueryOptions, createIndexingStatusQueryOptions, createPrimaryNameQueryOptions, createPrimaryNamesQueryOptions, createRecordsQueryOptions, createRegistrarActionsQueryOptions, queryKeys, useENSNodeConfig, useENSNodeSDKConfig, useIndexingStatus, usePrimaryName, usePrimaryNames, useRecords, useRegistrarActions, useResolvedIdentity, useSwrQuery };
|
|
553
|
+
export { ASSUME_IMMUTABLE_QUERY, ENSNodeContext, ENSNodeProvider, type ENSNodeProviderProps, type ENSNodeSDKConfig, type QueryParameter, type UsePrimaryNameParameters, type UsePrimaryNamesParameters, type UseRecordsParameters, type UseResolvedIdentityParameters, type WithSDKConfigParameter, createConfig, createConfigQueryOptions, createIndexingStatusQueryOptions, createNameTokensQueryOptions, createPrimaryNameQueryOptions, createPrimaryNamesQueryOptions, createRecordsQueryOptions, createRegistrarActionsQueryOptions, queryKeys, useENSNodeConfig, useENSNodeSDKConfig, useIndexingStatus, useNameTokens, usePrimaryName, usePrimaryNames, useRecords, useRegistrarActions, useResolvedIdentity, useSwrQuery };
|
package/dist/index.js
CHANGED
|
@@ -25,7 +25,8 @@ var queryKeys = {
|
|
|
25
25
|
primaryNames: (url, args) => [...queryKeys.resolve(url), "primary-names", args],
|
|
26
26
|
config: (url) => [...queryKeys.base(url), "config"],
|
|
27
27
|
indexingStatus: (url) => [...queryKeys.base(url), "indexing-status"],
|
|
28
|
-
registrarActions: (url, args) => [...queryKeys.base(url), "registrar-actions", args]
|
|
28
|
+
registrarActions: (url, args) => [...queryKeys.base(url), "registrar-actions", args],
|
|
29
|
+
nameTokens: (url, args) => [...queryKeys.base(url), "name-tokens", args]
|
|
29
30
|
};
|
|
30
31
|
function createRecordsQueryOptions(config, args) {
|
|
31
32
|
return {
|
|
@@ -87,6 +88,16 @@ function createRegistrarActionsQueryOptions(config, args) {
|
|
|
87
88
|
}
|
|
88
89
|
};
|
|
89
90
|
}
|
|
91
|
+
function createNameTokensQueryOptions(config, args) {
|
|
92
|
+
return {
|
|
93
|
+
enabled: true,
|
|
94
|
+
queryKey: queryKeys.nameTokens(config.client.url.href, args),
|
|
95
|
+
queryFn: async () => {
|
|
96
|
+
const client = new ENSNodeClient(config.client);
|
|
97
|
+
return client.nameTokens(args);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
90
101
|
|
|
91
102
|
// src/hooks/useENSNodeSDKConfig.ts
|
|
92
103
|
import { useContext } from "react";
|
|
@@ -131,8 +142,23 @@ function useIndexingStatus(parameters = {}) {
|
|
|
131
142
|
return useQuery2(options);
|
|
132
143
|
}
|
|
133
144
|
|
|
134
|
-
// src/hooks/
|
|
145
|
+
// src/hooks/useNameTokens.ts
|
|
135
146
|
import { useQuery as useQuery3 } from "@tanstack/react-query";
|
|
147
|
+
function useNameTokens(parameters) {
|
|
148
|
+
const { config, query = {} } = parameters;
|
|
149
|
+
const _config = useENSNodeSDKConfig(config);
|
|
150
|
+
const queryOptions = createNameTokensQueryOptions(_config, parameters);
|
|
151
|
+
return useQuery3({
|
|
152
|
+
...queryOptions,
|
|
153
|
+
refetchInterval: false,
|
|
154
|
+
// no refetching - assume data is immutable until a full page refresh
|
|
155
|
+
...query,
|
|
156
|
+
enabled: query.enabled ?? queryOptions.enabled
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// src/hooks/usePrimaryName.ts
|
|
161
|
+
import { useQuery as useQuery4 } from "@tanstack/react-query";
|
|
136
162
|
function usePrimaryName(parameters) {
|
|
137
163
|
const { config, query = {}, address, ...args } = parameters;
|
|
138
164
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -143,11 +169,11 @@ function usePrimaryName(parameters) {
|
|
|
143
169
|
...query,
|
|
144
170
|
enabled: canEnable && (query.enabled ?? queryOptions.enabled)
|
|
145
171
|
};
|
|
146
|
-
return
|
|
172
|
+
return useQuery4(options);
|
|
147
173
|
}
|
|
148
174
|
|
|
149
175
|
// src/hooks/usePrimaryNames.ts
|
|
150
|
-
import { useQuery as
|
|
176
|
+
import { useQuery as useQuery5 } from "@tanstack/react-query";
|
|
151
177
|
function usePrimaryNames(parameters) {
|
|
152
178
|
const { config, query = {}, address, ...args } = parameters;
|
|
153
179
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -158,11 +184,11 @@ function usePrimaryNames(parameters) {
|
|
|
158
184
|
...query,
|
|
159
185
|
enabled: canEnable && (query.enabled ?? queryOptions.enabled)
|
|
160
186
|
};
|
|
161
|
-
return
|
|
187
|
+
return useQuery5(options);
|
|
162
188
|
}
|
|
163
189
|
|
|
164
190
|
// src/hooks/useRecords.ts
|
|
165
|
-
import { useQuery as
|
|
191
|
+
import { useQuery as useQuery6 } from "@tanstack/react-query";
|
|
166
192
|
function useRecords(parameters) {
|
|
167
193
|
const { config, query = {}, name, ...args } = parameters;
|
|
168
194
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -173,11 +199,11 @@ function useRecords(parameters) {
|
|
|
173
199
|
...query,
|
|
174
200
|
enabled: canEnable && (query.enabled ?? queryOptions.enabled)
|
|
175
201
|
};
|
|
176
|
-
return
|
|
202
|
+
return useQuery6(options);
|
|
177
203
|
}
|
|
178
204
|
|
|
179
205
|
// src/hooks/useRegistrarActions.ts
|
|
180
|
-
import { useQuery as
|
|
206
|
+
import { useQuery as useQuery7 } from "@tanstack/react-query";
|
|
181
207
|
function useRegistrarActions(parameters = {}) {
|
|
182
208
|
const { config, query = {} } = parameters;
|
|
183
209
|
const _config = useENSNodeSDKConfig(config);
|
|
@@ -189,25 +215,35 @@ function useRegistrarActions(parameters = {}) {
|
|
|
189
215
|
...query,
|
|
190
216
|
enabled: query.enabled ?? queryOptions.enabled
|
|
191
217
|
};
|
|
192
|
-
return
|
|
218
|
+
return useQuery7(options);
|
|
193
219
|
}
|
|
194
220
|
|
|
195
221
|
// src/hooks/useResolvedIdentity.ts
|
|
196
222
|
import {
|
|
223
|
+
ENSNamespaceIds,
|
|
197
224
|
getResolvePrimaryNameChainIdParam,
|
|
198
225
|
ResolutionStatusIds
|
|
199
226
|
} from "@ensnode/ensnode-sdk";
|
|
200
227
|
function useResolvedIdentity(parameters) {
|
|
201
|
-
const { identity,
|
|
228
|
+
const { identity, accelerate, query: _query = {} } = parameters;
|
|
229
|
+
const { data } = useENSNodeConfig();
|
|
230
|
+
const namespace = data?.ensIndexerPublicConfig.namespace;
|
|
202
231
|
const {
|
|
203
232
|
data: primaryNameData,
|
|
204
233
|
status,
|
|
205
234
|
...query
|
|
206
235
|
} = usePrimaryName({
|
|
207
236
|
address: identity.address,
|
|
208
|
-
chainId: getResolvePrimaryNameChainIdParam(
|
|
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
|
+
),
|
|
209
242
|
accelerate,
|
|
210
|
-
|
|
243
|
+
query: {
|
|
244
|
+
..._query,
|
|
245
|
+
enabled: (_query.enabled ?? true) && namespace !== void 0
|
|
246
|
+
}
|
|
211
247
|
});
|
|
212
248
|
let result;
|
|
213
249
|
if (status === "pending") {
|
|
@@ -241,7 +277,7 @@ function useResolvedIdentity(parameters) {
|
|
|
241
277
|
|
|
242
278
|
// src/hooks/useSwrQuery.ts
|
|
243
279
|
import {
|
|
244
|
-
useQuery as
|
|
280
|
+
useQuery as useQuery8,
|
|
245
281
|
useQueryClient
|
|
246
282
|
} from "@tanstack/react-query";
|
|
247
283
|
import { useMemo } from "react";
|
|
@@ -249,7 +285,7 @@ function useSwrQuery(options, queryClient) {
|
|
|
249
285
|
const queryClientFromContext = useQueryClient();
|
|
250
286
|
const derivedQueryClient = queryClient ?? queryClientFromContext;
|
|
251
287
|
const cachedSuccessfulResult = derivedQueryClient.getQueryData(options.queryKey);
|
|
252
|
-
const queryResult =
|
|
288
|
+
const queryResult = useQuery8(
|
|
253
289
|
{
|
|
254
290
|
...options,
|
|
255
291
|
// cached result can never be stale
|
|
@@ -348,6 +384,7 @@ export {
|
|
|
348
384
|
createConfig,
|
|
349
385
|
createConfigQueryOptions,
|
|
350
386
|
createIndexingStatusQueryOptions,
|
|
387
|
+
createNameTokensQueryOptions,
|
|
351
388
|
createPrimaryNameQueryOptions,
|
|
352
389
|
createPrimaryNamesQueryOptions,
|
|
353
390
|
createRecordsQueryOptions,
|
|
@@ -356,6 +393,7 @@ export {
|
|
|
356
393
|
useENSNodeConfig,
|
|
357
394
|
useENSNodeSDKConfig,
|
|
358
395
|
useIndexingStatus,
|
|
396
|
+
useNameTokens,
|
|
359
397
|
usePrimaryName,
|
|
360
398
|
usePrimaryNames,
|
|
361
399
|
useRecords,
|
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/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 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\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","\"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","\"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":["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
|
+
"version": "1.3.1",
|
|
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": "
|
|
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.
|
|
43
|
+
"@ensnode/shared-configs": "1.3.1"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@ensnode/ensnode-sdk": "1.
|
|
46
|
+
"@ensnode/ensnode-sdk": "1.3.1"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"prepublish": "tsup",
|