@isograph/react 0.2.0 → 0.3.1

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 (151) hide show
  1. package/.turbo/turbo-compile-typescript.log +4 -0
  2. package/dist/core/FragmentReference.d.ts +25 -6
  3. package/dist/core/FragmentReference.d.ts.map +1 -0
  4. package/dist/core/FragmentReference.js +3 -13
  5. package/dist/core/IsographEnvironment.d.ts +34 -26
  6. package/dist/core/IsographEnvironment.d.ts.map +1 -0
  7. package/dist/core/IsographEnvironment.js +19 -22
  8. package/dist/core/PromiseWrapper.d.ts +4 -4
  9. package/dist/core/PromiseWrapper.d.ts.map +1 -0
  10. package/dist/core/PromiseWrapper.js +9 -9
  11. package/dist/core/areEqualWithDeepComparison.d.ts +5 -3
  12. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -0
  13. package/dist/core/areEqualWithDeepComparison.js +89 -39
  14. package/dist/core/cache.d.ts +20 -13
  15. package/dist/core/cache.d.ts.map +1 -0
  16. package/dist/core/cache.js +205 -128
  17. package/dist/core/check.d.ts +22 -0
  18. package/dist/core/check.d.ts.map +1 -0
  19. package/dist/core/check.js +127 -0
  20. package/dist/core/componentCache.d.ts +2 -2
  21. package/dist/core/componentCache.d.ts.map +1 -0
  22. package/dist/core/componentCache.js +28 -32
  23. package/dist/core/entrypoint.d.ts +31 -15
  24. package/dist/core/entrypoint.d.ts.map +1 -0
  25. package/dist/core/entrypoint.js +1 -2
  26. package/dist/core/garbageCollection.d.ts +6 -5
  27. package/dist/core/garbageCollection.d.ts.map +1 -0
  28. package/dist/core/garbageCollection.js +49 -16
  29. package/dist/core/logging.d.ts +68 -0
  30. package/dist/core/logging.d.ts.map +1 -0
  31. package/dist/core/logging.js +22 -0
  32. package/dist/core/makeNetworkRequest.d.ts +6 -3
  33. package/dist/core/makeNetworkRequest.d.ts.map +1 -0
  34. package/dist/core/makeNetworkRequest.js +160 -19
  35. package/dist/core/read.d.ts +25 -5
  36. package/dist/core/read.d.ts.map +1 -0
  37. package/dist/core/read.js +416 -259
  38. package/dist/core/reader.d.ts +31 -15
  39. package/dist/core/reader.d.ts.map +1 -0
  40. package/dist/core/startUpdate.d.ts +5 -0
  41. package/dist/core/startUpdate.d.ts.map +1 -0
  42. package/dist/core/startUpdate.js +15 -0
  43. package/dist/core/util.d.ts +5 -0
  44. package/dist/core/util.d.ts.map +1 -0
  45. package/dist/index.d.ts +19 -14
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +11 -2
  48. package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -3
  49. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -0
  50. package/dist/loadable-hooks/useClientSideDefer.js +6 -8
  51. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +27 -0
  52. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -0
  53. package/dist/loadable-hooks/useConnectionSpecPagination.js +162 -0
  54. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +2 -2
  55. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -0
  56. package/dist/loadable-hooks/useImperativeExposedMutationField.js +1 -2
  57. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +13 -7
  58. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -0
  59. package/dist/loadable-hooks/useImperativeLoadableField.js +4 -5
  60. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +13 -26
  61. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -0
  62. package/dist/loadable-hooks/useSkipLimitPagination.js +93 -47
  63. package/dist/react/FragmentReader.d.ts +6 -4
  64. package/dist/react/FragmentReader.d.ts.map +1 -0
  65. package/dist/react/FragmentReader.js +4 -2
  66. package/dist/react/IsographEnvironmentProvider.d.ts +1 -0
  67. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -0
  68. package/dist/react/IsographEnvironmentProvider.js +3 -3
  69. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +10 -0
  70. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -0
  71. package/dist/react/RenderAfterCommit__DO_NOT_USE.js +15 -0
  72. package/dist/react/useImperativeReference.d.ts +8 -6
  73. package/dist/react/useImperativeReference.d.ts.map +1 -0
  74. package/dist/react/useImperativeReference.js +6 -8
  75. package/dist/react/useLazyReference.d.ts +5 -3
  76. package/dist/react/useLazyReference.d.ts.map +1 -0
  77. package/dist/react/useLazyReference.js +34 -6
  78. package/dist/react/useReadAndSubscribe.d.ts +6 -3
  79. package/dist/react/useReadAndSubscribe.d.ts.map +1 -0
  80. package/dist/react/useReadAndSubscribe.js +13 -10
  81. package/dist/react/useRerenderOnChange.d.ts +7 -2
  82. package/dist/react/useRerenderOnChange.d.ts.map +1 -0
  83. package/dist/react/useRerenderOnChange.js +3 -4
  84. package/dist/react/useResult.d.ts +4 -3
  85. package/dist/react/useResult.d.ts.map +1 -0
  86. package/dist/react/useResult.js +14 -9
  87. package/isograph.config.json +8 -0
  88. package/package.json +14 -9
  89. package/{src/tests/schema.graphql → schema.graphql} +1 -0
  90. package/src/core/FragmentReference.ts +44 -17
  91. package/src/core/IsographEnvironment.ts +67 -50
  92. package/src/core/PromiseWrapper.ts +3 -3
  93. package/src/core/areEqualWithDeepComparison.ts +95 -41
  94. package/src/core/cache.ts +316 -169
  95. package/src/core/check.ts +212 -0
  96. package/src/core/componentCache.ts +40 -46
  97. package/src/core/entrypoint.ts +41 -16
  98. package/src/core/garbageCollection.ts +77 -26
  99. package/src/core/logging.ts +118 -0
  100. package/src/core/makeNetworkRequest.ts +249 -20
  101. package/src/core/read.ts +658 -368
  102. package/src/core/reader.ts +61 -21
  103. package/src/core/startUpdate.ts +28 -0
  104. package/src/core/util.ts +8 -0
  105. package/src/index.ts +94 -8
  106. package/src/loadable-hooks/useClientSideDefer.ts +48 -17
  107. package/src/loadable-hooks/useConnectionSpecPagination.ts +344 -0
  108. package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
  109. package/src/loadable-hooks/useImperativeLoadableField.ts +36 -12
  110. package/src/loadable-hooks/useSkipLimitPagination.ts +253 -94
  111. package/src/react/FragmentReader.tsx +15 -6
  112. package/src/react/IsographEnvironmentProvider.tsx +1 -1
  113. package/src/react/RenderAfterCommit__DO_NOT_USE.tsx +17 -0
  114. package/src/react/useImperativeReference.ts +50 -18
  115. package/src/react/useLazyReference.ts +79 -11
  116. package/src/react/useReadAndSubscribe.ts +33 -10
  117. package/src/react/useRerenderOnChange.ts +7 -2
  118. package/src/react/useResult.ts +30 -9
  119. package/src/tests/__isograph/Query/meName/entrypoint.ts +10 -29
  120. package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
  121. package/src/tests/__isograph/Query/meName/param_type.ts +5 -2
  122. package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
  123. package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -0
  124. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +10 -65
  125. package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
  126. package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +9 -6
  127. package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
  128. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +10 -0
  129. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +10 -28
  130. package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
  131. package/src/tests/__isograph/Query/nodeField/param_type.ts +7 -3
  132. package/src/tests/__isograph/Query/nodeField/parameters_type.ts +3 -0
  133. package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
  134. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -0
  135. package/src/tests/__isograph/Query/subquery/entrypoint.ts +28 -0
  136. package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -0
  137. package/src/tests/__isograph/Query/subquery/output_type.ts +3 -0
  138. package/src/tests/__isograph/Query/subquery/param_type.ts +12 -0
  139. package/src/tests/__isograph/Query/subquery/parameters_type.ts +3 -0
  140. package/src/tests/__isograph/Query/subquery/query_text.ts +8 -0
  141. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +52 -0
  142. package/src/tests/__isograph/iso.ts +24 -12
  143. package/src/tests/garbageCollection.test.ts +53 -45
  144. package/src/tests/meNameSuccessor.ts +8 -3
  145. package/src/tests/nodeQuery.ts +7 -4
  146. package/src/tests/normalizeData.test.ts +120 -0
  147. package/src/tests/tsconfig.json +3 -3
  148. package/tsconfig.json +2 -2
  149. package/tsconfig.pkg.json +7 -3
  150. package/vitest.config.ts +20 -0
  151. package/src/tests/isograph.config.json +0 -7
