@isograph/react 0.0.0-main-3247c783 → 0.0.0-main-c174d679

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.
package/dist/cache.js CHANGED
@@ -364,6 +364,12 @@ function getStoreKeyChunkForArgumentValue(argumentValue, variables) {
364
364
  case 'Variable': {
365
365
  return variables[argumentValue.name];
366
366
  }
367
+ case 'String': {
368
+ return argumentValue.value;
369
+ }
370
+ case 'Enum': {
371
+ return argumentValue.value;
372
+ }
367
373
  default: {
368
374
  // TODO configure eslint to allow unused vars starting with _
369
375
  // Ensure we have covered all variants
@@ -393,6 +399,14 @@ function getNetworkResponseKey(astNode) {
393
399
  argumentValueChunk = 'v_' + argumentValue.name;
394
400
  break;
395
401
  }
402
+ case 'String': {
403
+ argumentValueChunk = 's_' + argumentValue.value;
404
+ break;
405
+ }
406
+ case 'Enum': {
407
+ argumentValueChunk = 'e_' + argumentValue.value;
408
+ break;
409
+ }
396
410
  default: {
397
411
  // Ensure we have covered all variants
398
412
  let _ = argumentValue;
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, typ
5
5
  export { IsographEnvironmentProvider, useIsographEnvironment, type IsographEnvironmentProviderProps, } from './IsographEnvironmentProvider';
6
6
  export { useImperativeReference } from './useImperativeReference';
7
7
  export { EntrypointReader } from './EntrypointReader';
8
- export { EagerReaderArtifact, ComponentReaderArtifact, MutationReaderArtifact, RefetchReaderArtifact, ReaderAst, ReaderAstNode, ReaderLinkedField, ReaderResolverField, ReaderScalarField, TopLevelReaderArtifact, LoadableField, } from './reader';
8
+ export { EagerReaderArtifact, ComponentReaderArtifact, RefetchReaderArtifact, ReaderAst, ReaderAstNode, ReaderLinkedField, ReaderNonLoadableResolverField, ReaderScalarField, TopLevelReaderArtifact, LoadableField, } from './reader';
9
9
  export { NormalizationAst, NormalizationAstNode, NormalizationLinkedField, NormalizationScalarField, IsographEntrypoint, assertIsEntrypoint, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper, } from './entrypoint';
10
10
  export { readButDoNotEvaluate } from './read';
11
11
  export { useResult } from './useResult';
package/dist/read.js CHANGED
@@ -155,11 +155,13 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, mutab
155
155
  const allowedVariables = refetchQuery.allowedVariables;
156
156
  // Second, we allow the user to call the resolver, which will ultimately
157
157
  // use the resolver reader AST to get the resolver parameters.
158
- target[field.alias] = (_args) => [
158
+ target[field.alias] = (args) => [
159
159
  // Stable id
160
160
  root + '__' + field.name,
161
161
  // Fetcher
162
- field.refetchReaderArtifact.resolver(environment, refetchQueryArtifact, data.data, filterVariables(variables, allowedVariables), root, field.resolverReaderArtifact, field.usedRefetchQueries.map((id) => nestedRefetchQueries[id])),
162
+ field.refetchReaderArtifact.resolver(environment, refetchQueryArtifact, data.data, filterVariables(Object.assign(Object.assign({}, args), variables), allowedVariables), root,
163
+ // TODO these params should be removed
164
+ null, []),
163
165
  ];
164
166
  }
165
167
  break;
@@ -186,12 +188,51 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, mutab
186
188
  kind: 'FragmentReference',
187
189
  readerArtifact: field.readerArtifact,
188
190
  root,
189
- variables,
191
+ variables: generateChildVariableMap(variables, field.arguments),
190
192
  nestedRefetchQueries: resolverRefetchQueries,
191
193
  });
192
194
  }
193
195
  break;
194
196
  }
