@isograph/react 0.0.0-main-15990be5 → 0.0.0-main-cd7d2fe9

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 (60) hide show
  1. package/.turbo/turbo-compile-typescript.log +1 -1
  2. package/dist/core/FragmentReference.d.ts +5 -0
  3. package/dist/core/FragmentReference.d.ts.map +1 -1
  4. package/dist/core/IsographEnvironment.d.ts +3 -5
  5. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  6. package/dist/core/cache.d.ts +4 -1
  7. package/dist/core/cache.d.ts.map +1 -1
  8. package/dist/core/componentCache.d.ts.map +1 -1
  9. package/dist/core/componentCache.js +4 -0
  10. package/dist/core/entrypoint.d.ts +5 -1
  11. package/dist/core/entrypoint.d.ts.map +1 -1
  12. package/dist/core/makeNetworkRequest.d.ts +3 -0
  13. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  14. package/dist/core/makeNetworkRequest.js +7 -2
  15. package/dist/core/read.d.ts +2 -0
  16. package/dist/core/read.d.ts.map +1 -1
  17. package/dist/core/read.js +5 -0
  18. package/dist/core/reader.d.ts +12 -2
  19. package/dist/core/reader.d.ts.map +1 -1
  20. package/dist/core/startUpdate.d.ts +9 -0
  21. package/dist/core/startUpdate.d.ts.map +1 -0
  22. package/dist/core/startUpdate.js +6 -0
  23. package/dist/loadable-hooks/useClientSideDefer.d.ts +3 -1
  24. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  25. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +3 -1
  26. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  27. package/dist/loadable-hooks/useConnectionSpecPagination.js +4 -0
  28. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +3 -1
  29. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  30. package/dist/loadable-hooks/useSkipLimitPagination.js +4 -0
  31. package/dist/react/useImperativeReference.d.ts +2 -0
  32. package/dist/react/useImperativeReference.d.ts.map +1 -1
  33. package/dist/react/useLazyReference.d.ts +2 -0
  34. package/dist/react/useLazyReference.d.ts.map +1 -1
  35. package/dist/react/useReadAndSubscribe.d.ts +3 -1
  36. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  37. package/dist/react/useResult.d.ts +2 -0
  38. package/dist/react/useResult.d.ts.map +1 -1
  39. package/dist/react/useResult.js +4 -0
  40. package/package.json +4 -4
  41. package/src/core/FragmentReference.ts +12 -1
  42. package/src/core/IsographEnvironment.ts +7 -3
  43. package/src/core/cache.ts +21 -4
  44. package/src/core/componentCache.ts +4 -0
  45. package/src/core/entrypoint.ts +21 -5
  46. package/src/core/makeNetworkRequest.ts +32 -14
  47. package/src/core/read.ts +11 -2
  48. package/src/core/reader.ts +34 -6
  49. package/src/core/startUpdate.ts +16 -0
  50. package/src/loadable-hooks/useClientSideDefer.ts +16 -4
  51. package/src/loadable-hooks/useConnectionSpecPagination.ts +15 -2
  52. package/src/loadable-hooks/useSkipLimitPagination.ts +20 -3
  53. package/src/react/useImperativeReference.ts +6 -1
  54. package/src/react/useLazyReference.ts +6 -1
  55. package/src/react/useReadAndSubscribe.ts +11 -3
  56. package/src/react/useResult.ts +10 -1
  57. package/src/tests/__isograph/Query/meName/resolver_reader.ts +1 -0
  58. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +1 -0
  59. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +1 -0
  60. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useLazyReference.d.ts","sourceRoot":"","sources":["../../src/react/useLazyReference.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAInC,wBAAgB,gBAAgB,CAC9B,cAAc,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3D,iBAAiB,EAEjB,UAAU,EAAE,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,CAAC,EACjE,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,YAAY,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAC7C;IACD,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;CACzE,CAqBA"}
