@ensnode/ensnode-react 1.9.0 → 1.10.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/README.md CHANGED
@@ -16,18 +16,18 @@ Note: `@tanstack/react-query` is a peer dependency but you don't need to interac
16
16
 
17
17
  ### 1. Setup the Provider
18
18
 
19
- Wrap your app with the `ENSNodeProvider`:
19
+ Wrap your app with the `EnsNodeProvider`:
20
20
 
21
21
  ```tsx
22
- import { ENSNodeProvider, createConfig } from "@ensnode/ensnode-react";
22
+ import { EnsNodeProvider, createEnsNodeProviderOptions } from "@ensnode/ensnode-react";
23
23
 
24
- const config = createConfig({ url: "https://api.alpha.ensnode.io" });
24
+ const options = createEnsNodeProviderOptions({ url: "https://api.alpha.ensnode.io" });
25
25
 
26
26
  function App() {
27
27
  return (
28
- <ENSNodeProvider config={config}>
28
+ <EnsNodeProvider options={options}>
29
29
  <YourApp />
30
- </ENSNodeProvider>
30
+ </EnsNodeProvider>
31
31
  );
32
32
  }
33
33
  ```
@@ -124,13 +124,13 @@ function DisplayPrimaryNames() {
124
124
 
125
125
  ## API Reference
126
126
 
127
- ### ENSNodeProvider
127
+ ### EnsNodeProvider
128
128
 
129
- The provider component that supplies ENSNode configuration to all child components.
129
+ The provider component that supplies ENSNode Provider Options to all child components.
130
130
 
131
131
  ```tsx
132
- interface ENSNodeProviderProps {
133
- config: ENSNodeConfig;
132
+ interface EnsNodeProviderProps {
133
+ options: EnsNodeProviderOptions;
134
134
  queryClient?: QueryClient;
135
135
  queryClientOptions?: QueryClientOptions;
136
136
  }
@@ -138,16 +138,16 @@ interface ENSNodeProviderProps {
138
138
 
139
139
  #### Props
140
140
 
141
- - `config`: ENSNode configuration object
141
+ - `options`: ENSNode Provider Options object
142
142
  - `queryClient`: Optional TanStack Query client instance (requires manual QueryClientProvider setup)
143
143
  - `queryClientOptions`: Optional Custom options for auto-created QueryClient (only used when queryClient is not provided)
144
144
 
145
- ### createConfig
145
+ ### createEnsNodeProviderOptions
146
146
 
147
- Helper function to create ENSNode configuration with defaults.
147
+ Helper function to create ENSNode Provider Options with defaults.
148
148
 
149
149
  ```tsx
150
- const config = createConfig({
150
+ const options = createEnsNodeProviderOptions({
151
151
  url: "https://api.alpha.ensnode.io",
152
152
  });
153
153
  ```
@@ -230,12 +230,12 @@ const { data, isLoading, error, refetch } = usePrimaryNames({
230
230
 
231
231
  ### Custom Query Configuration
232
232
 
233
- The `ENSNodeProvider` automatically creates and manages a QueryClient for you. Cache keys include the ENSNode endpoint URL, so different endpoints (mainnet vs testnet) maintain separate caches. You can customize the QueryClient without importing TanStack Query:
233
+ The `EnsNodeProvider` automatically creates and manages a QueryClient for you. Cache keys include the ENSNode endpoint URL, so different ENSNode endpoints that may have different configurations (ex: mainnet vs sepolia) maintain separate caches. You can customize the QueryClient without importing TanStack Query:
234
234
 
235
235
  ```tsx
236
236
  // Simple setup - no TanStack Query knowledge needed
237
- <ENSNodeProvider
238
- config={config}
237
+ <EnsNodeProvider
238
+ options={options}
239
239
  queryClientOptions={{
240
240
  defaultOptions: {
241
241
  queries: {
@@ -247,7 +247,7 @@ The `ENSNodeProvider` automatically creates and manages a QueryClient for you. C
247
247
  }}
248
248
  >
249
249
  <App />
250
- </ENSNodeProvider>
250
+ </EnsNodeProvider>
251
251
  ```
252
252
 
253
253
  ### Advanced: Bring Your Own QueryClient
@@ -268,9 +268,9 @@ const queryClient = new QueryClient({
268
268
  });
269
269
 
270
270
  <QueryClientProvider client={queryClient}>
271
- <ENSNodeProvider config={config} queryClient={queryClient}>
271
+ <EnsNodeProvider options={options} queryClient={queryClient}>
272
272
  <App />
273
- </ENSNodeProvider>
273
+ </EnsNodeProvider>
274
274
  </QueryClientProvider>;
275
275
  ```
276
276
 
package/dist/index.cjs CHANGED
@@ -21,10 +21,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  ASSUME_IMMUTABLE_QUERY: () => ASSUME_IMMUTABLE_QUERY,
24
- ENSNodeContext: () => ENSNodeContext,
25
- ENSNodeProvider: () => ENSNodeProvider,
26
- createConfig: () => createConfig,
27
- createConfigQueryOptions: () => createConfigQueryOptions,
24
+ EnsNodeContext: () => EnsNodeContext,
25
+ EnsNodeProvider: () => EnsNodeProvider,
26
+ createEnsNodeProviderOptions: () => createEnsNodeProviderOptions,
28
27
  createIndexingStatusQueryOptions: () => createIndexingStatusQueryOptions,
29
28
  createNameTokensQueryOptions: () => createNameTokensQueryOptions,
30
29
  createPrimaryNameQueryOptions: () => createPrimaryNameQueryOptions,
@@ -32,8 +31,7 @@ __export(index_exports, {
32
31
  createRecordsQueryOptions: () => createRecordsQueryOptions,
33
32
  createRegistrarActionsQueryOptions: () => createRegistrarActionsQueryOptions,
34
33
  queryKeys: () => queryKeys,
35
- useENSNodeConfig: () => useENSNodeConfig,
36
- useENSNodeSDKConfig: () => useENSNodeSDKConfig,
34
+ useEnsNodeProviderOptions: () => useEnsNodeProviderOptions,
37
35
  useIndexingStatus: () => useIndexingStatus,
38
36
  useNameTokens: () => useNameTokens,
39
37
  usePrimaryName: () => usePrimaryName,
@@ -47,10 +45,23 @@ module.exports = __toCommonJS(index_exports);
47
45
 
48
46
  // src/context.ts
49
47
  var import_react = require("react");
50
- var ENSNodeContext = (0, import_react.createContext)(void 0);
51
- ENSNodeContext.displayName = "ENSNodeContext";
48
+ var EnsNodeContext = (0, import_react.createContext)(void 0);
49
+ EnsNodeContext.displayName = "EnsNodeContext";
52
50
 
53
- // src/hooks/useENSNodeConfig.ts
51
+ // src/hooks/useEnsNodeProviderOptions.ts
52
+ var import_react2 = require("react");
53
+ function useEnsNodeProviderOptions(options) {
54
+ const contextOptions = (0, import_react2.useContext)(EnsNodeContext);
55
+ const resolvedOptions = options ?? contextOptions;
56
+ if (!resolvedOptions) {
57
+ throw new Error(
58
+ "useEnsNodeProviderOptions must be used within an EnsNodeProvider or you must pass the options parameter"
59
+ );
60
+ }
61
+ return resolvedOptions;
62
+ }
63
+
64
+ // src/hooks/useIndexingStatus.ts
54
65
  var import_react_query = require("@tanstack/react-query");
55
66
 
56
67
  // src/utils/query.ts
@@ -68,7 +79,6 @@ var queryKeys = {
68
79
  records: (url, args) => [...queryKeys.resolve(url), "records", args],
69
80
  primaryName: (url, args) => [...queryKeys.resolve(url), "primary-name", args],
70
81
  primaryNames: (url, args) => [...queryKeys.resolve(url), "primary-names", args],
71
- config: (url) => [...queryKeys.base(url), "config"],
72
82
  indexingStatus: (url) => [...queryKeys.base(url), "indexing-status"],
73
83
  registrarActions: (url, args) => [...queryKeys.base(url), "registrar-actions", args],
74
84
  nameTokens: (url, args) => [...queryKeys.base(url), "name-tokens", args]
@@ -78,7 +88,7 @@ function createRecordsQueryOptions(config, args) {
78
88
  enabled: true,
79
89
  queryKey: queryKeys.records(config.client.url.href, args),
80
90
  queryFn: async () => {
81
- const client = new import_ensnode_sdk.ENSNodeClient(config.client);
91
+ const client = new import_ensnode_sdk.EnsNodeClient(config.client);
82
92
  return client.resolveRecords(args.name, args.selection, args);
83
93
  }
84
94
  };
@@ -88,7 +98,7 @@ function createPrimaryNameQueryOptions(config, args) {
88
98
  enabled: true,
89
99
  queryKey: queryKeys.primaryName(config.client.url.href, args),
90
100
  queryFn: async () => {
91
- const client = new import_ensnode_sdk.ENSNodeClient(config.client);
101
+ const client = new import_ensnode_sdk.EnsNodeClient(config.client);
92
102
  return client.resolvePrimaryName(args.address, args.chainId, args);
93
103
  }
94
104
  };
@@ -98,27 +108,17 @@ function createPrimaryNamesQueryOptions(config, args) {
98
108
  enabled: true,
99
109
  queryKey: queryKeys.primaryNames(config.client.url.href, args),
100
110
  queryFn: async () => {
101
- const client = new import_ensnode_sdk.ENSNodeClient(config.client);
111
+ const client = new import_ensnode_sdk.EnsNodeClient(config.client);
102
112
  return client.resolvePrimaryNames(args.address, args);
103
113
  }
104
114
  };
105
115
  }
106
- function createConfigQueryOptions(config) {
107
- return {
108
- enabled: true,
109
- queryKey: queryKeys.config(config.client.url.href),
110
- queryFn: async () => {
111
- const client = new import_ensnode_sdk.ENSNodeClient(config.client);
112
- return client.config();
113
- }
114
- };
115
- }
116
116
  function createIndexingStatusQueryOptions(config) {
117
117
  return {
118
118
  enabled: true,
119
119
  queryKey: queryKeys.indexingStatus(config.client.url.href),
120
120
  queryFn: async () => {
121
- const client = new import_ensnode_sdk.ENSNodeClient(config.client);
121
+ const client = new import_ensnode_sdk.EnsNodeClient(config.client);
122
122
  return client.indexingStatus();
123
123
  }
124
124
  };
@@ -128,7 +128,7 @@ function createRegistrarActionsQueryOptions(config, args) {
128
128
  enabled: true,
129
129
  queryKey: queryKeys.registrarActions(config.client.url.href, args),
130
130
  queryFn: async () => {
131
- const client = new import_ensnode_sdk.ENSNodeClient(config.client);
131
+ const client = new import_ensnode_sdk.EnsNodeClient(config.client);
132
132
  return client.registrarActions(args);
133
133
  }
134
134
  };
@@ -138,62 +138,33 @@ function createNameTokensQueryOptions(config, args) {
138
138
  enabled: true,
139
139
  queryKey: queryKeys.nameTokens(config.client.url.href, args),
140
140
  queryFn: async () => {
141
- const client = new import_ensnode_sdk.ENSNodeClient(config.client);
141
+ const client = new import_ensnode_sdk.EnsNodeClient(config.client);
142
142
  return client.nameTokens(args);
143
143
  }
144
144
  };
145
145
  }
146
146
 
147
- // src/hooks/useENSNodeSDKConfig.ts
148
- var import_react2 = require("react");
149
- function useENSNodeSDKConfig(config) {
150
- const contextConfig = (0, import_react2.useContext)(ENSNodeContext);
151
- const resolvedConfig = config ?? contextConfig;
152
- if (!resolvedConfig) {
153
- throw new Error(
154
- "useENSNodeSDKConfig must be used within an ENSNodeProvider or you must pass a config parameter"
155
- );
156
- }
157
- return resolvedConfig;
158
- }
159
-
160
- // src/hooks/useENSNodeConfig.ts
161
- function useENSNodeConfig(parameters = {}) {
162
- const { config, query = {} } = parameters;
163
- const _config = useENSNodeSDKConfig(config);
164
- const queryOptions = createConfigQueryOptions(_config);
165
- const options = {
166
- ...queryOptions,
167
- ...ASSUME_IMMUTABLE_QUERY,
168
- ...query,
169
- enabled: query.enabled ?? queryOptions.enabled
170
- };
171
- return (0, import_react_query.useQuery)(options);
172
- }
173
-
174
147
  // src/hooks/useIndexingStatus.ts
175
- var import_react_query2 = require("@tanstack/react-query");
176
148
  function useIndexingStatus(parameters = {}) {
177
- const { config, query = {} } = parameters;
178
- const _config = useENSNodeSDKConfig(config);
179
- const queryOptions = createIndexingStatusQueryOptions(_config);
180
- const options = {
149
+ const { options, query = {} } = parameters;
150
+ const providerOptions = useEnsNodeProviderOptions(options);
151
+ const queryOptions = createIndexingStatusQueryOptions(providerOptions);
152
+ return (0, import_react_query.useQuery)({
181
153
  ...queryOptions,
182
154
  refetchInterval: 10 * 1e3,
183
155
  // 10 seconds - indexing status changes frequently
184
156
  ...query,
185
157
  enabled: query.enabled ?? queryOptions.enabled
186
- };
187
- return (0, import_react_query2.useQuery)(options);
158
+ });
188
159
  }
189
160
 
190
161
  // src/hooks/useNameTokens.ts
191
- var import_react_query3 = require("@tanstack/react-query");
162
+ var import_react_query2 = require("@tanstack/react-query");
192
163
  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)({
164
+ const { options, query = {}, ...request } = parameters;
165
+ const providerOptions = useEnsNodeProviderOptions(options);
166
+ const queryOptions = createNameTokensQueryOptions(providerOptions, request);
167
+ return (0, import_react_query2.useQuery)({
197
168
  ...queryOptions,
198
169
  refetchInterval: false,
199
170
  // no refetching - assume data is immutable until a full page refresh
@@ -203,72 +174,66 @@ function useNameTokens(parameters) {
203
174
  }
204
175
 
205
176
  // src/hooks/usePrimaryName.ts
206
- var import_react_query4 = require("@tanstack/react-query");
177
+ var import_react_query3 = require("@tanstack/react-query");
207
178
  function usePrimaryName(parameters) {
208
- const { config, query = {}, address, ...args } = parameters;
209
- const _config = useENSNodeSDKConfig(config);
179
+ const { options, query = {}, address, ...args } = parameters;
180
+ const providerOptions = useEnsNodeProviderOptions(options);
210
181
  const canEnable = address !== null;
211
- const queryOptions = canEnable ? createPrimaryNameQueryOptions(_config, { ...args, address }) : { enabled: false, queryKey: ["disabled"] };
212
- const options = {
182
+ const queryOptions = canEnable ? createPrimaryNameQueryOptions(providerOptions, { ...args, address }) : { enabled: false, queryKey: ["disabled"] };
183
+ return (0, import_react_query3.useQuery)({
213
184
  ...queryOptions,
214
185
  ...query,
215
186
  enabled: canEnable && (query.enabled ?? queryOptions.enabled)
216
- };
217
- return (0, import_react_query4.useQuery)(options);
187
+ });
218
188
  }
219
189
 
220
190
  // src/hooks/usePrimaryNames.ts
221
- var import_react_query5 = require("@tanstack/react-query");
191
+ var import_react_query4 = require("@tanstack/react-query");
222
192
  function usePrimaryNames(parameters) {
223
- const { config, query = {}, address, ...args } = parameters;
224
- const _config = useENSNodeSDKConfig(config);
193
+ const { options, query = {}, address, ...args } = parameters;
194
+ const providerOptions = useEnsNodeProviderOptions(options);
225
195
  const canEnable = address !== null;
226
- const queryOptions = canEnable ? createPrimaryNamesQueryOptions(_config, { ...args, address }) : { enabled: false, queryKey: ["disabled"] };
227
- const options = {
196
+ const queryOptions = canEnable ? createPrimaryNamesQueryOptions(providerOptions, { ...args, address }) : { enabled: false, queryKey: ["disabled"] };
197
+ return (0, import_react_query4.useQuery)({
228
198
  ...queryOptions,
229
199
  ...query,
230
200
  enabled: canEnable && (query.enabled ?? queryOptions.enabled)
231
- };
232
- return (0, import_react_query5.useQuery)(options);
201
+ });
233
202
  }
234
203
 
235
204
  // src/hooks/useRecords.ts
236
- var import_react_query6 = require("@tanstack/react-query");
205
+ var import_react_query5 = require("@tanstack/react-query");
237
206
  function useRecords(parameters) {
238
- const { config, query = {}, name, ...args } = parameters;
239
- const _config = useENSNodeSDKConfig(config);
207
+ const { options, query = {}, name, ...args } = parameters;
208
+ const _config = useEnsNodeProviderOptions(options);
240
209
  const canEnable = name !== null;
241
210
  const queryOptions = canEnable ? createRecordsQueryOptions(_config, { ...args, name }) : { enabled: false, queryKey: ["disabled"] };
242
- const options = {
211
+ return (0, import_react_query5.useQuery)({
243
212
  ...queryOptions,
244
213
  ...query,
245
214
  enabled: canEnable && (query.enabled ?? queryOptions.enabled)
246
- };
247
- return (0, import_react_query6.useQuery)(options);
215
+ });
248
216
  }
249
217
 
250
218
  // src/hooks/useRegistrarActions.ts
251
- var import_react_query7 = require("@tanstack/react-query");
219
+ var import_react_query6 = require("@tanstack/react-query");
252
220
  function useRegistrarActions(parameters = {}) {
253
- const { config, query = {} } = parameters;
254
- const _config = useENSNodeSDKConfig(config);
255
- const queryOptions = createRegistrarActionsQueryOptions(_config, parameters);
256
- const options = {
221
+ const { options, query = {}, ...request } = parameters;
222
+ const providerOptions = useEnsNodeProviderOptions(options);
223
+ const queryOptions = createRegistrarActionsQueryOptions(providerOptions, request);
224
+ return (0, import_react_query6.useQuery)({
257
225
  ...queryOptions,
258
226
  refetchInterval: 10 * 1e3,
259
227
  // 10 seconds - latest registrar actions change frequently
260
228
  ...query,
261
229
  enabled: query.enabled ?? queryOptions.enabled
262
- };
263
- return (0, import_react_query7.useQuery)(options);
230
+ });
264
231
  }
265
232
 
266
233
  // src/hooks/useResolvedIdentity.ts
267
234
  var import_ensnode_sdk2 = require("@ensnode/ensnode-sdk");
268
235
  function useResolvedIdentity(parameters) {
269
- const { identity, accelerate, query: _query = {} } = parameters;
270
- const { data } = useENSNodeConfig();
271
- const namespace = data?.ensIndexerPublicConfig.namespace;
236
+ const { identity, namespace, accelerate, query: _query = {} } = parameters;
272
237
  const {
273
238
  data: primaryNameData,
274
239
  status,
@@ -281,7 +246,15 @@ function useResolvedIdentity(parameters) {
281
246
  namespace ?? import_ensnode_sdk2.ENSNamespaceIds.Mainnet
282
247
  ),
283
248
  accelerate,
249
+ // NOTE: Overriding `gcTime` to prevent unbounded memory growth
250
+ // in long-running sessions with many identities.
284
251
  query: {
252
+ ...ASSUME_IMMUTABLE_QUERY,
253
+ // identity changes very rarely
254
+ gcTime: 60 * 60 * 1e3,
255
+ // 1 hour
256
+ refetchInterval: false,
257
+ // not covered by ASSUME_IMMUTABLE_QUERY
285
258
  ..._query,
286
259
  enabled: (_query.enabled ?? true) && namespace !== void 0
287
260
  }
@@ -317,13 +290,13 @@ function useResolvedIdentity(parameters) {
317
290
  }
318
291
 
319
292
  // src/hooks/useSwrQuery.ts
320
- var import_react_query8 = require("@tanstack/react-query");
293
+ var import_react_query7 = require("@tanstack/react-query");
321
294
  var import_react3 = require("react");
322
295
  function useSwrQuery(options, queryClient) {
323
- const queryClientFromContext = (0, import_react_query8.useQueryClient)();
296
+ const queryClientFromContext = (0, import_react_query7.useQueryClient)();
324
297
  const derivedQueryClient = queryClient ?? queryClientFromContext;
325
298
  const cachedSuccessfulResult = derivedQueryClient.getQueryData(options.queryKey);
326
- const queryResult = (0, import_react_query8.useQuery)(
299
+ const queryResult = (0, import_react_query7.useQuery)(
327
300
  {
328
301
  ...options,
329
302
  // cached result can never be stale
@@ -354,21 +327,20 @@ function useSwrQuery(options, queryClient) {
354
327
  }
355
328
 
356
329
  // src/provider.tsx
357
- var import_react_query9 = require("@tanstack/react-query");
330
+ var import_react_query8 = require("@tanstack/react-query");
358
331
  var import_react4 = require("react");
359
332
  var import_ensnode_sdk3 = require("@ensnode/ensnode-sdk");
360
- function ENSNodeInternalProvider({
333
+ function EnsNodeInternalProvider({
361
334
  children,
362
- config
335
+ options
363
336
  }) {
364
- const memoizedConfig = (0, import_react4.useMemo)(() => config, [config]);
365
- return (0, import_react4.createElement)(ENSNodeContext.Provider, { value: memoizedConfig }, children);
337
+ return (0, import_react4.createElement)(EnsNodeContext.Provider, { value: options }, children);
366
338
  }
367
- function ENSNodeProvider(parameters) {
368
- const { children, config, queryClient, queryClientOptions } = parameters;
339
+ function EnsNodeProvider(parameters) {
340
+ const { children, options, queryClient, queryClientOptions } = parameters;
369
341
  let hasExistingQueryClient = false;
370
342
  try {
371
- hasExistingQueryClient = Boolean((0, import_react_query9.useQueryClient)());
343
+ hasExistingQueryClient = Boolean((0, import_react_query8.useQueryClient)());
372
344
  } catch {
373
345
  hasExistingQueryClient = false;
374
346
  }
@@ -378,13 +350,13 @@ function ENSNodeProvider(parameters) {
378
350
  "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."
379
351
  );
380
352
  }
381
- return (0, import_react4.createElement)(ENSNodeInternalProvider, { config, children });
353
+ return (0, import_react4.createElement)(EnsNodeInternalProvider, { options, children });
382
354
  }
383
355
  if (hasExistingQueryClient) {
384
- return (0, import_react4.createElement)(ENSNodeInternalProvider, { config, children });
356
+ return (0, import_react4.createElement)(EnsNodeInternalProvider, { options, children });
385
357
  }
386
358
  const defaultQueryClient = (0, import_react4.useMemo)(
387
- () => new import_react_query9.QueryClient({
359
+ () => new import_react_query8.QueryClient({
388
360
  defaultOptions: {
389
361
  queries: {
390
362
  retry: 3,
@@ -401,16 +373,16 @@ function ENSNodeProvider(parameters) {
401
373
  [queryClientOptions]
402
374
  );
403
375
  return (0, import_react4.createElement)(
404
- import_react_query9.QueryClientProvider,
376
+ import_react_query8.QueryClientProvider,
405
377
  { client: defaultQueryClient },
406
- (0, import_react4.createElement)(ENSNodeInternalProvider, { config, children })
378
+ (0, import_react4.createElement)(EnsNodeInternalProvider, { options, children })
407
379
  );
408
380
  }
409
- function createConfig(options) {
410
- const url = options?.url ? new URL(options.url) : import_ensnode_sdk3.ENSNodeClient.defaultOptions().url;
381
+ function createEnsNodeProviderOptions(options) {
382
+ const url = options?.url ? new URL(options.url) : import_ensnode_sdk3.EnsNodeClient.defaultOptions().url;
411
383
  return {
412
384
  client: {
413
- ...import_ensnode_sdk3.ENSNodeClient.defaultOptions(),
385
+ ...import_ensnode_sdk3.EnsNodeClient.defaultOptions(),
414
386
  url
415
387
  }
416
388
  };