197
+ case 'LoadablySelectedField': {
198
+ const refetchReaderParams = readData(environment, field.refetchReaderAst, root, variables,
199
+ // Refetch fields just read the id, and don't need refetch query artifacts
200
+ [], mutableEncounteredRecords);
201
+ if (refetchReaderParams.kind === 'MissingData') {
202
+ return {
203
+ kind: 'MissingData',
204
+ reason: 'Missing data for ' + field.alias + ' on root ' + root,
205
+ nestedReason: refetchReaderParams,
206
+ };
207
+ }
208
+ else {
209
+ target[field.alias] = (args) => [
210
+ // Stable id
211
+ root + '__' + field.name,
212
+ // Fetcher
213
+ () => {
214
+ // TODO we should use the reader AST for this
215
+ const includeReadOutData = (variables, readOutData) => {
216
+ variables.id = readOutData.id;
217
+ return variables;
218
+ };
219
+ const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
220
+ writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
221
+ const [_networkRequest, disposeNetworkRequest] = (0, cache_1.makeNetworkRequest)(environment, field.entrypoint, localVariables);
222
+ const fragmentReference = {
223
+ kind: 'FragmentReference',
224
+ readerArtifact: field.entrypoint.readerArtifact,
225
+ // TODO localVariables is not guaranteed to have an id field
226
+ root: localVariables.id,
227
+ variables: localVariables,
228
+ nestedRefetchQueries: field.entrypoint.nestedRefetchQueries,
229
+ };
230
+ return [fragmentReference, disposeNetworkRequest];
231
+ },
232
+ ];
233
+ }
234
+ break;
235
+ }
195
236
  default: {
196
237
  // Ensure we have covered all variants
197
238
  let _ = field;
@@ -214,3 +255,50 @@ function filterVariables(variables, allowedVariables) {
214
255
  }
215
256
  return result;
216
257
  }
258
+ function generateChildVariableMap(variables, fieldArguments) {
259
+ if (fieldArguments == null) {
260
+ return {};
261
+ }
262
+ const childVars = {};
263
+ for (const [name, value] of fieldArguments) {
264
+ if (value.kind === 'Variable') {
265
+ // @ts-expect-error
266
+ childVars[name] = variables[value.name];
267
+ }
268
+ else {
269
+ // @ts-expect-error
270
+ childVars[name] = value;
271
+ }
272
+ }
273
+ return childVars;
274
+ }
275
+ function writeQueryArgsToVariables(targetVariables, queryArgs, variables) {
276
+ if (queryArgs == null) {
277
+ return;
278
+ }
279
+ for (const [name, argType] of queryArgs) {
280
+ switch (argType.kind) {
281
+ case 'Variable': {
282
+ targetVariables[name] = variables[argType.name];
283
+ break;
284
+ }
285
+ case 'Enum': {
286
+ targetVariables[name] = argType.value;
287
+ break;
288
+ }
289
+ case 'Literal': {
290
+ targetVariables[name] = argType.value;
291
+ break;
292
+ }
293
+ case 'String': {
294
+ targetVariables[name] = argType.value;
295
+ break;
296
+ }
297
+ default: {
298
+ const _ = argType;
299
+ _;
300
+ throw new Error('Unexpected case');
301
+ }
302
+ }
303
+ }
304
+ }
package/dist/reader.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  import { Factory } from '@isograph/disposable-types';
3
3
  import { FragmentReference } from './FragmentReference';
4
4
  import { ComponentOrFieldName, DataId, IsographEnvironment } from './IsographEnvironment';
