@isograph/react 0.1.0 → 0.1.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.
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ import { ExtractReadFromStore, IsographEntrypoint, type FragmentReference } from './index';
3
+ export declare function EntrypointReader<TEntrypoint extends IsographEntrypoint<any, React.FC<any>>>(props: {
4
+ queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<any>>;
5
+ additionalProps?: any | void;
6
+ }): ReturnType<React.FC<any>>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.EntrypointReader = void 0;
27
+ const React = __importStar(require("react"));
28
+ const index_1 = require("./index");
29
+ function EntrypointReader(props) {
30
+ const Component = (0, index_1.useResult)(props.queryReference);
31
+ return React.createElement(Component, Object.assign({}, props.additionalProps));
32
+ }
33
+ exports.EntrypointReader = EntrypointReader;
package/dist/cache.d.ts CHANGED
@@ -13,8 +13,8 @@ declare global {
13
13
  * results.
14
14
  */
15
15
  export declare function stableCopy<T>(value: T): T;
16
- type IsoResolver = IsographEntrypoint<any, any, any>;
17
- export declare function getOrCreateCacheForArtifact<T>(environment: IsographEnvironment, artifact: IsographEntrypoint<any, any, T>, variables: object): ParentCache<PromiseWrapper<T>>;
16
+ type IsoResolver = IsographEntrypoint<any, any>;
17
+ export declare function getOrCreateCacheForArtifact<T>(environment: IsographEnvironment, artifact: IsographEntrypoint<any, T>, variables: object): ParentCache<PromiseWrapper<T>>;
18
18
  export declare function makeNetworkRequest<T>(environment: IsographEnvironment, artifact: IsoResolver, variables: object): ItemCleanupPair<PromiseWrapper<T>>;
19
19
  export declare function subscribe(environment: IsographEnvironment, callback: () => void): () => void;
20
20
  export declare function onNextChange(environment: IsographEnvironment): Promise<void>;
package/dist/cache.js CHANGED
@@ -53,7 +53,7 @@ function makeNetworkRequest(environment, artifact, variables) {
53
53
  .networkFunction(artifact.queryText, variables)
54
54
  .then((networkResponse) => {
55
55
  if (typeof window !== 'undefined' && window.__LOG) {
56
- console.log('network response', artifact);
56
+ console.log('network response', artifact, artifact);
57
57
  }
58
58
  normalizeData(environment, artifact.normalizationAst, networkResponse.data, variables, artifact.nestedRefetchQueries);
59
59
  return networkResponse.data;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { ReaderArtifact, RefetchQueryArtifactWrapper } from './index';
3
3
  import { IsographEnvironment, DataId } from './IsographEnvironment';
4
- export declare function getOrCreateCachedComponent(environment: IsographEnvironment, root: DataId, componentName: string, readerArtifact: ReaderArtifact<any, any, any>, variables: {
4
+ export declare function getOrCreateCachedComponent(environment: IsographEnvironment, root: DataId, componentName: string, readerArtifact: ReaderArtifact<any, any>, variables: {
5
5
  [key: string]: string;
6
6
  }, resolverRefetchQueries: RefetchQueryArtifactWrapper[]): import("react").FC<any>;
@@ -21,7 +21,7 @@ function getOrCreateCachedComponent(environment, root, componentName, readerArti
21
21
  variables,
22
22
  nestedRefetchQueries: resolverRefetchQueries,
23
23
  });
24
- return readerArtifact.resolver(Object.assign({ data }, additionalRuntimeProps));
24
+ return readerArtifact.resolver(data, additionalRuntimeProps);
25
25
  }
26
26
  Component.displayName = `${componentName} (id: ${root}) @component`;
27
27
  return Component;
package/dist/index.d.ts CHANGED
@@ -1,21 +1,25 @@
1
1
  import { DataId, IsographEnvironment, Link, StoreRecord } from './IsographEnvironment';
2
+ export { type PromiseWrapper } from './PromiseWrapper';
2
3
  export { makeNetworkRequest, subscribe } from './cache';
3
4
  export { IsographEnvironmentContext, ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, IsographEnvironmentProvider, type IsographEnvironmentProviderProps, type IsographNetworkFunction, type IsographStore, type Link, type StoreRecord, useIsographEnvironment, createIsographEnvironment, createIsographStore, } from './IsographEnvironment';
4
- export type IsographEntrypoint<TReadFromStore extends Object, TResolverProps, TResolverResult> = {
5
+ export { useImperativeReference } from './useImperativeReference';
6
+ export { EntrypointReader } from './EntrypointReader';
7
+ export type IsographEntrypoint<TReadFromStore extends Object, TResolverResult> = {
5
8
  kind: 'Entrypoint';
6
9
  queryText: string;
7
10
  normalizationAst: NormalizationAst;
8
- readerArtifact: ReaderArtifact<TReadFromStore, TResolverProps, TResolverResult>;
11
+ readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
9
12
  nestedRefetchQueries: RefetchQueryArtifactWrapper[];
10
13
  };
11
- export type ReaderArtifact<TReadFromStore extends Object, TResolverProps, TResolverResult> = {
14
+ export type ReaderArtifact<TReadFromStore extends Object, TResolverResult> = {
12
15
  kind: 'ReaderArtifact';
13
16
  readerAst: ReaderAst<TReadFromStore>;
14
- resolver: (data: TResolverProps) => TResolverResult;
17
+ resolver: (data: TReadFromStore, runtimeProps: any) => TResolverResult;
15
18
  variant: ReaderResolverVariant;
16
19
  };
17
20
  export type ReaderAstNode = ReaderScalarField | ReaderLinkedField | ReaderResolverField | ReaderRefetchField | ReaderMutationField;
18
21
  export type ReaderAst<TReadFromStore> = ReaderAstNode[];
22
+ export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends (arg1: any, arg2: infer P) => any ? P : never;
19
23
  export type ReaderScalarField = {
20
24
  kind: 'Scalar';
21
25
  fieldName: string;
@@ -38,22 +42,21 @@ export type ReaderResolverVariant = {
38
42
  export type ReaderResolverField = {
39
43
  kind: 'Resolver';
40
44
  alias: string;
41
- readerArtifact: ReaderArtifact<any, any, any>;
45
+ readerArtifact: ReaderArtifact<any, any>;
42
46
  arguments: Arguments | null;
43
47
  usedRefetchQueries: number[];
44
48
  };
45
49
  export type ReaderRefetchField = {
46
50
  kind: 'RefetchField';
47
51
  alias: string;
48
- readerArtifact: ReaderArtifact<any, any, any>;
52
+ readerArtifact: ReaderArtifact<any, any>;
49
53
  refetchQuery: number;
50
54
  };
51
55
  export type ReaderMutationField = {
52
56
  kind: 'MutationField';
53
57
  alias: string;
54
- readerArtifact: ReaderArtifact<any, any, any>;
58
+ readerArtifact: ReaderArtifact<any, any>;
55
59
  refetchQuery: number;
56
- allowedVariables: string[];
57
60
  };
58
61
  export type NormalizationAstNode = NormalizationScalarField | NormalizationLinkedField;
59
62
  export type NormalizationAst = NormalizationAstNode[];
@@ -88,26 +91,25 @@ export type ArgumentValue = {
88
91
  value: any;
89
92
  };
90
93
  type Variable = any;
91
- export type FragmentReference<TReadFromStore extends Object, TResolverProps, TResolverResult> = {
94
+ export type FragmentReference<TReadFromStore extends Object, TResolverResult> = {
92
95
  kind: 'FragmentReference';
93
- readerArtifact: ReaderArtifact<TReadFromStore, TResolverProps, TResolverResult>;
96
+ readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
94
97
  root: DataId;
95
98
  variables: {
96
99
  [index: string]: Variable;
97
100
  } | null;
98
101
  nestedRefetchQueries: RefetchQueryArtifactWrapper[];
99
102
  };
100
- type ExtractReadFromStore<Type> = Type extends IsographEntrypoint<infer X, any, any> ? X : never;
101
- type ExtractResolverProps<Type> = Type extends IsographEntrypoint<any, infer X, any> ? X : never;
102
- type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, any, infer X> ? X : never;
103
+ export type ExtractReadFromStore<Type> = Type extends IsographEntrypoint<infer X, any> ? X : never;
104
+ export type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, infer X> ? X : never;
103
105
  export declare function useLazyReference<TEntrypoint>(entrypoint: TEntrypoint | ((_: any) => any), variables: {
104
106
  [key: string]: Variable;
105
107
  }): {
106
- queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverProps<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
108
+ queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
107
109
  };
108
- export declare function useResult<TReadFromStore extends Object, TResolverProps, TResolverResult>(fragmentReference: FragmentReference<TReadFromStore, TResolverProps, TResolverResult>): TResolverResult;
109
- export declare function read<TReadFromStore extends Object, TResolverProps, TResolverResult>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, TResolverProps, TResolverResult>): TResolverResult;
110
- export declare function readButDoNotEvaluate<TReadFromStore extends Object>(environment: IsographEnvironment, reference: FragmentReference<TReadFromStore, unknown, unknown>): TReadFromStore;
110
+ export declare function useResult<TReadFromStore extends Object, TResolverResult>(fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
111
+ export declare function read<TReadFromStore extends Object, TResolverResult>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
112
+ export declare function readButDoNotEvaluate<TReadFromStore extends Object>(environment: IsographEnvironment, reference: FragmentReference<TReadFromStore, unknown>): TReadFromStore;
111
113
  export declare function defaultMissingFieldHandler(_storeRecord: StoreRecord, _root: DataId, fieldName: string, arguments_: {
112
114
  [index: string]: any;
113
115
  } | null, variables: {
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultMissingFieldHandler = exports.readButDoNotEvaluate = exports.read = exports.useResult = exports.useLazyReference = exports.createIsographStore = exports.createIsographEnvironment = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.ROOT_ID = exports.IsographEnvironmentContext = exports.subscribe = exports.makeNetworkRequest = void 0;
3
+ exports.defaultMissingFieldHandler = exports.readButDoNotEvaluate = exports.read = exports.useResult = exports.useLazyReference = exports.EntrypointReader = exports.useImperativeReference = exports.createIsographStore = exports.createIsographEnvironment = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.ROOT_ID = exports.IsographEnvironmentContext = exports.subscribe = exports.makeNetworkRequest = void 0;
4
4
  const cache_1 = require("./cache");
5
5
  const react_disposable_state_1 = require("@isograph/react-disposable-state");
6
6
  const componentCache_1 = require("./componentCache");
@@ -16,6 +16,10 @@ Object.defineProperty(exports, "IsographEnvironmentProvider", { enumerable: true
16
16
  Object.defineProperty(exports, "useIsographEnvironment", { enumerable: true, get: function () { return IsographEnvironment_2.useIsographEnvironment; } });
17
17
  Object.defineProperty(exports, "createIsographEnvironment", { enumerable: true, get: function () { return IsographEnvironment_2.createIsographEnvironment; } });
18
18
  Object.defineProperty(exports, "createIsographStore", { enumerable: true, get: function () { return IsographEnvironment_2.createIsographStore; } });
19
+ var useImperativeReference_1 = require("./useImperativeReference");
20
+ Object.defineProperty(exports, "useImperativeReference", { enumerable: true, get: function () { return useImperativeReference_1.useImperativeReference; } });
21
+ var EntrypointReader_1 = require("./EntrypointReader");
22
+ Object.defineProperty(exports, "EntrypointReader", { enumerable: true, get: function () { return EntrypointReader_1.EntrypointReader; } });
19
23
  function assertIsEntrypoint(value) {
20
24
  if (typeof value === 'function')
21
25
  throw new Error('Not a string');
@@ -214,7 +218,6 @@ function readData(environment, ast, root, variables, nestedRefetchQueries) {
214
218
  const allowedVariables = refetchQuery.allowedVariables;
215
219
  target[field.alias] = field.readerArtifact.resolver(environment,
216
220
  // resolvers for refetch fields take 3 args, and this is not reflected in types
217
- // @ts-expect-error
218
221
  refetchQueryArtifact, Object.assign(Object.assign({}, data.data), filterVariables(variables, allowedVariables)));
219
222
  }
220
223
  break;
@@ -241,9 +244,9 @@ function readData(environment, ast, root, variables, nestedRefetchQueries) {
241
244
  const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
242
245
  const refetchQueryArtifact = refetchQuery.artifact;
243
246
  const allowedVariables = refetchQuery.allowedVariables;
244
- target[field.alias] = field.readerArtifact.resolver(environment,
247
+ target[field.alias] = field.readerArtifact.resolver(environment, refetchQueryArtifact,
245
248
  // @ts-expect-error
246
- refetchQueryArtifact, data.data, filterVariables(variables, allowedVariables));
249
+ data.data, filterVariables(variables, allowedVariables));
247
250
  }
248
251
  break;
249
252
  }
@@ -261,6 +264,7 @@ function readData(environment, ast, root, variables, nestedRefetchQueries) {
261
264
  };
262
265
  }
263
266
  else {
267
+ // @ts-expect-error
264
268
  target[field.alias] = field.readerArtifact.resolver(data.data);
265
269
  }
266
270
  }
@@ -0,0 +1,8 @@
1
+ import { UnassignedState } from '@isograph/react-disposable-state';
2
+ import { type IsographEntrypoint, type FragmentReference, ExtractReadFromStore, ExtractResolverResult } from './index';
3
+ export declare function useImperativeReference<TEntrypoint extends IsographEntrypoint<any, any>>(entrypoint: TEntrypoint): {
4
+ queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverResult<TEntrypoint>> | UnassignedState;
5
+ loadQueryReference: (variables: {
6
+ [index: string]: string;
7
+ }) => void;
8
+ };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useImperativeReference = void 0;
4
+ const react_disposable_state_1 = require("@isograph/react-disposable-state");
5
+ const index_1 = require("./index");
6
+ function useImperativeReference(entrypoint) {
7
+ const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
8
+ const environment = (0, index_1.useIsographEnvironment)();
9
+ return {
10
+ queryReference: state,
11
+ loadQueryReference: (variables) => {
12
+ const [_networkRequest, disposeNetworkRequest] = (0, index_1.makeNetworkRequest)(environment, entrypoint, variables);
13
+ setState([
14
+ {
15
+ kind: 'FragmentReference',
16
+ readerArtifact: entrypoint.readerArtifact,
17
+ root: index_1.ROOT_ID,
18
+ variables,
19
+ nestedRefetchQueries: entrypoint.nestedRefetchQueries,
20
+ },
21
+ () => {
22
+ disposeNetworkRequest();
23
+ },
24
+ ]);
25
+ },
26
+ };
27
+ }
28
+ exports.useImperativeReference = useImperativeReference;
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Use Isograph with React",
5
+ "homepage": "https://isograph.dev",
5
6
  "main": "dist/index.js",
6
7
  "types": "dist/index.d.ts",
7
8
  "author": "Isograph Labs",
@@ -15,7 +16,7 @@
15
16
  "prepack": "yarn run test && yarn run compile"
16
17
  },
17
18
  "dependencies": {
18
- "@isograph/disposable-types": "0.1.0",
19
+ "@isograph/disposable-types": "0.1.1",
19
20
  "@isograph/react-disposable-state": "*",
20
21
  "react": "^18.2.0"
21
22
  },
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import {
3
+ ExtractReadFromStore,
4
+ IsographEntrypoint,
5
+ type FragmentReference,
6
+ useResult,
7
+ } from './index';
8
+
9
+ export function EntrypointReader<
10
+ TEntrypoint extends IsographEntrypoint<any, React.FC<any>>,
11
+ >(props: {
12
+ queryReference: FragmentReference<
13
+ ExtractReadFromStore<TEntrypoint>,
14
+ React.FC<any>
15
+ >;
16
+ additionalProps?: any | void;
17
+ }): ReturnType<React.FC<any>> {
18
+ const Component = useResult(props.queryReference);
19
+ return <Component {...props.additionalProps} />;
20
+ }
package/src/cache.tsx CHANGED
@@ -70,11 +70,11 @@ export function stableCopy<T>(value: T): T {
70
70
  return stable as any;
71
71
  }
72
72
 
73
- type IsoResolver = IsographEntrypoint<any, any, any>;
73
+ type IsoResolver = IsographEntrypoint<any, any>;
74
74
 
75
75
  export function getOrCreateCacheForArtifact<T>(
76
76
  environment: IsographEnvironment,
77
- artifact: IsographEntrypoint<any, any, T>,
77
+ artifact: IsographEntrypoint<any, T>,
78
78
  variables: object,
79
79
  ): ParentCache<PromiseWrapper<T>> {
80
80
  const cacheKey = artifact.queryText + JSON.stringify(stableCopy(variables));
@@ -95,7 +95,7 @@ export function makeNetworkRequest<T>(
95
95
  .networkFunction(artifact.queryText, variables)
96
96
  .then((networkResponse) => {
97
97
  if (typeof window !== 'undefined' && window.__LOG) {
98
- console.log('network response', artifact);
98
+ console.log('network response', artifact, artifact);
99
99
  }
100
100
  normalizeData(
101
101
  environment,
@@ -10,7 +10,7 @@ export function getOrCreateCachedComponent(
10
10
  environment: IsographEnvironment,
11
11
  root: DataId,
12
12
  componentName: string,
13
- readerArtifact: ReaderArtifact<any, any, any>,
13
+ readerArtifact: ReaderArtifact<any, any>,
14
14
  variables: { [key: string]: string },
15
15
  resolverRefetchQueries: RefetchQueryArtifactWrapper[],
16
16
  ) {
@@ -32,10 +32,7 @@ export function getOrCreateCachedComponent(
32
32
  nestedRefetchQueries: resolverRefetchQueries,
33
33
  });
34
34
 
35
- return readerArtifact.resolver({
36
- data,
37
- ...additionalRuntimeProps,
38
- });
35
+ return readerArtifact.resolver(data, additionalRuntimeProps);
39
36
  }
40
37
  Component.displayName = `${componentName} (id: ${root}) @component`;
41
38
  return Component;
package/src/index.tsx CHANGED
@@ -18,6 +18,7 @@ import {
18
18
  } from './IsographEnvironment';
19
19
  import { useEffect, useState } from 'react';
20
20
 
21
+ export { type PromiseWrapper } from './PromiseWrapper';
21
22
  export { makeNetworkRequest, subscribe } from './cache';
22
23
  export {
23
24
  IsographEnvironmentContext,
@@ -35,32 +36,27 @@ export {
35
36
  createIsographEnvironment,
36
37
  createIsographStore,
37
38
  } from './IsographEnvironment';
39
+ export { useImperativeReference } from './useImperativeReference';
40
+ export { EntrypointReader } from './EntrypointReader';
38
41
 
39
42
  // This type should be treated as an opaque type.
40
43
  export type IsographEntrypoint<
41
44
  TReadFromStore extends Object,
42
- TResolverProps,
43
45
  TResolverResult,
44
46
  > = {
45
47
  kind: 'Entrypoint';
46
48
  queryText: string;
47
49
  normalizationAst: NormalizationAst;
48
- readerArtifact: ReaderArtifact<
49
- TReadFromStore,
50
- TResolverProps,
51
- TResolverResult
52
- >;
50
+ readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
53
51
  nestedRefetchQueries: RefetchQueryArtifactWrapper[];
54
52
  };
55
53
 
56
- export type ReaderArtifact<
57
- TReadFromStore extends Object,
58
- TResolverProps,
59
- TResolverResult,
60
- > = {
54
+ // TODO this should probably be at least three distinct types, for @component,
55
+ // non-@component and refetch resolvers
56
+ export type ReaderArtifact<TReadFromStore extends Object, TResolverResult> = {
61
57
  kind: 'ReaderArtifact';
62
58
  readerAst: ReaderAst<TReadFromStore>;
63
- resolver: (data: TResolverProps) => TResolverResult;
59
+ resolver: (data: TReadFromStore, runtimeProps: any) => TResolverResult;
64
60
  variant: ReaderResolverVariant;
65
61
  };
66
62
 
@@ -74,6 +70,9 @@ export type ReaderAstNode =
74
70
  // @ts-ignore
75
71
  export type ReaderAst<TReadFromStore> = ReaderAstNode[];
76
72
 
73
+ export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> =
74
+ T extends (arg1: any, arg2: infer P) => any ? P : never;
75
+
77
76
  export type ReaderScalarField = {
78
77
  kind: 'Scalar';
79
78
  fieldName: string;
@@ -97,7 +96,7 @@ export type ReaderResolverVariant =
97
96
  export type ReaderResolverField = {
98
97
  kind: 'Resolver';
99
98
  alias: string;
100
- readerArtifact: ReaderArtifact<any, any, any>;
99
+ readerArtifact: ReaderArtifact<any, any>;
101
100
  arguments: Arguments | null;
102
101
  usedRefetchQueries: number[];
103
102
  };
@@ -106,7 +105,7 @@ export type ReaderRefetchField = {
106
105
  kind: 'RefetchField';
107
106
  alias: string;
108
107
  // TODO this bad modeling. A refetch field cannot have variant: "Component" (I think)
109
- readerArtifact: ReaderArtifact<any, any, any>;
108
+ readerArtifact: ReaderArtifact<any, any>;
110
109
  refetchQuery: number;
111
110
  };
112
111
 
@@ -114,9 +113,8 @@ export type ReaderMutationField = {
114
113
  kind: 'MutationField';
115
114
  alias: string;
116
115
  // TODO this bad modeling. A mutation field cannot have variant: "Component" (I think)
117
- readerArtifact: ReaderArtifact<any, any, any>;
116
+ readerArtifact: ReaderArtifact<any, any>;
118
117
  refetchQuery: number;
119
- allowedVariables: string[];
120
118
  };
121
119
 
122
120
  export type NormalizationAstNode =
@@ -169,46 +167,31 @@ type Variable = any;
169
167
 
170
168
  export type FragmentReference<
171
169
  TReadFromStore extends Object,
172
- TResolverProps,
173
170
  TResolverResult,
174
171
  > = {
175
172
  kind: 'FragmentReference';
176
- readerArtifact: ReaderArtifact<
177
- TReadFromStore,
178
- TResolverProps,
179
- TResolverResult
180
- >;
173
+ readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
181
174
  root: DataId;
182
175
  variables: { [index: string]: Variable } | null;
183
176
  // TODO: We should instead have ReaderAst<TResolverProps>
184
177
  nestedRefetchQueries: RefetchQueryArtifactWrapper[];
185
178
  };
186
179
 
187
- function assertIsEntrypoint<
188
- TReadFromStore extends Object,
189
- TResolverProps,
190
- TResolverResult,
191
- >(
180
+ function assertIsEntrypoint<TReadFromStore extends Object, TResolverResult>(
192
181
  value:
193
- | IsographEntrypoint<TReadFromStore, TResolverProps, TResolverResult>
182
+ | IsographEntrypoint<TReadFromStore, TResolverResult>
194
183
  | ((_: any) => any)
195
184
  // Temporarily, allow any here. Once we automatically provide
196
185
  // types to entrypoints, we probably don't need this.
197
186
  | any,
198
- ): asserts value is IsographEntrypoint<
199
- TReadFromStore,
200
- TResolverProps,
201
- TResolverResult
202
- > {
187
+ ): asserts value is IsographEntrypoint<TReadFromStore, TResolverResult> {
203
188
  if (typeof value === 'function') throw new Error('Not a string');
204
189
  }
205
190
 
206
- type ExtractReadFromStore<Type> =
207
- Type extends IsographEntrypoint<infer X, any, any> ? X : never;
208
- type ExtractResolverProps<Type> =
209
- Type extends IsographEntrypoint<any, infer X, any> ? X : never;
210
- type ExtractResolverResult<Type> =
211
- Type extends IsographEntrypoint<any, any, infer X> ? X : never;
191
+ export type ExtractReadFromStore<Type> =
192
+ Type extends IsographEntrypoint<infer X, any> ? X : never;
193
+ export type ExtractResolverResult<Type> =
194
+ Type extends IsographEntrypoint<any, infer X> ? X : never;
212
195
  // Note: we cannot write TEntrypoint extends IsographEntrypoint<any, any, any>, or else
213
196
  // if we do not explicitly pass a type, the read out type will be any.
214
197
  // We cannot write TEntrypoint extends IsographEntrypoint<never, never, never>, or else
@@ -217,21 +200,19 @@ export function useLazyReference<TEntrypoint>(
217
200
  entrypoint:
218
201
  | TEntrypoint
219
202
  // Temporarily, we need to allow useLazyReference to take the result of calling
220
- // iso`...`. At runtime, we confirm that the passed-in `iso` literal is actually
203
+ // iso(`...`). At runtime, we confirm that the passed-in `iso` literal is actually
221
204
  // an entrypoint.
222
205
  | ((_: any) => any),
223
206
  variables: { [key: string]: Variable },
224
207
  ): {
225
208
  queryReference: FragmentReference<
226
209
  ExtractReadFromStore<TEntrypoint>,
227
- ExtractResolverProps<TEntrypoint>,
228
210
  ExtractResolverResult<TEntrypoint>
229
211
  >;
230
212
  } {
231
213
  const environment = useIsographEnvironment();
232
214
  assertIsEntrypoint<
233
215
  ExtractReadFromStore<TEntrypoint>,
234
- ExtractResolverProps<TEntrypoint>,
235
216
  ExtractResolverResult<TEntrypoint>
236
217
  >(entrypoint);
237
218
  const cache = getOrCreateCacheForArtifact<ExtractResolverResult<TEntrypoint>>(
@@ -258,16 +239,8 @@ export function useLazyReference<TEntrypoint>(
258
239
  };
259
240
  }
260
241
 
261
- export function useResult<
262
- TReadFromStore extends Object,
263
- TResolverProps,
264
- TResolverResult,
265
- >(
266
- fragmentReference: FragmentReference<
267
- TReadFromStore,
268
- TResolverProps,
269
- TResolverResult
270
- >,
242
+ export function useResult<TReadFromStore extends Object, TResolverResult>(
243
+ fragmentReference: FragmentReference<TReadFromStore, TResolverResult>,
271
244
  ): TResolverResult {
272
245
  const environment = useIsographEnvironment();
273
246
 
@@ -281,17 +254,9 @@ export function useResult<
281
254
  return read(environment, fragmentReference);
282
255
  }
283
256
 
284
- export function read<
285
- TReadFromStore extends Object,
286
- TResolverProps,
287
- TResolverResult,
288
- >(
257
+ export function read<TReadFromStore extends Object, TResolverResult>(
289
258
  environment: IsographEnvironment,
290
- fragmentReference: FragmentReference<
291
- TReadFromStore,
292
- TResolverProps,
293
- TResolverResult
294
- >,
259
+ fragmentReference: FragmentReference<TReadFromStore, TResolverResult>,
295
260
  ): TResolverResult {
296
261
  const variant = fragmentReference.readerArtifact.variant;
297
262
  if (variant.kind === 'Eager') {
@@ -325,7 +290,7 @@ export function read<
325
290
 
326
291
  export function readButDoNotEvaluate<TReadFromStore extends Object>(
327
292
  environment: IsographEnvironment,
328
- reference: FragmentReference<TReadFromStore, unknown, unknown>,
293
+ reference: FragmentReference<TReadFromStore, unknown>,
329
294
  ): TReadFromStore {
330
295
  const response = readData(
331
296
  environment,
@@ -514,8 +479,8 @@ function readData<TReadFromStore>(
514
479
  target[field.alias] = field.readerArtifact.resolver(
515
480
  environment,
516
481
  // resolvers for refetch fields take 3 args, and this is not reflected in types
517
- // @ts-expect-error
518
482
  refetchQueryArtifact,
483
+ // @ts-expect-error
519
484
  {
520
485
  ...data.data,
521
486
  // TODO continue from here
@@ -555,8 +520,8 @@ function readData<TReadFromStore>(
555
520
 
556
521
  target[field.alias] = field.readerArtifact.resolver(
557
522
  environment,
558
- // @ts-expect-error
559
523
  refetchQueryArtifact,
524
+ // @ts-expect-error
560
525
  data.data,
561
526
  filterVariables(variables, allowedVariables),
562
527
  );
@@ -585,6 +550,7 @@ function readData<TReadFromStore>(
585
550
  nestedReason: data,
586
551
  };
587
552
  } else {
553
+ // @ts-expect-error
588
554
  target[field.alias] = field.readerArtifact.resolver(data.data);
589
555
  }
590
556
  } else if (variant.kind === 'Component') {
@@ -0,0 +1,58 @@
1
+ import {
2
+ UnassignedState,
3
+ useUpdatableDisposableState,
4
+ } from '@isograph/react-disposable-state';
5
+ import {
6
+ type IsographEntrypoint,
7
+ type FragmentReference,
8
+ ExtractReadFromStore,
9
+ ExtractResolverResult,
10
+ ROOT_ID,
11
+ useIsographEnvironment,
12
+ makeNetworkRequest,
13
+ } from './index';
14
+
15
+ export function useImperativeReference<
16
+ TEntrypoint extends IsographEntrypoint<any, any>,
17
+ >(
18
+ entrypoint: TEntrypoint,
19
+ ): {
20
+ queryReference:
21
+ | FragmentReference<
22
+ ExtractReadFromStore<TEntrypoint>,
23
+ ExtractResolverResult<TEntrypoint>
24
+ >
25
+ | UnassignedState;
26
+ loadQueryReference: (variables: { [index: string]: string }) => void;
27
+ } {
28
+ const { state, setState } =
29
+ useUpdatableDisposableState<
30
+ FragmentReference<
31
+ ExtractReadFromStore<TEntrypoint>,
32
+ ExtractResolverResult<TEntrypoint>
33
+ >
34
+ >();
35
+ const environment = useIsographEnvironment();
36
+ return {
37
+ queryReference: state,
38
+ loadQueryReference: (variables: { [index: string]: string }) => {
39
+ const [_networkRequest, disposeNetworkRequest] = makeNetworkRequest(
40
+ environment,
41
+ entrypoint,
42
+ variables,
43
+ );
44
+ setState([
45
+ {
46
+ kind: 'FragmentReference',
47
+ readerArtifact: entrypoint.readerArtifact,
48
+ root: ROOT_ID,
49
+ variables,
50
+ nestedRefetchQueries: entrypoint.nestedRefetchQueries,
51
+ },
52
+ () => {
53
+ disposeNetworkRequest();
54
+ },
55
+ ]);
56
+ },
57
+ };
58
+ }