@isograph/react 0.0.0-main-f524690b → 0.0.0-main-38d73d29

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/src/index.tsx CHANGED
@@ -1,27 +1,38 @@
1
1
  import {
2
- DataId,
3
- StoreRecord,
4
- DataTypeValue,
5
- Link,
6
- ROOT_ID,
7
2
  getOrCreateCacheForArtifact,
8
3
  onNextChange,
9
- getStore,
10
4
  getParentRecordKey,
11
5
  } from './cache';
12
6
  import { useLazyDisposableState } from '@isograph/react-disposable-state';
13
7
  import { type PromiseWrapper } from './PromiseWrapper';
14
8
  import { getOrCreateCachedComponent } from './componentCache';
15
-
16
- export {
17
- setNetwork,
18
- makeNetworkRequest,
19
- subscribe,
9
+ import {
20
10
  DataId,
11
+ DataTypeValue,
12
+ IsographEnvironment,
21
13
  Link,
14
+ ROOT_ID,
22
15
  StoreRecord,
23
- clearStore,
24
- } from './cache';
16
+ useIsographEnvironment,
17
+ } from './IsographEnvironment';
18
+
19
+ export { makeNetworkRequest, subscribe } from './cache';
20
+ export {
21
+ IsographEnvironmentContext,
22
+ ROOT_ID,
23
+ type DataId,
24
+ type DataTypeValue,
25
+ type IsographEnvironment,
26
+ IsographEnvironmentProvider,
27
+ type IsographEnvironmentProviderProps,
28
+ type IsographNetworkFunction,
29
+ type IsographStore,
30
+ type Link,
31
+ type StoreRecord,
32
+ useIsographEnvironment,
33
+ createIsographEnvironment,
34
+ createIsographStore,
35
+ } from './IsographEnvironment';
25
36
 
26
37
  export { iso } from './iso';
27
38
 
@@ -177,7 +188,10 @@ function assertIsEntrypoint<
177
188
  >(
178
189
  value:
179
190
  | IsographEntrypoint<TReadFromStore, TResolverProps, TResolverResult>
180
- | typeof iso,
191
+ | ((_: any) => any)
192
+ // Temporarily, allow any here. Once we automatically provide
193
+ // types to entrypoints, we probably don't need this.
194
+ | any,
181
195
  ): asserts value is IsographEntrypoint<
182
196
  TReadFromStore,
183
197
  TResolverProps,
@@ -211,9 +225,11 @@ export function useLazyReference<TEntrypoint>(
211
225
  ExtractResolverResult<TEntrypoint>
212
226
  >;
213
227
  } {
228
+ const environment = useIsographEnvironment();
214
229
  assertIsEntrypoint(entrypoint);
215
230
  // Typechecking fails here... TODO investigate
216
231
  const cache = getOrCreateCacheForArtifact<ExtractResolverResult<TEntrypoint>>(
232
+ environment,
217
233
  entrypoint,
218
234
  variables,
219
235
  );
@@ -234,11 +250,27 @@ export function useLazyReference<TEntrypoint>(
234
250
  };
235
251
  }
236
252
 
253
+ export function useRead<
254
+ TReadFromStore extends Object,
255
+ TResolverProps,
256
+ TResolverResult,
257
+ >(
258
+ fragmentReference: FragmentReference<
259
+ TReadFromStore,
260
+ TResolverProps,
261
+ TResolverResult
262
+ >,
263
+ ): TResolverResult {
264
+ const environment = useIsographEnvironment();
265
+ return read(environment, fragmentReference);
266
+ }
267
+
237
268
  export function read<
238
269
  TReadFromStore extends Object,
239
270
  TResolverProps,
240
271
  TResolverResult,
