@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/dist/IsographEnvironment.d.ts +56 -0
- package/dist/IsographEnvironment.js +65 -0
- package/dist/cache.d.ts +5 -21
- package/dist/cache.js +36 -58
- package/dist/componentCache.d.ts +2 -2
- package/dist/componentCache.js +3 -3
- package/dist/index.d.ts +7 -6
- package/dist/index.js +39 -39
- package/package.json +3 -3
- package/src/IsographEnvironment.tsx +126 -0
- package/src/{cache.ts → cache.tsx} +47 -81
- package/src/componentCache.ts +5 -9
- package/src/index.tsx +66 -53
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
|
-
|
24
|
-
} from './
|
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
|
-
|
|
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 =
|
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
|
-
|
570
|
-
|
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');
|