@isograph/react 0.0.0-main-55364d41 → 0.0.0-main-2c275831

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.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useReadPromise = exports.wrapPromise = void 0;
4
- const NOT_SET = Symbol("NOT_SET");
4
+ const NOT_SET = Symbol('NOT_SET');
5
5
  function wrapPromise(promise) {
6
6
  // TODO confirm suspense works if the promise is already resolved.
7
7
  const wrapper = { promise, value: NOT_SET };
package/dist/cache.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { ItemCleanupPair, ParentCache } from "@isograph/react-disposable-state";
2
- import { PromiseWrapper } from "./PromiseWrapper";
3
- import { IsographEntrypoint, NormalizationLinkedField, NormalizationScalarField, ReaderLinkedField, ReaderScalarField } from "./index";
1
+ import { ItemCleanupPair, ParentCache } from '@isograph/react-disposable-state';
2
+ import { PromiseWrapper } from './PromiseWrapper';
3
+ import { IsographEntrypoint, NormalizationLinkedField, NormalizationScalarField, ReaderLinkedField, ReaderScalarField } from './index';
4
4
  declare global {
5
5
  interface Window {
6
6
  __LOG: boolean;
@@ -26,7 +26,7 @@ export type StoreRecord = {
26
26
  id?: DataId;
27
27
  };
28
28
  export type DataId = string;
29
- export declare const ROOT_ID: DataId & "__ROOT";
29
+ export declare const ROOT_ID: DataId & '__ROOT';
30
30
  export declare function getStore(): {
31
31
  [index: string]: StoreRecord | null;
32
32
  __ROOT: StoreRecord;
package/dist/cache.js CHANGED
@@ -5,8 +5,8 @@ const react_disposable_state_1 = require("@isograph/react-disposable-state");
5
5
  const PromiseWrapper_1 = require("./PromiseWrapper");
6
6
  const cache = {};
7
7
  function getOrCreateCache(index, factory) {
8
- if (typeof window !== "undefined" && window.__LOG) {
9
- console.log("getting cache for", {
8
+ if (typeof window !== 'undefined' && window.__LOG) {
9
+ console.log('getting cache for', {
10
10
  index,
11
11
  cache: Object.keys(cache),
12
12
  found: !!cache[index],
@@ -23,7 +23,7 @@ function getOrCreateCache(index, factory) {
23
23
  * results.
24
24
  */
25
25
  function stableCopy(value) {
26
- if (!value || typeof value !== "object") {
26
+ if (!value || typeof value !== 'object') {
27
27
  return value;
28
28
  }
29
29
  if (Array.isArray(value)) {
@@ -52,15 +52,15 @@ function setNetwork(newNetwork) {
52
52
  }
53
53
  exports.setNetwork = setNetwork;
54
54
  function makeNetworkRequest(artifact, variables) {
55
- if (typeof window !== "undefined" && window.__LOG) {
56
- console.log("make network request", artifact, variables);
55
+ if (typeof window !== 'undefined' && window.__LOG) {
56
+ console.log('make network request', artifact, variables);
57
57
  }
58
58
  if (network == null) {
59
- throw new Error("Network must be set before makeNetworkRequest is called");
59
+ throw new Error('Network must be set before makeNetworkRequest is called');
60
60
  }
61
61
  const promise = network(artifact.queryText, variables).then((networkResponse) => {
62
- if (typeof window !== "undefined" && window.__LOG) {
63
- console.log("network response", artifact);
62
+ if (typeof window !== 'undefined' && window.__LOG) {
63
+ console.log('network response', artifact);
64
64
  }
65
65
  normalizeData(artifact.normalizationAst, networkResponse.data, variables, artifact.nestedRefetchQueries);
66
66
  return networkResponse.data;
@@ -75,7 +75,7 @@ function makeNetworkRequest(artifact, variables) {
75
75
  return response;
76
76
  }
77
77
  exports.makeNetworkRequest = makeNetworkRequest;
78
- exports.ROOT_ID = "__ROOT";
78
+ exports.ROOT_ID = '__ROOT';
79
79
  let store = {
80
80
  __ROOT: {},
81
81
  };
@@ -90,12 +90,12 @@ function clearStore() {
90
90
  }
91
91
  exports.clearStore = clearStore;
92
92
  function normalizeData(normalizationAst, networkResponse, variables, nestedRefetchQueries) {
93
- if (typeof window !== "undefined" && window.__LOG) {
94
- console.log("about to normalize", normalizationAst, networkResponse, variables);
93
+ if (typeof window !== 'undefined' && window.__LOG) {
94
+ console.log('about to normalize', normalizationAst, networkResponse, variables);
95
95
  }
96
96
  normalizeDataIntoRecord(normalizationAst, networkResponse, store.__ROOT, exports.ROOT_ID, variables, nestedRefetchQueries);
97
- if (typeof window !== "undefined" && window.__LOG) {
98
- console.log("after normalization", { store });
97
+ if (typeof window !== 'undefined' && window.__LOG) {
98
+ console.log('after normalization', { store });
99
99
  }
100
100
  callSubscriptions();
101
101
  }
@@ -123,11 +123,11 @@ function callSubscriptions() {
123
123
  function normalizeDataIntoRecord(normalizationAst, networkResponseParentRecord, targetParentRecord, targetParentRecordId, variables, nestedRefetchQueries) {
124
124
  for (const normalizationNode of normalizationAst) {
125
125
  switch (normalizationNode.kind) {
126
- case "Scalar": {
126
+ case 'Scalar': {
127
127
  normalizeScalarField(normalizationNode, networkResponseParentRecord, targetParentRecord, variables);
128
128
  break;
129
129
  }
130
- case "Linked": {
130
+ case 'Linked': {
131
131
  normalizeLinkedField(normalizationNode, networkResponseParentRecord, targetParentRecord, targetParentRecordId, variables, nestedRefetchQueries);
132
132
  break;
133
133
  }
@@ -138,12 +138,11 @@ function normalizeScalarField(astNode, networkResponseParentRecord, targetStoreR
138
138
  const networkResponseKey = getNetworkResponseKey(astNode);
139
139
  const networkResponseData = networkResponseParentRecord[networkResponseKey];
140
140
  const parentRecordKey = getParentRecordKey(astNode, variables);
141
- if (networkResponseData == null ||
142
- isScalarOrEmptyArray(networkResponseData)) {
141
+ if (networkResponseData == null || isScalarOrEmptyArray(networkResponseData)) {
143
142
  targetStoreRecord[parentRecordKey] = networkResponseData;
144
143
  }
145
144
  else {
146
- throw new Error("Unexpected object array when normalizing scalar");
145
+ throw new Error('Unexpected object array when normalizing scalar');
147
146
  }
148
147
  }
149
148
  /**
@@ -158,7 +157,7 @@ function normalizeLinkedField(astNode, networkResponseParentRecord, targetParent
158
157
  return;
159
158
  }
160
159
  if (isScalarButNotEmptyArray(networkResponseData)) {
161
- throw new Error("Unexpected scalar network response when normalizing a linked field");
160
+ throw new Error('Unexpected scalar network response when normalizing a linked field');
162
161
  }
163
162
  if (Array.isArray(networkResponseData)) {
164
163
  // TODO check astNode.plural or the like
@@ -191,9 +190,7 @@ function isScalarOrEmptyArray(data) {
191
190
  // This is maybe fixed in a new version of Typescript??
192
191
  return data.every((x) => isScalarOrEmptyArray(x));
193
192
  }
194
- const isScalarValue = typeof data === "string" ||
195
- typeof data === "number" ||
196
- typeof data === "boolean";
193
+ const isScalarValue = typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean';
197
194
  return isScalarValue;
198
195
  }
199
196
  function isScalarButNotEmptyArray(data) {
@@ -205,9 +202,7 @@ function isScalarButNotEmptyArray(data) {
205
202
  // This is maybe fixed in a new version of Typescript??
206
203
  return data.every((x) => isScalarOrEmptyArray(x));
207
204
  }
208
- const isScalarValue = typeof data === "string" ||
209
- typeof data === "number" ||
210
- typeof data === "boolean";
205
+ const isScalarValue = typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean';
211
206
  return isScalarValue;
212
207
  }
213
208
  function getParentRecordKey(astNode, variables) {
@@ -215,28 +210,62 @@ function getParentRecordKey(astNode, variables) {
215
210
  const fieldParameters = astNode.arguments;
216
211
  if (fieldParameters != null) {
217
212
  for (const fieldParameter of fieldParameters) {
218
- const { argumentName, variableName } = fieldParameter;
219
- const valueToUse = variables[variableName];
220
- parentRecordKey += `${exports.FIRST_SPLIT_KEY}${argumentName}${exports.SECOND_SPLIT_KEY}${valueToUse}`;
213
+ parentRecordKey += getStoreKeyChunkForArgument(fieldParameter, variables);
221
214
  }
222
215
  }
223
216
  return parentRecordKey;
224
217
  }
225
218
  exports.getParentRecordKey = getParentRecordKey;
219
+ function getStoreKeyChunkForArgumentValue(argumentValue, variables) {
220
+ switch (argumentValue.kind) {
221
+ case 'Literal': {
222
+ return argumentValue.value;
223
+ break;
224
+ }
225
+ case 'Variable': {
226
+ return variables[argumentValue.name];
227
+ break;
228
+ }
229
+ default: {
230
+ // TODO configure eslint to allow unused vars starting with _
231
+ let _ = argumentValue;
232
+ throw new Error('Unexpected case');
233
+ }
234
+ }
235
+ }
236
+ function getStoreKeyChunkForArgument(argument, variables) {
237
+ const chunk = getStoreKeyChunkForArgumentValue(argument[1], variables);
238
+ return `${exports.FIRST_SPLIT_KEY}${argument[0]}${exports.SECOND_SPLIT_KEY}${chunk}`;
239
+ }
226
240
  function getNetworkResponseKey(astNode) {
227
241
  let networkResponseKey = astNode.fieldName;
228
242
  const fieldParameters = astNode.arguments;
229
243
  if (fieldParameters != null) {
230
244
  for (const fieldParameter of fieldParameters) {
231
- const { argumentName, variableName } = fieldParameter;
232
- networkResponseKey += `${exports.FIRST_SPLIT_KEY}${argumentName}${exports.SECOND_SPLIT_KEY}${variableName}`;
245
+ const [argumentName, argumentValue] = fieldParameter;
246
+ let argumentValueChunk;
247
+ switch (argumentValue.kind) {
248
+ case 'Literal': {
249
+ argumentValueChunk = 'l_' + argumentValue.value;
250
+ break;
251
+ }
252
+ case 'Variable': {
253
+ argumentValueChunk = 'v_' + argumentValue.name;
254
+ break;
255
+ }
256
+ default: {
257
+ let _ = argumentValue;
258
+ throw new Error('Unexpected case');
259
+ }
260
+ }
261
+ networkResponseKey += `${exports.FIRST_SPLIT_KEY}${argumentName}${exports.SECOND_SPLIT_KEY}${argumentValueChunk}`;
233
262
  }
234
263
  }
235
264
  return networkResponseKey;
236
265
  }
237
266
  // an alias might be pullRequests____first___first____after___cursor
238
- exports.FIRST_SPLIT_KEY = "____";
239
- exports.SECOND_SPLIT_KEY = "___";
267
+ exports.FIRST_SPLIT_KEY = '____';
268
+ exports.SECOND_SPLIT_KEY = '___';
240
269
  // Returns a key to look up an item in the store
241
270
  function getDataIdOfNetworkResponse(parentRecordId, dataToNormalize, astNode, variables, index) {
242
271
  // Check whether the dataToNormalize has an id field. If so, that is the key.
@@ -254,9 +283,7 @@ function getDataIdOfNetworkResponse(parentRecordId, dataToNormalize, astNode, va
254
283
  return storeKey;
255
284
  }
256
285
  for (const fieldParameter of fieldParameters) {
257
- const { argumentName, variableName } = fieldParameter;
258
- const valueToUse = variables[variableName];
259
- storeKey += `${exports.FIRST_SPLIT_KEY}${argumentName}${exports.SECOND_SPLIT_KEY}${valueToUse}`;
286
+ storeKey += getStoreKeyChunkForArgument(fieldParameter, variables);
260
287
  }
261
288
  return storeKey;
262
289
  }
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
- import { ReaderArtifact, RefetchQueryArtifactWrapper } from "./index";
3
- import { DataId } from "./cache";
2
+ import { ReaderArtifact, RefetchQueryArtifactWrapper } from './index';
3
+ import { DataId } from './cache';
4
4
  export declare function getOrCreateCachedComponent(root: DataId, componentName: string, readerArtifact: ReaderArtifact<any, any, any>, variables: {
5
5
  [key: string]: string;
6
6
  }, resolverRefetchQueries: RefetchQueryArtifactWrapper[]): import("react").FC<any>;
@@ -15,7 +15,7 @@ function getOrCreateCachedComponent(root, componentName, readerArtifact, variabl
15
15
  (_c = byArgs[stringifiedArgs]) !== null && _c !== void 0 ? _c : (() => {
16
16
  function Component(additionalRuntimeProps) {
17
17
  const data = (0, index_1.readButDoNotEvaluate)({
18
- kind: "FragmentReference",
18
+ kind: 'FragmentReference',
19
19
  readerArtifact: readerArtifact,
20
20
  root,
21
21
  variables,
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
1
- import { DataId, StoreRecord, Link } from "./cache";
2
- export { setNetwork, makeNetworkRequest, subscribe, DataId, Link, StoreRecord, clearStore, } from "./cache";
1
+ import { DataId, StoreRecord, Link } from './cache';
2
+ export { setNetwork, makeNetworkRequest, subscribe, DataId, Link, StoreRecord, clearStore, } from './cache';
3
3
  export type IsographEntrypoint<TReadFromStore extends Object, TResolverProps, TResolverResult> = {
4
- kind: "Entrypoint";
4
+ kind: 'Entrypoint';
5
5
  queryText: string;
6
6
  normalizationAst: NormalizationAst;
7
7
  readerArtifact: ReaderArtifact<TReadFromStore, TResolverProps, TResolverResult>;
8
8
  nestedRefetchQueries: RefetchQueryArtifactWrapper[];
9
9
  };
10
10
  export type ReaderArtifact<TReadFromStore extends Object, TResolverProps, TResolverResult> = {
11
- kind: "ReaderArtifact";
11
+ kind: 'ReaderArtifact';
12
12
  readerAst: ReaderAst<TReadFromStore>;
13
13
  resolver: (data: TResolverProps) => TResolverResult;
14
14
  variant: ReaderResolverVariant;
@@ -16,39 +16,39 @@ export type ReaderArtifact<TReadFromStore extends Object, TResolverProps, TResol
16
16
  export type ReaderAstNode = ReaderScalarField | ReaderLinkedField | ReaderResolverField | ReaderRefetchField | ReaderMutationField;
17
17
  export type ReaderAst<TReadFromStore> = ReaderAstNode[];
18
18
  export type ReaderScalarField = {
19
- kind: "Scalar";
19
+ kind: 'Scalar';
20
20
  fieldName: string;
21
21
  alias: string | null;
22
22
  arguments: Arguments | null;
23
23
  };
24
24
  export type ReaderLinkedField = {
25
- kind: "Linked";
25
+ kind: 'Linked';
26
26
  fieldName: string;
27
27
  alias: string | null;
28
28
  selections: ReaderAst<unknown>;
29
29
  arguments: Arguments | null;
30
30
  };
31
31
  export type ReaderResolverVariant = {
32
- kind: "Eager";
32
+ kind: 'Eager';
33
33
  } | {
34
- kind: "Component";
34
+ kind: 'Component';
35
35
  componentName: string;
36
36
  };
37
37
  export type ReaderResolverField = {
38
- kind: "Resolver";
38
+ kind: 'Resolver';
39
39
  alias: string;
40
40
  readerArtifact: ReaderArtifact<any, any, any>;
41
41
  arguments: Arguments | null;
42
42
  usedRefetchQueries: number[];
43
43
  };
44
44
  export type ReaderRefetchField = {
45
- kind: "RefetchField";
45
+ kind: 'RefetchField';
46
46
  alias: string;
47
47
  readerArtifact: ReaderArtifact<any, any, any>;
48
48
  refetchQuery: number;
49
49
  };
50
50
  export type ReaderMutationField = {
51
- kind: "MutationField";
51
+ kind: 'MutationField';
52
52
  alias: string;
53
53
  readerArtifact: ReaderArtifact<any, any, any>;
54
54
  refetchQuery: number;
@@ -57,18 +57,18 @@ export type ReaderMutationField = {
57
57
  export type NormalizationAstNode = NormalizationScalarField | NormalizationLinkedField;
58
58
  export type NormalizationAst = NormalizationAstNode[];
59
59
  export type NormalizationScalarField = {
60
- kind: "Scalar";
60
+ kind: 'Scalar';
61
61
  fieldName: string;
62
62
  arguments: Arguments | null;
63
63
  };
64
64
  export type NormalizationLinkedField = {
65
- kind: "Linked";
65
+ kind: 'Linked';
66
66
  fieldName: string;
67
67
  arguments: Arguments | null;
68
68
  selections: NormalizationAst;
69
69
  };
70
70
  export type RefetchQueryArtifact = {
71
- kind: "RefetchQuery";
71
+ kind: 'RefetchQuery';
72
72
  queryText: string;
73
73
  normalizationAst: NormalizationAst;
74
74
  };
@@ -77,12 +77,17 @@ export type RefetchQueryArtifactWrapper = {
77
77
  allowedVariables: string[];
78
78
  };
79
79
  export type Arguments = Argument[];
80
- export type Argument = {
81
- argumentName: string;
82
- variableName: string;
80
+ export type Argument = [ArgumentName, ArgumentValue];
81
+ export type ArgumentName = string;
82
+ export type ArgumentValue = {
83
+ kind: 'Variable';
84
+ name: string;
85
+ } | {
86
+ kind: 'Literal';
87
+ value: any;
83
88
  };
84
89
  export type FragmentReference<TReadFromStore extends Object, TResolverProps, TResolverResult> = {
85
- kind: "FragmentReference";
90
+ kind: 'FragmentReference';
86
91
  readerArtifact: ReaderArtifact<TReadFromStore, TResolverProps, TResolverResult>;
87
92
  root: DataId;
88
93
  variables: {
@@ -90,9 +95,12 @@ export type FragmentReference<TReadFromStore extends Object, TResolverProps, TRe
90
95
  } | null;
91
96
  nestedRefetchQueries: RefetchQueryArtifactWrapper[];
92
97
  };
93
- export declare function iso<TResolverParameter, TResolverReturn = TResolverParameter>(_queryText: TemplateStringsArray): (x: (param: TResolverParameter) => TResolverReturn) => (param: TResolverParameter) => TResolverReturn;
94
- export declare function useLazyReference<TReadFromStore extends Object, TResolverProps, TResolverResult>(entrypoint: IsographEntrypoint<TReadFromStore, TResolverProps, TResolverResult> | typeof iso, variables: object): {
95
- queryReference: FragmentReference<TReadFromStore, TResolverProps, TResolverResult>;
98
+ export declare function iso<TResolverParameter>(_queryText: TemplateStringsArray): <TResolverReturn>(x: (param: TResolverParameter) => TResolverReturn) => (param: TResolverParameter) => TResolverReturn;
99
+ type ExtractTReadFromStore<Type> = Type extends IsographEntrypoint<infer X, any, any> ? X : never;
100
+ type ExtractResolverProps<Type> = Type extends IsographEntrypoint<any, infer X, any> ? X : never;
101
+ type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, any, infer X> ? X : never;
102
+ export declare function useLazyReference<TEntrypoint>(entrypoint: TEntrypoint | ((_: any) => any), variables: object): {
103
+ queryReference: FragmentReference<ExtractTReadFromStore<TEntrypoint>, ExtractResolverProps<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
96
104
  };
97
105
  export declare function read<TReadFromStore extends Object, TResolverProps, TResolverResult>(fragmentReference: FragmentReference<TReadFromStore, TResolverProps, TResolverResult>): TResolverResult;
98
106
  export declare function readButDoNotEvaluate<TReadFromStore extends Object>(reference: FragmentReference<TReadFromStore, unknown, unknown>): TReadFromStore;