@ensnode/ensnode-react 0.36.0 → 1.0.2

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/README.md CHANGED
@@ -80,6 +80,7 @@ function DisplayPrimaryName() {
80
80
  const { data, isLoading, error } = usePrimaryName({
81
81
  address: "0x179A862703a4adfb29896552DF9e307980D19285",
82
82
  chainId: mainnet.id,
83
+ accelerate: true, // Attempt Protocol Acceleration
83
84
  });
84
85
 
85
86
  if (isLoading) return <div>Loading...</div>;
@@ -199,6 +200,7 @@ The returned Primary Name, if set, is guaranteed to be a [Normalized Name](https
199
200
  const { data, isLoading, error, refetch } = usePrimaryName({
200
201
  address: "0x179A862703a4adfb29896552DF9e307980D19285",
201
202
  chainId: 10, // Optimism
203
+ accelerate: true, // Attempt Protocol Acceleration
202
204
  });
203
205
  ```
204
206
 
@@ -284,7 +286,8 @@ const [address, setAddress] = useState("");
284
286
  // only executes when address is not null
285
287
  const { data } = usePrimaryName({
286
288
  address: address || null,
287
- chainId: 1
289
+ chainId: 1,
290
+ accelerate: true, // Attempt Protocol Acceleration
288
291
  });
289
292
  ```
290
293
 
@@ -297,6 +300,7 @@ const [showPrimaryName, setShowPrimaryName] = useState(false);
297
300
  const { data } = usePrimaryName({
298
301
  address: "0x179A862703a4adfb29896552DF9e307980D19285",
299
302
  chainId: 1,
303
+ accelerate: true, // Attempt Protocol Acceleration
300
304
  query: { enabled: showPrimaryName },
301
305
  });
302
306
  ```
package/dist/index.cjs CHANGED
@@ -24,104 +24,35 @@ __export(index_exports, {
24
24
  ENSNodeContext: () => ENSNodeContext,
25
25
  ENSNodeProvider: () => ENSNodeProvider,
26
26
  createConfig: () => createConfig,
27
- useENSIndexerConfig: () => useENSIndexerConfig,
27
+ createConfigQueryOptions: () => createConfigQueryOptions,
28
+ createIndexingStatusQueryOptions: () => createIndexingStatusQueryOptions,
29
+ createPrimaryNameQueryOptions: () => createPrimaryNameQueryOptions,
30
+ createPrimaryNamesQueryOptions: () => createPrimaryNamesQueryOptions,
31
+ createRecordsQueryOptions: () => createRecordsQueryOptions,
32
+ createRegistrarActionsQueryOptions: () => createRegistrarActionsQueryOptions,
33
+ queryKeys: () => queryKeys,
28
34
  useENSNodeConfig: () => useENSNodeConfig,
35
+ useENSNodeSDKConfig: () => useENSNodeSDKConfig,
29
36
  useIndexingStatus: () => useIndexingStatus,
30
37
  usePrimaryName: () => usePrimaryName,
31
38
  usePrimaryNames: () => usePrimaryNames,
32
39
  useRecords: () => useRecords,
33
- useResolvedIdentity: () => useResolvedIdentity
40
+ useRegistrarActions: () => useRegistrarActions,
41
+ useResolvedIdentity: () => useResolvedIdentity,
42
+ useSwrQuery: () => useSwrQuery
34
43
  });
35
44
  module.exports = __toCommonJS(index_exports);
36
45
 
37
- // src/provider.tsx
38
- var import_ensnode_sdk = require("@ensnode/ensnode-sdk");
39
- var import_react_query = require("@tanstack/react-query");
40
- var import_react2 = require("react");
41
-
42
46
  // src/context.ts
43
47
  var import_react = require("react");
44
48
  var ENSNodeContext = (0, import_react.createContext)(void 0);
45
49
  ENSNodeContext.displayName = "ENSNodeContext";
46
50
 
47
- // src/provider.tsx
48
- function ENSNodeInternalProvider({
49
- children,
50
- config
51
- }) {
52
- const memoizedConfig = (0, import_react2.useMemo)(() => config, [config]);
53
- return (0, import_react2.createElement)(ENSNodeContext.Provider, { value: memoizedConfig }, children);
54
- }
55
- function ENSNodeProvider(parameters) {
56
- const { children, config, queryClient, queryClientOptions } = parameters;
57
- let hasExistingQueryClient = false;
58
- try {
59
- hasExistingQueryClient = Boolean((0, import_react_query.useQueryClient)());
60
- } catch {
61
- hasExistingQueryClient = false;
62
- }
63
- if (queryClient) {
64
- if (!hasExistingQueryClient) {
65
- throw new Error(
66
- "When providing a custom queryClient, you must wrap your app with QueryClientProvider. Either remove the queryClient prop to use auto-managed setup, or wrap with QueryClientProvider."
67
- );
68
- }
69
- return (0, import_react2.createElement)(ENSNodeInternalProvider, { config, children });
70
- }
71
- if (hasExistingQueryClient) {
72
- return (0, import_react2.createElement)(ENSNodeInternalProvider, { config, children });
73
- }
74
- const defaultQueryClient = (0, import_react2.useMemo)(
75
- () => new import_react_query.QueryClient({
76
- defaultOptions: {
77
- queries: {
78
- retry: 3,
79
- staleTime: 1e3 * 60 * 5,
80
- // 5 minutes
81
- gcTime: 1e3 * 60 * 30,
82
- // 30 minutes
83
- refetchInterval: 1e3 * 10
84
- // 10 seconds
85
- }
86
- },
87
- ...queryClientOptions
88
- }),
89
- [queryClientOptions]
90
- );
91
- return (0, import_react2.createElement)(
92
- import_react_query.QueryClientProvider,
93
- { client: defaultQueryClient },
94
- (0, import_react2.createElement)(ENSNodeInternalProvider, { config, children })
95
- );
96
- }
97
- function createConfig(options) {
98
- const url = options?.url ? new URL(options.url) : import_ensnode_sdk.ENSNodeClient.defaultOptions().url;
99
- return {
100
- client: {
101
- ...import_ensnode_sdk.ENSNodeClient.defaultOptions(),
102
- url
103
- }
104
- };
105
- }
106
-
107
51
  // src/hooks/useENSNodeConfig.ts
108
- var import_react3 = require("react");
109
- function useENSNodeConfig(config) {
110
- const contextConfig = (0, import_react3.useContext)(ENSNodeContext);
111
- const resolvedConfig = config ?? contextConfig;
112
- if (!resolvedConfig) {
113
- throw new Error(
114
- "useENSNodeConfig must be used within an ENSNodeProvider or you must pass a config parameter"
115
- );
116
- }
117
- return resolvedConfig;
118
- }
119
-
120
- // src/hooks/useRecords.ts
121
- var import_react_query2 = require("@tanstack/react-query");
52
+ var import_react_query = require("@tanstack/react-query");
122
53
 
123
54
  // src/utils/query.ts
124
- var import_ensnode_sdk2 = require("@ensnode/ensnode-sdk");
55
+ var import_ensnode_sdk = require("@ensnode/ensnode-sdk");
125
56
  var ASSUME_IMMUTABLE_QUERY = {
126
57
  staleTime: Infinity,
127
58
  gcTime: Infinity,
@@ -136,14 +67,15 @@ var queryKeys = {
136
67
  primaryName: (url, args) => [...queryKeys.resolve(url), "primary-name", args],
137
68
  primaryNames: (url, args) => [...queryKeys.resolve(url), "primary-names", args],
138
69
  config: (url) => [...queryKeys.base(url), "config"],
139
- indexingStatus: (url) => [...queryKeys.base(url), "indexing-status"]
70
+ indexingStatus: (url) => [...queryKeys.base(url), "indexing-status"],
71
+ registrarActions: (url, args) => [...queryKeys.base(url), "registrar-actions", args]
140
72
  };
141
73
  function createRecordsQueryOptions(config, args) {
142
74
  return {
143
75
  enabled: true,
144
76
  queryKey: queryKeys.records(config.client.url.href, args),
145
77
  queryFn: async () => {
146
- const client = new import_ensnode_sdk2.ENSNodeClient(config.client);
78
+ const client = new import_ensnode_sdk.ENSNodeClient(config.client);
147
79
  return client.resolveRecords(args.name, args.selection, args);
148
80
  }
149
81
  };
@@ -153,7 +85,7 @@ function createPrimaryNameQueryOptions(config, args) {
153
85
  enabled: true,
154
86
  queryKey: queryKeys.primaryName(config.client.url.href, args),
155
87
  queryFn: async () => {
156
- const client = new import_ensnode_sdk2.ENSNodeClient(config.client);
88
+ const client = new import_ensnode_sdk.ENSNodeClient(config.client);
157
89
  return client.resolvePrimaryName(args.address, args.chainId, args);
158
90
  }
159
91
  };
@@ -163,17 +95,17 @@ function createPrimaryNamesQueryOptions(config, args) {
163
95
  enabled: true,
164
96
  queryKey: queryKeys.primaryNames(config.client.url.href, args),
165
97
  queryFn: async () => {
166
- const client = new import_ensnode_sdk2.ENSNodeClient(config.client);
98
+ const client = new import_ensnode_sdk.ENSNodeClient(config.client);
167
99
  return client.resolvePrimaryNames(args.address, args);
168
100
  }
169
101
  };
170
102
  }
171
- function createENSIndexerConfigQueryOptions(config) {
103
+ function createConfigQueryOptions(config) {
172
104
  return {
173
105
  enabled: true,
174
106
  queryKey: queryKeys.config(config.client.url.href),
175
107
  queryFn: async () => {
176
- const client = new import_ensnode_sdk2.ENSNodeClient(config.client);
108
+ const client = new import_ensnode_sdk.ENSNodeClient(config.client);
177
109
  return client.config();
178
110
  }
179
111
  };
@@ -183,22 +115,61 @@ function createIndexingStatusQueryOptions(config) {
183
115
  enabled: true,
184
116
  queryKey: queryKeys.indexingStatus(config.client.url.href),
185
117
  queryFn: async () => {
186
- const client = new import_ensnode_sdk2.ENSNodeClient(config.client);
118
+ const client = new import_ensnode_sdk.ENSNodeClient(config.client);
187
119
  return client.indexingStatus();
188
120
  }
189
121
  };
190
122
  }
123
+ function createRegistrarActionsQueryOptions(config, args) {
124
+ return {
125
+ enabled: true,
126
+ queryKey: queryKeys.registrarActions(config.client.url.href, args),
127
+ queryFn: async () => {
128
+ const client = new import_ensnode_sdk.ENSNodeClient(config.client);
129
+ return client.registrarActions(args);
130
+ }
131
+ };
132
+ }
191
133
 
192
- // src/hooks/useRecords.ts
193
- function useRecords(parameters) {
194
- const { config, query = {}, name, ...args } = parameters;
195
- const _config = useENSNodeConfig(config);
196
- const canEnable = name !== null;
197
- const queryOptions = canEnable ? createRecordsQueryOptions(_config, { ...args, name }) : { enabled: false, queryKey: ["disabled"] };
134
+ // src/hooks/useENSNodeSDKConfig.ts
135
+ var import_react2 = require("react");
136
+ function useENSNodeSDKConfig(config) {
137
+ const contextConfig = (0, import_react2.useContext)(ENSNodeContext);
138
+ const resolvedConfig = config ?? contextConfig;
139
+ if (!resolvedConfig) {
140
+ throw new Error(
141
+ "useENSNodeSDKConfig must be used within an ENSNodeProvider or you must pass a config parameter"
142
+ );
143
+ }
144
+ return resolvedConfig;
145
+ }
146
+
147
+ // src/hooks/useENSNodeConfig.ts
148
+ function useENSNodeConfig(parameters = {}) {
149
+ const { config, query = {} } = parameters;
150
+ const _config = useENSNodeSDKConfig(config);
151
+ const queryOptions = createConfigQueryOptions(_config);
198
152
  const options = {
199
153
  ...queryOptions,
154
+ ...ASSUME_IMMUTABLE_QUERY,
200
155
  ...query,
201
- enabled: canEnable && (query.enabled ?? queryOptions.enabled)
156
+ enabled: query.enabled ?? queryOptions.enabled
157
+ };
158
+ return (0, import_react_query.useQuery)(options);
159
+ }
160
+
161
+ // src/hooks/useIndexingStatus.ts
162
+ var import_react_query2 = require("@tanstack/react-query");
163
+ function useIndexingStatus(parameters = {}) {
164
+ const { config, query = {} } = parameters;
165
+ const _config = useENSNodeSDKConfig(config);
166
+ const queryOptions = createIndexingStatusQueryOptions(_config);
167
+ const options = {
168
+ ...queryOptions,
169
+ refetchInterval: 10 * 1e3,
170
+ // 10 seconds - indexing status changes frequently
171
+ ...query,
172
+ enabled: query.enabled ?? queryOptions.enabled
202
173
  };
203
174
  return (0, import_react_query2.useQuery)(options);
204
175
  }
@@ -207,7 +178,7 @@ function useRecords(parameters) {
207
178
  var import_react_query3 = require("@tanstack/react-query");
208
179
  function usePrimaryName(parameters) {
209
180
  const { config, query = {}, address, ...args } = parameters;
210
- const _config = useENSNodeConfig(config);
181
+ const _config = useENSNodeSDKConfig(config);
211
182
  const canEnable = address !== null;
212
183
  const queryOptions = canEnable ? createPrimaryNameQueryOptions(_config, { ...args, address }) : { enabled: false, queryKey: ["disabled"] };
213
184
  const options = {
@@ -222,7 +193,7 @@ function usePrimaryName(parameters) {
222
193
  var import_react_query4 = require("@tanstack/react-query");
223
194
  function usePrimaryNames(parameters) {
224
195
  const { config, query = {}, address, ...args } = parameters;
225
- const _config = useENSNodeConfig(config);
196
+ const _config = useENSNodeSDKConfig(config);
226
197
  const canEnable = address !== null;
227
198
  const queryOptions = canEnable ? createPrimaryNamesQueryOptions(_config, { ...args, address }) : { enabled: false, queryKey: ["disabled"] };
228
199
  const options = {
@@ -233,31 +204,31 @@ function usePrimaryNames(parameters) {
233
204
  return (0, import_react_query4.useQuery)(options);
234
205
  }
235
206
 
236
- // src/hooks/useENSIndexerConfig.ts
207
+ // src/hooks/useRecords.ts
237
208
  var import_react_query5 = require("@tanstack/react-query");
238
- function useENSIndexerConfig(parameters = {}) {
239
- const { config, query = {} } = parameters;
240
- const _config = useENSNodeConfig(config);
241
- const queryOptions = createENSIndexerConfigQueryOptions(_config);
209
+ function useRecords(parameters) {
210
+ const { config, query = {}, name, ...args } = parameters;
211
+ const _config = useENSNodeSDKConfig(config);
212
+ const canEnable = name !== null;
213
+ const queryOptions = canEnable ? createRecordsQueryOptions(_config, { ...args, name }) : { enabled: false, queryKey: ["disabled"] };
242
214
  const options = {
243
215
  ...queryOptions,
244
- ...ASSUME_IMMUTABLE_QUERY,
245
216
  ...query,
246
- enabled: query.enabled ?? queryOptions.enabled
217
+ enabled: canEnable && (query.enabled ?? queryOptions.enabled)
247
218
  };
248
219
  return (0, import_react_query5.useQuery)(options);
249
220
  }
250
221
 
251
- // src/hooks/useIndexingStatus.ts
222
+ // src/hooks/useRegistrarActions.ts
252
223
  var import_react_query6 = require("@tanstack/react-query");
253
- function useIndexingStatus(parameters = {}) {
224
+ function useRegistrarActions(parameters = {}) {
254
225
  const { config, query = {} } = parameters;
255
- const _config = useENSNodeConfig(config);
256
- const queryOptions = createIndexingStatusQueryOptions(_config);
226
+ const _config = useENSNodeSDKConfig(config);
227
+ const queryOptions = createRegistrarActionsQueryOptions(_config, parameters);
257
228
  const options = {
258
229
  ...queryOptions,
259
230
  refetchInterval: 10 * 1e3,
260
- // 10 seconds - indexing status changes frequently
231
+ // 10 seconds - latest registrar actions change frequently
261
232
  ...query,
262
233
  enabled: query.enabled ?? queryOptions.enabled
263
234
  };
@@ -265,16 +236,17 @@ function useIndexingStatus(parameters = {}) {
265
236
  }
266
237
 
267
238
  // src/hooks/useResolvedIdentity.ts
268
- var import_ensnode_sdk3 = require("@ensnode/ensnode-sdk");
239
+ var import_ensnode_sdk2 = require("@ensnode/ensnode-sdk");
269
240
  function useResolvedIdentity(parameters) {
270
- const { identity, namespaceId, ...args } = parameters;
241
+ const { identity, namespaceId, accelerate, ...args } = parameters;
271
242
  const {
272
243
  data: primaryNameData,
273
244
  status,
274
245
  ...query
275
246
  } = usePrimaryName({
276
247
  address: identity.address,
277
- chainId: (0, import_ensnode_sdk3.getResolvePrimaryNameChainIdParam)(identity.chainId, namespaceId),
248
+ chainId: (0, import_ensnode_sdk2.getResolvePrimaryNameChainIdParam)(identity.chainId, namespaceId),
249
+ accelerate,
278
250
  ...args
279
251
  });
280
252
  let result;
@@ -282,20 +254,20 @@ function useResolvedIdentity(parameters) {
282
254
  result = identity;
283
255
  } else if (status === "error") {
284
256
  result = {
285
- resolutionStatus: import_ensnode_sdk3.ResolutionStatusIds.Unknown,
257
+ resolutionStatus: import_ensnode_sdk2.ResolutionStatusIds.Unknown,
286
258
  chainId: identity.chainId,
287
259
  address: identity.address
288
260
  };
289
261
  } else if (primaryNameData.name === null) {
290
262
  result = {
291
- resolutionStatus: import_ensnode_sdk3.ResolutionStatusIds.Unnamed,
263
+ resolutionStatus: import_ensnode_sdk2.ResolutionStatusIds.Unnamed,
292
264
  chainId: identity.chainId,
293
265
  address: identity.address,
294
266
  name: null
295
267
  };
296
268
  } else {
297
269
  result = {
298
- resolutionStatus: import_ensnode_sdk3.ResolutionStatusIds.Named,
270
+ resolutionStatus: import_ensnode_sdk2.ResolutionStatusIds.Named,
299
271
  chainId: identity.chainId,
300
272
  address: identity.address,
301
273
  name: primaryNameData.name
@@ -306,4 +278,104 @@ function useResolvedIdentity(parameters) {
306
278
  identity: result
307
279
  };
308
280
  }
281
+
282
+ // src/hooks/useSwrQuery.ts
283
+ var import_react_query7 = require("@tanstack/react-query");
284
+ var import_react3 = require("react");
285
+ function useSwrQuery(options, queryClient) {
286
+ const queryClientFromContext = (0, import_react_query7.useQueryClient)();
287
+ const derivedQueryClient = queryClient ?? queryClientFromContext;
288
+ const cachedSuccessfulResult = derivedQueryClient.getQueryData(options.queryKey);
289
+ const queryResult = (0, import_react_query7.useQuery)(
290
+ {
291
+ ...options,
292
+ // cached result can never be stale
293
+ staleTime: cachedSuccessfulResult ? Infinity : void 0,
294
+ // cached result can never be removed by garbage collector
295
+ gcTime: cachedSuccessfulResult ? Infinity : void 0
296
+ },
297
+ queryClient
298
+ );
299
+ const memoizedQueryResult = (0, import_react3.useMemo)(() => {
300
+ if (queryResult.isError && cachedSuccessfulResult) {
301
+ return {
302
+ ...queryResult,
303
+ // set error props
304
+ isError: false,
305
+ error: null,
306
+ isRefetchError: false,
307
+ isLoadingError: false,
308
+ // st success props
309
+ isSuccess: true,
310
+ status: "success",
311
+ data: cachedSuccessfulResult
312
+ };
313
+ }
314
+ return queryResult;
315
+ }, [queryResult, cachedSuccessfulResult]);
316
+ return memoizedQueryResult;
317
+ }
318
+
319
+ // src/provider.tsx
320
+ var import_react_query8 = require("@tanstack/react-query");
321
+ var import_react4 = require("react");
322
+ var import_ensnode_sdk3 = require("@ensnode/ensnode-sdk");
323
+ function ENSNodeInternalProvider({
324
+ children,
325
+ config
326
+ }) {
327
+ const memoizedConfig = (0, import_react4.useMemo)(() => config, [config]);
328
+ return (0, import_react4.createElement)(ENSNodeContext.Provider, { value: memoizedConfig }, children);
329
+ }
330
+ function ENSNodeProvider(parameters) {
331
+ const { children, config, queryClient, queryClientOptions } = parameters;
332
+ let hasExistingQueryClient = false;
333
+ try {
334
+ hasExistingQueryClient = Boolean((0, import_react_query8.useQueryClient)());
335
+ } catch {
336
+ hasExistingQueryClient = false;
337
+ }
338
+ if (queryClient) {
339
+ if (!hasExistingQueryClient) {
340
+ throw new Error(
341
+ "When providing a custom queryClient, you must wrap your app with QueryClientProvider. Either remove the queryClient prop to use auto-managed setup, or wrap with QueryClientProvider."
342
+ );
343
+ }
344
+ return (0, import_react4.createElement)(ENSNodeInternalProvider, { config, children });
345
+ }
346
+ if (hasExistingQueryClient) {
347
+ return (0, import_react4.createElement)(ENSNodeInternalProvider, { config, children });
348
+ }
349
+ const defaultQueryClient = (0, import_react4.useMemo)(
350
+ () => new import_react_query8.QueryClient({
351
+ defaultOptions: {
352
+ queries: {
353
+ retry: 3,
354
+ staleTime: 1e3 * 60 * 5,
355
+ // 5 minutes
356
+ gcTime: 1e3 * 60 * 30,
357
+ // 30 minutes
358
+ refetchInterval: 1e3 * 10
359
+ // 10 seconds
360
+ }
361
+ },
362
+ ...queryClientOptions
363
+ }),
364
+ [queryClientOptions]
365
+ );
366
+ return (0, import_react4.createElement)(
367
+ import_react_query8.QueryClientProvider,
368
+ { client: defaultQueryClient },
369
+ (0, import_react4.createElement)(ENSNodeInternalProvider, { config, children })
370
+ );
371
+ }
372
+ function createConfig(options) {
373
+ const url = options?.url ? new URL(options.url) : import_ensnode_sdk3.ENSNodeClient.defaultOptions().url;
374
+ return {
375
+ client: {
376
+ ...import_ensnode_sdk3.ENSNodeClient.defaultOptions(),
377
+ url
378
+ }
379
+ };
380
+ }
309
381
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/context.ts","../src/hooks/useENSNodeConfig.ts","../src/hooks/useRecords.ts","../src/utils/query.ts","../src/hooks/usePrimaryName.ts","../src/hooks/usePrimaryNames.ts","../src/hooks/useENSIndexerConfig.ts","../src/hooks/useIndexingStatus.ts","../src/hooks/useResolvedIdentity.ts"],"sourcesContent":["export type { QueryClient } from \"@tanstack/react-query\";\n\nexport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\n\nexport * from \"./provider\";\nexport * from \"./context\";\nexport * from \"./hooks\";\nexport * from \"./types\";\nexport { ASSUME_IMMUTABLE_QUERY } from \"./utils/query\";\n","\"use client\";\n\nimport { ENSNodeClient } from \"@ensnode/ensnode-sdk\";\nimport { QueryClient, QueryClientProvider, useQueryClient } from \"@tanstack/react-query\";\nimport { createElement, useMemo } from \"react\";\n\nimport { ENSNodeContext } from \"./context\";\nimport type { ENSNodeConfig } from \"./types\";\n\nexport interface ENSNodeProviderProps {\n /** ENSNode configuration */\n config: ENSNodeConfig;\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: ENSNodeConfig;\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 }): ENSNodeConfig {\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","import { createContext } from \"react\";\n\nimport type { ENSNodeConfig } from \"./types\";\n\n/**\n * React context for ENSNode configuration\n */\nexport const ENSNodeContext = createContext<ENSNodeConfig | undefined>(undefined);\n\n/**\n * Display name for debugging\n */\nENSNodeContext.displayName = \"ENSNodeContext\";\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ENSNodeContext } from \"../context\";\nimport type { ENSNodeConfig } from \"../types\";\n\n/**\n * Hook to access the ENSNode configuration 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 useENSNodeConfig<TConfig extends ENSNodeConfig = ENSNodeConfig>(\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 \"useENSNodeConfig must be used within an ENSNodeProvider or you must pass a config parameter\",\n );\n }\n\n return resolvedConfig as TConfig;\n}\n","\"use client\";\n\nimport type { ResolverRecordsSelection } from \"@ensnode/ensnode-sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport type { ConfigParameter, UseRecordsParameters } from \"../types\";\nimport { createRecordsQueryOptions } from \"../utils/query\";\nimport { useENSNodeConfig } from \"./useENSNodeConfig\";\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> & ConfigParameter,\n) {\n const { config, query = {}, name, ...args } = parameters;\n const _config = useENSNodeConfig(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","\"use client\";\n\nimport {\n ENSNodeClient,\n IndexingStatusRequest,\n ResolvePrimaryNameRequest,\n ResolvePrimaryNamesRequest,\n ResolveRecordsRequest,\n ResolverRecordsSelection,\n} from \"@ensnode/ensnode-sdk\";\nimport type { UndefinedInitialDataOptions } from \"@tanstack/react-query\";\nimport type { ENSNodeConfig } 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\n/**\n * Creates query options for Records Resolution\n */\nexport function createRecordsQueryOptions<SELECTION extends ResolverRecordsSelection>(\n config: ENSNodeConfig,\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: ENSNodeConfig,\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: ENSNodeConfig,\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 ENSIndexer Config API\n */\nexport function createENSIndexerConfigQueryOptions(config: ENSNodeConfig) {\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 ENSIndexer Indexing Status API\n */\nexport function createIndexingStatusQueryOptions(config: ENSNodeConfig) {\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","\"use client\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ConfigParameter, UsePrimaryNameParameters } from \"../types\";\nimport { createPrimaryNameQueryOptions } from \"../utils/query\";\nimport { useENSNodeConfig } from \"./useENSNodeConfig\";\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 * });\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 & ConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeConfig(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\";\nimport type { ConfigParameter, UsePrimaryNamesParameters } from \"../types\";\nimport { createPrimaryNamesQueryOptions } from \"../utils/query\";\nimport { useENSNodeConfig } from \"./useENSNodeConfig\";\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 & ConfigParameter) {\n const { config, query = {}, address, ...args } = parameters;\n const _config = useENSNodeConfig(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","import { ConfigResponse } from \"@ensnode/ensnode-sdk\";\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { ConfigParameter, QueryParameter } from \"../types\";\nimport { ASSUME_IMMUTABLE_QUERY, createENSIndexerConfigQueryOptions } from \"../utils/query\";\nimport { useENSNodeConfig } from \"./useENSNodeConfig\";\n\ntype UseENSIndexerConfigParameters = QueryParameter<ConfigResponse>;\n\nexport function useENSIndexerConfig(\n parameters: ConfigParameter & UseENSIndexerConfigParameters = {},\n) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeConfig(config);\n\n const queryOptions = createENSIndexerConfigQueryOptions(_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","import { IndexingStatusRequest, IndexingStatusResponse } from \"@ensnode/ensnode-sdk\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { ConfigParameter, QueryParameter } from \"../types\";\nimport { createIndexingStatusQueryOptions } from \"../utils/query\";\nimport { useENSNodeConfig } from \"./useENSNodeConfig\";\n\ninterface UseIndexingStatusParameters\n extends IndexingStatusRequest,\n QueryParameter<IndexingStatusResponse> {}\n\nexport function useIndexingStatus(parameters: ConfigParameter & UseIndexingStatusParameters = {}) {\n const { config, query = {} } = parameters;\n const _config = useENSNodeConfig(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 {\n ENSNamespaceId,\n Identity,\n NamedIdentity,\n ResolutionStatusIds,\n ResolvedIdentity,\n UnknownIdentity,\n UnnamedIdentity,\n UnresolvedIdentity,\n getResolvePrimaryNameChainIdParam,\n} from \"@ensnode/ensnode-sdk\";\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}\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 *\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, ...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 ...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"],"mappings":"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","names":["import_react","import_react","import_react_query","import_ensnode_sdk","import_react_query","import_react_query","import_react_query","import_react_query","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/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"]}