@isograph/react 0.0.0-main-90264a00 → 0.0.0-main-0e7d8883

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.
@@ -0,0 +1,13 @@
1
+ import { DataId } from './IsographEnvironment';
2
+ import { RefetchQueryArtifactWrapper } from './entrypoint';
3
+ import { ReaderArtifact } from './reader';
4
+ export type Variable = any;
5
+ export type FragmentReference<TReadFromStore extends Object, TResolverResult> = {
6
+ kind: 'FragmentReference';
7
+ readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
8
+ root: DataId;
9
+ variables: {
10
+ [index: string]: Variable;
11
+ } | null;
12
+ nestedRefetchQueries: RefetchQueryArtifactWrapper[];
13
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { DataId, DataTypeValue, IsographEnvironment, Link } from './IsographEnvironment';
2
- import { ReaderArtifact } from './reader';
3
- import { IsographEntrypoint, RefetchQueryArtifactWrapper } from './entrypoint';
1
+ import { DataTypeValue, Link } from './IsographEnvironment';
2
+ import { IsographEntrypoint } from './entrypoint';
3
+ import { FragmentReference, Variable } from './FragmentReference';
4
4
  export { retainQuery, unretainQuery, type RetainedQuery, garbageCollectEnvironment, } from './garbageCollection';
5
5
  export { type PromiseWrapper } from './PromiseWrapper';
6
6
  export { makeNetworkRequest, subscribe } from './cache';
@@ -10,6 +10,9 @@ export { useImperativeReference } from './useImperativeReference';
10
10
  export { EntrypointReader } from './EntrypointReader';
11
11
  export { type ReaderArtifact, ReaderAst, ReaderAstNode, ReaderLinkedField, ReaderMutationField, ReaderRefetchField, ReaderResolverField, ReaderResolverVariant, ReaderScalarField, } from './reader';
12
12
  export { NormalizationAst, NormalizationAstNode, NormalizationLinkedField, NormalizationScalarField, IsographEntrypoint, assertIsEntrypoint, RefetchQueryArtifact, RefetchQueryArtifactWrapper, } from './entrypoint';
13
+ export { read, readButDoNotEvaluate } from './read';
14
+ export { useResult } from './useResult';
15
+ export { type FragmentReference } from './FragmentReference';
13
16
  export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends (arg1: any, arg2: infer P) => any ? P : never;
14
17
  export type Arguments = Argument[];
15
18
  export type Argument = [ArgumentName, ArgumentValue];
@@ -21,16 +24,6 @@ export type ArgumentValue = {
21
24
  kind: 'Literal';
22
25
  value: any;
23
26
  };
24
- type Variable = any;
25
- export type FragmentReference<TReadFromStore extends Object, TResolverResult> = {
26
- kind: 'FragmentReference';
27
- readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
28
- root: DataId;
29
- variables: {
30
- [index: string]: Variable;
31
- } | null;
32
- nestedRefetchQueries: RefetchQueryArtifactWrapper[];
33
- };
34
27
  export type ExtractReadFromStore<Type> = Type extends IsographEntrypoint<infer X, any> ? X : never;
35
28
  export type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, infer X> ? X : never;
36
29
  export declare function useLazyReference<TEntrypoint>(entrypoint: TEntrypoint | ((_: any) => any), variables: {
@@ -38,10 +31,4 @@ export declare function useLazyReference<TEntrypoint>(entrypoint: TEntrypoint |
38
31
  }): {
39
32
  queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
40
33
  };
41
- export declare function useResult<TReadFromStore extends Object, TResolverResult>(fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
42
- export declare function read<TReadFromStore extends Object, TResolverResult>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
43
- export declare function readButDoNotEvaluate<TReadFromStore extends Object>(environment: IsographEnvironment, reference: FragmentReference<TReadFromStore, unknown>): TReadFromStore;
44
34
  export declare function assertLink(link: DataTypeValue): Link | null;
45
- export type IsographComponentProps<TDataType, TOtherProps = Object> = {
46
- data: TDataType;
47
- } & TOtherProps;
package/dist/index.js CHANGED
@@ -1,11 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assertLink = exports.readButDoNotEvaluate = exports.read = exports.useResult = exports.useLazyReference = exports.assertIsEntrypoint = exports.EntrypointReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.subscribe = exports.makeNetworkRequest = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
3
+ exports.assertLink = exports.useLazyReference = exports.useResult = exports.readButDoNotEvaluate = exports.read = exports.assertIsEntrypoint = exports.EntrypointReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.subscribe = exports.makeNetworkRequest = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
4
4
  const cache_1 = require("./cache");
5
5
  const react_disposable_state_1 = require("@isograph/react-disposable-state");
6
- const componentCache_1 = require("./componentCache");
7
6
  const IsographEnvironment_1 = require("./IsographEnvironment");
8
- const react_1 = require("react");
9
7
  const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
10
8
  const entrypoint_1 = require("./entrypoint");
11
9
  var garbageCollection_1 = require("./garbageCollection");
@@ -29,6 +27,11 @@ var EntrypointReader_1 = require("./EntrypointReader");
29
27
  Object.defineProperty(exports, "EntrypointReader", { enumerable: true, get: function () { return EntrypointReader_1.EntrypointReader; } });
30
28
  var entrypoint_2 = require("./entrypoint");
31
29
  Object.defineProperty(exports, "assertIsEntrypoint", { enumerable: true, get: function () { return entrypoint_2.assertIsEntrypoint; } });
30
+ var read_1 = require("./read");
31
+ Object.defineProperty(exports, "read", { enumerable: true, get: function () { return read_1.read; } });
32
+ Object.defineProperty(exports, "readButDoNotEvaluate", { enumerable: true, get: function () { return read_1.readButDoNotEvaluate; } });
33
+ var useResult_1 = require("./useResult");
34
+ Object.defineProperty(exports, "useResult", { enumerable: true, get: function () { return useResult_1.useResult; } });
32
35
  // Note: we cannot write TEntrypoint extends IsographEntrypoint<any, any, any>, or else
33
36
  // if we do not explicitly pass a type, the read out type will be any.
34
37
  // We cannot write TEntrypoint extends IsographEntrypoint<never, never, never>, or else
@@ -51,237 +54,6 @@ function useLazyReference(entrypoint, variables) {
51
54
  };
52
55
  }
53
56
  exports.useLazyReference = useLazyReference;
54
- function useResult(fragmentReference) {
55
- const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
56
- const [, setState] = (0, react_1.useState)();
57
- (0, react_1.useEffect)(() => {
58
- return (0, cache_1.subscribe)(environment, () => {
59
- return setState({});
60
- });
61
- }, []);
62
- return read(environment, fragmentReference);
63
- }
64
- exports.useResult = useResult;
65
- function read(environment, fragmentReference) {
66
- var _a, _b;
67
- const variant = fragmentReference.readerArtifact.variant;
68
- if (variant.kind === 'Eager') {
69
- const data = readData(environment, fragmentReference.readerArtifact.readerAst, fragmentReference.root, (_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {}, fragmentReference.nestedRefetchQueries);
70
- if (data.kind === 'MissingData') {
71
- throw (0, cache_1.onNextChange)(environment);
72
- }
73
- else {
74
- // @ts-expect-error This not properly typed yet
75
- return fragmentReference.readerArtifact.resolver(data.data);
76
- }
77
- }
78
- else if (variant.kind === 'Component') {
79
- // @ts-ignore
80
- return (0, componentCache_1.getOrCreateCachedComponent)(environment, fragmentReference.root, variant.componentName, fragmentReference.readerArtifact, (_b = fragmentReference.variables) !== null && _b !== void 0 ? _b : {}, fragmentReference.nestedRefetchQueries);
81
- }
82
- // Why can't Typescript realize that this is unreachable??
83
- throw new Error('This is unreachable');
84
- }
85
- exports.read = read;
86
- function readButDoNotEvaluate(environment, reference) {
87
- var _a;
88
- const response = readData(environment, reference.readerArtifact.readerAst, reference.root, (_a = reference.variables) !== null && _a !== void 0 ? _a : {}, reference.nestedRefetchQueries);
89
- if (typeof window !== 'undefined' && window.__LOG) {
90
- console.log('done reading', { response });
91
- }
92
- if (response.kind === 'MissingData') {
93
- throw (0, cache_1.onNextChange)(environment);
94
- }
95
- else {
96
- return response.data;
97
- }
98
- }
99
- exports.readButDoNotEvaluate = readButDoNotEvaluate;
100
- function readData(environment, ast, root, variables, nestedRefetchQueries) {
101
- var _a, _b, _c, _d, _e;
102
- let storeRecord = environment.store[root];
103
- if (storeRecord === undefined) {
104
- return { kind: 'MissingData', reason: 'No record for root ' + root };
105
- }
106
- if (storeRecord === null) {
107
- return { kind: 'Success', data: null };
108
- }
109
- let target = {};
110
- for (const field of ast) {
111
- switch (field.kind) {
112
- case 'Scalar': {
113
- const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
114
- const value = storeRecord[storeRecordName];
115
- // TODO consider making scalars into discriminated unions. This probably has
116
- // to happen for when we handle errors.
117
- if (value === undefined) {
118
- return {
119
- kind: 'MissingData',
120
- reason: 'No value for ' + storeRecordName + ' on root ' + root,
121
- };
122
- }
123
- target[(_a = field.alias) !== null && _a !== void 0 ? _a : field.fieldName] = value;
124
- break;
125
- }
126
- case 'Linked': {
127
- const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
128
- const value = storeRecord[storeRecordName];
129
- if (Array.isArray(value)) {
130
- const results = [];
131
- for (const item of value) {
132
- const link = assertLink(item);
133
- if (link === undefined) {
134
- return {
135
- kind: 'MissingData',
136
- reason: 'No link for ' +
137
- storeRecordName +
138
- ' on root ' +
139
- root +
140
- '. Link is ' +
141
- JSON.stringify(item),
142
- };
143
- }
144
- else if (link === null) {
145
- results.push(null);
146
- continue;
147
- }
148
- const result = readData(environment, field.selections, link.__link, variables, nestedRefetchQueries);
149
- if (result.kind === 'MissingData') {
150
- return {
151
- kind: 'MissingData',
152
- reason: 'Missing data for ' +
153
- storeRecordName +
154
- ' on root ' +
155
- root +
156
- '. Link is ' +
157
- JSON.stringify(item),
158
- nestedReason: result,
159
- };
160
- }
161
- results.push(result.data);
162
- }
163
- target[(_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName] = results;
164
- break;
165
- }
166
- let link = assertLink(value);
167
- if (link === undefined) {
168
- // TODO make this configurable, and also generated and derived from the schema
169
- const missingFieldHandler = (_c = environment.missingFieldHandler) !== null && _c !== void 0 ? _c : IsographEnvironment_1.defaultMissingFieldHandler;
170
- const altLink = missingFieldHandler(storeRecord, root, field.fieldName, field.arguments, variables);
171
- if (altLink === undefined) {
172
- return {
173
- kind: 'MissingData',
174
- reason: 'No link for ' +
175
- storeRecordName +
176
- ' on root ' +
177
- root +
178
- '. Link is ' +
179
- JSON.stringify(value),
180
- };
181
- }
182
- else {
183
- link = altLink;
184
- }
185
- }
186
- else if (link === null) {
187
- target[(_d = field.alias) !== null && _d !== void 0 ? _d : field.fieldName] = null;
188
- break;
189
- }
190
- const targetId = link.__link;
191
- const data = readData(environment, field.selections, targetId, variables, nestedRefetchQueries);
192
- if (data.kind === 'MissingData') {
193
- return {
194
- kind: 'MissingData',
195
- reason: 'Missing data for ' + storeRecordName + ' on root ' + root,
196
- nestedReason: data,
197
- };
198
- }
199
- target[(_e = field.alias) !== null && _e !== void 0 ? _e : field.fieldName] = data.data;
200
- break;
201
- }
202
- case 'RefetchField': {
203
- const data = readData(environment, field.readerArtifact.readerAst, root, variables,
204
- // Refetch fields just read the id, and don't need refetch query artifacts
205
- []);
206
- if (typeof window !== 'undefined' && window.__LOG) {
207
- console.log('refetch field data', data, field);
208
- }
209
- if (data.kind === 'MissingData') {
210
- return {
211
- kind: 'MissingData',
212
- reason: 'Missing data for ' + field.alias + ' on root ' + root,
213
- nestedReason: data,
214
- };
215
- }
216
- else {
217
- const refetchQueryIndex = field.refetchQuery;
218
- if (refetchQueryIndex == null) {
219
- throw new Error('refetchQuery is null in RefetchField');
220
- }
221
- const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
222
- const refetchQueryArtifact = refetchQuery.artifact;
223
- const allowedVariables = refetchQuery.allowedVariables;
224
- target[field.alias] = field.readerArtifact.resolver(environment,
225
- // resolvers for refetch fields take 3 args, and this is not reflected in types
226
- refetchQueryArtifact, Object.assign(Object.assign({}, data.data), filterVariables(variables, allowedVariables)));
227
- }
228
- break;
229
- }
230
- case 'MutationField': {
231
- const data = readData(environment, field.readerArtifact.readerAst, root, variables,
232
- // Refetch fields just read the id, and don't need refetch query artifacts
233
- []);
234
- if (typeof window !== 'undefined' && window.__LOG) {
235
- console.log('refetch field data', data, field);
236
- }
237
- if (data.kind === 'MissingData') {
238
- return {
239
- kind: 'MissingData',
240
- reason: 'Missing data for ' + field.alias + ' on root ' + root,
241
- nestedReason: data,
242
- };
243
- }
244
- else {
245
- const refetchQueryIndex = field.refetchQuery;
246
- if (refetchQueryIndex == null) {
247
- throw new Error('refetchQuery is null in MutationField');
248
- }
249
- const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
250
- const refetchQueryArtifact = refetchQuery.artifact;
251
- const allowedVariables = refetchQuery.allowedVariables;
252
- target[field.alias] = field.readerArtifact.resolver(environment, refetchQueryArtifact,
253
- // @ts-expect-error
254
- data.data, filterVariables(variables, allowedVariables));
255
- }
256
- break;
257
- }
258
- case 'Resolver': {
259
- const usedRefetchQueries = field.usedRefetchQueries;
260
- const resolverRefetchQueries = usedRefetchQueries.map((index) => nestedRefetchQueries[index]);
261
- const variant = field.readerArtifact.variant;
262
- if (variant.kind === 'Eager') {
263
- const data = readData(environment, field.readerArtifact.readerAst, root, variables, resolverRefetchQueries);
264
- if (data.kind === 'MissingData') {
265
- return {
266
- kind: 'MissingData',
267
- reason: 'Missing data for ' + field.alias + ' on root ' + root,
268
- nestedReason: data,
269
- };
270
- }
271
- else {
272
- // @ts-expect-error
273
- target[field.alias] = field.readerArtifact.resolver(data.data);
274
- }
275
- }
276
- else if (variant.kind === 'Component') {
277
- target[field.alias] = (0, componentCache_1.getOrCreateCachedComponent)(environment, root, variant.componentName, field.readerArtifact, variables, resolverRefetchQueries);
278
- }
279
- break;
280
- }
281
- }
282
- }
283
- return { kind: 'Success', data: target };
284
- }
285
57
  function assertLink(link) {
286
58
  if (Array.isArray(link)) {
287
59
  throw new Error('Unexpected array');
@@ -295,10 +67,3 @@ function assertLink(link) {
295
67
  throw new Error('Invalid link');
296
68
  }
297
69
  exports.assertLink = assertLink;
298
- function filterVariables(variables, allowedVariables) {
299
- const result = {};
300
- for (const key of allowedVariables) {
301
- result[key] = variables[key];
302
- }
303
- return result;
304
- }
package/dist/read.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { FragmentReference } from './index';
2
+ import { IsographEnvironment } from './IsographEnvironment';
3
+ export declare function read<TReadFromStore extends Object, TResolverResult>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
4
+ export declare function readButDoNotEvaluate<TReadFromStore extends Object>(environment: IsographEnvironment, reference: FragmentReference<TReadFromStore, unknown>): TReadFromStore;
package/dist/read.js ADDED
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readButDoNotEvaluate = exports.read = void 0;
4
+ const cache_1 = require("./cache");
5
+ const componentCache_1 = require("./componentCache");
6
+ const index_1 = require("./index");
7
+ const IsographEnvironment_1 = require("./IsographEnvironment");
8
+ function read(environment, fragmentReference) {
9
+ var _a, _b;
10
+ const variant = fragmentReference.readerArtifact.variant;
11
+ if (variant.kind === 'Eager') {
12
+ const data = readData(environment, fragmentReference.readerArtifact.readerAst, fragmentReference.root, (_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {}, fragmentReference.nestedRefetchQueries);
13
+ if (data.kind === 'MissingData') {
14
+ throw (0, cache_1.onNextChange)(environment);
15
+ }
16
+ else {
17
+ // @ts-expect-error This not properly typed yet
18
+ return fragmentReference.readerArtifact.resolver(data.data);
19
+ }
20
+ }
21
+ else if (variant.kind === 'Component') {
22
+ // @ts-ignore
23
+ return (0, componentCache_1.getOrCreateCachedComponent)(environment, fragmentReference.root, variant.componentName, fragmentReference.readerArtifact, (_b = fragmentReference.variables) !== null && _b !== void 0 ? _b : {}, fragmentReference.nestedRefetchQueries);
24
+ }
25
+ // Why can't Typescript realize that this is unreachable??
26
+ throw new Error('This is unreachable');
27
+ }
28
+ exports.read = read;
29
+ function readButDoNotEvaluate(environment, reference) {
30
+ var _a;
31
+ const response = readData(environment, reference.readerArtifact.readerAst, reference.root, (_a = reference.variables) !== null && _a !== void 0 ? _a : {}, reference.nestedRefetchQueries);
32
+ if (typeof window !== 'undefined' && window.__LOG) {
33
+ console.log('done reading', { response });
34
+ }
35
+ if (response.kind === 'MissingData') {
36
+ throw (0, cache_1.onNextChange)(environment);
37
+ }
38
+ else {
39
+ return response.data;
40
+ }
41
+ }
42
+ exports.readButDoNotEvaluate = readButDoNotEvaluate;
43
+ function readData(environment, ast, root, variables, nestedRefetchQueries) {
44
+ var _a, _b, _c, _d, _e;
45
+ let storeRecord = environment.store[root];
46
+ if (storeRecord === undefined) {
47
+ return { kind: 'MissingData', reason: 'No record for root ' + root };
48
+ }
49
+ if (storeRecord === null) {
50
+ return { kind: 'Success', data: null };
51
+ }
52
+ let target = {};
53
+ for (const field of ast) {
54
+ switch (field.kind) {
55
+ case 'Scalar': {
56
+ const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
57
+ const value = storeRecord[storeRecordName];
58
+ // TODO consider making scalars into discriminated unions. This probably has
59
+ // to happen for when we handle errors.
60
+ if (value === undefined) {
61
+ return {
62
+ kind: 'MissingData',
63
+ reason: 'No value for ' + storeRecordName + ' on root ' + root,
64
+ };
65
+ }
66
+ target[(_a = field.alias) !== null && _a !== void 0 ? _a : field.fieldName] = value;
67
+ break;
68
+ }
69
+ case 'Linked': {
70
+ const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
71
+ const value = storeRecord[storeRecordName];
72
+ if (Array.isArray(value)) {
73
+ const results = [];
74
+ for (const item of value) {
75
+ const link = (0, index_1.assertLink)(item);
76
+ if (link === undefined) {
77
+ return {
78
+ kind: 'MissingData',
79
+ reason: 'No link for ' +
80
+ storeRecordName +
81
+ ' on root ' +
82
+ root +
83
+ '. Link is ' +
84
+ JSON.stringify(item),
85
+ };
86
+ }
87
+ else if (link === null) {
88
+ results.push(null);
89
+ continue;
90
+ }
91
+ const result = readData(environment, field.selections, link.__link, variables, nestedRefetchQueries);
92
+ if (result.kind === 'MissingData') {
93
+ return {
94
+ kind: 'MissingData',
95
+ reason: 'Missing data for ' +
96
+ storeRecordName +
97
+ ' on root ' +
98
+ root +
99
+ '. Link is ' +
100
+ JSON.stringify(item),
101
+ nestedReason: result,
102
+ };
103
+ }
104
+ results.push(result.data);
105
+ }
106
+ target[(_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName] = results;
107
+ break;
108
+ }
109
+ let link = (0, index_1.assertLink)(value);
110
+ if (link === undefined) {
111
+ // TODO make this configurable, and also generated and derived from the schema
112
+ const missingFieldHandler = (_c = environment.missingFieldHandler) !== null && _c !== void 0 ? _c : IsographEnvironment_1.defaultMissingFieldHandler;
113
+ const altLink = missingFieldHandler(storeRecord, root, field.fieldName, field.arguments, variables);
114
+ if (altLink === undefined) {
115
+ return {
116
+ kind: 'MissingData',
117
+ reason: 'No link for ' +
118
+ storeRecordName +
119
+ ' on root ' +
120
+ root +
121
+ '. Link is ' +
122
+ JSON.stringify(value),
123
+ };
124
+ }
125
+ else {
126
+ link = altLink;
127
+ }
128
+ }
129
+ else if (link === null) {
130
+ target[(_d = field.alias) !== null && _d !== void 0 ? _d : field.fieldName] = null;
131
+ break;
132
+ }
133
+ const targetId = link.__link;
134
+ const data = readData(environment, field.selections, targetId, variables, nestedRefetchQueries);
135
+ if (data.kind === 'MissingData') {
136
+ return {
137
+ kind: 'MissingData',
138
+ reason: 'Missing data for ' + storeRecordName + ' on root ' + root,
139
+ nestedReason: data,
140
+ };
141
+ }
142
+ target[(_e = field.alias) !== null && _e !== void 0 ? _e : field.fieldName] = data.data;
143
+ break;
144
+ }
145
+ case 'RefetchField': {
146
+ const data = readData(environment, field.readerArtifact.readerAst, root, variables,
147
+ // Refetch fields just read the id, and don't need refetch query artifacts
148
+ []);
149
+ if (typeof window !== 'undefined' && window.__LOG) {
150
+ console.log('refetch field data', data, field);
151
+ }
152
+ if (data.kind === 'MissingData') {
153
+ return {
154
+ kind: 'MissingData',
155
+ reason: 'Missing data for ' + field.alias + ' on root ' + root,
156
+ nestedReason: data,
157
+ };
158
+ }
159
+ else {
160
+ const refetchQueryIndex = field.refetchQuery;
161
+ if (refetchQueryIndex == null) {
162
+ throw new Error('refetchQuery is null in RefetchField');
163
+ }
164
+ const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
165
+ const refetchQueryArtifact = refetchQuery.artifact;
166
+ const allowedVariables = refetchQuery.allowedVariables;
167
+ target[field.alias] = field.readerArtifact.resolver(environment,
168
+ // resolvers for refetch fields take 3 args, and this is not reflected in types
169
+ refetchQueryArtifact, Object.assign(Object.assign({}, data.data), filterVariables(variables, allowedVariables)));
170
+ }
171
+ break;
172
+ }
173
+ case 'MutationField': {
174
+ const data = readData(environment, field.readerArtifact.readerAst, root, variables,
175
+ // Refetch fields just read the id, and don't need refetch query artifacts
176
+ []);
177
+ if (typeof window !== 'undefined' && window.__LOG) {
178
+ console.log('refetch field data', data, field);
179
+ }
180
+ if (data.kind === 'MissingData') {
181
+ return {
182
+ kind: 'MissingData',
183
+ reason: 'Missing data for ' + field.alias + ' on root ' + root,
184
+ nestedReason: data,
185
+ };
186
+ }
187
+ else {
188
+ const refetchQueryIndex = field.refetchQuery;
189
+ if (refetchQueryIndex == null) {
190
+ throw new Error('refetchQuery is null in MutationField');
191
+ }
192
+ const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
193
+ const refetchQueryArtifact = refetchQuery.artifact;
194
+ const allowedVariables = refetchQuery.allowedVariables;
195
+ target[field.alias] = field.readerArtifact.resolver(environment, refetchQueryArtifact,
196
+ // @ts-expect-error
197
+ data.data, filterVariables(variables, allowedVariables));
198
+ }
199
+ break;
200
+ }
201
+ case 'Resolver': {
202
+ const usedRefetchQueries = field.usedRefetchQueries;
203
+ const resolverRefetchQueries = usedRefetchQueries.map((index) => nestedRefetchQueries[index]);
204
+ const variant = field.readerArtifact.variant;
205
+ if (variant.kind === 'Eager') {
206
+ const data = readData(environment, field.readerArtifact.readerAst, root, variables, resolverRefetchQueries);
207
+ if (data.kind === 'MissingData') {
208
+ return {
209
+ kind: 'MissingData',
210
+ reason: 'Missing data for ' + field.alias + ' on root ' + root,
211
+ nestedReason: data,
212
+ };
213
+ }
214
+ else {
215
+ // @ts-expect-error
216
+ target[field.alias] = field.readerArtifact.resolver(data.data);
217
+ }
218
+ }
219
+ else if (variant.kind === 'Component') {
220
+ target[field.alias] = (0, componentCache_1.getOrCreateCachedComponent)(environment, root, variant.componentName, field.readerArtifact, variables, resolverRefetchQueries);
221
+ }
222
+ break;
223
+ }
224
+ }
225
+ }
226
+ return { kind: 'Success', data: target };
227
+ }
228
+ function filterVariables(variables, allowedVariables) {
229
+ const result = {};
230
+ for (const key of allowedVariables) {
231
+ result[key] = variables[key];
232
+ }
233
+ return result;
234
+ }
@@ -0,0 +1,2 @@
1
+ import { FragmentReference } from './index';
2
+ export declare function useResult<TReadFromStore extends Object, TResolverResult>(fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useResult = void 0;
4
+ const react_1 = require("react");
5
+ const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
6
+ const cache_1 = require("./cache");
7
+ const read_1 = require("./read");
8
+ function useResult(fragmentReference) {
9
+ const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
10
+ const [, setState] = (0, react_1.useState)();
11
+ (0, react_1.useEffect)(() => {
12
+ return (0, cache_1.subscribe)(environment, () => {
13
+ return setState({});
14
+ });
15
+ }, []);
16
+ return (0, read_1.read)(environment, fragmentReference);
17
+ }
18
+ exports.useResult = useResult;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.0.0-main-90264a00",
3
+ "version": "0.0.0-main-0e7d8883",
4
4
  "description": "Use Isograph with React",
5
5
  "homepage": "https://isograph.dev",
6
6
  "main": "dist/index.js",
@@ -16,8 +16,8 @@
16
16
  "prepack": "yarn run test && yarn run compile"
17
17
  },
18
18
  "dependencies": {
19
- "@isograph/disposable-types": "0.0.0-main-90264a00",
20
- "@isograph/react-disposable-state": "0.0.0-main-90264a00",
19
+ "@isograph/disposable-types": "0.0.0-main-0e7d8883",
20
+ "@isograph/react-disposable-state": "0.0.0-main-0e7d8883",
21
21
  "react": "^18.2.0"
22
22
  },
23
23
  "devDependencies": {
@@ -0,0 +1,18 @@
1
+ import { DataId } from './IsographEnvironment';
2
+ import { RefetchQueryArtifactWrapper } from './entrypoint';
3
+ import { ReaderArtifact } from './reader';
4
+
5
+ // TODO type this better
6
+ export type Variable = any;
7
+
8
+ export type FragmentReference<
9
+ TReadFromStore extends Object,
10
+ TResolverResult,
11
+ > = {
12
+ kind: 'FragmentReference';
13
+ readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
14
+ root: DataId;
15
+ variables: { [index: string]: Variable } | null;
16
+ // TODO: We should instead have ReaderAst<TResolverProps>
17
+ nestedRefetchQueries: RefetchQueryArtifactWrapper[];
18
+ };