@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.
Files changed (160) hide show
  1. package/dist/core/FragmentReference.d.ts +25 -0
  2. package/dist/core/FragmentReference.d.ts.map +1 -0
  3. package/dist/core/FragmentReference.js +16 -0
  4. package/dist/core/IsographEnvironment.d.ts +89 -0
  5. package/dist/core/IsographEnvironment.d.ts.map +1 -0
  6. package/dist/core/IsographEnvironment.js +65 -0
  7. package/dist/core/PromiseWrapper.d.ts +28 -0
  8. package/dist/core/PromiseWrapper.d.ts.map +1 -0
  9. package/dist/core/PromiseWrapper.js +57 -0
  10. package/dist/core/areEqualWithDeepComparison.d.ts +5 -0
  11. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -0
  12. package/dist/core/areEqualWithDeepComparison.js +95 -0
  13. package/dist/core/cache.d.ts +44 -0
  14. package/dist/core/cache.d.ts.map +1 -0
  15. package/dist/core/cache.js +514 -0
  16. package/dist/core/check.d.ts +18 -0
  17. package/dist/core/check.d.ts.map +1 -0
  18. package/dist/core/check.js +127 -0
  19. package/dist/core/componentCache.d.ts +5 -0
  20. package/dist/core/componentCache.d.ts.map +1 -0
  21. package/dist/core/componentCache.js +38 -0
  22. package/dist/core/entrypoint.d.ts +69 -0
  23. package/dist/core/entrypoint.d.ts.map +1 -0
  24. package/dist/core/entrypoint.js +7 -0
  25. package/dist/core/garbageCollection.d.ts +13 -0
  26. package/dist/core/garbageCollection.d.ts.map +1 -0
  27. package/dist/core/garbageCollection.js +107 -0
  28. package/dist/core/logging.d.ts +69 -0
  29. package/dist/core/logging.d.ts.map +1 -0
  30. package/dist/core/logging.js +19 -0
  31. package/dist/core/makeNetworkRequest.d.ts +9 -0
  32. package/dist/core/makeNetworkRequest.d.ts.map +1 -0
  33. package/dist/core/makeNetworkRequest.js +118 -0
  34. package/dist/core/read.d.ts +27 -0
  35. package/dist/core/read.d.ts.map +1 -0
  36. package/dist/core/read.js +478 -0
  37. package/dist/core/reader.d.ts +87 -0
  38. package/dist/core/reader.d.ts.map +1 -0
  39. package/dist/core/reader.js +2 -0
  40. package/dist/core/util.d.ts +19 -0
  41. package/dist/core/util.d.ts.map +1 -0
  42. package/dist/core/util.js +2 -0
  43. package/dist/index.d.ts +26 -120
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +57 -306
  46. package/dist/loadable-hooks/useClientSideDefer.d.ts +16 -0
  47. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -0
  48. package/dist/loadable-hooks/useClientSideDefer.js +13 -0
  49. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +34 -0
  50. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -0
  51. package/dist/loadable-hooks/useConnectionSpecPagination.js +160 -0
  52. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +6 -0
  53. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -0
  54. package/dist/loadable-hooks/useImperativeExposedMutationField.js +14 -0
  55. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +17 -0
  56. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -0
  57. package/dist/loadable-hooks/useImperativeLoadableField.js +14 -0
  58. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +27 -0
  59. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -0
  60. package/dist/loadable-hooks/useSkipLimitPagination.js +162 -0
  61. package/dist/react/FragmentReader.d.ts +16 -0
  62. package/dist/react/FragmentReader.d.ts.map +1 -0
  63. package/dist/{EntrypointReader.js → react/FragmentReader.js} +7 -5
  64. package/dist/react/IsographEnvironmentProvider.d.ts +11 -0
  65. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -0
  66. package/dist/{IsographEnvironment.js → react/IsographEnvironmentProvider.js} +4 -22
  67. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +10 -0
  68. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -0
  69. package/dist/react/RenderAfterCommit__DO_NOT_USE.js +15 -0
  70. package/dist/react/useImperativeReference.d.ts +12 -0
  71. package/dist/react/useImperativeReference.d.ts.map +1 -0
  72. package/dist/react/useImperativeReference.js +35 -0
  73. package/dist/react/useLazyReference.d.ts +10 -0
  74. package/dist/react/useLazyReference.d.ts.map +1 -0
  75. package/dist/react/useLazyReference.js +21 -0
  76. package/dist/react/useReadAndSubscribe.d.ts +20 -0
  77. package/dist/react/useReadAndSubscribe.d.ts.map +1 -0
  78. package/dist/react/useReadAndSubscribe.js +40 -0
  79. package/dist/react/useRerenderOnChange.d.ts +8 -0
  80. package/dist/react/useRerenderOnChange.d.ts.map +1 -0
  81. package/dist/react/useRerenderOnChange.js +22 -0
  82. package/dist/react/useResult.d.ts +9 -0
  83. package/dist/react/useResult.d.ts.map +1 -0
  84. package/dist/react/useResult.js +39 -0
  85. package/docs/how-useLazyReference-works.md +117 -0
  86. package/isograph.config.json +7 -0
  87. package/package.json +18 -9
  88. package/schema.graphql +17 -0
  89. package/src/core/FragmentReference.ts +49 -0
  90. package/src/core/IsographEnvironment.ts +192 -0
  91. package/src/core/PromiseWrapper.ts +86 -0
  92. package/src/core/areEqualWithDeepComparison.ts +112 -0
  93. package/src/core/cache.ts +835 -0
  94. package/src/core/check.ts +207 -0
  95. package/src/core/componentCache.ts +62 -0
  96. package/src/core/entrypoint.ts +106 -0
  97. package/src/core/garbageCollection.ts +173 -0
  98. package/src/core/logging.ts +116 -0
  99. package/src/core/makeNetworkRequest.ts +175 -0
  100. package/src/core/read.ts +722 -0
  101. package/src/core/reader.ts +160 -0
  102. package/src/core/util.ts +27 -0
  103. package/src/index.ts +99 -0
  104. package/src/loadable-hooks/useClientSideDefer.ts +58 -0
  105. package/src/loadable-hooks/useConnectionSpecPagination.ts +331 -0
  106. package/src/loadable-hooks/useImperativeExposedMutationField.ts +17 -0
  107. package/src/loadable-hooks/useImperativeLoadableField.ts +52 -0
  108. package/src/loadable-hooks/useSkipLimitPagination.ts +352 -0
  109. package/src/react/FragmentReader.tsx +43 -0
  110. package/src/react/IsographEnvironmentProvider.tsx +33 -0
  111. package/src/react/RenderAfterCommit__DO_NOT_USE.tsx +17 -0
  112. package/src/react/useImperativeReference.ts +68 -0
  113. package/src/react/useLazyReference.ts +42 -0
  114. package/src/react/useReadAndSubscribe.ts +81 -0
  115. package/src/react/useRerenderOnChange.ts +38 -0
  116. package/src/react/useResult.ts +73 -0
  117. package/src/tests/__isograph/Query/meName/entrypoint.ts +52 -0
  118. package/src/tests/__isograph/Query/meName/output_type.ts +3 -0
  119. package/src/tests/__isograph/Query/meName/param_type.ts +9 -0
  120. package/src/tests/__isograph/Query/meName/resolver_reader.ts +33 -0
  121. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +90 -0
  122. package/src/tests/__isograph/Query/meNameSuccessor/output_type.ts +3 -0
  123. package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +14 -0
  124. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +57 -0
  125. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +57 -0
  126. package/src/tests/__isograph/Query/nodeField/output_type.ts +3 -0
  127. package/src/tests/__isograph/Query/nodeField/param_type.ts +10 -0
  128. package/src/tests/__isograph/Query/nodeField/parameters_type.ts +3 -0
  129. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +38 -0
  130. package/src/tests/__isograph/Query/subquery/entrypoint.ts +67 -0
  131. package/src/tests/__isograph/Query/subquery/output_type.ts +3 -0
  132. package/src/tests/__isograph/Query/subquery/param_type.ts +12 -0
  133. package/src/tests/__isograph/Query/subquery/parameters_type.ts +3 -0
  134. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +47 -0
  135. package/src/tests/__isograph/iso.ts +99 -0
  136. package/src/tests/garbageCollection.test.ts +142 -0
  137. package/src/tests/meNameSuccessor.ts +25 -0
  138. package/src/tests/nodeQuery.ts +19 -0
  139. package/src/tests/normalizeData.test.ts +120 -0
  140. package/src/tests/tsconfig.json +21 -0
  141. package/tsconfig.json +6 -0
  142. package/tsconfig.pkg.json +7 -1
  143. package/vitest.config.ts +20 -0
  144. package/dist/EntrypointReader.d.ts +0 -6
  145. package/dist/IsographEnvironment.d.ts +0 -56
  146. package/dist/PromiseWrapper.d.ts +0 -13
  147. package/dist/PromiseWrapper.js +0 -22
  148. package/dist/cache.d.ts +0 -26
  149. package/dist/cache.js +0 -274
  150. package/dist/componentCache.d.ts +0 -6
  151. package/dist/componentCache.js +0 -31
  152. package/dist/useImperativeReference.d.ts +0 -8
  153. package/dist/useImperativeReference.js +0 -28
  154. package/src/EntrypointReader.tsx +0 -20
  155. package/src/IsographEnvironment.tsx +0 -120
  156. package/src/PromiseWrapper.ts +0 -29
  157. package/src/cache.tsx +0 -484
  158. package/src/componentCache.ts +0 -41
  159. package/src/index.tsx +0 -617
  160. 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
+ }