@isograph/react 0.1.1 → 0.3.0
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/core/FragmentReference.d.ts +25 -0
- package/dist/core/FragmentReference.d.ts.map +1 -0
- package/dist/core/FragmentReference.js +16 -0
- package/dist/core/IsographEnvironment.d.ts +89 -0
- package/dist/core/IsographEnvironment.d.ts.map +1 -0
- package/dist/core/IsographEnvironment.js +65 -0
- package/dist/core/PromiseWrapper.d.ts +28 -0
- package/dist/core/PromiseWrapper.d.ts.map +1 -0
- package/dist/core/PromiseWrapper.js +57 -0
- package/dist/core/areEqualWithDeepComparison.d.ts +5 -0
- package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -0
- package/dist/core/areEqualWithDeepComparison.js +95 -0
- package/dist/core/cache.d.ts +44 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +514 -0
- package/dist/core/check.d.ts +18 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +127 -0
- package/dist/core/componentCache.d.ts +5 -0
- package/dist/core/componentCache.d.ts.map +1 -0
- package/dist/core/componentCache.js +38 -0
- package/dist/core/entrypoint.d.ts +69 -0
- package/dist/core/entrypoint.d.ts.map +1 -0
- package/dist/core/entrypoint.js +7 -0
- package/dist/core/garbageCollection.d.ts +13 -0
- package/dist/core/garbageCollection.d.ts.map +1 -0
- package/dist/core/garbageCollection.js +107 -0
- package/dist/core/logging.d.ts +69 -0
- package/dist/core/logging.d.ts.map +1 -0
- package/dist/core/logging.js +19 -0
- package/dist/core/makeNetworkRequest.d.ts +9 -0
- package/dist/core/makeNetworkRequest.d.ts.map +1 -0
- package/dist/core/makeNetworkRequest.js +118 -0
- package/dist/core/read.d.ts +27 -0
- package/dist/core/read.d.ts.map +1 -0
- package/dist/core/read.js +478 -0
- package/dist/core/reader.d.ts +87 -0
- package/dist/core/reader.d.ts.map +1 -0
- package/dist/core/reader.js +2 -0
- package/dist/core/util.d.ts +19 -0
- package/dist/core/util.d.ts.map +1 -0
- package/dist/core/util.js +2 -0
- package/dist/index.d.ts +26 -120
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -306
- package/dist/loadable-hooks/useClientSideDefer.d.ts +16 -0
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -0
- package/dist/loadable-hooks/useClientSideDefer.js +13 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +34 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.js +160 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +6 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.js +14 -0
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +17 -0
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -0
- package/dist/loadable-hooks/useImperativeLoadableField.js +14 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +27 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -0
- package/dist/loadable-hooks/useSkipLimitPagination.js +162 -0
- package/dist/react/FragmentReader.d.ts +16 -0
- package/dist/react/FragmentReader.d.ts.map +1 -0
- package/dist/{EntrypointReader.js → react/FragmentReader.js} +7 -5
- package/dist/react/IsographEnvironmentProvider.d.ts +11 -0
- package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -0
- package/dist/{IsographEnvironment.js → react/IsographEnvironmentProvider.js} +4 -22
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +10 -0
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -0
- package/dist/react/RenderAfterCommit__DO_NOT_USE.js +15 -0
- package/dist/react/useImperativeReference.d.ts +12 -0
- package/dist/react/useImperativeReference.d.ts.map +1 -0
- package/dist/react/useImperativeReference.js +35 -0
- package/dist/react/useLazyReference.d.ts +10 -0
- package/dist/react/useLazyReference.d.ts.map +1 -0
- package/dist/react/useLazyReference.js +21 -0
- package/dist/react/useReadAndSubscribe.d.ts +20 -0
- package/dist/react/useReadAndSubscribe.d.ts.map +1 -0
- package/dist/react/useReadAndSubscribe.js +40 -0
- package/dist/react/useRerenderOnChange.d.ts +8 -0
- package/dist/react/useRerenderOnChange.d.ts.map +1 -0
- package/dist/react/useRerenderOnChange.js +22 -0
- package/dist/react/useResult.d.ts +9 -0
- package/dist/react/useResult.d.ts.map +1 -0
- package/dist/react/useResult.js +39 -0
- package/docs/how-useLazyReference-works.md +117 -0
- package/isograph.config.json +7 -0
- package/package.json +18 -9
- package/schema.graphql +17 -0
- package/src/core/FragmentReference.ts +49 -0
- package/src/core/IsographEnvironment.ts +192 -0
- package/src/core/PromiseWrapper.ts +86 -0
- package/src/core/areEqualWithDeepComparison.ts +112 -0
- package/src/core/cache.ts +835 -0
- package/src/core/check.ts +207 -0
- package/src/core/componentCache.ts +62 -0
- package/src/core/entrypoint.ts +106 -0
- package/src/core/garbageCollection.ts +173 -0
- package/src/core/logging.ts +116 -0
- package/src/core/makeNetworkRequest.ts +175 -0
- package/src/core/read.ts +722 -0
- package/src/core/reader.ts +160 -0
- package/src/core/util.ts +27 -0
- package/src/index.ts +99 -0
- package/src/loadable-hooks/useClientSideDefer.ts +58 -0
- package/src/loadable-hooks/useConnectionSpecPagination.ts +331 -0
- package/src/loadable-hooks/useImperativeExposedMutationField.ts +17 -0
- package/src/loadable-hooks/useImperativeLoadableField.ts +52 -0
- package/src/loadable-hooks/useSkipLimitPagination.ts +352 -0
- package/src/react/FragmentReader.tsx +43 -0
- package/src/react/IsographEnvironmentProvider.tsx +33 -0
- package/src/react/RenderAfterCommit__DO_NOT_USE.tsx +17 -0
- package/src/react/useImperativeReference.ts +68 -0
- package/src/react/useLazyReference.ts +42 -0
- package/src/react/useReadAndSubscribe.ts +81 -0
- package/src/react/useRerenderOnChange.ts +38 -0
- package/src/react/useResult.ts +73 -0
- package/src/tests/__isograph/Query/meName/entrypoint.ts +52 -0
- package/src/tests/__isograph/Query/meName/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meName/param_type.ts +9 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +33 -0
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +90 -0
- package/src/tests/__isograph/Query/meNameSuccessor/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +14 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +57 -0
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +57 -0
- package/src/tests/__isograph/Query/nodeField/output_type.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/param_type.ts +10 -0
- package/src/tests/__isograph/Query/nodeField/parameters_type.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +38 -0
- package/src/tests/__isograph/Query/subquery/entrypoint.ts +67 -0
- package/src/tests/__isograph/Query/subquery/output_type.ts +3 -0
- package/src/tests/__isograph/Query/subquery/param_type.ts +12 -0
- package/src/tests/__isograph/Query/subquery/parameters_type.ts +3 -0
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +47 -0
- package/src/tests/__isograph/iso.ts +99 -0
- package/src/tests/garbageCollection.test.ts +142 -0
- package/src/tests/meNameSuccessor.ts +25 -0
- package/src/tests/nodeQuery.ts +19 -0
- package/src/tests/normalizeData.test.ts +120 -0
- package/src/tests/tsconfig.json +21 -0
- package/tsconfig.json +6 -0
- package/tsconfig.pkg.json +7 -1
- package/vitest.config.ts +20 -0
- package/dist/EntrypointReader.d.ts +0 -6
- package/dist/IsographEnvironment.d.ts +0 -56
- package/dist/PromiseWrapper.d.ts +0 -13
- package/dist/PromiseWrapper.js +0 -22
- package/dist/cache.d.ts +0 -26
- package/dist/cache.js +0 -274
- package/dist/componentCache.d.ts +0 -6
- package/dist/componentCache.js +0 -31
- package/dist/useImperativeReference.d.ts +0 -8
- package/dist/useImperativeReference.js +0 -28
- package/src/EntrypointReader.tsx +0 -20
- package/src/IsographEnvironment.tsx +0 -120
- package/src/PromiseWrapper.ts +0 -29
- package/src/cache.tsx +0 -484
- package/src/componentCache.ts +0 -41
- package/src/index.tsx +0 -617
- package/src/useImperativeReference.ts +0 -58
@@ -0,0 +1,86 @@
|
|
1
|
+
export type AnyError = any;
|
2
|
+
|
3
|
+
const NOT_SET: Symbol = Symbol('NOT_SET');
|
4
|
+
type NotSet = typeof NOT_SET;
|
5
|
+
|
6
|
+
type Result<T, E> =
|
7
|
+
| {
|
8
|
+
kind: 'Ok';
|
9
|
+
value: T;
|
10
|
+
}
|
11
|
+
| {
|
12
|
+
kind: 'Err';
|
13
|
+
error: E;
|
14
|
+
};
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Invariant:
|
18
|
+
* Before the promise is resolved, value becomes non-null.
|
19
|
+
*/
|
20
|
+
export type PromiseWrapper<T, E = any> = {
|
21
|
+
readonly promise: Promise<T>;
|
22
|
+
result: Result<Exclude<T, NotSet>, E> | NotSet;
|
23
|
+
};
|
24
|
+
|
25
|
+
export function wrapPromise<T>(promise: Promise<T>): PromiseWrapper<T, any> {
|
26
|
+
// TODO confirm suspense works if the promise is already resolved.
|
27
|
+
const wrapper: PromiseWrapper<T, any> = { promise, result: NOT_SET };
|
28
|
+
promise
|
29
|
+
.then((v) => {
|
30
|
+
// v is assignable to Exclude<T, Symbol> | Symbol
|
31
|
+
wrapper.result = { kind: 'Ok', value: v as any };
|
32
|
+
})
|
33
|
+
.catch((e) => {
|
34
|
+
// e is assignable to Exclude<T, Symbol> | Symbol
|
35
|
+
wrapper.result = { kind: 'Err', error: e as any };
|
36
|
+
});
|
37
|
+
return wrapper;
|
38
|
+
}
|
39
|
+
|
40
|
+
export function wrapResolvedValue<T>(value: T): PromiseWrapper<T, never> {
|
41
|
+
return {
|
42
|
+
promise: Promise.resolve(value),
|
43
|
+
result: {
|
44
|
+
kind: 'Ok',
|
45
|
+
// @ts-expect-error one should not call wrapResolvedValue with NOT_SET
|
46
|
+
value,
|
47
|
+
},
|
48
|
+
};
|
49
|
+
}
|
50
|
+
|
51
|
+
export function readPromise<T, E>(p: PromiseWrapper<T, E>): T {
|
52
|
+
const { result } = p;
|
53
|
+
if (result !== NOT_SET) {
|
54
|
+
// Safety: p.result is either NOT_SET or an actual value.
|
55
|
+
const resultKind = result as Result<T, any>;
|
56
|
+
if (resultKind.kind === 'Ok') {
|
57
|
+
return resultKind.value;
|
58
|
+
} else {
|
59
|
+
throw resultKind.error;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
throw p.promise;
|
64
|
+
}
|
65
|
+
|
66
|
+
export type PromiseState<T, E> =
|
67
|
+
| {
|
68
|
+
kind: 'Pending';
|
69
|
+
promise: Promise<T>;
|
70
|
+
}
|
71
|
+
| Result<T, E>;
|
72
|
+
|
73
|
+
export function getPromiseState<T, E>(
|
74
|
+
p: PromiseWrapper<T, E>,
|
75
|
+
): PromiseState<T, E> {
|
76
|
+
const { result } = p;
|
77
|
+
if (result !== NOT_SET) {
|
78
|
+
// Safety: p.result is either NOT_SET or an actual value.
|
79
|
+
const resultKind = result as Result<T, any>;
|
80
|
+
return resultKind;
|
81
|
+
}
|
82
|
+
return {
|
83
|
+
kind: 'Pending',
|
84
|
+
promise: p.promise,
|
85
|
+
};
|
86
|
+
}
|
@@ -0,0 +1,112 @@
|
|
1
|
+
import type { ReaderAst, ReaderLinkedField, ReaderScalarField } from './reader';
|
2
|
+
export function mergeUsingReaderAst(
|
3
|
+
field: ReaderScalarField | ReaderLinkedField,
|
4
|
+
oldItem: unknown,
|
5
|
+
newItem: unknown,
|
6
|
+
): unknown {
|
7
|
+
if (newItem === null) {
|
8
|
+
return oldItem === null ? oldItem : newItem;
|
9
|
+
}
|
10
|
+
|
11
|
+
if (newItem === undefined) {
|
12
|
+
return oldItem === undefined ? oldItem : newItem;
|
13
|
+
}
|
14
|
+
|
15
|
+
if (Array.isArray(newItem)) {
|
16
|
+
if (!Array.isArray(oldItem)) {
|
17
|
+
return newItem;
|
18
|
+
}
|
19
|
+
|
20
|
+
return mergeArraysUsingReaderAst(field, oldItem, newItem);
|
21
|
+
}
|
22
|
+
|
23
|
+
switch (field.kind) {
|
24
|
+
case 'Scalar':
|
25
|
+
return oldItem === newItem ? oldItem : newItem;
|
26
|
+
case 'Linked':
|
27
|
+
if (oldItem == null) {
|
28
|
+
return newItem;
|
29
|
+
}
|
30
|
+
|
31
|
+
return mergeObjectsUsingReaderAst(field.selections, oldItem, newItem);
|
32
|
+
default: {
|
33
|
+
// Ensure we have covered all variants
|
34
|
+
let _: never = field;
|
35
|
+
_;
|
36
|
+
throw new Error('Unexpected case.');
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
export function mergeArraysUsingReaderAst(
|
42
|
+
field: ReaderScalarField | ReaderLinkedField,
|
43
|
+
oldItems: ReadonlyArray<unknown>,
|
44
|
+
newItems: Array<unknown>,
|
45
|
+
): ReadonlyArray<unknown> {
|
46
|
+
if (newItems.length !== oldItems.length) {
|
47
|
+
return newItems;
|
48
|
+
}
|
49
|
+
|
50
|
+
let canRecycle = true;
|
51
|
+
for (let i = 0; i < newItems.length; i++) {
|
52
|
+
const mergedItem = mergeUsingReaderAst(field, oldItems[i], newItems[i]);
|
53
|
+
if (mergedItem !== oldItems[i]) {
|
54
|
+
canRecycle = false;
|
55
|
+
} else {
|
56
|
+
newItems[i] = mergedItem;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
return canRecycle ? oldItems : newItems;
|
61
|
+
}
|
62
|
+
|
63
|
+
export function mergeObjectsUsingReaderAst(
|
64
|
+
ast: ReaderAst<object>,
|
65
|
+
oldItemObject: object,
|
66
|
+
newItemObject: object,
|
67
|
+
): object {
|
68
|
+
let canRecycle = true;
|
69
|
+
for (const field of ast) {
|
70
|
+
switch (field.kind) {
|
71
|
+
case 'Scalar':
|
72
|
+
case 'Linked':
|
73
|
+
const key = field.alias ?? field.fieldName;
|
74
|
+
// @ts-expect-error
|
75
|
+
const oldValue = oldItemObject[key];
|
76
|
+
// @ts-expect-error
|
77
|
+
const newValue = newItemObject[key];
|
78
|
+
|
79
|
+
const mergedValue = mergeUsingReaderAst(field, oldValue, newValue);
|
80
|
+
if (mergedValue !== oldValue) {
|
81
|
+
canRecycle = false;
|
82
|
+
} else {
|
83
|
+
// @ts-expect-error
|
84
|
+
newItemObject[key] = mergedValue;
|
85
|
+
}
|
86
|
+
break;
|
87
|
+
case 'Resolver': {
|
88
|
+
const key = field.alias;
|
89
|
+
// @ts-expect-error
|
90
|
+
const oldValue = oldItemObject[key];
|
91
|
+
// @ts-expect-error
|
92
|
+
const newValue = newItemObject[key];
|
93
|
+
|
94
|
+
if (oldValue !== newValue) {
|
95
|
+
canRecycle = false;
|
96
|
+
}
|
97
|
+
break;
|
98
|
+
}
|
99
|
+
case 'ImperativelyLoadedField':
|
100
|
+
case 'LoadablySelectedField':
|
101
|
+
break;
|
102
|
+
default: {
|
103
|
+
// Ensure we have covered all variants
|
104
|
+
let _: never = field;
|
105
|
+
_;
|
106
|
+
throw new Error('Unexpected case.');
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
return canRecycle ? oldItemObject : newItemObject;
|
112
|
+
}
|