@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,478 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readButDoNotEvaluate = readButDoNotEvaluate;
4
+ exports.getNetworkRequestOptionsWithDefaults = getNetworkRequestOptionsWithDefaults;
5
+ const cache_1 = require("./cache");
6
+ const componentCache_1 = require("./componentCache");
7
+ const IsographEnvironment_1 = require("./IsographEnvironment");
8
+ const makeNetworkRequest_1 = require("./makeNetworkRequest");
9
+ const PromiseWrapper_1 = require("./PromiseWrapper");
10
+ const logging_1 = require("./logging");
11
+ function readButDoNotEvaluate(environment, fragmentReference, networkRequestOptions) {
12
+ var _a;
13
+ const mutableEncounteredRecords = new Map();
14
+ const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
15
+ const response = readData(environment, readerWithRefetchQueries.readerArtifact.readerAst, fragmentReference.root, (_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {}, readerWithRefetchQueries.nestedRefetchQueries, fragmentReference.networkRequest, networkRequestOptions, mutableEncounteredRecords);
16
+ (0, logging_1.logMessage)(environment, {
17
+ kind: 'DoneReading',
18
+ response,
19
+ });
20
+ if (response.kind === 'MissingData') {
21
+ // There are two cases here that we care about:
22
+ // 1. the network request is in flight, we haven't suspend on it, and we want
23
+ // to throw if it errors out. So, networkRequestOptions.suspendIfInFlight === false
24
+ // and networkRequestOptions.throwOnNetworkError === true.
25
+ // 2. everything else
26
+ //
27
+ // In the first case, we cannot simply throw onNextChange, because if the network
28
+ // response errors out, we will not update the store, so the onNextChange promise
29
+ // will not resolve.
30
+ if (!networkRequestOptions.suspendIfInFlight &&
31
+ networkRequestOptions.throwOnNetworkError) {
32
+ // TODO assert that the network request state is not Err
33
+ throw new Promise((resolve, reject) => {
34
+ (0, cache_1.onNextChangeToRecord)(environment, response.recordLink).then(resolve);
35
+ fragmentReference.networkRequest.promise.catch(reject);
36
+ });
37
+ }
38
+ throw (0, cache_1.onNextChangeToRecord)(environment, response.recordLink);
39
+ }
40
+ else {
41
+ return {
42
+ encounteredRecords: mutableEncounteredRecords,
43
+ item: response.data,
44
+ };
45
+ }
46
+ }
47
+ function readData(environment, ast, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords) {
48
+ var _a, _b, _c, _d, _e;
49
+ const encounteredIds = (0, cache_1.insertIfNotExists)(mutableEncounteredRecords, root.__typename);
50
+ encounteredIds.add(root.__link);
51
+ let storeRecord = (_a = environment.store[root.__typename]) === null || _a === void 0 ? void 0 : _a[root.__link];
52
+ if (storeRecord === undefined) {
53
+ return {
54
+ kind: 'MissingData',
55
+ reason: 'No record for root ' + root.__link,
56
+ recordLink: root,
57
+ };
58
+ }
59
+ if (storeRecord === null) {
60
+ return {
61
+ kind: 'Success',
62
+ data: null,
63
+ encounteredRecords: mutableEncounteredRecords,
64
+ };
65
+ }
66
+ let target = {};
67
+ for (const field of ast) {
68
+ switch (field.kind) {
69
+ case 'Scalar': {
70
+ const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
71
+ const value = storeRecord[storeRecordName];
72
+ // TODO consider making scalars into discriminated unions. This probably has
73
+ // to happen for when we handle errors.
74
+ if (value === undefined) {
75
+ return {
76
+ kind: 'MissingData',
77
+ reason: 'No value for ' + storeRecordName + ' on root ' + root.__link,
78
+ recordLink: root,
79
+ };
80
+ }
81
+ target[(_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName] = value;
82
+ break;
83
+ }
84
+ case 'Linked': {
85
+ const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
86
+ const value = storeRecord[storeRecordName];
87
+ if (Array.isArray(value)) {
88
+ const results = [];
89
+ for (const item of value) {
90
+ const link = (0, IsographEnvironment_1.assertLink)(item);
91
+ if (link === undefined) {
92
+ return {
93
+ kind: 'MissingData',
94
+ reason: 'No link for ' +
95
+ storeRecordName +
96
+ ' on root ' +
97
+ root.__link +
98
+ '. Link is ' +
99
+ JSON.stringify(item),
100
+ recordLink: root,
101
+ };
102
+ }
103
+ else if (link === null) {
104
+ results.push(null);
105
+ continue;
106
+ }
107
+ const result = readData(environment, field.selections, link, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
108
+ if (result.kind === 'MissingData') {
109
+ return {
110
+ kind: 'MissingData',
111
+ reason: 'Missing data for ' +
112
+ storeRecordName +
113
+ ' on root ' +
114
+ root.__link +
115
+ '. Link is ' +
116
+ JSON.stringify(item),
117
+ nestedReason: result,
118
+ recordLink: result.recordLink,
119
+ };
120
+ }
121
+ results.push(result.data);
122
+ }
123
+ target[(_c = field.alias) !== null && _c !== void 0 ? _c : field.fieldName] = results;
124
+ break;
125
+ }
126
+ let link = (0, IsographEnvironment_1.assertLink)(value);
127
+ if (field.condition) {
128
+ const data = readData(environment, field.condition.readerAst, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
129
+ if (data.kind === 'MissingData') {
130
+ return {
131
+ kind: 'MissingData',
132
+ reason: 'Missing data for ' +
133
+ storeRecordName +
134
+ ' on root ' +
135
+ root.__link,
136
+ nestedReason: data,
137
+ recordLink: data.recordLink,
138
+ };
139
+ }
140
+ const condition = field.condition.resolver({
141
+ data: data.data,
142
+ parameters: {},
143
+ });
144
+ if (condition === true) {
145
+ link = root;
146
+ }
147
+ else if (condition === false) {
148
+ link = null;
149
+ }
150
+ else {
151
+ link = condition;
152
+ }
153
+ }
154
+ if (link === undefined) {
155
+ // TODO make this configurable, and also generated and derived from the schema
156
+ const missingFieldHandler = environment.missingFieldHandler;
157
+ const altLink = missingFieldHandler === null || missingFieldHandler === void 0 ? void 0 : missingFieldHandler(storeRecord, root, field.fieldName, field.arguments, variables);
158
+ (0, logging_1.logMessage)(environment, {
159
+ kind: 'MissingFieldHandlerCalled',
160
+ root,
161
+ storeRecord,
162
+ fieldName: field.fieldName,
163
+ arguments: field.arguments,
164
+ variables,
165
+ });
166
+ if (altLink === undefined) {
167
+ return {
168
+ kind: 'MissingData',
169
+ reason: 'No link for ' +
170
+ storeRecordName +
171
+ ' on root ' +
172
+ root.__link +
173
+ '. Link is ' +
174
+ JSON.stringify(value),
175
+ recordLink: root,
176
+ };
177
+ }
178
+ else {
179
+ link = altLink;
180
+ }
181
+ }
182
+ else if (link === null) {
183
+ target[(_d = field.alias) !== null && _d !== void 0 ? _d : field.fieldName] = null;
184
+ break;
185
+ }
186
+ const targetId = link;
187
+ const data = readData(environment, field.selections, targetId, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
188
+ if (data.kind === 'MissingData') {
189
+ return {
190
+ kind: 'MissingData',
191
+ reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
192
+ nestedReason: data,
193
+ recordLink: data.recordLink,
194
+ };
195
+ }
196
+ target[(_e = field.alias) !== null && _e !== void 0 ? _e : field.fieldName] = data.data;
197
+ break;
198
+ }
199
+ case 'ImperativelyLoadedField': {
200
+ // First, we read the data using the refetch reader AST (i.e. read out the
201
+ // id field).
202
+ const data = readData(environment, field.refetchReaderArtifact.readerAst, root, variables,
203
+ // Refetch fields just read the id, and don't need refetch query artifacts
204
+ [],
205
+ // This is probably indicative of the fact that we are doing redundant checks
206
+ // on the status of this network request...
207
+ networkRequest, networkRequestOptions, mutableEncounteredRecords);
208
+ if (data.kind === 'MissingData') {
209
+ return {
210
+ kind: 'MissingData',
211
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
212
+ nestedReason: data,
213
+ recordLink: data.recordLink,
214
+ };
215
+ }
216
+ else {
217
+ const refetchQueryIndex = field.refetchQuery;
218
+ const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
219
+ if (refetchQuery == null) {
220
+ throw new Error('refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.');
221
+ }
222
+ const refetchQueryArtifact = refetchQuery.artifact;
223
+ const allowedVariables = refetchQuery.allowedVariables;
224
+ // Second, we allow the user to call the resolver, which will ultimately
225
+ // use the resolver reader AST to get the resolver parameters.
226
+ target[field.alias] = (args) => [
227
+ // Stable id
228
+ root.__link + '__' + field.name,
229
+ // Fetcher
230
+ field.refetchReaderArtifact.resolver(environment, refetchQueryArtifact, data.data, filterVariables(Object.assign(Object.assign({}, args), variables), allowedVariables), root,
231
+ // TODO these params should be removed
232
+ null, []),
233
+ ];
234
+ }
235
+ break;
236
+ }
237
+ case 'Resolver': {
238
+ const usedRefetchQueries = field.usedRefetchQueries;
239
+ const resolverRefetchQueries = usedRefetchQueries.map((index) => {
240
+ const resolverRefetchQuery = nestedRefetchQueries[index];
241
+ if (resolverRefetchQuery == null) {
242
+ throw new Error('resolverRefetchQuery is null in Resolver. This is indicative of a bug in Isograph.');
243
+ }
244
+ return resolverRefetchQuery;
245
+ });
246
+ switch (field.readerArtifact.kind) {
247
+ case 'EagerReaderArtifact': {
248
+ const data = readData(environment, field.readerArtifact.readerAst, root, generateChildVariableMap(variables, field.arguments), resolverRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
249
+ if (data.kind === 'MissingData') {
250
+ return {
251
+ kind: 'MissingData',
252
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
253
+ nestedReason: data,
254
+ recordLink: data.recordLink,
255
+ };
256
+ }
257
+ else {
258
+ const firstParameter = {
259
+ data: data.data,
260
+ parameters: variables,
261
+ };
262
+ target[field.alias] =
263
+ field.readerArtifact.resolver(firstParameter);
264
+ }
265
+ break;
266
+ }
267
+ case 'ComponentReaderArtifact': {
268
+ target[field.alias] = (0, componentCache_1.getOrCreateCachedComponent)(environment, field.readerArtifact.componentName, {
269
+ kind: 'FragmentReference',
270
+ readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
271
+ kind: 'ReaderWithRefetchQueries',
272
+ readerArtifact: field.readerArtifact,
273
+ nestedRefetchQueries: resolverRefetchQueries,
274
+ }),
275
+ root,
276
+ variables: generateChildVariableMap(variables, field.arguments),
277
+ networkRequest,
278
+ }, networkRequestOptions);
279
+ break;
280
+ }
281
+ default: {
282
+ let _ = field.readerArtifact;
283
+ _;
284
+ throw new Error('Unexpected kind');
285
+ }
286
+ }
287
+ break;
288
+ }
289
+ case 'LoadablySelectedField': {
290
+ const refetchReaderParams = readData(environment, field.refetchReaderAst, root, variables,
291
+ // Refetch fields just read the id, and don't need refetch query artifacts
292
+ [], networkRequest, networkRequestOptions, mutableEncounteredRecords);
293
+ if (refetchReaderParams.kind === 'MissingData') {
294
+ return {
295
+ kind: 'MissingData',
296
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
297
+ nestedReason: refetchReaderParams,
298
+ recordLink: refetchReaderParams.recordLink,
299
+ };
300
+ }
301
+ else {
302
+ target[field.alias] = (args, fetchOptions) => {
303
+ // TODO we should use the reader AST for this
304
+ const includeReadOutData = (variables, readOutData) => {
305
+ variables.id = readOutData.id;
306
+ return variables;
307
+ };
308
+ const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
309
+ writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
310
+ return [
311
+ // Stable id
312
+ root.__typename +
313
+ ':' +
314
+ root.__link +
315
+ '/' +
316
+ field.name +
317
+ '/' +
318
+ stableStringifyArgs(localVariables),
319
+ // Fetcher
320
+ () => {
321
+ const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
322
+ const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
323
+ const fragmentReference = {
324
+ kind: 'FragmentReference',
325
+ readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
326
+ kind: 'ReaderWithRefetchQueries',
327
+ readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
328
+ nestedRefetchQueries: entrypoint.readerWithRefetchQueries
329
+ .nestedRefetchQueries,
330
+ }),
331
+ // TODO localVariables is not guaranteed to have an id field
332
+ root,
333
+ variables: localVariables,
334
+ networkRequest,
335
+ };
336
+ return [fragmentReference, disposeNetworkRequest];
337
+ };
338
+ if (field.entrypoint.kind === 'Entrypoint') {
339
+ return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
340
+ }
341
+ else {
342
+ const isographArtifactPromiseWrapper = (0, IsographEnvironment_1.getOrLoadIsographArtifact)(environment, field.entrypoint.typeAndField, field.entrypoint.loader);
343
+ const state = (0, PromiseWrapper_1.getPromiseState)(isographArtifactPromiseWrapper);
344
+ if (state.kind === 'Ok') {
345
+ return fragmentReferenceAndDisposeFromEntrypoint(state.value);
346
+ }
347
+ else {
348
+ // Promise is pending or thrown
349
+ let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
350
+ const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
351
+ if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
352
+ const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
353
+ entrypointLoaderState = {
354
+ kind: 'NetworkRequestStarted',
355
+ disposeNetworkRequest,
356
+ };
357
+ return networkRequest.promise;
358
+ }
359
+ }));
360
+ const readerWithRefetchPromise = isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries);
361
+ const fragmentReference = {
362
+ kind: 'FragmentReference',
363
+ readerWithRefetchQueries: (0, PromiseWrapper_1.wrapPromise)(readerWithRefetchPromise),
364
+ // TODO localVariables is not guaranteed to have an id field
365
+ root,
366
+ variables: localVariables,
367
+ networkRequest,
368
+ };
369
+ return [
370
+ fragmentReference,
371
+ () => {
372
+ if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
373
+ entrypointLoaderState.disposeNetworkRequest();
374
+ }
375
+ entrypointLoaderState = { kind: 'Disposed' };
376
+ },
377
+ ];
378
+ }
379
+ }
380
+ },
381
+ ];
382
+ };
383
+ }
384
+ break;
385
+ }
386
+ default: {
387
+ // Ensure we have covered all variants
388
+ let _ = field;
389
+ _;
390
+ throw new Error('Unexpected case.');
391
+ }
392
+ }
393
+ }
394
+ return {
395
+ kind: 'Success',
396
+ data: target,
397
+ encounteredRecords: mutableEncounteredRecords,
398
+ };
399
+ }
400
+ function filterVariables(variables, allowedVariables) {
401
+ const result = {};
402
+ for (const key of allowedVariables) {
403
+ // @ts-expect-error
404
+ result[key] = variables[key];
405
+ }
406
+ return result;
407
+ }
408
+ function generateChildVariableMap(variables, fieldArguments) {
409
+ if (fieldArguments == null) {
410
+ return {};
411
+ }
412
+ const childVars = {};
413
+ for (const [name, value] of fieldArguments) {
414
+ if (value.kind === 'Variable') {
415
+ const variable = variables[value.name];
416
+ // Variable could be null if it was not provided but has a default case,
417
+ // so we allow the loop to continue rather than throwing an error.
418
+ if (variable != null) {
419
+ childVars[name] = variable;
420
+ }
421
+ }
422
+ else {
423
+ childVars[name] = value.value;
424
+ }
425
+ }
426
+ return childVars;
427
+ }
428
+ function writeQueryArgsToVariables(targetVariables, queryArgs, variables) {
429
+ if (queryArgs == null) {
430
+ return;
431
+ }
432
+ for (const [name, argType] of queryArgs) {
433
+ switch (argType.kind) {
434
+ case 'Variable': {
435
+ targetVariables[name] = variables[argType.name];
436
+ break;
437
+ }
438
+ case 'Enum': {
439
+ targetVariables[name] = argType.value;
440
+ break;
441
+ }
442
+ case 'Literal': {
443
+ targetVariables[name] = argType.value;
444
+ break;
445
+ }
446
+ case 'String': {
447
+ targetVariables[name] = argType.value;
448
+ break;
449
+ }
450
+ default: {
451
+ const _ = argType;
452
+ _;
453
+ throw new Error('Unexpected case');
454
+ }
455
+ }
456
+ }
457
+ }
458
+ function getNetworkRequestOptionsWithDefaults(networkRequestOptions) {
459
+ var _a, _b;
460
+ return {
461
+ suspendIfInFlight: (_a = networkRequestOptions === null || networkRequestOptions === void 0 ? void 0 : networkRequestOptions.suspendIfInFlight) !== null && _a !== void 0 ? _a : false,
462
+ throwOnNetworkError: (_b = networkRequestOptions === null || networkRequestOptions === void 0 ? void 0 : networkRequestOptions.throwOnNetworkError) !== null && _b !== void 0 ? _b : true,
463
+ };
464
+ }
465
+ // TODO use a description of the params for this?
466
+ // TODO call stableStringifyArgs on the variable values, as well.
467
+ // This doesn't matter for now, since we are just using primitive values
468
+ // in the demo.
469
+ function stableStringifyArgs(args) {
470
+ const keys = Object.keys(args);
471
+ keys.sort();
472
+ let s = '';
473
+ for (const key of keys) {
474
+ // @ts-expect-error
475
+ s += `${key}=${JSON.stringify(args[key])};`;
476
+ }
477
+ return s;
478
+ }
@@ -0,0 +1,87 @@
1
+ import { Factory } from '@isograph/disposable-types';
2
+ import { FragmentReference, ExtractParameters, ExtractData } from './FragmentReference';
3
+ import { ComponentOrFieldName, IsographEnvironment, type Link } from './IsographEnvironment';
4
+ import { IsographEntrypoint, IsographEntrypointLoader, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
5
+ import { Arguments } from './util';
6
+ import { FetchOptions } from './check';
7
+ export type TopLevelReaderArtifact<TReadFromStore extends {
8
+ parameters: object;
9
+ data: object;
10
+ }, TClientFieldValue, TComponentProps extends Record<PropertyKey, never>> = EagerReaderArtifact<TReadFromStore, TClientFieldValue> | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
11
+ export type EagerReaderArtifact<TReadFromStore extends {
12
+ parameters: object;
13
+ data: object;
14
+ }, TClientFieldValue> = {
15
+ readonly kind: 'EagerReaderArtifact';
16
+ readonly readerAst: ReaderAst<TReadFromStore>;
17
+ readonly resolver: (data: ResolverFirstParameter<TReadFromStore>) => TClientFieldValue;
18
+ };
19
+ export type ComponentReaderArtifact<TReadFromStore extends {
20
+ parameters: object;
21
+ data: object;
22
+ }, TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>> = {
23
+ readonly kind: 'ComponentReaderArtifact';
24
+ readonly componentName: ComponentOrFieldName;
25
+ readonly readerAst: ReaderAst<TReadFromStore>;
26
+ readonly resolver: (data: ResolverFirstParameter<TReadFromStore>, runtimeProps: TComponentProps) => React.ReactNode;
27
+ };
28
+ export type ResolverFirstParameter<TReadFromStore extends {
29
+ data: object;
30
+ parameters: object;
31
+ }> = {
32
+ data: ExtractData<TReadFromStore>;
33
+ parameters: ExtractParameters<TReadFromStore>;
34
+ };
35
+ export type RefetchReaderArtifact = {
36
+ readonly kind: 'RefetchReaderArtifact';
37
+ readonly readerAst: ReaderAst<unknown>;
38
+ readonly resolver: (environment: IsographEnvironment, artifact: RefetchQueryNormalizationArtifact, variables: any, filteredVariables: any, rootLink: Link, readerArtifact: TopLevelReaderArtifact<any, any, any> | null, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[]) => () => void;
39
+ };
40
+ export type ReaderAstNode = ReaderScalarField | ReaderLinkedField | ReaderNonLoadableResolverField | ReaderImperativelyLoadedField | ReaderLoadableField;
41
+ export type ReaderAst<TReadFromStore> = ReadonlyArray<ReaderAstNode>;
42
+ export type ReaderScalarField = {
43
+ readonly kind: 'Scalar';
44
+ readonly fieldName: string;
45
+ readonly alias: string | null;
46
+ readonly arguments: Arguments | null;
47
+ };
48
+ export type ReaderLinkedField = {
49
+ readonly kind: 'Linked';
50
+ readonly fieldName: string;
51
+ readonly alias: string | null;
52
+ readonly selections: ReaderAst<unknown>;
53
+ readonly arguments: Arguments | null;
54
+ readonly condition: EagerReaderArtifact<{
55
+ data: object;
56
+ parameters: object;
57
+ }, boolean | Link | null> | null;
58
+ };
59
+ export type ReaderNonLoadableResolverField = {
60
+ readonly kind: 'Resolver';
61
+ readonly alias: string;
62
+ readonly readerArtifact: TopLevelReaderArtifact<any, any, any>;
63
+ readonly arguments: Arguments | null;
64
+ readonly usedRefetchQueries: number[];
65
+ };
66
+ export type ReaderImperativelyLoadedField = {
67
+ readonly kind: 'ImperativelyLoadedField';
68
+ readonly alias: string;
69
+ readonly refetchReaderArtifact: RefetchReaderArtifact;
70
+ readonly refetchQuery: number;
71
+ readonly name: string;
72
+ };
73
+ export type ReaderLoadableField = {
74
+ readonly kind: 'LoadablySelectedField';
75
+ readonly alias: string;
76
+ readonly name: string;
77
+ readonly queryArguments: Arguments | null;
78
+ readonly refetchReaderAst: ReaderAst<any>;
79
+ readonly entrypoint: IsographEntrypoint<any, any> | IsographEntrypointLoader<any, any>;
80
+ };
81
+ type StableId = string;
82
+ export type LoadableField<TReadFromStore extends {
83
+ data: object;
84
+ parameters: object;
85
+ }, TResult, TArgs = ExtractParameters<TReadFromStore>> = (args: TArgs | void, fetchOptions: FetchOptions) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
86
+ export {};
87
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/core/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,19 @@
1
+ export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends (arg1: any, arg2: infer P) => any ? P : never;
2
+ export type CombineWithIntrinsicAttributes<T> = T extends Record<PropertyKey, never> ? JSX.IntrinsicAttributes : T & JSX.IntrinsicAttributes;
3
+ export type Arguments = Argument[];
4
+ export type Argument = [ArgumentName, ArgumentValue];
5
+ export type ArgumentName = string;
6
+ export type ArgumentValue = {
7
+ readonly kind: 'Variable';
8
+ readonly name: string;
9
+ } | {
10
+ readonly kind: 'Literal';
11
+ readonly value: any;
12
+ } | {
13
+ readonly kind: 'String';
14
+ readonly value: string;
15
+ } | {
16
+ readonly kind: 'Enum';
17
+ readonly value: string;
18
+ };
19
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/core/util.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,GAAG,IACpE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;AAC1D,MAAM,MAAM,8BAA8B,CAAC,CAAC,IAC1C,CAAC,SAAS,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAChC,GAAG,CAAC,mBAAmB,GACvB,CAAC,GAAG,GAAG,CAAC,mBAAmB,CAAC;AAElC,MAAM,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC;AACnC,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAClC,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACrB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });