@isograph/react 0.0.0-main-6815ceff → 0.0.0-main-3092d4a2

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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @isograph/react@0.0.0-main-6815ceff compile-typescript /Users/runner/work/isograph/isograph/libs/isograph-react
2
+ > @isograph/react@0.0.0-main-3092d4a2 compile-typescript /Users/runner/work/isograph/isograph/libs/isograph-react
3
3
  > rm -rf dist/* && tsc -p tsconfig.pkg.json
4
4
 
@@ -3,7 +3,7 @@ import { RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
3
3
  import { ExtractData, FragmentReference, Variables, type UnknownTReadFromStore } from './FragmentReference';
4
4
  import { IsographEnvironment, type DataTypeValue, type Link, type StoreRecord } from './IsographEnvironment';
5
5
  import { PromiseWrapper } from './PromiseWrapper';
6
- import { ReaderAst, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
6
+ import { ReaderAst, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderLoadableField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
7
7
  export type WithEncounteredRecords<T> = {
8
8
  readonly encounteredRecords: EncounteredIds;
9
9
  readonly item: ExtractData<T>;
@@ -19,6 +19,7 @@ export type ReadDataResult<Data> = ReadDataResultSuccess<Data> | {
19
19
  readonly nestedReason?: ReadDataResult<unknown>;
20
20
  readonly recordLink: Link;
21
21
  };
22
+ export declare function readLoadablySelectedFieldData(environment: IsographEnvironment, field: ReaderLoadableField, root: Link, variables: Variables, networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
22
23
  export declare function readResolverFieldData(environment: IsographEnvironment, field: ReaderNonLoadableResolverField, root: Link, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
23
24
  export declare function readScalarFieldData(field: ReaderScalarField, storeRecord: StoreRecord, root: Link, variables: Variables): ReadDataResult<string | number | boolean | Link | DataTypeValue[] | null>;
24
25
  export declare function readLinkedFieldData(environment: IsographEnvironment, field: ReaderLinkedField, storeRecord: StoreRecord, root: Link, variables: Variables, networkRequest: PromiseWrapper<void, any>, readData: <TReadFromStore>(ast: ReaderAst<TReadFromStore>, root: Link) => ReadDataResult<object>): ReadDataResult<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"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"}
package/dist/core/read.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.readButDoNotEvaluate = readButDoNotEvaluate;
4
+ exports.readLoadablySelectedFieldData = readLoadablySelectedFieldData;
4
5
  exports.readResolverFieldData = readResolverFieldData;
5
6
  exports.readScalarFieldData = readScalarFieldData;
6
7
  exports.readLinkedFieldData = readLinkedFieldData;
@@ -117,102 +118,11 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
117
118
  break;
118
119
  }
119
120
  case 'LoadablySelectedField': {
120
- const refetchReaderParams = readData(environment, field.refetchReaderAst, root, variables,
121
- // Refetch fields just read the id, and don't need refetch query artifacts
122
- [], networkRequest, networkRequestOptions, mutableEncounteredRecords);
123
- if (refetchReaderParams.kind === 'MissingData') {
124
- return {
125
- kind: 'MissingData',
126
- reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
127
- nestedReason: refetchReaderParams,
128
- recordLink: refetchReaderParams.recordLink,
129
- };
130
- }
131
- else {
132
- target[field.alias] = (args,
133
- // TODO get the associated type for FetchOptions from the loadably selected field
134
- fetchOptions) => {
135
- // TODO we should use the reader AST for this
136
- const includeReadOutData = (variables, readOutData) => {
137
- variables.id = readOutData.id;
138
- return variables;
139
- };
140
- const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
141
- writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
142
- return [
143
- // Stable id
144
- root.__typename +
145
- ':' +
146
- root.__link +
147
- '/' +
148
- field.name +
149
- '/' +
150
- stableStringifyArgs(localVariables),
151
- // Fetcher
152
- () => {
153
- const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
154
- const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
155
- const fragmentReference = {
156
- kind: 'FragmentReference',
157
- readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
158
- kind: 'ReaderWithRefetchQueries',
159
- readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
160
- nestedRefetchQueries: entrypoint.readerWithRefetchQueries
161
- .nestedRefetchQueries,
162
- }),
163
- // TODO localVariables is not guaranteed to have an id field
164
- root,
165
- variables: localVariables,
166
- networkRequest,
167
- };
168
- return [fragmentReference, disposeNetworkRequest];
169
- };
170
- if (field.entrypoint.kind === 'Entrypoint') {
171
- return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
172
- }
173
- else {
174
- const isographArtifactPromiseWrapper = (0, IsographEnvironment_1.getOrLoadIsographArtifact)(environment, field.entrypoint.typeAndField, field.entrypoint.loader);
175
- const state = (0, PromiseWrapper_1.getPromiseState)(isographArtifactPromiseWrapper);
176
- if (state.kind === 'Ok') {
177
- return fragmentReferenceAndDisposeFromEntrypoint(state.value);
178
- }
179
- else {
180
- // Promise is pending or thrown
181
- let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
182
- const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
183
- if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
184
- const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
185
- entrypointLoaderState = {
186
- kind: 'NetworkRequestStarted',
187
- disposeNetworkRequest,
188
- };
189
- return networkRequest.promise;
190
- }
191
- }));
192
- const readerWithRefetchPromise = isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries);
193
- const fragmentReference = {
194
- kind: 'FragmentReference',
195
- readerWithRefetchQueries: (0, PromiseWrapper_1.wrapPromise)(readerWithRefetchPromise),
196
- // TODO localVariables is not guaranteed to have an id field
197
- root,
198
- variables: localVariables,
199
- networkRequest,
200
- };
201
- return [
202
- fragmentReference,
203
- () => {
204
- if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
205
- entrypointLoaderState.disposeNetworkRequest();
206
- }
207
- entrypointLoaderState = { kind: 'Disposed' };
208
- },
209
- ];
210
- }
211
- }
212
- },
213
- ];
214
- };
121
+ const data = readLoadablySelectedFieldData(environment, field, root, variables, networkRequest, networkRequestOptions, mutableEncounteredRecords);
122
+ if (data.kind === 'MissingData') {
123
+ return data;
215
124
  }
125
+ target[field.alias] = data.data;
216
126
  break;
217
127
  }
218
128
  default: {
@@ -228,6 +138,104 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
228
138
  data: target,
229
139
  };
230
140
  }
141
+ function readLoadablySelectedFieldData(environment, field, root, variables, networkRequest, networkRequestOptions, mutableEncounteredRecords) {
142
+ const refetchReaderParams = readData(environment, field.refetchReaderAst, root, variables,
143
+ // Refetch fields just read the id, and don't need refetch query artifacts
144
+ [], networkRequest, networkRequestOptions, mutableEncounteredRecords);
145
+ if (refetchReaderParams.kind === 'MissingData') {
146
+ return {
147
+ kind: 'MissingData',
148
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
149
+ nestedReason: refetchReaderParams,
150
+ recordLink: refetchReaderParams.recordLink,
151
+ };
152
+ }
153
+ return {
154
+ kind: 'Success',
155
+ data: (args,
156
+ // TODO get the associated type for FetchOptions from the loadably selected field
157
+ fetchOptions) => {
158
+ // TODO we should use the reader AST for this
159
+ const includeReadOutData = (variables, readOutData) => {
160
+ variables.id = readOutData.id;
161
+ return variables;
162
+ };
163
+ const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
164
+ writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
165
+ return [
166
+ // Stable id
167
+ root.__typename +
168
+ ':' +
169
+ root.__link +
170
+ '/' +
171
+ field.name +
172
+ '/' +
173
+ stableStringifyArgs(localVariables),
174
+ // Fetcher
175
+ () => {
176
+ const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
177
+ const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
178
+ const fragmentReference = {
179
+ kind: 'FragmentReference',
180
+ readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
181
+ kind: 'ReaderWithRefetchQueries',
182
+ readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
183
+ nestedRefetchQueries: entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
184
+ }),
185
+ // TODO localVariables is not guaranteed to have an id field
186
+ root,
187
+ variables: localVariables,
188
+ networkRequest,
189
+ };
190
+ return [fragmentReference, disposeNetworkRequest];
191
+ };
192
+ if (field.entrypoint.kind === 'Entrypoint') {
193
+ return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
194
+ }
195
+ else {
196
+ const isographArtifactPromiseWrapper = (0, IsographEnvironment_1.getOrLoadIsographArtifact)(environment, field.entrypoint.typeAndField, field.entrypoint.loader);
197
+ const state = (0, PromiseWrapper_1.getPromiseState)(isographArtifactPromiseWrapper);
198
+ if (state.kind === 'Ok') {
199
+ return fragmentReferenceAndDisposeFromEntrypoint(state.value);
200
+ }
201
+ else {
202
+ // Promise is pending or thrown
203
+ let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
204
+ const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
205
+ if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
206
+ const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
207
+ entrypointLoaderState = {
208
+ kind: 'NetworkRequestStarted',
209
+ disposeNetworkRequest,
210
+ };
211
+ return networkRequest.promise;
212
+ }
213
+ }));
214
+ const readerWithRefetchPromise = isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries);
215
+ const fragmentReference = {
216
+ kind: 'FragmentReference',
217
+ readerWithRefetchQueries: (0, PromiseWrapper_1.wrapPromise)(readerWithRefetchPromise),
218
+ // TODO localVariables is not guaranteed to have an id field
219
+ root,
220
+ variables: localVariables,
221
+ networkRequest,
222
+ };
223
+ return [
224
+ fragmentReference,
225
+ () => {
226
+ if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
227
+ entrypointLoaderState.disposeNetworkRequest();
228
+ }
229
+ entrypointLoaderState = { kind: 'Disposed' };
230
+ },
231
+ ];
232
+ }
233
+ }
234
+ },
235
+ ];
236
+ },
237
+ };
238
+ }
231
239
  function filterVariables(variables, allowedVariables) {
232
240
  const result = {};
233
241
  for (const key of allowedVariables) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.0.0-main-6815ceff",
3
+ "version": "0.0.0-main-3092d4a2",
4
4
  "description": "Use Isograph with React",
5
5
  "homepage": "https://isograph.dev",
6
6
  "main": "dist/index.js",
@@ -20,9 +20,9 @@
20
20
  "iso-watch": "cross-env ../../target/debug/isograph_cli --config ./isograph.config.json --watch"
21
21
  },
22
22
  "dependencies": {
23
- "@isograph/disposable-types": "0.0.0-main-6815ceff",
24
- "@isograph/react-disposable-state": "0.0.0-main-6815ceff",
25
- "@isograph/reference-counted-pointer": "0.0.0-main-6815ceff"
23
+ "@isograph/disposable-types": "0.0.0-main-3092d4a2",
24
+ "@isograph/react-disposable-state": "0.0.0-main-3092d4a2",
25
+ "@isograph/reference-counted-pointer": "0.0.0-main-3092d4a2"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "react": "^18.0.0 || ^19.0.0"
package/src/core/read.ts CHANGED
@@ -40,6 +40,7 @@ import {
40
40
  ReaderAst,
41
41
  type ReaderImperativelyLoadedField,
42
42
  type ReaderLinkedField,
43
+ type ReaderLoadableField,
43
44
  type ReaderNonLoadableResolverField,
44
45
  type ReaderScalarField,
45
46
  } from './reader';
@@ -247,172 +248,19 @@ function readData<TReadFromStore>(
247
248
  break;
248
249
  }
249
250
  case 'LoadablySelectedField': {
250
- const refetchReaderParams = readData(
251
+ const data = readLoadablySelectedFieldData(
251
252
  environment,
252
- field.refetchReaderAst,
253
+ field,
253
254
  root,
254
255
  variables,
255
- // Refetch fields just read the id, and don't need refetch query artifacts
256
- [],
257
256
  networkRequest,
258
257
  networkRequestOptions,
259
258
  mutableEncounteredRecords,
260
259
  );
261
- if (refetchReaderParams.kind === 'MissingData') {
262
- return {
263
- kind: 'MissingData',
264
- reason:
265
- 'Missing data for ' + field.alias + ' on root ' + root.__link,
266
- nestedReason: refetchReaderParams,
267
- recordLink: refetchReaderParams.recordLink,
268
- };
269
- } else {
270
- target[field.alias] = (
271
- args: any,
272
- // TODO get the associated type for FetchOptions from the loadably selected field
273
- fetchOptions?: FetchOptions<any>,
274
- ) => {
275
- // TODO we should use the reader AST for this
276
- const includeReadOutData = (variables: any, readOutData: any) => {
277
- variables.id = readOutData.id;
278
- return variables;
279
- };
280
- const localVariables = includeReadOutData(
281
- args ?? {},
282
- refetchReaderParams.data,
283
- );
284
- writeQueryArgsToVariables(
285
- localVariables,
286
- field.queryArguments,
287
- variables,
288
- );
289
-
290
- return [
291
- // Stable id
292
- root.__typename +
293
- ':' +
294
- root.__link +
295
- '/' +
296
- field.name +
297
- '/' +
298
- stableStringifyArgs(localVariables),
299
- // Fetcher
300
- () => {
301
- const fragmentReferenceAndDisposeFromEntrypoint = (
302
- entrypoint: IsographEntrypoint<any, any, any>,
303
- ): [FragmentReference<any, any>, CleanupFn] => {
304
- const [networkRequest, disposeNetworkRequest] =
305
- maybeMakeNetworkRequest(
306
- environment,
307
- entrypoint,
308
- localVariables,
309
- fetchOptions,
310
- );
311
-
312
- const fragmentReference: FragmentReference<any, any> = {
313
- kind: 'FragmentReference',
314
- readerWithRefetchQueries: wrapResolvedValue({
315
- kind: 'ReaderWithRefetchQueries',
316
- readerArtifact:
317
- entrypoint.readerWithRefetchQueries.readerArtifact,
318
- nestedRefetchQueries:
319
- entrypoint.readerWithRefetchQueries
320
- .nestedRefetchQueries,
321
- } as const),
322
-
323
- // TODO localVariables is not guaranteed to have an id field
324
- root,
325
- variables: localVariables,
326
- networkRequest,
327
- };
328
- return [fragmentReference, disposeNetworkRequest];
329
- };
330
-
331
- if (field.entrypoint.kind === 'Entrypoint') {
332
- return fragmentReferenceAndDisposeFromEntrypoint(
333
- field.entrypoint,
334
- );
335
- } else {
336
- const isographArtifactPromiseWrapper =
337
- getOrLoadIsographArtifact(
338
- environment,
339
- field.entrypoint.typeAndField,
340
- field.entrypoint.loader,
341
- );
342
- const state = getPromiseState(isographArtifactPromiseWrapper);
343
- if (state.kind === 'Ok') {
344
- return fragmentReferenceAndDisposeFromEntrypoint(
345
- state.value,
346
- );
347
- } else {
348
- // Promise is pending or thrown
349
-
350
- let entrypointLoaderState:
351
- | {
352
- kind: 'EntrypointNotLoaded';
353
- }
354
- | {
355
- kind: 'NetworkRequestStarted';
356
- disposeNetworkRequest: CleanupFn;
357
- }
358
- | { kind: 'Disposed' } = { kind: 'EntrypointNotLoaded' };
359
-
360
- const networkRequest = wrapPromise(
361
- isographArtifactPromiseWrapper.promise.then(
362
- (entrypoint) => {
363
- if (
364
- entrypointLoaderState.kind === 'EntrypointNotLoaded'
365
- ) {
366
- const [networkRequest, disposeNetworkRequest] =
367
- maybeMakeNetworkRequest(
368
- environment,
369
- entrypoint,
370
- localVariables,
371
- fetchOptions,
372
- );
373
- entrypointLoaderState = {
374
- kind: 'NetworkRequestStarted',
375
- disposeNetworkRequest,
376
- };
377
- return networkRequest.promise;
378
- }
379
- },
380
- ),
381
- );
382
- const readerWithRefetchPromise =
383
- isographArtifactPromiseWrapper.promise.then(
384
- (entrypoint) => entrypoint.readerWithRefetchQueries,
385
- );
386
-
387
- const fragmentReference: FragmentReference<any, any> = {
388
- kind: 'FragmentReference',
389
- readerWithRefetchQueries: wrapPromise(
390
- readerWithRefetchPromise,
391
- ),
392
-
393
- // TODO localVariables is not guaranteed to have an id field
394
- root,
395
- variables: localVariables,
396
- networkRequest,
397
- };
398
-
399
- return [
400
- fragmentReference,
401
- () => {
402
- if (
403
- entrypointLoaderState.kind === 'NetworkRequestStarted'
404
- ) {
405
- entrypointLoaderState.disposeNetworkRequest();
406
- }
407
- entrypointLoaderState = { kind: 'Disposed' };
408
- },
409
- ];
410
- }
411
- }
412
- },
413
- ];
414
- };
260
+ if (data.kind === 'MissingData') {
261
+ return data;
415
262
  }
263
+ target[field.alias] = data.data;
416
264
  break;
417
265
  }
418
266
 
@@ -430,6 +278,172 @@ function readData<TReadFromStore>(
430
278
  };
431
279
  }
432
280
 
281
+ export function readLoadablySelectedFieldData(
282
+ environment: IsographEnvironment,
283
+ field: ReaderLoadableField,
284
+ root: Link,
285
+ variables: Variables,
286
+ networkRequest: PromiseWrapper<void, any>,
287
+ networkRequestOptions: NetworkRequestReaderOptions,
288
+ mutableEncounteredRecords: EncounteredIds,
289
+ ): ReadDataResult<unknown> {
290
+ const refetchReaderParams = readData(
291
+ environment,
292
+ field.refetchReaderAst,
293
+ root,
294
+ variables,
295
+ // Refetch fields just read the id, and don't need refetch query artifacts
296
+ [],
297
+ networkRequest,
298
+ networkRequestOptions,
299
+ mutableEncounteredRecords,
300
+ );
301
+
302
+ if (refetchReaderParams.kind === 'MissingData') {
303
+ return {
304
+ kind: 'MissingData',
305
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
306
+ nestedReason: refetchReaderParams,
307
+ recordLink: refetchReaderParams.recordLink,
308
+ };
309
+ }
310
+
311
+ return {
312
+ kind: 'Success',
313
+ data: (
314
+ args: any,
315
+ // TODO get the associated type for FetchOptions from the loadably selected field
316
+ fetchOptions?: FetchOptions<any>,
317
+ ) => {
318
+ // TODO we should use the reader AST for this
319
+ const includeReadOutData = (variables: any, readOutData: any) => {
320
+ variables.id = readOutData.id;
321
+ return variables;
322
+ };
323
+ const localVariables = includeReadOutData(
324
+ args ?? {},
325
+ refetchReaderParams.data,
326
+ );
327
+ writeQueryArgsToVariables(
328
+ localVariables,
329
+ field.queryArguments,
330
+ variables,
331
+ );
332
+
333
+ return [
334
+ // Stable id
335
+ root.__typename +
336
+ ':' +
337
+ root.__link +
338
+ '/' +
339
+ field.name +
340
+ '/' +
341
+ stableStringifyArgs(localVariables),
342
+ // Fetcher
343
+ () => {
344
+ const fragmentReferenceAndDisposeFromEntrypoint = (
345
+ entrypoint: IsographEntrypoint<any, any, any>,
346
+ ): [FragmentReference<any, any>, CleanupFn] => {
347
+ const [networkRequest, disposeNetworkRequest] =
348
+ maybeMakeNetworkRequest(
349
+ environment,
350
+ entrypoint,
351
+ localVariables,
352
+ fetchOptions,
353
+ );
354
+
355
+ const fragmentReference: FragmentReference<any, any> = {
356
+ kind: 'FragmentReference',
357
+ readerWithRefetchQueries: wrapResolvedValue({
358
+ kind: 'ReaderWithRefetchQueries',
359
+ readerArtifact:
360
+ entrypoint.readerWithRefetchQueries.readerArtifact,
361
+ nestedRefetchQueries:
362
+ entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
363
+ } as const),
364
+
365
+ // TODO localVariables is not guaranteed to have an id field
366
+ root,
367
+ variables: localVariables,
368
+ networkRequest,
369
+ };
370
+ return [fragmentReference, disposeNetworkRequest];
371
+ };
372
+
373
+ if (field.entrypoint.kind === 'Entrypoint') {
374
+ return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
375
+ } else {
376
+ const isographArtifactPromiseWrapper = getOrLoadIsographArtifact(
377
+ environment,
378
+ field.entrypoint.typeAndField,
379
+ field.entrypoint.loader,
380
+ );
381
+ const state = getPromiseState(isographArtifactPromiseWrapper);
382
+ if (state.kind === 'Ok') {
383
+ return fragmentReferenceAndDisposeFromEntrypoint(state.value);
384
+ } else {
385
+ // Promise is pending or thrown
386
+
387
+ let entrypointLoaderState:
388
+ | {
389
+ kind: 'EntrypointNotLoaded';
390
+ }
391
+ | {
392
+ kind: 'NetworkRequestStarted';
393
+ disposeNetworkRequest: CleanupFn;
394
+ }
395
+ | { kind: 'Disposed' } = { kind: 'EntrypointNotLoaded' };
396
+
397
+ const networkRequest = wrapPromise(
398
+ isographArtifactPromiseWrapper.promise.then((entrypoint) => {
399
+ if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
400
+ const [networkRequest, disposeNetworkRequest] =
401
+ maybeMakeNetworkRequest(
402
+ environment,
403
+ entrypoint,
404
+ localVariables,
405
+ fetchOptions,
406
+ );
407
+ entrypointLoaderState = {
408
+ kind: 'NetworkRequestStarted',
409
+ disposeNetworkRequest,
410
+ };
411
+ return networkRequest.promise;
412
+ }
413
+ }),
414
+ );
415
+ const readerWithRefetchPromise =
416
+ isographArtifactPromiseWrapper.promise.then(
417
+ (entrypoint) => entrypoint.readerWithRefetchQueries,
418
+ );
419
+
420
+ const fragmentReference: FragmentReference<any, any> = {
421
+ kind: 'FragmentReference',
422
+ readerWithRefetchQueries: wrapPromise(readerWithRefetchPromise),
423
+
424
+ // TODO localVariables is not guaranteed to have an id field
425
+ root,
426
+ variables: localVariables,
427
+ networkRequest,
428
+ };
429
+
430
+ return [
431
+ fragmentReference,
432
+ () => {
433
+ if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
434
+ entrypointLoaderState.disposeNetworkRequest();
435
+ }
436
+ entrypointLoaderState = { kind: 'Disposed' };
437
+ },
438
+ ];
439
+ }
440
+ }
441
+ },
442
+ ];
443
+ },
444
+ };
445
+ }
446
+
433
447
  function filterVariables(
434
448
  variables: Variables,
435
449
  allowedVariables: string[],