@@ -0,0 +1,4 @@
1
+
2
+ > @isograph/react@0.3.1 compile-typescript /Users/runner/work/isograph/isograph/libs/isograph-react
3
+ > rm -rf dist/* && tsc -p tsconfig.pkg.json
4
+
@@ -1,15 +1,34 @@
1
- import { DataId } from './IsographEnvironment';
2
1
  import { ReaderWithRefetchQueries } from '../core/entrypoint';
2
+ import { type Link } from './IsographEnvironment';
3
3
  import { PromiseWrapper } from './PromiseWrapper';
4
- export type VariableValue = string | number | boolean | null | object;
4
+ import type { StartUpdate } from './reader';
5
+ export type VariableValue = string | number | boolean | null | {
6
+ readonly [index: string]: VariableValue;
7
+ } | VariableValue[];
5
8
  export type Variables = {
6
9
  readonly [index: string]: VariableValue;
7
10
  };
8
- export type FragmentReference<TReadFromStore extends Object, TClientFieldValue> = {
11
+ export type UnknownTReadFromStore = {
12
+ parameters: object;
13
+ data: object;
14
+ startUpdate?: StartUpdate<object>;
15
+ };
16
+ export type ExtractData<T> = T extends {
17
+ data: infer D extends object;
18
+ } ? D : never;
19
+ export type ExtractParameters<T> = T extends {
20
+ parameters: infer P extends Variables;
21
+ } ? P : Variables;
22
+ export type ExtractStartUpdate<T extends {
23
+ startUpdate?: StartUpdate<object>;
24
+ }> = T['startUpdate'];
25
+ export type FragmentReference<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
9
26
  readonly kind: 'FragmentReference';
10
27
  readonly readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
11
- readonly root: DataId;
12
- readonly variables: Variables | null;
28
+ readonly root: Link;
29
+ readonly variables: ExtractParameters<TReadFromStore>;
13
30
  readonly networkRequest: PromiseWrapper<void, any>;
14
31
  };
15
- export declare function stableIdForFragmentReference(fragmentReference: FragmentReference<any, any>): string;
32
+ export type StableIdForFragmentReference = string;
33
+ export declare function stableIdForFragmentReference(fragmentReference: FragmentReference<any, any>, fieldName: string): StableIdForFragmentReference;
34
+ //# sourceMappingURL=FragmentReference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FragmentReference.d.ts","sourceRoot":"","sources":["../../src/core/FragmentReference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ;IACE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;CACzC,GACD,aAAa,EAAE,CAAC;AAEpB,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS;IACrC,IAAI,EAAE,MAAM,CAAC,SAAS,MAAM,CAAC;CAC9B,GACG,CAAC,GACD,KAAK,CAAC;AAEV,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS;IAC3C,UAAU,EAAE,MAAM,CAAC,SAAS,SAAS,CAAC;CACvC,GACG,CAAC,GACD,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,CAC5B,CAAC,SAAS;IACR,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,IACC,CAAC,CAAC,aAAa,CAAC,CAAC;AAErB,MAAM,MAAM,iBAAiB,CAC3B,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,IACf;IACF,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,wBAAwB,EAAE,cAAc,CAC/C,wBAAwB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAC5D,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACtD,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAElD,wBAAgB,4BAA4B,CAC1C,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,EAC9C,SAAS,EAAE,MAAM,GAChB,4BAA4B,CAE9B"}
@@ -1,17 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stableIdForFragmentReference = void 0;
4
- function stableIdForFragmentReference(fragmentReference) {
5
- var _a;
6
- return `${fragmentReference.root}/TODO_FRAGMENT_NAME/${serializeVariables((_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {})}`;
7
- }
8
3
  exports.stableIdForFragmentReference = stableIdForFragmentReference;
9
- function serializeVariables(variables) {
10
- let s = '';
11
- const keys = Object.keys(variables);
12
- keys.sort();
13
- for (const key of keys) {
14
- s += `${key}:${variables[key]},`;
15
- }
16
- return s;
4
+ const cache_1 = require("./cache");
5
+ function stableIdForFragmentReference(fragmentReference, fieldName) {
6
+ return `${fragmentReference.root.__typename}/${fragmentReference.root.__link}/${fieldName}/${JSON.stringify((0, cache_1.stableCopy)(fragmentReference.variables))}`;
17
7
  }
@@ -1,71 +1,79 @@
1
- /// <reference types="react" />
2
1
  import { ParentCache } from '@isograph/react-disposable-state';
2
+ import { IsographEntrypoint } from './entrypoint';
3
+ import { FragmentReference, Variables, type StableIdForFragmentReference, type UnknownTReadFromStore } from './FragmentReference';
3
4
  import { RetainedQuery } from './garbageCollection';
4
- import { WithEncounteredRecords } from './read';
5
- import { FragmentReference, Variables } from './FragmentReference';
5
+ import { LogFunction, WrappedLogFunction } from './logging';
6
6
  import { PromiseWrapper } from './PromiseWrapper';
7
- import { IsographEntrypoint } from './entrypoint';
7
+ import { WithEncounteredRecords } from './read';
8
+ import type { ReaderAst, StartUpdate } from './reader';
8
9
  export type ComponentOrFieldName = string;
9
10
  export type StringifiedArgs = string;
10
- type ComponentCache = {
11
- [key: DataId]: {
12
- [key: ComponentOrFieldName]: {
13
- [key: StringifiedArgs]: React.FC<any>;
14
- };
15
- };
11
+ export type FieldCache<T> = {
12
+ [key: StableIdForFragmentReference]: T;
16
13
  };
17
- export type FragmentSubscription<TReadFromStore extends Object> = {
14
+ export type FragmentSubscription<TReadFromStore extends UnknownTReadFromStore> = {
18
15
  readonly kind: 'FragmentSubscription';
19
16
  readonly callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void;
20
17
  /** The value read out from the previous call to readButDoNotEvaluate */
