@isograph/react 0.4.2 → 0.5.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 (144) hide show
  1. package/.turbo/turbo-compile-libs.log +2 -2
  2. package/dist/core/FragmentReference.d.ts +4 -2
  3. package/dist/core/FragmentReference.d.ts.map +1 -1
  4. package/dist/core/FragmentReference.js +2 -2
  5. package/dist/core/IsographEnvironment.d.ts +19 -11
  6. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  7. package/dist/core/IsographEnvironment.js +27 -2
  8. package/dist/core/PromiseWrapper.d.ts +13 -7
  9. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  10. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -1
  11. package/dist/core/areEqualWithDeepComparison.js +5 -0
  12. package/dist/core/brand.d.ts +17 -0
  13. package/dist/core/brand.d.ts.map +1 -1
  14. package/dist/core/cache.d.ts +10 -7
  15. package/dist/core/cache.d.ts.map +1 -1
  16. package/dist/core/cache.js +102 -74
  17. package/dist/core/check.d.ts +8 -4
  18. package/dist/core/check.d.ts.map +1 -1
  19. package/dist/core/check.js +10 -7
  20. package/dist/core/componentCache.d.ts +1 -1
  21. package/dist/core/componentCache.d.ts.map +1 -1
  22. package/dist/core/componentCache.js +6 -4
  23. package/dist/core/entrypoint.d.ts +17 -7
  24. package/dist/core/entrypoint.d.ts.map +1 -1
  25. package/dist/core/garbageCollection.d.ts +8 -2
  26. package/dist/core/garbageCollection.d.ts.map +1 -1
  27. package/dist/core/garbageCollection.js +36 -14
  28. package/dist/core/logging.d.ts +16 -3
  29. package/dist/core/logging.d.ts.map +1 -1
  30. package/dist/core/makeNetworkRequest.d.ts +4 -2
  31. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  32. package/dist/core/makeNetworkRequest.js +115 -38
  33. package/dist/core/optimisticProxy.d.ts +59 -0
  34. package/dist/core/optimisticProxy.d.ts.map +1 -0
  35. package/dist/core/optimisticProxy.js +399 -0
  36. package/dist/core/read.d.ts +3 -2
  37. package/dist/core/read.d.ts.map +1 -1
  38. package/dist/core/read.js +158 -123
  39. package/dist/core/reader.d.ts +10 -5
  40. package/dist/core/reader.d.ts.map +1 -1
  41. package/dist/core/startUpdate.d.ts +3 -2
  42. package/dist/core/startUpdate.d.ts.map +1 -1
  43. package/dist/core/startUpdate.js +35 -36
  44. package/dist/index.d.ts +2 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +2 -1
  47. package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -4
  48. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  49. package/dist/loadable-hooks/useClientSideDefer.js +34 -1
  50. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +5 -3
  51. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  52. package/dist/loadable-hooks/useConnectionSpecPagination.js +27 -13
  53. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +1 -1
  54. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  55. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +1 -1
  56. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  57. package/dist/loadable-hooks/useSkipLimitPagination.js +1 -1
  58. package/dist/react/FragmentReader.d.ts +2 -1
  59. package/dist/react/FragmentReader.d.ts.map +1 -1
  60. package/dist/react/FragmentRenderer.d.ts +2 -1
  61. package/dist/react/FragmentRenderer.d.ts.map +1 -1
  62. package/dist/react/LoadableFieldReader.d.ts +9 -3
  63. package/dist/react/LoadableFieldReader.d.ts.map +1 -1
  64. package/dist/react/LoadableFieldReader.js +40 -1
  65. package/dist/react/LoadableFieldRenderer.d.ts +9 -3
  66. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -1
  67. package/dist/react/LoadableFieldRenderer.js +36 -1
  68. package/dist/react/useImperativeReference.d.ts +4 -3
  69. package/dist/react/useImperativeReference.d.ts.map +1 -1
  70. package/dist/react/useImperativeReference.js +3 -5
  71. package/dist/react/useLazyReference.d.ts +2 -1
  72. package/dist/react/useLazyReference.d.ts.map +1 -1
  73. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  74. package/dist/react/useReadAndSubscribe.js +1 -3
  75. package/dist/react/useResult.d.ts.map +1 -1
  76. package/dist/react/useResult.js +6 -5
  77. package/package.json +16 -17
  78. package/src/core/FragmentReference.ts +10 -4
  79. package/src/core/IsographEnvironment.ts +59 -13
  80. package/src/core/PromiseWrapper.ts +14 -7
  81. package/src/core/areEqualWithDeepComparison.ts +5 -0
  82. package/src/core/brand.ts +18 -0
  83. package/src/core/cache.ts +186 -91
  84. package/src/core/check.ts +21 -10
  85. package/src/core/componentCache.ts +8 -4
  86. package/src/core/entrypoint.ts +35 -6
  87. package/src/core/garbageCollection.ts +61 -19
  88. package/src/core/logging.ts +15 -3
  89. package/src/core/makeNetworkRequest.ts +307 -74
  90. package/src/core/optimisticProxy.ts +563 -0
  91. package/src/core/read.ts +233 -163
  92. package/src/core/reader.ts +11 -7
  93. package/src/core/startUpdate.ts +47 -32
  94. package/src/index.ts +2 -1
  95. package/src/loadable-hooks/useClientSideDefer.ts +76 -26
  96. package/src/loadable-hooks/useConnectionSpecPagination.ts +34 -17
  97. package/src/loadable-hooks/useImperativeLoadableField.ts +2 -2
  98. package/src/loadable-hooks/useSkipLimitPagination.ts +2 -3
  99. package/src/react/FragmentReader.tsx +3 -1
  100. package/src/react/FragmentRenderer.tsx +8 -1
  101. package/src/react/LoadableFieldReader.tsx +123 -12
  102. package/src/react/LoadableFieldRenderer.tsx +122 -12
  103. package/src/react/useImperativeReference.ts +20 -11
  104. package/src/react/useLazyReference.ts +17 -6
  105. package/src/react/useReadAndSubscribe.ts +1 -8
  106. package/src/react/useResult.ts +9 -11
  107. package/src/tests/__isograph/Node/__link/output_type.ts +3 -0
  108. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +3 -3
  109. package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +3 -1
  110. package/src/tests/__isograph/Query/linkedUpdate/param_type.ts +4 -4
  111. package/src/tests/__isograph/Query/linkedUpdate/raw_response_type.ts +13 -0
  112. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +6 -6
  113. package/src/tests/__isograph/Query/meName/entrypoint.ts +3 -1
  114. package/src/tests/__isograph/Query/meName/raw_response_type.ts +7 -0
  115. package/src/tests/__isograph/Query/meName/resolver_reader.ts +2 -2
  116. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +3 -1
  117. package/src/tests/__isograph/Query/meNameSuccessor/raw_response_type.ts +14 -0
  118. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +4 -4
  119. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +3 -1
  120. package/src/tests/__isograph/Query/nodeField/raw_response_type.ts +7 -0
  121. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +2 -2
  122. package/src/tests/__isograph/Query/normalizeUndefinedField/entrypoint.ts +33 -0
  123. package/src/tests/__isograph/Query/normalizeUndefinedField/normalization_ast.ts +25 -0
  124. package/src/tests/__isograph/Query/normalizeUndefinedField/output_type.ts +3 -0
  125. package/src/tests/__isograph/Query/normalizeUndefinedField/param_type.ts +9 -0
  126. package/src/tests/__isograph/Query/normalizeUndefinedField/query_text.ts +6 -0
  127. package/src/tests/__isograph/Query/normalizeUndefinedField/raw_response_type.ts +7 -0
  128. package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +38 -0
  129. package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +3 -1
  130. package/src/tests/__isograph/Query/startUpdate/raw_response_type.ts +8 -0
  131. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +3 -3
  132. package/src/tests/__isograph/Query/subquery/entrypoint.ts +3 -1
  133. package/src/tests/__isograph/Query/subquery/raw_response_type.ts +9 -0
  134. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +3 -3
  135. package/src/tests/__isograph/iso.ts +11 -1
  136. package/src/tests/garbageCollection.test.ts +8 -5
  137. package/src/tests/meNameSuccessor.ts +6 -3
  138. package/src/tests/nodeQuery.ts +4 -2
  139. package/src/tests/normalizeData.test.ts +89 -15
  140. package/src/tests/optimisticProxy.test.ts +860 -0
  141. package/src/tests/startUpdate.test.ts +8 -6
  142. package/vitest.config.ts +10 -1
  143. package/src/tests/__isograph/Economist/link/output_type.ts +0 -2
  144. package/src/tests/__isograph/Node/link/output_type.ts +0 -3