1
+ {"version":3,"file":"useLazyReference.d.ts","sourceRoot":"","sources":["../../src/react/useLazyReference.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,wBAAgB,gBAAgB,CAC9B,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EACD,iBAAiB,EAEjB,UAAU,EAAE,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,CAAC,EACjE,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,YAAY,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAC7C;IACD,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;CACzE,CAqBA"}
@@ -1,16 +1,18 @@
1
1
  import { ExtractData, FragmentReference } from '../core/FragmentReference';
2
2
  import { NetworkRequestReaderOptions, WithEncounteredRecords } from '../core/read';
3
- import type { ReaderAst } from '../core/reader';
3
+ import type { ReaderAst, StartUpdate } from '../core/reader';
4
4
  /**
5
5
  * Read the data from a fragment reference and subscribe to updates.
6
6
  */
7
7
  export declare function useReadAndSubscribe<TReadFromStore extends {
8
8
  parameters: object;
9
9
  data: object;
10
+ startUpdate?: StartUpdate<object>;
10
11
  }>(fragmentReference: FragmentReference<TReadFromStore, any>, networkRequestOptions: NetworkRequestReaderOptions, readerAst: ReaderAst<TReadFromStore>): ExtractData<TReadFromStore>;
11
12
  export declare function useSubscribeToMultiple<TReadFromStore extends {
12
13
  parameters: object;
13
14
  data: object;
15
+ startUpdate?: StartUpdate<object>;
14
16
  }>(items: ReadonlyArray<{
15
17
  records: WithEncounteredRecords<TReadFromStore>;
16
18
  callback: (updatedRecords: WithEncounteredRecords<TReadFromStore>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useReadAndSubscribe.d.ts","sourceRoot":"","sources":["../../src/react/useReadAndSubscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,iBAAiB,EAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAE3B,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAE3D,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,EACzD,qBAAqB,EAAE,2BAA2B,EAClD,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,GACnC,WAAW,CAAC,cAAc,CAAC,CAY7B;AAED,wBAAgB,sBAAsB,CACpC,cAAc,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAE3D,KAAK,EAAE,aAAa,CAAC;IACnB,OAAO,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC1D,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACtC,CAAC,QAiCH"}
1
+ {"version":3,"file":"useReadAndSubscribe.d.ts","sourceRoot":"","sources":["../../src/react/useReadAndSubscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,iBAAiB,EAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAE3B,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7D;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EAED,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,EACzD,qBAAqB,EAAE,2BAA2B,EAClD,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,GACnC,WAAW,CAAC,cAAc,CAAC,CAY7B;AAED,wBAAgB,sBAAsB,CACpC,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EAED,KAAK,EAAE,aAAa,CAAC;IACnB,OAAO,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC1D,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACtC,CAAC,QAiCH"}
@@ -1,9 +1,11 @@
1
1
  import { FragmentReference } from '../core/FragmentReference';
2
2
  import { PromiseWrapper } from '../core/PromiseWrapper';
3
3
  import { NetworkRequestReaderOptions } from '../core/read';
4
+ import type { StartUpdate } from '../core/reader';
4
5
  export declare function useResult<TReadFromStore extends {
5
6
  parameters: object;
6
7
  data: object;
8
+ startUpdate?: StartUpdate<object>;
7
9
  }, TClientFieldValue>(fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>, partialNetworkRequestOptions?: Partial<NetworkRequestReaderOptions> | void): TClientFieldValue;
8
10
  export declare function maybeUnwrapNetworkRequest(networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions): void;
9
11
  //# sourceMappingURL=useResult.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useResult.d.ts","sourceRoot":"","sources":["../../src/react/useResult.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAEL,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAItB,wBAAgB,SAAS,CACvB,cAAc,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3D,iBAAiB,EAEjB,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,EACvE,4BAA4B,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAAG,IAAI,GACzE,iBAAiB,CAqCnB;AAED,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,EACzC,qBAAqB,EAAE,2BAA2B,QAWnD"}
1
+ {"version":3,"file":"useResult.d.ts","sourceRoot":"","sources":["../../src/react/useResult.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAEL,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,wBAAgB,SAAS,CACvB,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EACD,iBAAiB,EAEjB,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,EACvE,4BAA4B,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAAG,IAAI,GACzE,iBAAiB,CAwCnB;AAED,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,EACzC,qBAAqB,EAAE,2BAA2B,QAWnD"}
@@ -5,6 +5,7 @@ exports.maybeUnwrapNetworkRequest = maybeUnwrapNetworkRequest;
5
5
  const componentCache_1 = require("../core/componentCache");
6
6
  const PromiseWrapper_1 = require("../core/PromiseWrapper");
7
7
  const read_1 = require("../core/read");
8
+ const startUpdate_1 = require("../core/startUpdate");
8
9
  const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
9
10
  const useReadAndSubscribe_1 = require("./useReadAndSubscribe");
10
11
  function useResult(fragmentReference, partialNetworkRequestOptions) {
@@ -22,6 +23,9 @@ function useResult(fragmentReference, partialNetworkRequestOptions) {
22
23
  const param = {
23
24
  data: data,
24
25
  parameters: fragmentReference.variables,
26
+ startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
27
+ ? (0, startUpdate_1.startUpdate)(environment, data)
28
+ : undefined,
25
29
  };
26
30
  return readerWithRefetchQueries.readerArtifact.resolver(param);
27
31
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.0.0-main-15990be5",
3
+ "version": "0.0.0-main-cd7d2fe9",
4
4
  "description": "Use Isograph with React",
5
5
  "homepage": "https://isograph.dev",
6
6
  "main": "dist/index.js",
@@ -19,9 +19,9 @@
19
19
  "iso-watch": "cross-env ../../target/debug/isograph_cli --config ./isograph.config.json --watch"
20
20
  },
21
21
  "dependencies": {
22
- "@isograph/disposable-types": "0.0.0-main-15990be5",
23
- "@isograph/react-disposable-state": "0.0.0-main-15990be5",
24
- "@isograph/reference-counted-pointer": "0.0.0-main-15990be5"
22
+ "@isograph/disposable-types": "0.0.0-main-cd7d2fe9",
23
+ "@isograph/react-disposable-state": "0.0.0-main-cd7d2fe9",
24
+ "@isograph/reference-counted-pointer": "0.0.0-main-cd7d2fe9"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "react": "^18.0.0 || ^19.0.0"
@@ -1,6 +1,7 @@
1
1
  import { ReaderWithRefetchQueries } from '../core/entrypoint';
2
2
  import { type Link } from './IsographEnvironment';
3
3
  import { PromiseWrapper } from './PromiseWrapper';
4
+ import type { StartUpdate } from './reader';
4
5
 
5
6
  // TODO type this better
6
7
  export type VariableValue = string | number | boolean | null | object;
@@ -19,8 +20,18 @@ export type ExtractParameters<T> = T extends {
19
20
  ? P
20
21
  : Variables;
21
22
 
23
+ export type ExtractStartUpdate<
24
+ T extends {
25
+ startUpdate?: StartUpdate<object>;
26
+ },
27
+ > = T['startUpdate'];
28
+
22
29
  export type FragmentReference<
23
- TReadFromStore extends { parameters: object; data: object },
30
+ TReadFromStore extends {
31
+ parameters: object;
32
+ data: object;
33
+ startUpdate?: StartUpdate<object>;
34
+ },
24
35
  TClientFieldValue,
25
36
  > = {
26
37
  readonly kind: 'FragmentReference';
@@ -5,7 +5,7 @@ import { RetainedQuery } from './garbageCollection';
5
5
  import { LogFunction, WrappedLogFunction } from './logging';
6
6
  import { PromiseWrapper, wrapPromise } from './PromiseWrapper';
7
7
  import { WithEncounteredRecords } from './read';
8
- import type { ReaderAst } from './reader';
8
+ import type { ReaderAst, StartUpdate } from './reader';
9
9
 
10
10
  export type ComponentOrFieldName = string;
11
11
  export type StringifiedArgs = string;
@@ -16,7 +16,11 @@ type ComponentCache = {
16
16
  };
17
17
 
18
18
  export type FragmentSubscription<
19
- TReadFromStore extends { parameters: object; data: object },
19
+ TReadFromStore extends {
20
+ parameters: object;
21
+ data: object;
22
+ startUpdate?: StartUpdate<object>;
23
+ },
20
24
  > = {
21
25
  readonly kind: 'FragmentSubscription';
22
26
  readonly callback: (
@@ -40,7 +44,7 @@ type AnyRecordSubscription = {
40
44
  };
41
45
 
42
46
  type Subscription =
43
- | FragmentSubscription<{ parameters: object; data: object }>
47
+ | FragmentSubscription<any>
44
48
  | AnyChangesToRecordSubscription
45
49
  | AnyRecordSubscription;
46
50
  type Subscriptions = Set<Subscription>;
package/src/core/cache.ts CHANGED
@@ -33,13 +33,22 @@ import { logMessage } from './logging';
33
33
  import { maybeMakeNetworkRequest } from './makeNetworkRequest';
34
34
  import { wrapResolvedValue } from './PromiseWrapper';
35
35
  import { readButDoNotEvaluate, WithEncounteredRecords } from './read';
36
- import { ReaderLinkedField, ReaderScalarField, type ReaderAst } from './reader';
36
+ import {
37
+ ReaderLinkedField,
38
+ ReaderScalarField,
39
+ type ReaderAst,
40
+ type StartUpdate,
41
+ } from './reader';
37
42
  import { Argument, ArgumentValue } from './util';
38
43
 
39
44
  export const TYPENAME_FIELD_NAME = '__typename';
40
45
 
41
46
  export function getOrCreateItemInSuspenseCache<
42
- TReadFromStore extends { parameters: object; data: object },
47
+ TReadFromStore extends {
48
+ parameters: object;
49
+ data: object;
50
+ startUpdate?: StartUpdate<object>;
51
+ },
43
52
  TClientFieldValue,
44
53
  >(
45
54
  environment: IsographEnvironment,
@@ -83,7 +92,11 @@ export function stableCopy<T>(value: T): T {
83
92
  }
84
93
 
85
94
  export function getOrCreateCacheForArtifact<
86
- TReadFromStore extends { parameters: object; data: object },
95
+ TReadFromStore extends {
96
+ parameters: object;
97
+ data: object;
98
+ startUpdate?: StartUpdate<object>;
99
+ },
87
100
  TClientFieldValue,
88
101
  >(
89
102
  environment: IsographEnvironment,
@@ -209,7 +222,11 @@ export function subscribeToAnyChangesToRecord(
209
222
 
210
223
  // TODO we should re-read and call callback if the value has changed
211
224
  export function subscribe<
212
- TReadFromStore extends { parameters: object; data: object },
225
+ TReadFromStore extends {
226
+ parameters: object;
227
+ data: object;
228
+ startUpdate?: StartUpdate<object>;
229
+ },
213
230
  >(
214
231
  environment: IsographEnvironment,
215
232
  encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>,
@@ -5,6 +5,7 @@ import { IsographEnvironment } from './IsographEnvironment';
5
5
  import { logMessage } from './logging';
6
6
  import { readPromise } from './PromiseWrapper';
7
7
  import { NetworkRequestReaderOptions } from './read';
8
+ import { startUpdate } from './startUpdate';
8
9
 
9
10
  export function getOrCreateCachedComponent(
10
11
  environment: IsographEnvironment,
@@ -51,6 +52,9 @@ export function getOrCreateCachedComponent(
51
52
  {
52
53
  data,
53
54
  parameters: fragmentReference.variables,
55
+ startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
56
+ ? startUpdate(environment, data)
57
+ : undefined,
54
58
  },
55
59
  additionalRuntimeProps,
56
60
  );
@@ -1,9 +1,13 @@
1
1
  import type { TypeName } from './IsographEnvironment';
2
- import { TopLevelReaderArtifact } from './reader';
2
+ import { TopLevelReaderArtifact, type StartUpdate } from './reader';
3
3
  import { Arguments } from './util';
4
4
 
5
5
  export type ReaderWithRefetchQueries<
6
- TReadFromStore extends { parameters: object; data: object },
6
+ TReadFromStore extends {
7
+ parameters: object;
8
+ data: object;
9
+ startUpdate?: StartUpdate<object>;
10
+ },
7
11
  TClientFieldValue,
8
12
  > = {
9
13
  readonly kind: 'ReaderWithRefetchQueries';
@@ -23,7 +27,11 @@ export type NetworkRequestInfo<TNormalizationAst> = {
23
27
  };
24
28
  // This type should be treated as an opaque type.
25
29
  export type IsographEntrypoint<
26
- TReadFromStore extends { parameters: object; data: object },
30
+ TReadFromStore extends {
31
+ parameters: object;
32
+ data: object;
33
+ startUpdate?: StartUpdate<object>;
34
+ },
27
35
  TClientFieldValue,
28
36
  TNormalizationAst = NormalizationAst,
29
37
  > = {
@@ -37,7 +45,11 @@ export type IsographEntrypoint<
37
45
  };
38
46
 
39
47
  export type IsographEntrypointLoader<
40
- TReadFromStore extends { parameters: object; data: object },
48
+ TReadFromStore extends {
49
+ parameters: object;
50
+ data: object;
51
+ startUpdate?: StartUpdate<object>;
52
+ },
41
53
  TClientFieldValue,
42
54
  > = {
43
55
  readonly kind: 'EntrypointLoader';
@@ -93,7 +105,11 @@ export type RefetchQueryNormalizationArtifactWrapper = {
93
105
  };
94
106
 
95
107
  export function assertIsEntrypoint<
96
- TReadFromStore extends { parameters: object; data: object },
108
+ TReadFromStore extends {
109
+ parameters: object;
110
+ data: object;
111
+ startUpdate?: StartUpdate<object>;
112
+ },
97
113
  TClientFieldValue,
98
114
  >(
99
115
  value:
@@ -6,7 +6,7 @@ import {
6
6
  IsographEntrypoint,
7
7
  RefetchQueryNormalizationArtifact,
8
8
  } from './entrypoint';
9
- import { ExtractParameters } from './FragmentReference';
9
+ import { ExtractParameters, type FragmentReference } from './FragmentReference';
10
10
  import {
11
11
  garbageCollectEnvironment,
12
12
  RetainedQuery,
@@ -22,11 +22,17 @@ import {
22
22
  wrapResolvedValue,
23
23
  } from './PromiseWrapper';
24
24
  import { readButDoNotEvaluate } from './read';
25
+ import type { StartUpdate } from './reader';
26
+ import { startUpdate } from './startUpdate';
25
27
 
26
28
  let networkRequestId = 0;
27
29
 
28
30
  export function maybeMakeNetworkRequest<
29
- TReadFromStore extends { parameters: object; data: object },
31
+ TReadFromStore extends {
32
+ parameters: object;
33
+ data: object;
34
+ startUpdate?: StartUpdate<object>;
35
+ },
30
36
  TClientFieldValue,
31
37
  >(
32
38
  environment: IsographEnvironment,
@@ -68,7 +74,11 @@ export function maybeMakeNetworkRequest<
68
74
  }
69
75
 
70
76
  export function makeNetworkRequest<
71
- TReadFromStore extends { parameters: object; data: object },
77
+ TReadFromStore extends {
78
+ parameters: object;
79
+ data: object;
80
+ startUpdate?: StartUpdate<object>;
81
+ },
72
82
  TClientFieldValue,
73
83
  >(
74
84
  environment: IsographEnvironment,
@@ -201,7 +211,11 @@ type NetworkRequestStatus =
201
211
  };
202
212
 
203
213
  function readDataForOnComplete<
204
- TReadFromStore extends { parameters: object; data: object },
214
+ TReadFromStore extends {
215
+ parameters: object;
216
+ data: object;
217
+ startUpdate?: StartUpdate<object>;
218
+ },
205
219
  TClientFieldValue,
206
220
  >(
207
221
  artifact:
@@ -227,18 +241,19 @@ function readDataForOnComplete<
227
241
  throwOnNetworkError: false,
228
242
  };
229
243
 
244
+ const fragment: FragmentReference<TReadFromStore, TClientFieldValue> = {
245
+ kind: 'FragmentReference',
246
+ // TODO this smells.
247
+ readerWithRefetchQueries: wrapResolvedValue(
248
+ artifact.readerWithRefetchQueries,
249
+ ),
250
+ root,
251
+ variables,
252
+ networkRequest: fakeNetworkRequest,
253
+ };
230
254
  const fragmentResult = readButDoNotEvaluate(
231
255
  environment,
232
- {
233
- kind: 'FragmentReference',
234
- // TODO this smells.
235
- readerWithRefetchQueries: wrapResolvedValue(
236
- artifact.readerWithRefetchQueries,
237
- ),
238
- root,
239
- variables,
240
- networkRequest: fakeNetworkRequest,
241
- },
256
+ fragment,
242
257
  fakeNetworkRequestOptions,
243
258
  ).item;
244
259
  const readerArtifact = artifact.readerWithRefetchQueries.readerArtifact;
@@ -269,6 +284,9 @@ function readDataForOnComplete<
269
284
  return readerArtifact.resolver({
270
285
  data: fragmentResult,
271
286
  parameters: variables,
287
+ startUpdate: readerArtifact.hasUpdatable
288
+ ? startUpdate(environment, fragmentResult)
289
+ : undefined,
272
290
  });
273
291
  }
274
292
  default: {
package/src/core/read.ts CHANGED
@@ -33,7 +33,8 @@ import {
33
33
  wrapPromise,
34
34
  wrapResolvedValue,
35
35
  } from './PromiseWrapper';
36
- import { ReaderAst } from './reader';
36
+ import { ReaderAst, type StartUpdate } from './reader';
37
+ import { startUpdate } from './startUpdate';
37
38
  import { Arguments } from './util';
38
39
 
39
40
  export type WithEncounteredRecords<T> = {
@@ -42,7 +43,11 @@ export type WithEncounteredRecords<T> = {
42
43
  };
43
44
 
44
45
  export function readButDoNotEvaluate<
45
- TReadFromStore extends { parameters: object; data: object },
46
+ TReadFromStore extends {
47
+ parameters: object;
48
+ data: object;
49
+ startUpdate?: StartUpdate<object>;
50
+ },
46
51
  >(
47
52
  environment: IsographEnvironment,
48
53
  fragmentReference: FragmentReference<TReadFromStore, unknown>,
@@ -264,6 +269,9 @@ function readData<TReadFromStore>(
264
269
  const condition = field.condition.resolver({
265
270
  data: data.data,
266
271
  parameters: {},
272
+ startUpdate: field.condition.hasUpdatable
273
+ ? startUpdate(environment, data)
274
+ : undefined,
267
275
  });
268
276
  if (condition === true) {
269
277
  link = root;
@@ -427,6 +435,7 @@ function readData<TReadFromStore>(
427
435
  const firstParameter = {
428
436
  data: data.data,
429
437
  parameters: variables,
438
+ startUpdate: () => {},
430
439
  };
431
440
  target[field.alias] =
432
441
  field.readerArtifact.resolver(firstParameter);
@@ -10,6 +10,7 @@ import {
10
10
  ExtractData,
11
11
  ExtractParameters,
12
12
  FragmentReference,
13
+ type ExtractStartUpdate,
13
14
  } from './FragmentReference';
14
15
  import {
15
16
  ComponentOrFieldName,
@@ -19,7 +20,11 @@ import {
19
20
  import { Arguments } from './util';
20
21
 
21
22
  export type TopLevelReaderArtifact<
22
- TReadFromStore extends { parameters: object; data: object },
23
+ TReadFromStore extends {
24
+ parameters: object;
25
+ data: object;
26
+ startUpdate?: StartUpdate<object>;
27
+ },
23
28
  TClientFieldValue,
24
29
  TComponentProps extends Record<PropertyKey, never>,
25
30
  > =
@@ -27,7 +32,11 @@ export type TopLevelReaderArtifact<
27
32
  | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
28
33
 
29
34
  export type EagerReaderArtifact<
30
- TReadFromStore extends { parameters: object; data: object },
35
+ TReadFromStore extends {
36
+ parameters: object;
37
+ data: object;
38
+ startUpdate?: StartUpdate<object>;
39
+ },
31
40
  TClientFieldValue,
32
41
  > = {
33
42
  readonly kind: 'EagerReaderArtifact';
@@ -35,10 +44,15 @@ export type EagerReaderArtifact<
35
44
  readonly resolver: (
36
45
  data: ResolverFirstParameter<TReadFromStore>,
37
46
  ) => TClientFieldValue;
47
+ readonly hasUpdatable: boolean;
38
48
  };
39
49
 
40
50
  export type ComponentReaderArtifact<
41
- TReadFromStore extends { parameters: object; data: object },
51
+ TReadFromStore extends {
52
+ parameters: object;
53
+ data: object;
54
+ startUpdate?: StartUpdate<object>;
55
+ },
42
56
  TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>,
43
57
  > = {
44
58
  readonly kind: 'ComponentReaderArtifact';
@@ -48,15 +62,25 @@ export type ComponentReaderArtifact<
48
62
  data: ResolverFirstParameter<TReadFromStore>,
49
63
  runtimeProps: TComponentProps,
50
64
  ) => React.ReactNode;
65
+ readonly hasUpdatable: boolean;
51
66
  };
52
67
 
53
68
  export type ResolverFirstParameter<
54
- TReadFromStore extends { data: object; parameters: object },
69
+ TReadFromStore extends {
70
+ data: object;
71
+ parameters: object;
72
+ startUpdate?: StartUpdate<object>;
73
+ },
55
74
  > = {
56
75
  data: ExtractData<TReadFromStore>;
57
76
  parameters: ExtractParameters<TReadFromStore>;
77
+ startUpdate: undefined | ExtractStartUpdate<TReadFromStore>;
58
78
  };
59
79
 
80
+ export type StartUpdate<UpdatableData> = (
81
+ updater: (updatableData: UpdatableData) => void,
82
+ ) => void;
83
+
60
84
  export type RefetchReaderArtifact = {
61
85
  readonly kind: 'RefetchReaderArtifact';
62
86
  readonly readerAst: ReaderAst<unknown>;
@@ -104,7 +128,7 @@ export type ReaderLinkedField = {
104
128
  readonly selections: ReaderAst<unknown>;
105
129
  readonly arguments: Arguments | null;
106
130
  readonly condition: EagerReaderArtifact<
107
- { data: object; parameters: object },
131
+ { data: object; parameters: any; startUpdate?: StartUpdate<object> },
108
132
  boolean | Link | null
109
133
  > | null;
110
134
  };
@@ -154,7 +178,11 @@ type StableId = string;
154
178
  /// except to stringify the args or whatnot. Calling the factory can be
155
179
  /// expensive. For example, doing so will probably trigger a network request.
156
180
  export type LoadableField<
157
- TReadFromStore extends { data: object; parameters: object },
181
+ TReadFromStore extends {
182
+ data: object;
183
+ parameters: object;
184
+ startUpdate?: StartUpdate<object>;
185
+ },
158
186
  TResult,
159
187
  TArgs = ExtractParameters<TReadFromStore>,
160
188
  > = (
@@ -0,0 +1,16 @@
1
+ import type { ExtractData, ExtractStartUpdate } from './FragmentReference';
2
+ import type { IsographEnvironment } from './IsographEnvironment';
3
+ import type { StartUpdate } from './reader';
4
+
5
+ export function startUpdate<
6
+ TReadFromStore extends {
7
+ parameters: object;
8
+ data: object;
9
+ startUpdate?: StartUpdate<object>;
10
+ },
11
+ >(
12
+ _environment: IsographEnvironment,
13
+ _data: ExtractData<TReadFromStore>,
14
+ ): ExtractStartUpdate<TReadFromStore> {
15
+ return (_updater) => {};
16
+ }
@@ -5,11 +5,15 @@ import {
5
5
  ExtractParameters,
6
6
  FragmentReference,
7
7
  } from '../core/FragmentReference';
8
- import { LoadableField } from '../core/reader';
8
+ import { LoadableField, type StartUpdate } from '../core/reader';
9
9
  import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
10
10
 
11
11
  export function useClientSideDefer<
12
- TReadFromStore extends { data: object; parameters: object },
12
+ TReadFromStore extends {
13
+ data: object;
14
+ parameters: object;
15
+ startUpdate?: StartUpdate<object>;
16
+ },
13
17
  TResult,
14
18
  >(
15
19
  loadableField: LoadableField<
@@ -22,7 +26,11 @@ export function useClientSideDefer<
22
26
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
23
27
 
24
28
  export function useClientSideDefer<
25
- TReadFromStore extends { data: object; parameters: object },
29
+ TReadFromStore extends {
30
+ data: object;
31
+ parameters: object;
32
+ startUpdate?: StartUpdate<object>;
33
+ },
26
34
  TResult,
27
35
  TProvidedArgs extends object,
28
36
  >(
@@ -36,7 +44,11 @@ export function useClientSideDefer<
36
44
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
37
45
 
38
46
  export function useClientSideDefer<
39
- TReadFromStore extends { data: object; parameters: object },
47
+ TReadFromStore extends {
48
+ data: object;
49
+ parameters: object;
50
+ startUpdate?: StartUpdate<object>;
51
+ },
40
52
  TResult,
41
53
  TProvidedArgs extends object,
42
54
  >(
@@ -16,13 +16,22 @@ import {
16
16
  readButDoNotEvaluate,
17
17
  type WithEncounteredRecords,
18
18
  } from '../core/read';
19
- import { LoadableField, type ReaderAst } from '../core/reader';
19
+ import {
20
+ LoadableField,
21
+ type ReaderAst,
22
+ type StartUpdate,
23
+ } from '../core/reader';
24
+ import { startUpdate } from '../core/startUpdate';
20
25
  import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
21
26
  import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
22
27
  import { maybeUnwrapNetworkRequest } from '../react/useResult';
23
28
 
24
29
  type UsePaginationReturnValue<
25
- TReadFromStore extends { parameters: object; data: object },
30
+ TReadFromStore extends {
31
+ parameters: object;
32
+ data: object;
33
+ startUpdate?: StartUpdate<object>;
34
+ },
26
35
  TItem,
27
36
  > =
28
37
  | {
@@ -86,6 +95,7 @@ export function useConnectionSpecPagination<
86
95
  TReadFromStore extends {
87
96
  parameters: object;
88
97
  data: object;
98
+ startUpdate?: StartUpdate<object>;
89
99
  },
90
100
  TItem,
91
101
  >(
@@ -128,6 +138,9 @@ export function useConnectionSpecPagination<
128
138
  const firstParameter = {
129
139
  data,
130
140
  parameters: fragmentReference.variables,
141
+ startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
142
+ ? startUpdate(environment, data)
143
+ : undefined,
131
144
  };
132
145
 
133
146
  if (
@@ -16,13 +16,22 @@ import {
16
16
  readButDoNotEvaluate,
17
17
  type WithEncounteredRecords,
18
18
  } from '../core/read';
19
- import { LoadableField, type ReaderAst } from '../core/reader';
19
+ import {
20
+ LoadableField,
21
+ type ReaderAst,
22
+ type StartUpdate,
23
+ } from '../core/reader';
24
+ import { startUpdate } from '../core/startUpdate';
20
25
  import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
21
26
  import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
22
27
  import { maybeUnwrapNetworkRequest } from '../react/useResult';
23
28
 
24
29
  type UseSkipLimitReturnValue<
25
- TReadFromStore extends { data: object; parameters: object },
30
+ TReadFromStore extends {
31
+ data: object;
32
+ parameters: object;
33
+ startUpdate?: StartUpdate<object>;
34
+ },
26
35
  TItem,
27
36
  > =
28
37
  | {
@@ -43,7 +52,11 @@ type UseSkipLimitReturnValue<
43
52
  };
44
53
 
45
54
  type ArrayFragmentReference<
46
- TReadFromStore extends { parameters: object; data: object },
55
+ TReadFromStore extends {
56
+ parameters: object;
57
+ data: object;
58
+ startUpdate?: StartUpdate<object>;
59
+ },
47
60
  TItem,
48
61
  > = FragmentReference<TReadFromStore, ReadonlyArray<TItem>>;
49
62
 
@@ -79,6 +92,7 @@ export function useSkipLimitPagination<
79
92
  TReadFromStore extends {
80
93
  parameters: object;
81
94
  data: object;
95
+ startUpdate?: StartUpdate<object>;
82
96
  },
83
97
  >(
84
98
  loadableField: LoadableField<
@@ -122,6 +136,9 @@ export function useSkipLimitPagination<
122
136
  const firstParameter = {
123
137
  data,
124
138
  parameters: fragmentReference.variables,
139
+ startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
140
+ ? startUpdate(environment, data)
141
+ : undefined,
125
142
  };
126
143
 
127
144
  if (