@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.
- package/dist/EntrypointReader.d.ts +6 -0
- package/dist/EntrypointReader.js +33 -0
- package/dist/cache.d.ts +2 -2
- package/dist/cache.js +1 -1
- package/dist/componentCache.d.ts +1 -1
- package/dist/componentCache.js +1 -1
- package/dist/index.d.ts +19 -17
- package/dist/index.js +8 -4
- package/dist/useImperativeReference.d.ts +8 -0
- package/dist/useImperativeReference.js +28 -0
- package/package.json +3 -2
- package/src/EntrypointReader.tsx +20 -0
- package/src/cache.tsx +3 -3
- package/src/componentCache.ts +2 -5
- package/src/index.tsx +31 -65
- package/src/useImperativeReference.ts +58 -0
@@ -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
|
17
|
-
export declare function getOrCreateCacheForArtifact<T>(environment: IsographEnvironment, artifact: IsographEntrypoint<any,
|
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;
|
package/dist/componentCache.d.ts
CHANGED
@@ -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
|
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>;
|
package/dist/componentCache.js
CHANGED
@@ -21,7 +21,7 @@ function getOrCreateCachedComponent(environment, root, componentName, readerArti
|
|
21
21
|
variables,
|
22
22
|
nestedRefetchQueries: resolverRefetchQueries,
|
23
23
|
});
|
24
|
-
return readerArtifact.resolver(
|
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
|
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,
|
11
|
+
readerArtifact: ReaderArtifact<TReadFromStore, TResolverResult>;
|
9
12
|
nestedRefetchQueries: RefetchQueryArtifactWrapper[];
|
10
13
|
};
|
11
|
-
export type ReaderArtifact<TReadFromStore extends Object,
|
14
|
+
export type ReaderArtifact<TReadFromStore extends Object, TResolverResult> = {
|
12
15
|
kind: 'ReaderArtifact';
|
13
16
|
readerAst: ReaderAst<TReadFromStore>;
|
14
|
-
resolver: (data:
|
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
|
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
|
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
|
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,
|
94
|
+
export type FragmentReference<TReadFromStore extends Object, TResolverResult> = {
|
92
95
|
kind: 'FragmentReference';
|
93
|
-
readerArtifact: ReaderArtifact<TReadFromStore,
|
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
|
101
|
-
type
|
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>,
|
108
|
+
queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
|
107
109
|
};
|
108
|
-
export declare function useResult<TReadFromStore extends Object,
|
109
|
-
export declare function read<TReadFromStore extends Object,
|
110
|
-
export declare function readButDoNotEvaluate<TReadFromStore extends Object>(environment: IsographEnvironment, reference: FragmentReference<TReadFromStore, unknown
|
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
|
-
|
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.
|
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.
|
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
|
73
|
+
type IsoResolver = IsographEntrypoint<any, any>;
|
74
74
|
|
75
75
|
export function getOrCreateCacheForArtifact<T>(
|
76
76
|
environment: IsographEnvironment,
|
77
|
-
artifact: IsographEntrypoint<any,
|
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,
|
package/src/componentCache.ts
CHANGED
@@ -10,7 +10,7 @@ export function getOrCreateCachedComponent(
|
|
10
10
|
environment: IsographEnvironment,
|
11
11
|
root: DataId,
|
12
12
|
componentName: string,
|
13
|
-
readerArtifact: ReaderArtifact<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
|
-
|
57
|
-
|
58
|
-
|
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:
|
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
|
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
|
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
|
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,
|
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
|
208
|
-
type
|
209
|
-
Type extends IsographEntrypoint<any, infer X
|
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
|
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
|
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
|
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
|
+
}
|