241
272
  >(
273
+ environment: IsographEnvironment,
242
274
  fragmentReference: FragmentReference<
243
275
  TReadFromStore,
244
276
  TResolverProps,
@@ -248,19 +280,21 @@ export function read<
248
280
  const variant = fragmentReference.readerArtifact.variant;
249
281
  if (variant.kind === 'Eager') {
250
282
  const data = readData(
283
+ environment,
251
284
  fragmentReference.readerArtifact.readerAst,
252
285
  fragmentReference.root,
253
286
  fragmentReference.variables ?? {},
254
287
  fragmentReference.nestedRefetchQueries,
255
288
  );
256
289
  if (data.kind === 'MissingData') {
257
- throw onNextChange();
290
+ throw onNextChange(environment);
258
291
  } else {
259
292
  return fragmentReference.readerArtifact.resolver(data.data);
260
293
  }
261
294
  } else if (variant.kind === 'Component') {
262
295
  // @ts-ignore
263
296
  return getOrCreateCachedComponent(
297
+ environment,
264
298
  fragmentReference.root,
265
299
  variant.componentName,
266
300
  fragmentReference.readerArtifact,
@@ -273,9 +307,11 @@ export function read<
273
307
  }
274
308
 
275
309
  export function readButDoNotEvaluate<TReadFromStore extends Object>(
310
+ environment: IsographEnvironment,
276
311
  reference: FragmentReference<TReadFromStore, unknown, unknown>,
277
312
  ): TReadFromStore {
278
313
  const response = readData(
314
+ environment,
279
315
  reference.readerArtifact.readerAst,
280
316
  reference.root,
281
317
  reference.variables ?? {},
@@ -285,7 +321,7 @@ export function readButDoNotEvaluate<TReadFromStore extends Object>(
285
321
  console.log('done reading', { response });
286
322
  }
287
323
  if (response.kind === 'MissingData') {
288
- throw onNextChange();
324
+ throw onNextChange(environment);
289
325
  } else {
290
326
  return response.data;
291
327
  }
@@ -303,12 +339,13 @@ type ReadDataResult<TReadFromStore> =
303
339
  };
304
340
 
305
341
  function readData<TReadFromStore>(
342
+ environment: IsographEnvironment,
306
343
  ast: ReaderAst<TReadFromStore>,
307
344
  root: DataId,
308
345
  variables: { [index: string]: string },
309
346
  nestedRefetchQueries: RefetchQueryArtifactWrapper[],
310
347
  ): ReadDataResult<TReadFromStore> {
311
- let storeRecord = getStore()[root];
348
+ let storeRecord = environment.store[root];
312
349
  if (storeRecord === undefined) {
313
350
  return { kind: 'MissingData', reason: 'No record for root ' + root };
314
351
  }
@@ -358,6 +395,7 @@ function readData<TReadFromStore>(
358
395
  continue;
359
396
  }
360
397
  const result = readData(
398
+ environment,
361
399
  field.selections,
362
400
  link.__link,
363
401
  variables,
@@ -384,6 +422,8 @@ function readData<TReadFromStore>(
384
422
  let link = assertLink(value);
385
423
  if (link === undefined) {
386
424
  // TODO make this configurable, and also generated and derived from the schema
425
+ const missingFieldHandler =
426
+ environment.missingFieldHandler ?? defaultMissingFieldHandler;
387
427
  const altLink = missingFieldHandler(
388
428
  storeRecord,
389
429
  root,
@@ -411,6 +451,7 @@ function readData<TReadFromStore>(
411
451
  }
412
452
  const targetId = link.__link;
413
453
  const data = readData(
454
+ environment,
414
455
  field.selections,
415
456
  targetId,
416
457
  variables,
@@ -428,6 +469,7 @@ function readData<TReadFromStore>(
428
469
  }
429
470
  case 'RefetchField': {
430
471
  const data = readData(
472
+ environment,
431
473
  field.readerArtifact.readerAst,
432
474
  root,
433
475
  variables,
@@ -453,6 +495,7 @@ function readData<TReadFromStore>(
453
495
  const allowedVariables = refetchQuery.allowedVariables;
454
496
 
455
497
  target[field.alias] = field.readerArtifact.resolver(
498
+ environment,
456
499
  refetchQueryArtifact,
457
500
  {
458
501
  ...data.data,
@@ -466,6 +509,7 @@ function readData<TReadFromStore>(
466
509
  }
467
510
  case 'MutationField': {
468
511
  const data = readData(
512
+ environment,
469
513
  field.readerArtifact.readerAst,
470
514
  root,
471
515
  variables,
@@ -491,6 +535,7 @@ function readData<TReadFromStore>(
491
535
  const allowedVariables = refetchQuery.allowedVariables;
492
536
 
493
537
  target[field.alias] = field.readerArtifact.resolver(
538
+ environment,
494
539
  refetchQueryArtifact,
495
540
  data.data,
496
541
  filterVariables(variables, allowedVariables),
@@ -507,6 +552,7 @@ function readData<TReadFromStore>(
507
552
  const variant = field.readerArtifact.variant;
508
553
  if (variant.kind === 'Eager') {
509
554
  const data = readData(
555
+ environment,
510
556
  field.readerArtifact.readerAst,
511
557
  root,
512
558
  variables,
@@ -523,6 +569,7 @@ function readData<TReadFromStore>(
523
569
  }
524
570
  } else if (variant.kind === 'Component') {
525
571
  target[field.alias] = getOrCreateCachedComponent(
572
+ environment,
526
573
  root,
527
574
  variant.componentName,
528
575
  field.readerArtifact,
@@ -537,37 +584,9 @@ function readData<TReadFromStore>(
537
584
  return { kind: 'Success', data: target as any };
538
585
  }
539
586
 
540
- let customMissingFieldHandler: typeof defaultMissingFieldHandler | null = null;
541
-
542
- function missingFieldHandler(
543
- storeRecord: StoreRecord,
544
- root: DataId,
545
- fieldName: string,
546
- arguments_: { [index: string]: any } | null,
547
- variables: { [index: string]: any } | null,
548
- ): Link | undefined {
549
- if (customMissingFieldHandler != null) {
550
- return customMissingFieldHandler(
551
- storeRecord,
552
- root,
553
- fieldName,
554
- arguments_,
555
- variables,
556
- );
557
- } else {
558
- return defaultMissingFieldHandler(
559
- storeRecord,
560
- root,
561
- fieldName,
562
- arguments_,
563
- variables,
564
- );
565
- }
566
- }
567
-
568
587
  export function defaultMissingFieldHandler(
569
- storeRecord: StoreRecord,
570
- root: DataId,
588
+ _storeRecord: StoreRecord,
589
+ _root: DataId,
571
590
  fieldName: string,
572
591
  arguments_: { [index: string]: any } | null,
573
592
  variables: { [index: string]: any } | null,
@@ -583,12 +602,6 @@ export function defaultMissingFieldHandler(
583
602
  }
584
603
  }
585
604
 
586
- export function setMissingFieldHandler(
587
- handler: typeof defaultMissingFieldHandler,
588
- ) {
589
- customMissingFieldHandler = handler;
590
- }
591
-
592
605
  function assertLink(link: DataTypeValue): Link | undefined | null {
593
606
  if (Array.isArray(link)) {
594
607
  throw new Error('Unexpected array');