21
18
  readonly encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>;
22
19
  readonly fragmentReference: FragmentReference<TReadFromStore, any>;
20
+ readonly readerAst: ReaderAst<TReadFromStore>;
23
21
  };
24
- type AnyRecordSubscription = {
22
+ export type AnyChangesToRecordSubscription = {
23
+ readonly kind: 'AnyChangesToRecord';
24
+ readonly callback: () => void;
25
+ readonly recordLink: Link;
26
+ };
27
+ export type AnyRecordSubscription = {
25
28
  readonly kind: 'AnyRecords';
26
29
  readonly callback: () => void;
27
30
  };
28
- type Subscription = FragmentSubscription<Object> | AnyRecordSubscription;
29
- type Subscriptions = Set<Subscription>;
30
- type CacheMap<T> = {
31
+ export type Subscription = FragmentSubscription<any> | AnyChangesToRecordSubscription | AnyRecordSubscription;
32
+ export type Subscriptions = Set<Subscription>;
33
+ export type CacheMap<T> = {
31
34
  [index: string]: ParentCache<T>;
32
35
  };
33
36
  export type IsographEnvironment = {
34
37
  readonly store: IsographStore;
35
38
  readonly networkFunction: IsographNetworkFunction;
36
39
  readonly missingFieldHandler: MissingFieldHandler | null;
37
- readonly componentCache: ComponentCache;
40
+ readonly componentCache: FieldCache<React.FC<any>>;
41
+ readonly eagerReaderCache: FieldCache<StartUpdate<any> | undefined>;
38
42
  readonly subscriptions: Subscriptions;
39
43
  readonly fragmentCache: CacheMap<FragmentReference<any, any>>;
40
- readonly entrypointArtifactCache: Map<string, PromiseWrapper<IsographEntrypoint<any, any>>>;
44
+ readonly entrypointArtifactCache: Map<string, PromiseWrapper<IsographEntrypoint<any, any, any>>>;
41
45
  readonly retainedQueries: Set<RetainedQuery>;
42
46
  readonly gcBuffer: Array<RetainedQuery>;
43
47
  readonly gcBufferSize: number;
48
+ readonly loggers: Set<WrappedLogFunction>;
44
49
  };
45
- export type MissingFieldHandler = (storeRecord: StoreRecord, root: DataId, fieldName: string, arguments_: {
50
+ export type MissingFieldHandler = (storeRecord: StoreRecord, root: Link, fieldName: string, arguments_: {
46
51
  [index: string]: any;
47
52
  } | null, variables: Variables | null) => Link | undefined;
48
53
  export type IsographNetworkFunction = (queryText: string, variables: Variables) => Promise<any>;
49
54
  export type Link = {
50
55
  readonly __link: DataId;
56
+ readonly __typename: TypeName;
51
57
  };
52
58
  export type DataTypeValue = undefined | number | boolean | string | null | Link | DataTypeValue[];
53
59
  export type StoreRecord = {
54
60
  [index: DataId | string]: DataTypeValue;
55
61
  readonly id?: DataId;
56
62
  };
63
+ export type TypeName = string;
57
64
  export type DataId = string;
58
65
  export declare const ROOT_ID: DataId & '__ROOT';
59
66
  export type IsographStore = {
60
- [index: DataId]: StoreRecord | null;
61
- readonly __ROOT: StoreRecord;
67
+ [index: TypeName]: {
68
+ [index: DataId]: StoreRecord | null;
69
+ } | null;
70
+ readonly Query: {
71
+ readonly __ROOT: StoreRecord;
72
+ };
62
73
  };
63
- export declare function createIsographEnvironment(store: IsographStore, networkFunction: IsographNetworkFunction, missingFieldHandler?: MissingFieldHandler): IsographEnvironment;
74
+ export declare function createIsographEnvironment(store: IsographStore, networkFunction: IsographNetworkFunction, missingFieldHandler?: MissingFieldHandler | null, logFunction?: LogFunction | null): IsographEnvironment;
64
75
  export declare function createIsographStore(): IsographStore;
65
- export declare function defaultMissingFieldHandler(_storeRecord: StoreRecord, _root: DataId, fieldName: string, arguments_: {
66
- [index: string]: any;
67
- } | null, variables: Variables | null): Link | undefined;
68
76
  export declare function assertLink(link: DataTypeValue): Link | null | undefined;
69
77
  export declare function getLink(maybeLink: DataTypeValue): Link | null;
70
- export declare function getOrLoadIsographArtifact(environment: IsographEnvironment, key: string, loader: () => Promise<IsographEntrypoint<any, any>>): PromiseWrapper<IsographEntrypoint<any, any>>;
71
- export {};
78
+ export declare function getOrLoadIsographArtifact(environment: IsographEnvironment, key: string, loader: () => Promise<IsographEntrypoint<any, any, any>>): PromiseWrapper<IsographEntrypoint<any, any, any>>;
79
+ //# sourceMappingURL=IsographEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IsographEnvironment.d.ts","sourceRoot":"","sources":["../../src/core/IsographEnvironment.ts"],"names":[],"mappings":"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"}
@@ -1,42 +1,40 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getOrLoadIsographArtifact = exports.getLink = exports.assertLink = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = void 0;
3
+ exports.ROOT_ID = void 0;
4
+ exports.createIsographEnvironment = createIsographEnvironment;
5
+ exports.createIsographStore = createIsographStore;
6
+ exports.assertLink = assertLink;
7
+ exports.getLink = getLink;
8
+ exports.getOrLoadIsographArtifact = getOrLoadIsographArtifact;
4
9
  const PromiseWrapper_1 = require("./PromiseWrapper");
5
10
  exports.ROOT_ID = '__ROOT';
6
11
  const DEFAULT_GC_BUFFER_SIZE = 10;
7
- function createIsographEnvironment(store, networkFunction, missingFieldHandler) {
12
+ function createIsographEnvironment(store, networkFunction, missingFieldHandler, logFunction) {
13
+ logFunction === null || logFunction === void 0 ? void 0 : logFunction({
14
+ kind: 'EnvironmentCreated',
15
+ });
8
16
  return {
9
17
  store,
10
18
  networkFunction,
11
19
  missingFieldHandler: missingFieldHandler !== null && missingFieldHandler !== void 0 ? missingFieldHandler : null,
12
20
  componentCache: {},
21
+ eagerReaderCache: {},
13
22
  subscriptions: new Set(),
14
23
  fragmentCache: {},
15
24
  entrypointArtifactCache: new Map(),
16
25
  retainedQueries: new Set(),
17
26
  gcBuffer: [],
18
27
  gcBufferSize: DEFAULT_GC_BUFFER_SIZE,
28
+ loggers: logFunction != null ? new Set([{ log: logFunction }]) : new Set(),
19
29
  };
20
30
  }
21
- exports.createIsographEnvironment = createIsographEnvironment;
22
31
  function createIsographStore() {
23
32
  return {
24
- [exports.ROOT_ID]: {},
33
+ Query: {
34
+ [exports.ROOT_ID]: {},
35
+ },
25
36
  };
26
37
  }
27
- exports.createIsographStore = createIsographStore;
28
- function defaultMissingFieldHandler(_storeRecord, _root, fieldName, arguments_, variables) {
29
- if (fieldName === 'node' || fieldName === 'user') {
30
- const variable = arguments_ === null || arguments_ === void 0 ? void 0 : arguments_['id'];
31
- const value = variables === null || variables === void 0 ? void 0 : variables[variable];
32
- // TODO can we handle explicit nulls here too? Probably, after wrapping in objects
33
- if (value != null) {
34
- // @ts-expect-error
35
- return { __link: value };
36
- }
37
- }
38
- }
39
- exports.defaultMissingFieldHandler = defaultMissingFieldHandler;
40
38
  function assertLink(link) {
41
39
  if (Array.isArray(link)) {
42
40
  throw new Error('Unexpected array');
@@ -49,17 +47,17 @@ function assertLink(link) {
49
47
  }
50
48
  throw new Error('Invalid link');
51
49
  }
52
- exports.assertLink = assertLink;
53
50
  function getLink(maybeLink) {
54
51
  if (maybeLink != null &&
55
52
  typeof maybeLink === 'object' &&
56
- // @ts-expect-error this is safe
57
- maybeLink.__link != null) {
53
+ '__link' in maybeLink &&
54
+ maybeLink.__link != null &&
55
+ '__typename' in maybeLink &&
56
+ maybeLink.__typename != null) {
58
57
  return maybeLink;
59
58
  }
60
59
  return null;
61
60
  }
62
- exports.getLink = getLink;
63
61
  function getOrLoadIsographArtifact(environment, key, loader) {
64
62
  const value = environment.entrypointArtifactCache.get(key);
65
63
  if (value != null) {
@@ -69,4 +67,3 @@ function getOrLoadIsographArtifact(environment, key, loader) {
69
67
  environment.entrypointArtifactCache.set(key, wrapped);
70
68
  return wrapped;
71
69
  }
72
- exports.getOrLoadIsographArtifact = getOrLoadIsographArtifact;
@@ -1,7 +1,7 @@
1
1
  export type AnyError = any;
2
- declare const NOT_SET: Symbol;
3
- type NotSet = typeof NOT_SET;
4
- type Result<T, E> = {
2
+ export declare const NOT_SET: Symbol;
3
+ export type NotSet = typeof NOT_SET;
4
+ export type Result<T, E> = {
5
5
  kind: 'Ok';
6
6
  value: T;
7
7
  } | {
@@ -24,4 +24,4 @@ export type PromiseState<T, E> = {
24
24
  promise: Promise<T>;
25
25
  } | Result<T, E>;
26
26
  export declare function getPromiseState<T, E>(p: PromiseWrapper<T, E>): PromiseState<T, E>;
27
- export {};
27
+ //# sourceMappingURL=PromiseWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromiseWrapper.d.ts","sourceRoot":"","sources":["../../src/core/PromiseWrapper.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC;AAE3B,eAAO,MAAM,OAAO,EAAE,MAA0B,CAAC;AACjD,MAAM,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC;AAEpC,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IACnB;IACE,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,CAAC,CAAC;CACV,GACD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEN;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;CAChD,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAa1E;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CASvE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAa5D;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,IACzB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACrB,GACD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjB,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAClC,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GACtB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAWpB"}
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPromiseState = exports.readPromise = exports.wrapResolvedValue = exports.wrapPromise = void 0;
4
- const NOT_SET = Symbol('NOT_SET');
3
+ exports.NOT_SET = void 0;
4
+ exports.wrapPromise = wrapPromise;
5
+ exports.wrapResolvedValue = wrapResolvedValue;
6
+ exports.readPromise = readPromise;
7
+ exports.getPromiseState = getPromiseState;
8
+ exports.NOT_SET = Symbol('NOT_SET');
5
9
  function wrapPromise(promise) {
6
10
  // TODO confirm suspense works if the promise is already resolved.
7
- const wrapper = { promise, result: NOT_SET };
11
+ const wrapper = { promise, result: exports.NOT_SET };
8
12
  promise
9
13
  .then((v) => {
10
14
  // v is assignable to Exclude<T, Symbol> | Symbol
@@ -16,7 +20,6 @@ function wrapPromise(promise) {
16
20
  });
17
21
  return wrapper;
18
22
  }
19
- exports.wrapPromise = wrapPromise;
20
23
  function wrapResolvedValue(value) {
21
24
  return {
22
25
  promise: Promise.resolve(value),
@@ -27,10 +30,9 @@ function wrapResolvedValue(value) {
27
30
  },
28
31
  };
29
32
  }
30
- exports.wrapResolvedValue = wrapResolvedValue;
31
33
  function readPromise(p) {
32
34
  const { result } = p;
33
- if (result !== NOT_SET) {
35
+ if (result !== exports.NOT_SET) {
34
36
  // Safety: p.result is either NOT_SET or an actual value.
35
37
  const resultKind = result;
36
38
  if (resultKind.kind === 'Ok') {
@@ -42,10 +44,9 @@ function readPromise(p) {
42
44
  }
43
45
  throw p.promise;
44
46
  }
45
- exports.readPromise = readPromise;
46
47
  function getPromiseState(p) {
47
48
  const { result } = p;
48
- if (result !== NOT_SET) {
49
+ if (result !== exports.NOT_SET) {
49
50
  // Safety: p.result is either NOT_SET or an actual value.
50
51
  const resultKind = result;
51
52
  return resultKind;
@@ -55,4 +56,3 @@ function getPromiseState(p) {
55
56
  promise: p.promise,
56
57
  };
57
58
  }
58
- exports.getPromiseState = getPromiseState;
@@ -1,3 +1,5 @@
1
- export declare function areEqualWithDeepComparison(oldItem: unknown, newItem: unknown): boolean;
2
- export declare function areEqualArraysWithDeepComparison(oldItems: ReadonlyArray<unknown>, newItems: ReadonlyArray<unknown>): boolean;
3
- export declare function areEqualObjectsWithDeepComparison(oldItemObject: object, newItemObject: object): boolean;
1
+ import type { ReaderAst, ReaderLinkedField, ReaderScalarField } from './reader';
2
+ export declare function mergeUsingReaderAst(field: ReaderScalarField | ReaderLinkedField, oldItem: unknown, newItem: unknown): unknown;
3
+ export declare function mergeArraysUsingReaderAst(field: ReaderScalarField | ReaderLinkedField, oldItems: ReadonlyArray<unknown>, newItems: Array<unknown>): ReadonlyArray<unknown>;
4
+ export declare function mergeObjectsUsingReaderAst(ast: ReaderAst<object>, oldItemObject: object, newItemObject: object): object;
5
+ //# sourceMappingURL=areEqualWithDeepComparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"areEqualWithDeepComparison.d.ts","sourceRoot":"","sources":["../../src/core/areEqualWithDeepComparison.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEhF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,EAC5C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAiCT;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,EAC5C,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GACvB,aAAa,CAAC,OAAO,CAAC,CAgBxB;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,EACtB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACpB,MAAM,CA+DR"}
@@ -1,61 +1,111 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.areEqualObjectsWithDeepComparison = exports.areEqualArraysWithDeepComparison = exports.areEqualWithDeepComparison = void 0;
4
- function areEqualWithDeepComparison(oldItem, newItem) {
3
+ exports.mergeUsingReaderAst = mergeUsingReaderAst;
4
+ exports.mergeArraysUsingReaderAst = mergeArraysUsingReaderAst;
5
+ exports.mergeObjectsUsingReaderAst = mergeObjectsUsingReaderAst;
6
+ function mergeUsingReaderAst(field, oldItem, newItem) {
5
7
  if (newItem === null) {
6
- return oldItem === null;
8
+ return oldItem === null ? oldItem : newItem;
7
9
  }
8
10
  if (newItem === undefined) {
9
- return oldItem === undefined;
11
+ return oldItem === undefined ? oldItem : newItem;
10
12
  }
11
13
  if (Array.isArray(newItem)) {
12
14
  if (!Array.isArray(oldItem)) {
13
- return false;
15
+ return newItem;
14
16
  }
15
- return areEqualArraysWithDeepComparison(oldItem, newItem);
17
+ return mergeArraysUsingReaderAst(field, oldItem, newItem);
16
18
  }
17
- if (typeof newItem === 'object') {
18
- if (typeof oldItem !== 'object') {
19
- return false;
19
+ switch (field.kind) {
20
+ case 'Scalar':
21
+ return oldItem === newItem ? oldItem : newItem;
22
+ case 'Linked':
23
+ if (oldItem == null) {
24
+ return newItem;
25
+ }
26
+ return mergeObjectsUsingReaderAst(field.selections, oldItem, newItem);
27
+ default: {
28
+ // Ensure we have covered all variants
29
+ let _ = field;
30
+ _;
31
+ throw new Error('Unexpected case.');
20
32
  }
21
- if (oldItem === null) {
22
- return false;
23
- }
24
- return areEqualObjectsWithDeepComparison(oldItem, newItem);
25
33
  }
26
- return newItem === oldItem;
27
34
  }
28
- exports.areEqualWithDeepComparison = areEqualWithDeepComparison;
29
- function areEqualArraysWithDeepComparison(oldItems, newItems) {
35
+ function mergeArraysUsingReaderAst(field, oldItems, newItems) {
30
36
  if (newItems.length !== oldItems.length) {
31
- return false;
37
+ return newItems;
32
38
  }
39
+ let canRecycle = true;
33
40
  for (let i = 0; i < newItems.length; i++) {
34
- if (!areEqualWithDeepComparison(oldItems[i], newItems[i])) {
35
- return false;
41
+ const mergedItem = mergeUsingReaderAst(field, oldItems[i], newItems[i]);
42
+ if (mergedItem !== oldItems[i]) {
43
+ canRecycle = false;
44
+ }
45
+ else {
46
+ newItems[i] = mergedItem;
36
47
  }
37
48
  }
38
- return true;
49
+ return canRecycle ? oldItems : newItems;
39
50
  }
40
- exports.areEqualArraysWithDeepComparison = areEqualArraysWithDeepComparison;
41
- function areEqualObjectsWithDeepComparison(oldItemObject, newItemObject) {
42
- const oldKeys = Object.keys(oldItemObject);
43
- const newKeys = Object.keys(newItemObject);
44
- if (oldKeys.length !== newKeys.length) {
45
- return false;
46
- }
47
- for (const oldKey of oldKeys) {
48
- if (!(oldKey in newItemObject)) {
49
- return false;
50
- }
51
- // @ts-expect-error
52
- const oldValue = oldItemObject[oldKey];
53
- // @ts-expect-error
54
- const newValue = newItemObject[oldKey];
55
- if (!areEqualWithDeepComparison(oldValue, newValue)) {
56
- return false;
51
+ function mergeObjectsUsingReaderAst(ast, oldItemObject, newItemObject) {
52
+ var _a;
53
+ let canRecycle = true;
54
+ for (const field of ast) {
55
+ switch (field.kind) {
56
+ case 'Scalar':
57
+ case 'Linked':
58
+ const key = (_a = field.alias) !== null && _a !== void 0 ? _a : field.fieldName;
59
+ // @ts-expect-error
60
+ const oldValue = oldItemObject[key];
61
+ // @ts-expect-error
62
+ const newValue = newItemObject[key];
63
+ const mergedValue = mergeUsingReaderAst(field, oldValue, newValue);
64
+ if (mergedValue !== oldValue) {
65
+ canRecycle = false;
66
+ }
67
+ else {
68
+ // @ts-expect-error
69
+ newItemObject[key] = mergedValue;
70
+ }
71
+ break;
72
+ case 'Resolver': {
73
+ const key = field.alias;
74
+ // @ts-expect-error
75
+ const oldValue = oldItemObject[key];
76
+ // @ts-expect-error
77
+ const newValue = newItemObject[key];
78
+ if (oldValue !== newValue) {
79
+ canRecycle = false;
80
+ }
81
+ break;
82
+ }
83
+ case 'Link': {
84
+ const key = field.alias;
85
+ // @ts-expect-error
86
+ const oldValue = oldItemObject[key];
87
+ // @ts-expect-error
88
+ const newValue = newItemObject[key];
89
+ if (oldValue.__link !== newValue.__link ||
90
+ oldValue.__typename !== newValue.__typename) {
91
+ canRecycle = false;
92
+ }
93
+ else {
94
+ // @ts-expect-error
95
+ newItemObject[key] = oldValue;
96
+ }
97
+ break;
98
+ }
99
+ case 'ImperativelyLoadedField':
100
+ case 'LoadablySelectedField':
101
+ break;
102
+ default: {
103
+ // Ensure we have covered all variants
104
+ let _ = field;
105
+ _;
106
+ throw new Error('Unexpected case.');
107
+ }
57
108
  }
58
109
  }
59
- return true;
110
+ return canRecycle ? oldItemObject : newItemObject;
60
111
  }
61
- exports.areEqualObjectsWithDeepComparison = areEqualObjectsWithDeepComparison;
@@ -1,28 +1,35 @@
1
1
  import { Factory, ParentCache } from '@isograph/react-disposable-state';
2
- import { DataId, type IsographEnvironment } from './IsographEnvironment';
3
- import { IsographEntrypoint, NormalizationAst, NormalizationLinkedField, NormalizationScalarField, RefetchQueryNormalizationArtifactWrapper } from '../core/entrypoint';
4
- import { ReaderLinkedField, ReaderScalarField } from './reader';
2
+ import { IsographEntrypoint, NormalizationLinkedField, NormalizationScalarField, RefetchQueryNormalizationArtifactWrapper, type NormalizationAst, type NormalizationAstLoader, type NormalizationAstNodes } from '../core/entrypoint';
3
+ import { FetchOptions } from './check';
4
+ import { ExtractParameters, FragmentReference, Variables, type UnknownTReadFromStore } from './FragmentReference';
5
+ import { DataId, Link, type IsographEnvironment, type TypeName } from './IsographEnvironment';
5
6
  import { WithEncounteredRecords } from './read';
6
- import { FragmentReference, Variables } from './FragmentReference';
7
- export declare function getOrCreateItemInSuspenseCache<TReadFromStore extends Object, TClientFieldValue>(environment: IsographEnvironment, index: string, factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
7
+ import { ReaderLinkedField, ReaderScalarField, type ReaderAst } from './reader';
8
+ export declare const TYPENAME_FIELD_NAME = "__typename";
9
+ export declare function getOrCreateItemInSuspenseCache<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue>(environment: IsographEnvironment, index: string, factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
8
10
  /**
9
11
  * Creates a copy of the provided value, ensuring any nested objects have their
10
12
  * keys sorted such that equivalent values would have identical JSON.stringify
11
13
  * results.
12
14
  */
13
15
  export declare function stableCopy<T>(value: T): T;
14
- export declare function getOrCreateCacheForArtifact<TReadFromStore extends Object, TClientFieldValue>(environment: IsographEnvironment, entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>, variables: Variables): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
15
- type NetworkResponseScalarValue = string | number | boolean;
16
- type NetworkResponseValue = NetworkResponseScalarValue | null | NetworkResponseObject | NetworkResponseObject[] | NetworkResponseScalarValue[];
17
- type NetworkResponseObject = {
16
+ export declare function getOrCreateCacheForArtifact<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader>(environment: IsographEnvironment, entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>, variables: ExtractParameters<TReadFromStore>, fetchOptions?: FetchOptions<TClientFieldValue>): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>>;
17
+ export type NetworkResponseScalarValue = string | number | boolean;
18
+ export type NetworkResponseValue = NetworkResponseScalarValue | null | NetworkResponseObject | (NetworkResponseObject | null)[] | (NetworkResponseScalarValue | null)[];
19
+ export type NetworkResponseObject = {
18
20
  [index: string]: undefined | NetworkResponseValue;
19
21
  id?: DataId;
22
+ __typename?: TypeName;
20
23
  };
21
- export declare function normalizeData(environment: IsographEnvironment, normalizationAst: NormalizationAst, networkResponse: NetworkResponseObject, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[]): Set<DataId>;
24
+ export declare function normalizeData(environment: IsographEnvironment, normalizationAst: NormalizationAstNodes, networkResponse: NetworkResponseObject, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], root: Link): EncounteredIds;
22
25
  export declare function subscribeToAnyChange(environment: IsographEnvironment, callback: () => void): () => void;
23
- export declare function subscribe<TReadFromStore extends Object>(environment: IsographEnvironment, encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>, fragmentReference: FragmentReference<TReadFromStore, any>, callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void): () => void;
24
- export declare function onNextChange(environment: IsographEnvironment): Promise<void>;
26
+ export declare function subscribeToAnyChangesToRecord(environment: IsographEnvironment, recordLink: Link, callback: () => void): () => void;
27
+ export declare function subscribe<TReadFromStore extends UnknownTReadFromStore>(environment: IsographEnvironment, encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>, fragmentReference: FragmentReference<TReadFromStore, any>, callback: (newEncounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>) => void, readerAst: ReaderAst<TReadFromStore>): () => void;
28
+ export declare function onNextChangeToRecord(environment: IsographEnvironment, recordLink: Link): Promise<void>;
29
+ export type EncounteredIds = Map<TypeName, Set<DataId>>;
30
+ export declare function insertIfNotExists<K, V>(map: Map<K, Set<V>>, key: K): Set<V>;
25
31
  export declare function getParentRecordKey(astNode: NormalizationLinkedField | NormalizationScalarField | ReaderLinkedField | ReaderScalarField, variables: Variables): string;
26
32
  export declare const FIRST_SPLIT_KEY = "____";
27
33
  export declare const SECOND_SPLIT_KEY = "___";
28
- export {};
34
+ export declare const THIRD_SPLIT_KEY = "__";
35
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"}