5
- import { RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
5
+ import { IsographEntrypoint, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
6
6
  import { Arguments } from './util';
7
7
  export type TopLevelReaderArtifact<TReadFromStore extends Object, TClientFieldValue, TComponentProps extends Record<string, never>> = EagerReaderArtifact<TReadFromStore, TClientFieldValue> | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
8
8
  export type EagerReaderArtifact<TReadFromStore extends Object, TClientFieldValue> = {
@@ -21,12 +21,7 @@ export type RefetchReaderArtifact = {
21
21
  readonly readerAst: ReaderAst<unknown>;
22
22
  readonly resolver: (environment: IsographEnvironment, artifact: RefetchQueryNormalizationArtifact, variables: any, filteredVariables: any, rootId: DataId, readerArtifact: TopLevelReaderArtifact<any, any, any> | null, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[]) => () => void;
23
23
  };
24
- export type MutationReaderArtifact<TReadFromStore extends Object> = {
25
- readonly kind: 'MutationReaderArtifact';
26
- readonly readerAst: ReaderAst<unknown>;
27
- readonly resolver: (environment: IsographEnvironment, entrypoint: RefetchQueryNormalizationArtifact, readOutData: TReadFromStore, filteredVariables: any, rootId: DataId, readerArtifact: TopLevelReaderArtifact<any, any, any> | null, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[]) => (mutationParams: any) => void;
28
- };
29
- export type ReaderAstNode = ReaderScalarField | ReaderLinkedField | ReaderResolverField | ReaderImperativelyLoadedField;
24
+ export type ReaderAstNode = ReaderScalarField | ReaderLinkedField | ReaderNonLoadableResolverField | ReaderImperativelyLoadedField | ReaderLoadableField;
30
25
  export type ReaderAst<TReadFromStore> = ReadonlyArray<ReaderAstNode>;
31
26
  export type ReaderScalarField = {
32
27
  readonly kind: 'Scalar';
@@ -41,7 +36,7 @@ export type ReaderLinkedField = {
41
36
  readonly selections: ReaderAst<unknown>;
42
37
  readonly arguments: Arguments | null;
43
38
  };
44
- export type ReaderResolverField = {
39
+ export type ReaderNonLoadableResolverField = {
45
40
  readonly kind: 'Resolver';
46
41
  readonly alias: string;
47
42
  readonly readerArtifact: TopLevelReaderArtifact<any, any, any>;
@@ -51,11 +46,17 @@ export type ReaderResolverField = {
51
46
  export type ReaderImperativelyLoadedField = {
52
47
  readonly kind: 'ImperativelyLoadedField';
53
48
  readonly alias: string;
54
- readonly refetchReaderArtifact: MutationReaderArtifact<any> | RefetchReaderArtifact;
55
- readonly resolverReaderArtifact: TopLevelReaderArtifact<any, any, any> | null;
49
+ readonly refetchReaderArtifact: RefetchReaderArtifact;
56
50
  readonly refetchQuery: number;
57
51
  readonly name: string;
58
- readonly usedRefetchQueries: number[];
52
+ };
53
+ export type ReaderLoadableField = {
54
+ readonly kind: 'LoadablySelectedField';
55
+ readonly alias: string;
56
+ readonly name: string;
57
+ readonly queryArguments: Arguments | null;
58
+ readonly refetchReaderAst: ReaderAst<any>;
59
+ readonly entrypoint: IsographEntrypoint<any, any>;
59
60
  };
60
61
  type StableId = string;
61
62
  export type LoadableField<TArgs, TResult> = (args: TArgs) => [StableId, Factory<FragmentReference<any, TResult>>];
package/dist/util.d.ts CHANGED
@@ -8,4 +8,10 @@ export type ArgumentValue = {
8
8
  } | {
9
9
  readonly kind: 'Literal';
10
10
  readonly value: any;
11
+ } | {
12
+ readonly kind: 'String';
13
+ readonly value: string;
14
+ } | {
15
+ readonly kind: 'Enum';
16
+ readonly value: string;
11
17
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.0.0-main-3247c783",
3
+ "version": "0.0.0-main-c174d679",
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-3247c783",
20
- "@isograph/react-disposable-state": "0.0.0-main-3247c783",
19
+ "@isograph/disposable-types": "0.0.0-main-c174d679",
20
+ "@isograph/react-disposable-state": "0.0.0-main-c174d679",
21
21
  "react": "^18.2.0"
22
22
  },
23
23
  "devDependencies": {
package/src/cache.ts CHANGED
@@ -650,6 +650,12 @@ function getStoreKeyChunkForArgumentValue(
650
650
  case 'Variable': {
651
651
  return variables[argumentValue.name];
652
652
  }
653
+ case 'String': {
654
+ return argumentValue.value;
655
+ }
656
+ case 'Enum': {
657
+ return argumentValue.value;
658
+ }
653
659
  default: {
654
660
  // TODO configure eslint to allow unused vars starting with _
655
661
  // Ensure we have covered all variants
@@ -683,6 +689,14 @@ function getNetworkResponseKey(
683
689
  argumentValueChunk = 'v_' + argumentValue.name;
684
690
  break;
685
691
  }
692
+ case 'String': {
693
+ argumentValueChunk = 's_' + argumentValue.value;
694
+ break;
695
+ }
696
+ case 'Enum': {
697
+ argumentValueChunk = 'e_' + argumentValue.value;
698
+ break;
699
+ }
686
700
  default: {
687
701
  // Ensure we have covered all variants
688
702
  let _: never = argumentValue;
package/src/index.ts CHANGED
@@ -29,12 +29,11 @@ export { EntrypointReader } from './EntrypointReader';
29
29
  export {
30
30
  EagerReaderArtifact,
31
31
  ComponentReaderArtifact,
32
- MutationReaderArtifact,
33
32
  RefetchReaderArtifact,
34
33
  ReaderAst,
35
34
  ReaderAstNode,
36
35
  ReaderLinkedField,
37
- ReaderResolverField,
36
+ ReaderNonLoadableResolverField,
38
37
  ReaderScalarField,
39
38
  TopLevelReaderArtifact,
40
39
  LoadableField,
package/src/read.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { getParentRecordKey, onNextChange } from './cache';
1
+ import { getParentRecordKey, makeNetworkRequest, onNextChange } from './cache';
2
2
  import { getOrCreateCachedComponent } from './componentCache';
3
3
  import { RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
4
4
  import { FragmentReference, Variables } from './FragmentReference';
@@ -9,6 +9,7 @@ import {
9
9
  IsographEnvironment,
10
10
  } from './IsographEnvironment';
11
11
  import { ReaderAst } from './reader';
12
+ import { Arguments } from './util';
12
13
 
13
14
  export type WithEncounteredRecords<T> = {
14
15
  readonly encounteredRecords: Set<DataId>;
@@ -222,7 +223,7 @@ function readData<TReadFromStore>(
222
223
 
223
224
  // Second, we allow the user to call the resolver, which will ultimately
224
225
  // use the resolver reader AST to get the resolver parameters.
225
- target[field.alias] = (_args: void) => [
226
+ target[field.alias] = (args: any) => [
226
227
  // Stable id
227
228
  root + '__' + field.name,
228
229
  // Fetcher
@@ -230,10 +231,11 @@ function readData<TReadFromStore>(
230
231
  environment,
231
232
  refetchQueryArtifact,
232
233
  data.data,
233
- filterVariables(variables, allowedVariables),
234
+ filterVariables({ ...args, ...variables }, allowedVariables),
234
235
  root,
235
- field.resolverReaderArtifact,
236
- field.usedRefetchQueries.map((id) => nestedRefetchQueries[id]),
236
+ // TODO these params should be removed
237
+ null,
238
+ [],
237
239
  ),
238
240
  ];
239
241
  }
@@ -272,13 +274,69 @@ function readData<TReadFromStore>(
272
274
  kind: 'FragmentReference',
273
275
  readerArtifact: field.readerArtifact,
274
276
  root,
275
- variables,
277
+ variables: generateChildVariableMap(variables, field.arguments),
276
278
  nestedRefetchQueries: resolverRefetchQueries,
277
279
  } as const,
278
280
  );
279
281
  }
280
282
  break;
281
283
  }
284
+ case 'LoadablySelectedField': {
285
+ const refetchReaderParams = readData(
286
+ environment,
287
+ field.refetchReaderAst,
288
+ root,
289
+ variables,
290
+ // Refetch fields just read the id, and don't need refetch query artifacts
291
+ [],
292
+ mutableEncounteredRecords,
293
+ );
294
+ if (refetchReaderParams.kind === 'MissingData') {
295
+ return {
296
+ kind: 'MissingData',
297
+ reason: 'Missing data for ' + field.alias + ' on root ' + root,
298
+ nestedReason: refetchReaderParams,
299
+ };
300
+ } else {
301
+ target[field.alias] = (args: any) => [
302
+ // Stable id
303
+ root + '__' + field.name,
304
+ // Fetcher
305
+ () => {
306
+ // TODO we should use the reader AST for this
307
+ const includeReadOutData = (variables: any, readOutData: any) => {
308
+ variables.id = readOutData.id;
309
+ return variables;
310
+ };
311
+ const localVariables = includeReadOutData(
312
+ args ?? {},
313
+ refetchReaderParams.data,
314
+ );
315
+ writeQueryArgsToVariables(
316
+ localVariables,
317
+ field.queryArguments,
318
+ variables,
319
+ );
320
+ const [_networkRequest, disposeNetworkRequest] =
321
+ makeNetworkRequest(
322
+ environment,
323
+ field.entrypoint,
324
+ localVariables,
325
+ );
326
+ const fragmentReference = {
327
+ kind: 'FragmentReference',
328
+ readerArtifact: field.entrypoint.readerArtifact,
329
+ // TODO localVariables is not guaranteed to have an id field
330
+ root: localVariables.id,
331
+ variables: localVariables,
332
+ nestedRefetchQueries: field.entrypoint.nestedRefetchQueries,
333
+ } as const;
334
+ return [fragmentReference, disposeNetworkRequest];
335
+ },
336
+ ];
337
+ }
338
+ break;
339
+ }
282
340
  default: {
283
341
  // Ensure we have covered all variants
284
342
  let _: never = field;
@@ -305,3 +363,59 @@ function filterVariables(
305
363
  }
306
364
  return result;
307
365
  }
366
+
367
+ function generateChildVariableMap(
368
+ variables: Variables,
369
+ fieldArguments: Arguments | null,
370
+ ): Variables {
371
+ if (fieldArguments == null) {
372
+ return {};
373
+ }
374
+
375
+ const childVars: Variables = {};
376
+ for (const [name, value] of fieldArguments) {
377
+ if (value.kind === 'Variable') {
378
+ // @ts-expect-error
379
+ childVars[name] = variables[value.name];
380
+ } else {
381
+ // @ts-expect-error
382
+ childVars[name] = value;
383
+ }
384
+ }
385
+ return childVars;
386
+ }
387
+
388
+ function writeQueryArgsToVariables(
389
+ targetVariables: any,
390
+ queryArgs: Arguments | null,
391
+ variables: Variables,
392
+ ) {
393
+ if (queryArgs == null) {
394
+ return;
395
+ }
396
+ for (const [name, argType] of queryArgs) {
397
+ switch (argType.kind) {
398
+ case 'Variable': {
399
+ targetVariables[name] = variables[argType.name];
400
+ break;
401
+ }
402
+ case 'Enum': {
403
+ targetVariables[name] = argType.value;
404
+ break;
405
+ }
406
+ case 'Literal': {
407
+ targetVariables[name] = argType.value;
408
+ break;
409
+ }
410
+ case 'String': {
411
+ targetVariables[name] = argType.value;
412
+ break;
413
+ }
414
+ default: {
415
+ const _: never = argType;
416
+ _;
417
+ throw new Error('Unexpected case');
418
+ }
419
+ }
420
+ }
421
+ }
package/src/reader.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  IsographEnvironment,
7
7
  } from './IsographEnvironment';
8
8
  import {
9
+ IsographEntrypoint,
9
10
  RefetchQueryNormalizationArtifact,
10
11
  RefetchQueryNormalizationArtifactWrapper,
11
12
  } from './entrypoint';
@@ -58,28 +59,12 @@ export type RefetchReaderArtifact = {
58
59
  ) => () => void;
59
60
  };
60
61
 
61
- export type MutationReaderArtifact<TReadFromStore extends Object> = {
62
- readonly kind: 'MutationReaderArtifact';
63
- readonly readerAst: ReaderAst<unknown>;
64
- readonly resolver: (
65
- environment: IsographEnvironment,
66
- // TODO type this better
67
- entrypoint: RefetchQueryNormalizationArtifact,
68
- readOutData: TReadFromStore,
69
- // TODO type this better
70
- filteredVariables: any,
71
- rootId: DataId,
72
- readerArtifact: TopLevelReaderArtifact<any, any, any> | null,
73
- // TODO type this better
74
- nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
75
- ) => (mutationParams: any) => void;
76
- };
77
-
78
62
  export type ReaderAstNode =
79
63
  | ReaderScalarField
80
64
  | ReaderLinkedField
81
- | ReaderResolverField
82
- | ReaderImperativelyLoadedField;
65
+ | ReaderNonLoadableResolverField
66
+ | ReaderImperativelyLoadedField
67
+ | ReaderLoadableField;
83
68
 
84
69
  // @ts-ignore
85
70
  export type ReaderAst<TReadFromStore> = ReadonlyArray<ReaderAstNode>;
@@ -98,7 +83,7 @@ export type ReaderLinkedField = {
98
83
  readonly arguments: Arguments | null;
99
84
  };
100
85
 
101
- export type ReaderResolverField = {
86
+ export type ReaderNonLoadableResolverField = {
102
87
  readonly kind: 'Resolver';
103
88
  readonly alias: string;
104
89
  // TODO don't type this as any
@@ -110,13 +95,23 @@ export type ReaderResolverField = {
110
95
  export type ReaderImperativelyLoadedField = {
111
96
  readonly kind: 'ImperativelyLoadedField';
112
97
  readonly alias: string;
113
- readonly refetchReaderArtifact:
114
- | MutationReaderArtifact<any>
115
- | RefetchReaderArtifact;
116
- readonly resolverReaderArtifact: TopLevelReaderArtifact<any, any, any> | null;
98
+ readonly refetchReaderArtifact: RefetchReaderArtifact;
117
99
  readonly refetchQuery: number;
118
100
  readonly name: string;
119
- readonly usedRefetchQueries: number[];
101
+ };
102
+
103
+ export type ReaderLoadableField = {
104
+ readonly kind: 'LoadablySelectedField';
105
+ readonly alias: string;
106
+
107
+ // To generate a stable id, we need the parent id + the name + the args that
108
+ // we pass to the field, which come from: queryArgs, refetchReaderAst
109
+ // (technically, but in practice that is always "id") and the user-provided args.
110
+ readonly name: string;
111
+ readonly queryArguments: Arguments | null;
112
+ readonly refetchReaderAst: ReaderAst<any>;
113
+
114
+ readonly entrypoint: IsographEntrypoint<any, any>;
120
115
  };
121
116
 
122
117
  type StableId = string;
package/src/util.ts CHANGED
@@ -12,4 +12,12 @@ export type ArgumentValue =
12
12
  | {
13
13
  readonly kind: 'Literal';
14
14
  readonly value: any;
15
+ }
16
+ | {
17
+ readonly kind: 'String';
18
+ readonly value: string;
19
+ }
20
+ | {
21
+ readonly kind: 'Enum';
22
+ readonly value: string;
15
23
  };