package/dist/core/read.js CHANGED
@@ -5,6 +5,7 @@ exports.readLoadablySelectedFieldData = readLoadablySelectedFieldData;
5
5
  exports.readResolverFieldData = readResolverFieldData;
6
6
  exports.readScalarFieldData = readScalarFieldData;
7
7
  exports.readLinkedFieldData = readLinkedFieldData;
8
+ exports.readClientPointerData = readClientPointerData;
8
9
  exports.getNetworkRequestOptionsWithDefaults = getNetworkRequestOptionsWithDefaults;
9
10
  exports.readImperativelyLoadedField = readImperativelyLoadedField;
10
11
  const cache_1 = require("./cache");
@@ -12,6 +13,7 @@ const componentCache_1 = require("./componentCache");
12
13
  const IsographEnvironment_1 = require("./IsographEnvironment");
13
14
  const logging_1 = require("./logging");
14
15
  const makeNetworkRequest_1 = require("./makeNetworkRequest");
16
+ const optimisticProxy_1 = require("./optimisticProxy");
15
17
  const PromiseWrapper_1 = require("./PromiseWrapper");
16
18
  const startUpdate_1 = require("./startUpdate");
17
19
  function readButDoNotEvaluate(environment, fragmentReference, networkRequestOptions) {
@@ -62,10 +64,10 @@ function readButDoNotEvaluate(environment, fragmentReference, networkRequestOpti
62
64
  }
63
65
  }
64
66
  function readData(environment, ast, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords) {
65
- var _a, _b, _c;
67
+ var _a, _b;
66
68
  const encounteredIds = (0, cache_1.insertEmptySetIfMissing)(mutableEncounteredRecords, root.__typename);
67
69
  encounteredIds.add(root.__link);
68
- let storeRecord = (_a = environment.store[root.__typename]) === null || _a === void 0 ? void 0 : _a[root.__link];
70
+ let storeRecord = (0, optimisticProxy_1.getStoreRecordProxy)(environment.store, root);
69
71
  if (storeRecord === undefined) {
70
72
  return {
71
73
  kind: 'MissingData',
@@ -87,7 +89,7 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
87
89
  if (data.kind === 'MissingData') {
88
90
  return data;
89
91
  }
90
- target[(_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName] = data.data;
92
+ target[(_a = field.alias) !== null && _a !== void 0 ? _a : field.fieldName] = data.data;
91
93
  break;
92
94
  }
93
95
  case 'Link': {
@@ -99,7 +101,7 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
99
101
  if (data.kind === 'MissingData') {
100
102
  return data;
101
103
  }
102
- target[(_c = field.alias) !== null && _c !== void 0 ? _c : field.fieldName] = data.data;
104
+ target[(_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName] = data.data;
103
105
  break;
104
106
  }
105
107
  case 'ImperativelyLoadedField': {
@@ -175,14 +177,13 @@ function readLoadablySelectedFieldData(environment, field, root, variables, netw
175
177
  // Fetcher
176
178
  () => {
177
179
  const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
178
- const readerWithRefetchQueries = entrypoint.readerWithRefetchQueries.kind ===
179
- 'ReaderWithRefetchQueriesLoader'
180
- ? (0, PromiseWrapper_1.wrapPromise)(entrypoint.readerWithRefetchQueries.loader())
181
- : (0, PromiseWrapper_1.wrapResolvedValue)(entrypoint.readerWithRefetchQueries);
180
+ const { fieldName, readerArtifactKind, readerWithRefetchQueries } = (0, IsographEnvironment_1.getOrLoadReaderWithRefetchQueries)(environment, entrypoint.readerWithRefetchQueries);
182
181
  const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, readerWithRefetchQueries, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : null);
183
182
  const fragmentReference = {
184
183
  kind: 'FragmentReference',
185
184
  readerWithRefetchQueries,
185
+ fieldName,
186
+ readerArtifactKind,
186
187
  // TODO localVariables is not guaranteed to have an id field
187
188
  root,
188
189
  variables: localVariables,
@@ -202,10 +203,7 @@ function readLoadablySelectedFieldData(environment, field, root, variables, netw
202
203
  else {
203
204
  // Promise is pending or thrown
204
205
  let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
205
- const readerWithRefetchQueries = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries.kind ===
206
- 'ReaderWithRefetchQueriesLoader'
207
- ? entrypoint.readerWithRefetchQueries.loader()
208
- : entrypoint.readerWithRefetchQueries));
206
+ const readerWithRefetchQueries = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => (0, IsographEnvironment_1.getOrLoadReaderWithRefetchQueries)(environment, entrypoint.readerWithRefetchQueries).readerWithRefetchQueries.promise));
209
207
  const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
210
208
  if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
211
209
  const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, readerWithRefetchQueries, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : null);
@@ -219,6 +217,8 @@ function readLoadablySelectedFieldData(environment, field, root, variables, netw
219
217
  const fragmentReference = {
220
218
  kind: 'FragmentReference',
221
219
  readerWithRefetchQueries,
220
+ fieldName: field.name,
221
+ readerArtifactKind: field.entrypoint.readerArtifactKind,
222
222
  // TODO localVariables is not guaranteed to have an id field
223
223
  root,
224
224
  variables: localVariables,
@@ -322,6 +322,8 @@ function readResolverFieldData(environment, field, root, variables, nestedRefetc
322
322
  const fragment = {
323
323
  kind: 'FragmentReference',
324
324
  readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(readerWithRefetchQueries),
325
+ fieldName: field.readerArtifact.fieldName,
326
+ readerArtifactKind: field.readerArtifact.kind,
325
327
  root,
326
328
  variables: generateChildVariableMap(variables, field.arguments),
327
329
  networkRequest,
@@ -341,7 +343,7 @@ function readResolverFieldData(environment, field, root, variables, nestedRefetc
341
343
  data: data.data,
342
344
  parameters: variables,
343
345
  startUpdate: field.readerArtifact.hasUpdatable
344
- ? (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, readerWithRefetchQueries.readerArtifact.fieldName, networkRequestOptions)
346
+ ? (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, networkRequestOptions)
345
347
  : undefined,
346
348
  };
347
349
  return {
@@ -352,7 +354,7 @@ function readResolverFieldData(environment, field, root, variables, nestedRefetc
352
354
  case 'ComponentReaderArtifact': {
353
355
  return {
354
356
  kind: 'Success',
355
- data: (0, componentCache_1.getOrCreateCachedComponent)(environment, field.readerArtifact.fieldName, fragment, networkRequestOptions),
357
+ data: (0, componentCache_1.getOrCreateCachedComponent)(environment, fragment, networkRequestOptions),
356
358
  };
357
359
  }
358
360
  default: {
@@ -378,7 +380,45 @@ function readScalarFieldData(field, storeRecord, root, variables) {
378
380
  }
379
381
  function readLinkedFieldData(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, readData) {
380
382
  const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
381
- const value = storeRecord[storeRecordName];
383
+ let value = storeRecord[storeRecordName];
384
+ if (field.condition) {
385
+ const data = readData(field.condition.readerAst, root);
386
+ if (data.kind === 'MissingData') {
387
+ return {
388
+ kind: 'MissingData',
389
+ reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
390
+ nestedReason: data,
391
+ recordLink: data.recordLink,
392
+ };
393
+ }
394
+ const readerWithRefetchQueries = {
395
+ kind: 'ReaderWithRefetchQueries',
396
+ readerArtifact: field.condition,
397
+ // TODO this is wrong
398
+ // should map field.condition.usedRefetchQueries
399
+ // but it doesn't exist
400
+ nestedRefetchQueries: [],
401
+ };
402
+ const fragment = {
403
+ kind: 'FragmentReference',
404
+ readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(readerWithRefetchQueries),
405
+ root,
406
+ fieldName: field.condition.fieldName,
407
+ readerArtifactKind: field.condition.kind,
408
+ variables: generateChildVariableMap(variables,
409
+ // TODO this is wrong
410
+ // should use field.arguments
411
+ // but it doesn't exist
412
+ []),
413
+ networkRequest,
414
+ };
415
+ const condition = field.condition.resolver(Object.assign({ data: data.data, parameters: {} }, (field.condition.hasUpdatable
416
+ ? {
417
+ startUpdate: (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, networkRequestOptions),
418
+ }
419
+ : undefined)));
420
+ value = condition;
421
+ }
382
422
  if (Array.isArray(value)) {
383
423
  const results = [];
384
424
  for (const item of value) {
@@ -399,6 +439,24 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
399
439
  results.push(null);
400
440
  continue;
401
441
  }
442
+ if (isClientPointer(field)) {
443
+ const result = readClientPointerData(environment, field, link, variables, nestedRefetchQueries, readData);
444
+ if (result.kind === 'MissingData') {
445
+ return {
446
+ kind: 'MissingData',
447
+ reason: 'Missing data for ' +
448
+ storeRecordName +
449
+ ' on root ' +
450
+ root.__link +
451
+ '. Link is ' +
452
+ JSON.stringify(item),
453
+ nestedReason: result,
454
+ recordLink: result.recordLink,
455
+ };
456
+ }
457
+ results.push(result.data);
458
+ continue;
459
+ }
402
460
  const result = readData(field.selections, link);
403
461
  if (result.kind === 'MissingData') {
404
462
  return {
@@ -421,42 +479,6 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
421
479
  };
422
480
  }
423
481
  let link = (0, IsographEnvironment_1.assertLink)(value);
424
- if (field.condition) {
425
- const data = readData(field.condition.readerAst, root);
426
- if (data.kind === 'MissingData') {
427
- return {
428
- kind: 'MissingData',
429
- reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
430
- nestedReason: data,
431
- recordLink: data.recordLink,
432
- };
433
- }
434
- const readerWithRefetchQueries = {
435
- kind: 'ReaderWithRefetchQueries',
436
- readerArtifact: field.condition,
437
- // TODO this is wrong
438
- // should map field.condition.usedRefetchQueries
439
- // but it doesn't exist
440
- nestedRefetchQueries: [],
441
- };
442
- const fragment = {
443
- kind: 'FragmentReference',
444
- readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(readerWithRefetchQueries),
445
- root,
446
- variables: generateChildVariableMap(variables,
447
- // TODO this is wrong
448
- // should use field.arguments
449
- // but it doesn't exist
450
- []),
451
- networkRequest,
452
- };
453
- const condition = field.condition.resolver(Object.assign({ data: data.data, parameters: {} }, (field.condition.hasUpdatable
454
- ? {
455
- startUpdate: (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, readerWithRefetchQueries.readerArtifact.fieldName, networkRequestOptions),
456
- }
457
- : undefined)));
458
- link = condition;
459
- }
460
482
  if (link === undefined) {
461
483
  // TODO make this configurable, and also generated and derived from the schema
462
484
  const missingFieldHandler = environment.missingFieldHandler;
@@ -491,83 +513,19 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
491
513
  data: null,
492
514
  };
493
515
  }
494
- const targetId = link;
495
- const { refetchQueryIndex } = field;
496
- if (refetchQueryIndex != null) {
497
- // if field.refetchQueryIndex is not null, then the field is a client pointer, i.e.
498
- // it is like a loadable field that returns the selections.
499
- const refetchReaderParams = readData([
500
- {
501
- kind: 'Scalar',
502
- fieldName: 'id',
503
- alias: null,
504
- arguments: null,
505
- isUpdatable: false,
506
- },
507
- ], targetId);
508
- if (refetchReaderParams.kind === 'MissingData') {
516
+ if (isClientPointer(field)) {
517
+ const data = readClientPointerData(environment, field, link, variables, nestedRefetchQueries, readData);
518
+ if (data.kind === 'MissingData') {
509
519
  return {
510
520
  kind: 'MissingData',
511
- reason: 'Missing data for ' + field.alias + ' on root ' + targetId.__link,
512
- nestedReason: refetchReaderParams,
513
- recordLink: refetchReaderParams.recordLink,
521
+ reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
522
+ nestedReason: data,
523
+ recordLink: data.recordLink,
514
524
  };
515
525
  }
516
- const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
517
- if (refetchQuery == null) {
518
- throw new Error('refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.');
519
- }
520
- const refetchQueryArtifact = refetchQuery.artifact;
521
- const allowedVariables = refetchQuery.allowedVariables;
522
- return {
523
- kind: 'Success',
524
- data: (args,
525
- // TODO get the associated type for FetchOptions from the loadably selected field
526
- fetchOptions) => {
527
- const includeReadOutData = (variables, readOutData) => {
528
- variables.id = readOutData.id;
529
- return variables;
530
- };
531
- const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
532
- writeQueryArgsToVariables(localVariables, field.arguments, variables);
533
- return [
534
- // Stable id
535
- targetId.__typename +
536
- ':' +
537
- targetId.__link +
538
- '/' +
539
- field.fieldName +
540
- '/' +
541
- stableStringifyArgs(localVariables),
542
- // Fetcher
543
- () => {
544
- const variables = includeReadOutData(filterVariables(Object.assign(Object.assign({}, args), localVariables), allowedVariables), refetchReaderParams.data);
545
- const readerWithRefetchQueries = (0, PromiseWrapper_1.wrapResolvedValue)({
546
- kind: 'ReaderWithRefetchQueries',
547
- readerArtifact: {
548
- kind: 'EagerReaderArtifact',
549
- fieldName: field.fieldName,
550
- readerAst: field.selections,
551
- resolver: ({ data }) => data,
552
- hasUpdatable: false,
553
- },
554
- nestedRefetchQueries,
555
- });
556
- const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, refetchQueryArtifact, variables, readerWithRefetchQueries, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : null);
557
- const fragmentReference = {
558
- kind: 'FragmentReference',
559
- readerWithRefetchQueries: readerWithRefetchQueries,
560
- root: targetId,
561
- variables,
562
- networkRequest,
563
- };
564
- return [fragmentReference, disposeNetworkRequest];
565
- },
566
- ];
567
- },
568
- };
526
+ return data;
569
527
  }
570
- const data = readData(field.selections, targetId);
528
+ const data = readData(field.selections, link);
571
529
  if (data.kind === 'MissingData') {
572
530
  return {
573
531
  kind: 'MissingData',
@@ -578,6 +536,83 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
578
536
  }
579
537
  return data;
580
538
  }
539
+ function isClientPointer(field) {
540
+ return field.refetchQueryIndex !== null;
541
+ }
542
+ function readClientPointerData(environment, field, root, variables, nestedRefetchQueries, readData) {
543
+ const refetchReaderParams = readData([
544
+ {
545
+ kind: 'Scalar',
546
+ fieldName: 'id',
547
+ alias: null,
548
+ arguments: null,
549
+ isUpdatable: false,
550
+ },
551
+ ], root);
552
+ if (refetchReaderParams.kind === 'MissingData') {
553
+ return {
554
+ kind: 'MissingData',
555
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
556
+ nestedReason: refetchReaderParams,
557
+ recordLink: refetchReaderParams.recordLink,
558
+ };
559
+ }
560
+ const refetchQuery = nestedRefetchQueries[field.refetchQueryIndex];
561
+ if (refetchQuery == null) {
562
+ throw new Error('refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.');
563
+ }
564
+ const refetchQueryArtifact = refetchQuery.artifact;
565
+ const allowedVariables = refetchQuery.allowedVariables;
566
+ return {
567
+ kind: 'Success',
568
+ data: (args,
569
+ // TODO get the associated type for FetchOptions from the loadably selected field
570
+ fetchOptions) => {
571
+ const includeReadOutData = (variables, readOutData) => {
572
+ variables.id = readOutData.id;
573
+ return variables;
574
+ };
575
+ const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
576
+ writeQueryArgsToVariables(localVariables, field.arguments, variables);
577
+ return [
578
+ // Stable id
579
+ root.__typename +
580
+ ':' +
581
+ root.__link +
582
+ '/' +
583
+ field.fieldName +
584
+ '/' +
585
+ stableStringifyArgs(localVariables),
586
+ // Fetcher
587
+ () => {
588
+ const variables = includeReadOutData(filterVariables(Object.assign(Object.assign({}, args), localVariables), allowedVariables), refetchReaderParams.data);
589
+ const readerWithRefetchQueries = (0, PromiseWrapper_1.wrapResolvedValue)({
590
+ kind: 'ReaderWithRefetchQueries',
591
+ readerArtifact: {
592
+ kind: 'EagerReaderArtifact',
593
+ fieldName: field.fieldName,
594
+ readerAst: field.selections,
595
+ resolver: ({ data }) => data,
596
+ hasUpdatable: false,
597
+ },
598
+ nestedRefetchQueries,
599
+ });
600
+ const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, refetchQueryArtifact, variables, readerWithRefetchQueries, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : null);
601
+ const fragmentReference = {
602
+ kind: 'FragmentReference',
603
+ fieldName: field.fieldName,
604
+ readerArtifactKind: 'EagerReaderArtifact',
605
+ readerWithRefetchQueries: readerWithRefetchQueries,
606
+ root,
607
+ variables,
608
+ networkRequest,
609
+ };
610
+ return [fragmentReference, disposeNetworkRequest];
611
+ },
612
+ ];
613
+ },
614
+ };
615
+ }
581
616
  function getNetworkRequestOptionsWithDefaults(networkRequestOptions) {
582
617
  var _a, _b;
583
618
  return {
@@ -7,7 +7,7 @@ import { Arguments } from './util';
7
7
  export type TopLevelReaderArtifact<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TComponentProps extends Record<PropertyKey, never>> = EagerReaderArtifact<TReadFromStore, TClientFieldValue> | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
8
8
  export type EagerReaderArtifact<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
9
9
  readonly kind: 'EagerReaderArtifact';
10
- readonly fieldName: string;
10
+ readonly fieldName: ComponentOrFieldName;
11
11
  readonly readerAst: ReaderAst<TReadFromStore>;
12
12
  readonly resolver: (data: ResolverFirstParameter<TReadFromStore>) => TClientFieldValue;
13
13
  readonly hasUpdatable: boolean;
@@ -20,7 +20,9 @@ export type ComponentReaderArtifact<TReadFromStore extends UnknownTReadFromStore
20
20
  readonly hasUpdatable: boolean;
21
21
  };
22
22
  export type ResolverFirstParameter<TReadFromStore extends UnknownTReadFromStore> = Pick<TReadFromStore, 'data' | 'parameters' | 'startUpdate'>;
23
- export type StartUpdate<UpdatableData> = (updater: (updatableData: UpdatableData) => void) => void;
23
+ export type StartUpdate<UpdatableData> = (updater: (startUpdateParams: {
24
+ updatableData: UpdatableData;
25
+ }) => void) => void;
24
26
  export type RefetchReaderArtifact = {
25
27
  readonly kind: 'RefetchReaderArtifact';
26
28
  readonly readerAst: ReaderAst<unknown>;
@@ -49,13 +51,16 @@ export type ReaderLinkedField = {
49
51
  data: any;
50
52
  parameters: any;
51
53
  startUpdate?: StartUpdate<any>;
52
- }, StoreLink | null> | null;
54
+ }, StoreLink | null | (StoreLink | null)[] | StoreLink[]> | null;
53
55
  readonly isUpdatable: boolean;
54
56
  /**
55
57
  * If refetchQueryIndex != null, then the linked field is a client pointer.
56
58
  */
57
59
  readonly refetchQueryIndex: number | null;
58
60
  };
61
+ export interface ReaderClientPointer extends ReaderLinkedField {
62
+ readonly refetchQueryIndex: number;
63
+ }
59
64
  export type ReaderNonLoadableResolverField = {
60
65
  readonly kind: 'Resolver';
61
66
  readonly alias: string;
@@ -76,8 +81,8 @@ export type LoadablySelectedField = {
76
81
  readonly name: string;
77
82
  readonly queryArguments: Arguments | null;
78
83
  readonly refetchReaderAst: ReaderAst<any>;
79
- readonly entrypoint: IsographEntrypoint<any, any, any> | IsographEntrypointLoader<any, any>;
84
+ readonly entrypoint: IsographEntrypoint<any, any, any, any> | IsographEntrypointLoader<any, any, any>;
80
85
  };
81
86
  export type StableId = string;
82
- export type LoadableField<TReadFromStore extends UnknownTReadFromStore, TResult, TArgs = ExtractParameters<TReadFromStore>> = (args: TArgs | void, fetchOptions: FetchOptions<TResult>) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
87
+ export type LoadableField<TReadFromStore extends UnknownTReadFromStore, TResult, TArgs = ExtractParameters<TReadFromStore>> = (args: TArgs | void, fetchOptions: FetchOptions<TResult, never>) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
83
88
  //# sourceMappingURL=reader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/core/reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/core/reader.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { type EncounteredIds } from './cache';
2
2
  import { type ExtractStartUpdate, type ExtractUpdatableData, type FragmentReference, type UnknownTReadFromStore } from './FragmentReference';
3
3
  import { type IsographEnvironment } from './IsographEnvironment';
4
+ import { type StoreLayer } from './optimisticProxy';
4
5
  import { type NetworkRequestReaderOptions } from './read';
5
- export declare function getOrCreateCachedStartUpdate<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, unknown>, eagerResolverName: string, networkRequestOptions: NetworkRequestReaderOptions): ExtractStartUpdate<TReadFromStore>;
6
+ export declare function getOrCreateCachedStartUpdate<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, unknown>, networkRequestOptions: NetworkRequestReaderOptions): ExtractStartUpdate<TReadFromStore>;
6
7
  export declare function createStartUpdate<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, unknown>, networkRequestOptions: NetworkRequestReaderOptions): ExtractStartUpdate<TReadFromStore>;
7
- export declare function createUpdatableProxy<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, unknown>, networkRequestOptions: NetworkRequestReaderOptions, mutableUpdatedIds: EncounteredIds): ExtractUpdatableData<TReadFromStore>;
8
+ export declare function createUpdatableProxy<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, storeLayer: StoreLayer, fragmentReference: FragmentReference<TReadFromStore, unknown>, networkRequestOptions: NetworkRequestReaderOptions, mutableUpdatedIds: EncounteredIds): ExtractUpdatableData<TReadFromStore>;
8
9
  //# sourceMappingURL=startUpdate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"startUpdate.d.ts","sourceRoot":"","sources":["../../src/core/startUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAML,KAAK,2BAA2B,EAEjC,MAAM,QAAQ,CAAC;AAGhB,wBAAgB,4BAA4B,CAC1C,cAAc,SAAS,qBAAqB,EAE5C,WAAW,EAAE,mBAAmB,EAChC,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,iBAAiB,EAAE,MAAM,EACzB,qBAAqB,EAAE,2BAA2B,GACjD,kBAAkB,CAAC,cAAc,CAAC,CAQpC;AAED,wBAAgB,iBAAiB,CAAC,cAAc,SAAS,qBAAqB,EAC5E,WAAW,EAAE,mBAAmB,EAChC,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,qBAAqB,EAAE,2BAA2B,GACjD,kBAAkB,CAAC,cAAc,CAAC,CA2BpC;AAED,wBAAgB,oBAAoB,CAClC,cAAc,SAAS,qBAAqB,EAE5C,WAAW,EAAE,mBAAmB,EAChC,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,qBAAqB,EAAE,2BAA2B,EAClD,iBAAiB,EAAE,cAAc,GAChC,oBAAoB,CAAC,cAAc,CAAC,CAkBtC"}
1
+ {"version":3,"file":"startUpdate.d.ts","sourceRoot":"","sources":["../../src/core/startUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAML,KAAK,2BAA2B,EAEjC,MAAM,QAAQ,CAAC;AAGhB,wBAAgB,4BAA4B,CAC1C,cAAc,SAAS,qBAAqB,EAE5C,WAAW,EAAE,mBAAmB,EAChC,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,qBAAqB,EAAE,2BAA2B,GACjD,kBAAkB,CAAC,cAAc,CAAC,CAQpC;AAED,wBAAgB,iBAAiB,CAAC,cAAc,SAAS,qBAAqB,EAC5E,WAAW,EAAE,mBAAmB,EAChC,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,qBAAqB,EAAE,2BAA2B,GACjD,kBAAkB,CAAC,cAAc,CAAC,CAqCpC;AAED,wBAAgB,oBAAoB,CAClC,cAAc,SAAS,qBAAqB,EAE5C,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,qBAAqB,EAAE,2BAA2B,EAClD,iBAAiB,EAAE,cAAc,GAChC,oBAAoB,CAAC,cAAc,CAAC,CAmBtC"}
@@ -7,40 +7,43 @@ const cache_1 = require("./cache");
7
7
  const FragmentReference_1 = require("./FragmentReference");
8
8
  const IsographEnvironment_1 = require("./IsographEnvironment");
9
9
  const logging_1 = require("./logging");
10
+ const optimisticProxy_1 = require("./optimisticProxy");
10
11
  const PromiseWrapper_1 = require("./PromiseWrapper");
11
12
  const read_1 = require("./read");
12
- function getOrCreateCachedStartUpdate(environment, fragmentReference, eagerResolverName, networkRequestOptions) {
13
+ function getOrCreateCachedStartUpdate(environment, fragmentReference, networkRequestOptions) {
13
14
  var _a;
14
15
  var _b, _c;
15
- return ((_a = (_b = environment.eagerReaderCache)[_c = (0, FragmentReference_1.stableIdForFragmentReference)(fragmentReference, eagerResolverName)]) !== null && _a !== void 0 ? _a : (_b[_c] = createStartUpdate(environment, fragmentReference, networkRequestOptions)));
16
+ return ((_a = (_b = environment.eagerReaderCache)[_c = (0, FragmentReference_1.stableIdForFragmentReference)(fragmentReference)]) !== null && _a !== void 0 ? _a : (_b[_c] = createStartUpdate(environment, fragmentReference, networkRequestOptions)));
16
17
  }
17
18
  function createStartUpdate(environment, fragmentReference, networkRequestOptions) {
18
19
  return (updater) => {
19
20
  let mutableUpdatedIds = new Map();
20
- let data = createUpdatableProxy(environment, fragmentReference, networkRequestOptions, mutableUpdatedIds);
21
- try {
22
- updater(data);
23
- }
24
- catch (e) {
25
- (0, logging_1.logMessage)(environment, () => ({
26
- kind: 'StartUpdateError',
27
- error: e,
28
- }));
29
- throw e;
30
- }
31
- finally {
32
- (0, logging_1.logMessage)(environment, () => ({
33
- kind: 'StartUpdateComplete',
34
- updatedIds: mutableUpdatedIds,
35
- }));
36
- (0, cache_1.callSubscriptions)(environment, mutableUpdatedIds);
37
- }
21
+ const startUpdate = (storeLayer) => {
22
+ mutableUpdatedIds.clear();
23
+ let updatableData = createUpdatableProxy(environment, storeLayer, fragmentReference, networkRequestOptions, mutableUpdatedIds);
24
+ try {
25
+ updater({ updatableData });
26
+ }
27
+ catch (e) {
28
+ (0, logging_1.logMessage)(environment, () => ({
29
+ kind: 'StartUpdateError',
30
+ error: e,
31
+ }));
32
+ throw e;
33
+ }
34
+ };
35
+ environment.store = (0, optimisticProxy_1.addStartUpdateStoreLayer)(environment.store, startUpdate);
36
+ (0, logging_1.logMessage)(environment, () => ({
37
+ kind: 'StartUpdateComplete',
38
+ updatedIds: mutableUpdatedIds,
39
+ }));
40
+ (0, cache_1.callSubscriptions)(environment, mutableUpdatedIds);
38
41
  };
39
42
  }
40
- function createUpdatableProxy(environment, fragmentReference, networkRequestOptions, mutableUpdatedIds) {
43
+ function createUpdatableProxy(environment, storeLayer, fragmentReference, networkRequestOptions, mutableUpdatedIds) {
41
44
  var _a;
42
45
  const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
43
- return readUpdatableData(environment, readerWithRefetchQueries.readerArtifact.readerAst, fragmentReference.root, (_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {}, readerWithRefetchQueries.nestedRefetchQueries, fragmentReference.networkRequest, networkRequestOptions, {
46
+ return readUpdatableData(environment, storeLayer, readerWithRefetchQueries.readerArtifact.readerAst, fragmentReference.root, (_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {}, readerWithRefetchQueries.nestedRefetchQueries, fragmentReference.networkRequest, networkRequestOptions, {
44
47
  lastInvalidated: 0,
45
48
  }, mutableUpdatedIds).data;
46
49
  }
@@ -65,21 +68,15 @@ function defineCachedProperty(target, property, mutableState, get, set) {
65
68
  },
66
69
  })));
67
70
  }
68
- function readUpdatableData(environment, ast, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableState, mutableUpdatedIds) {
69
- var _a, _b, _c;
70
- let storeRecord = (_a = environment.store[root.__typename]) === null || _a === void 0 ? void 0 : _a[root.__link];
71
- if (storeRecord == null) {
72
- return {
73
- kind: 'Success',
74
- data: null,
75
- };
76
- }
71
+ function readUpdatableData(environment, storeLayer, ast, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableState, mutableUpdatedIds) {
72
+ var _a, _b;
73
+ const storeRecord = (0, optimisticProxy_1.getMutableStoreRecordProxy)(storeLayer, root);
77
74
  let target = {};
78
75
  for (const field of ast) {
79
76
  switch (field.kind) {
80
77
  case 'Scalar': {
81
78
  const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
82
- defineCachedProperty(target, (_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName, mutableState, () => {
79
+ defineCachedProperty(target, (_a = field.alias) !== null && _a !== void 0 ? _a : field.fieldName, mutableState, () => {
83
80
  const data = (0, read_1.readScalarFieldData)(field, storeRecord, root, variables);
84
81
  if (data.kind === 'MissingData') {
85
82
  throw new Error(data.reason);
@@ -87,6 +84,7 @@ function readUpdatableData(environment, ast, root, variables, nestedRefetchQueri
87
84
  return data.data;
88
85
  }, field.isUpdatable
89
86
  ? (newValue) => {
87
+ const storeRecord = (0, optimisticProxy_1.getOrInsertRecord)(storeLayer.data, root);
90
88
  storeRecord[storeRecordName] = newValue;
91
89
  const updatedIds = (0, cache_1.insertEmptySetIfMissing)(mutableUpdatedIds, root.__typename);
92
90
  updatedIds.add(root.__link);
@@ -96,19 +94,20 @@ function readUpdatableData(environment, ast, root, variables, nestedRefetchQueri
96
94
  }
97
95
  case 'Linked': {
98
96
  const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
99
- defineCachedProperty(target, (_c = field.alias) !== null && _c !== void 0 ? _c : field.fieldName, mutableState, () => {
100
- const data = (0, read_1.readLinkedFieldData)(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, (ast, root) => readUpdatableData(environment, ast, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableState, mutableUpdatedIds));
97
+ defineCachedProperty(target, (_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName, mutableState, () => {
98
+ const data = (0, read_1.readLinkedFieldData)(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, (ast, root) => readUpdatableData(environment, storeLayer, ast, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableState, mutableUpdatedIds));
101
99
  if (data.kind === 'MissingData') {
102
100
  throw new Error(data.reason);
103
101
  }
104
102
  return data.data;
105
103
  }, 'isUpdatable' in field && field.isUpdatable
106
104
  ? (newValue) => {
105
+ const storeRecord = (0, optimisticProxy_1.getOrInsertRecord)(storeLayer.data, root);
107
106
  if (Array.isArray(newValue)) {
108
- storeRecord[storeRecordName] = newValue.map((node) => (0, IsographEnvironment_1.assertLink)(node === null || node === void 0 ? void 0 : node.link));
107
+ storeRecord[storeRecordName] = newValue.map((node) => (0, IsographEnvironment_1.assertLink)(node === null || node === void 0 ? void 0 : node.__link));
109
108
  }
110
109
  else {
111
- storeRecord[storeRecordName] = (0, IsographEnvironment_1.assertLink)(newValue === null || newValue === void 0 ? void 0 : newValue.link);
110
+ storeRecord[storeRecordName] = (0, IsographEnvironment_1.assertLink)(newValue === null || newValue === void 0 ? void 0 : newValue.__link);
112
111
  }
113
112
  const updatedIds = (0, cache_1.insertEmptySetIfMissing)(mutableUpdatedIds, root.__typename);
114
113
  updatedIds.add(root.__link);
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export { retainQuery, unretainQuery, type RetainedQuery, garbageCollectEnvironment, type DidUnretainSomeQuery, } from './core/garbageCollection';
2
2
  export { type PromiseWrapper, readPromise, getPromiseState, wrapResolvedValue, wrapPromise, type PromiseState, type Result, type AnyError, type NotSet, NOT_SET, } from './core/PromiseWrapper';
3
- export { callSubscriptions, subscribe, normalizeData, type NetworkResponseObject, type NetworkResponseValue, type NetworkResponseScalarValue, type EncounteredIds, } from './core/cache';
3
+ export { callSubscriptions, subscribe, normalizeData, writeData, type NetworkResponseObject, type NetworkResponseValue, type NetworkResponseScalarValue, type EncounteredIds, } from './core/cache';
4
4
  export { makeNetworkRequest } from './core/makeNetworkRequest';
5
- export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, type IsographNetworkFunction, type IsographStore, type MissingFieldHandler, type StoreLink, type Link, type StoreRecord, type CacheMap, createIsographEnvironment, createIsographStore, type FieldCache, type Subscriptions, type Subscription, type TypeName, type FragmentSubscription, type AnyChangesToRecordSubscription, type AnyRecordSubscription, type ComponentOrFieldName, type StringifiedArgs, } from './core/IsographEnvironment';
5
+ export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, type IsographNetworkFunction, type BaseStoreLayerData as IsographStore, type MissingFieldHandler, type StoreLink, type Link, type StoreRecord, type CacheMap, createIsographEnvironment, createIsographStore, type FieldCache, type Subscriptions, type Subscription, type TypeName, type FragmentSubscription, type AnyChangesToRecordSubscription, type AnyRecordSubscription, type ComponentOrFieldName, type StringifiedArgs, } from './core/IsographEnvironment';
6
6
  export { type EagerReaderArtifact, type ComponentReaderArtifact, type RefetchReaderArtifact, type ReaderAst, type ReaderAstNode, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField, type TopLevelReaderArtifact, type LoadableField, type StableId, type ResolverFirstParameter, type ReaderImperativelyLoadedField, type LoadablySelectedField as ReaderLoadableField, type ReaderLinkField, type StartUpdate, } from './core/reader';
7
7
  export { type NormalizationAst, type NormalizationAstNode, type NormalizationAstNodes, type NormalizationAstLoader, type NormalizationLinkedField, type NormalizationScalarField, type IsographEntrypoint, type IsographOperation, type IsographPersistedOperation, type IsographPersistedOperationExtraInfo, assertIsEntrypoint, type RefetchQueryNormalizationArtifact, type RefetchQueryNormalizationArtifactWrapper, type ExtractProps, type ExtractReadFromStore, type ExtractResolverResult, type NetworkRequestInfo, type NormalizationInlineFragment, type ReaderWithRefetchQueries, type IsographEntrypointLoader, } from './core/entrypoint';
8
8
  export { readButDoNotEvaluate, type WithEncounteredRecords, type NetworkRequestReaderOptions, type ReadDataResult, } from './core/read';