@isograph/react 0.0.0-main-0e7d8883 → 0.0.0-main-4b202045
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 -2
- package/dist/EntrypointReader.js +2 -2
- package/dist/IsographEnvironment.d.ts +1 -0
- package/dist/IsographEnvironment.js +14 -1
- package/dist/cache.d.ts +2 -1
- package/dist/componentCache.d.ts +2 -1
- package/dist/componentCache.js +2 -2
- package/dist/entrypoint.d.ts +3 -1
- package/dist/garbageCollection.d.ts +1 -1
- package/dist/garbageCollection.js +2 -3
- package/dist/index.d.ts +2 -22
- package/dist/index.js +16 -54
- package/dist/read.d.ts +1 -1
- package/dist/read.js +2 -3
- package/dist/reader.d.ts +1 -1
- package/dist/useImperativeReference.d.ts +2 -1
- package/dist/useImperativeReference.js +6 -4
- package/dist/useLazyReference.d.ts +7 -0
- package/dist/useLazyReference.js +30 -0
- package/dist/useResult.d.ts +1 -1
- package/dist/util.d.ts +11 -0
- package/dist/util.js +2 -0
- package/package.json +3 -3
- package/src/EntrypointReader.tsx +20 -15
- package/src/IsographEnvironment.tsx +13 -0
- package/src/cache.tsx +9 -11
- package/src/componentCache.ts +3 -5
- package/src/entrypoint.ts +6 -1
- package/src/garbageCollection.ts +2 -1
- package/src/index.tsx +8 -88
- package/src/read.ts +3 -1
- package/src/reader.ts +1 -1
- package/src/useImperativeReference.ts +6 -6
- package/src/useLazyReference.ts +58 -0
- package/src/useResult.ts +1 -1
- package/src/util.ts +15 -0
@@ -1,6 +1,10 @@
|
|
1
1
|
import * as React from 'react';
|
2
|
-
import { ExtractReadFromStore, IsographEntrypoint
|
3
|
-
|
2
|
+
import { ExtractReadFromStore, IsographEntrypoint } from './entrypoint';
|
3
|
+
import { FragmentReference } from './FragmentReference';
|
4
|
+
export declare function EntrypointReader<TProps extends Record<any, any>, TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>>(props: TProps extends Record<string, never> ? {
|
5
|
+
queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<TProps>>;
|
6
|
+
additionalProps?: TProps;
|
7
|
+
} : {
|
4
8
|
queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<TProps>>;
|
5
9
|
additionalProps: TProps;
|
6
10
|
}): React.ReactNode;
|
package/dist/EntrypointReader.js
CHANGED
@@ -25,9 +25,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
26
|
exports.EntrypointReader = void 0;
|
27
27
|
const React = __importStar(require("react"));
|
28
|
-
const
|
28
|
+
const useResult_1 = require("./useResult");
|
29
29
|
function EntrypointReader(props) {
|
30
|
-
const Component = (0,
|
30
|
+
const Component = (0, useResult_1.useResult)(props.queryReference);
|
31
31
|
return React.createElement(Component, Object.assign({}, props.additionalProps));
|
32
32
|
}
|
33
33
|
exports.EntrypointReader = EntrypointReader;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = void 0;
|
3
|
+
exports.assertLink = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = void 0;
|
4
4
|
exports.ROOT_ID = '__ROOT';
|
5
5
|
const DEFAULT_GC_BUFFER_SIZE = 10;
|
6
6
|
function createIsographEnvironment(store, networkFunction, missingFieldHandler) {
|
@@ -34,3 +34,16 @@ function defaultMissingFieldHandler(_storeRecord, _root, fieldName, arguments_,
|
|
34
34
|
}
|
35
35
|
}
|
36
36
|
exports.defaultMissingFieldHandler = defaultMissingFieldHandler;
|
37
|
+
function assertLink(link) {
|
38
|
+
if (Array.isArray(link)) {
|
39
|
+
throw new Error('Unexpected array');
|
40
|
+
}
|
41
|
+
if (link == null) {
|
42
|
+
return null;
|
43
|
+
}
|
44
|
+
if (typeof link === 'object') {
|
45
|
+
return link;
|
46
|
+
}
|
47
|
+
throw new Error('Invalid link');
|
48
|
+
}
|
49
|
+
exports.assertLink = assertLink;
|
package/dist/cache.d.ts
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
import { ItemCleanupPair, ParentCache } from '@isograph/react-disposable-state';
|
2
2
|
import { PromiseWrapper } from './PromiseWrapper';
|
3
|
-
import { IsographEntrypoint, NormalizationLinkedField, NormalizationScalarField, ReaderLinkedField, ReaderScalarField } from './index';
|
4
3
|
import { type IsographEnvironment } from './IsographEnvironment';
|
4
|
+
import { IsographEntrypoint, NormalizationLinkedField, NormalizationScalarField } from './entrypoint';
|
5
|
+
import { ReaderLinkedField, ReaderScalarField } from './reader';
|
5
6
|
declare global {
|
6
7
|
interface Window {
|
7
8
|
__LOG: boolean;
|
package/dist/componentCache.d.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
/// <reference types="react" />
|
2
|
-
import {
|
2
|
+
import { RefetchQueryArtifactWrapper } from './entrypoint';
|
3
3
|
import { IsographEnvironment, DataId } from './IsographEnvironment';
|
4
|
+
import { ReaderArtifact } from './reader';
|
4
5
|
export declare function getOrCreateCachedComponent(environment: IsographEnvironment, root: DataId, componentName: string, readerArtifact: ReaderArtifact<any, any>, variables: {
|
5
6
|
[key: string]: string;
|
6
7
|
}, resolverRefetchQueries: RefetchQueryArtifactWrapper[]): import("react").FC<any>;
|
package/dist/componentCache.js
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.getOrCreateCachedComponent = void 0;
|
4
|
-
const index_1 = require("./index");
|
5
4
|
const cache_1 = require("./cache");
|
5
|
+
const read_1 = require("./read");
|
6
6
|
function getOrCreateCachedComponent(environment, root, componentName, readerArtifact, variables, resolverRefetchQueries) {
|
7
7
|
var _a, _b, _c;
|
8
8
|
const cachedComponentsById = environment.componentCache;
|
@@ -14,7 +14,7 @@ function getOrCreateCachedComponent(environment, root, componentName, readerArti
|
|
14
14
|
byArgs[stringifiedArgs] =
|
15
15
|
(_c = byArgs[stringifiedArgs]) !== null && _c !== void 0 ? _c : (() => {
|
16
16
|
function Component(additionalRuntimeProps) {
|
17
|
-
const data = (0,
|
17
|
+
const data = (0, read_1.readButDoNotEvaluate)(environment, {
|
18
18
|
kind: 'FragmentReference',
|
19
19
|
readerArtifact: readerArtifact,
|
20
20
|
root,
|
package/dist/entrypoint.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import { Arguments } from './index';
|
2
1
|
import { ReaderArtifact } from './reader';
|
2
|
+
import { Arguments } from './util';
|
3
3
|
export type IsographEntrypoint<TReadFromStore extends Object, TResolverResult> = {
|
4
4
|
kind: 'Entrypoint';
|
5
5
|
queryText: string;
|
@@ -30,3 +30,5 @@ export type RefetchQueryArtifactWrapper = {
|
|
30
30
|
allowedVariables: string[];
|
31
31
|
};
|
32
32
|
export declare function assertIsEntrypoint<TReadFromStore extends Object, TResolverResult>(value: IsographEntrypoint<TReadFromStore, TResolverResult> | ((_: any) => any) | any): asserts value is IsographEntrypoint<TReadFromStore, TResolverResult>;
|
33
|
+
export type ExtractReadFromStore<Type> = Type extends IsographEntrypoint<infer X, any> ? X : never;
|
34
|
+
export type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, infer X> ? X : never;
|
@@ -2,7 +2,6 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.garbageCollectEnvironment = exports.retainQuery = exports.unretainQuery = void 0;
|
4
4
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
5
|
-
const index_1 = require("./index");
|
6
5
|
const cache_1 = require("./cache");
|
7
6
|
function unretainQuery(environment, retainedQuery) {
|
8
7
|
environment.retainedQueries.delete(retainedQuery);
|
@@ -48,14 +47,14 @@ function recordReachableIdsFromRecord(store, currentRecord, mutableRetainedIds,
|
|
48
47
|
const ids = [];
|
49
48
|
if (Array.isArray(linkedFieldOrFields)) {
|
50
49
|
for (const maybeLink of linkedFieldOrFields) {
|
51
|
-
const link = (0,
|
50
|
+
const link = (0, IsographEnvironment_1.assertLink)(maybeLink);
|
52
51
|
if (link != null) {
|
53
52
|
ids.push(link.__link);
|
54
53
|
}
|
55
54
|
}
|
56
55
|
}
|
57
56
|
else {
|
58
|
-
const link = (0,
|
57
|
+
const link = (0, IsographEnvironment_1.assertLink)(linkedFieldOrFields);
|
59
58
|
if (link != null) {
|
60
59
|
ids.push(link.__link);
|
61
60
|
}
|
package/dist/index.d.ts
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
import { DataTypeValue, Link } from './IsographEnvironment';
|
2
|
-
import { IsographEntrypoint } from './entrypoint';
|
3
|
-
import { FragmentReference, Variable } from './FragmentReference';
|
4
1
|
export { retainQuery, unretainQuery, type RetainedQuery, garbageCollectEnvironment, } from './garbageCollection';
|
5
2
|
export { type PromiseWrapper } from './PromiseWrapper';
|
6
3
|
export { makeNetworkRequest, subscribe } from './cache';
|
@@ -13,22 +10,5 @@ export { NormalizationAst, NormalizationAstNode, NormalizationLinkedField, Norma
|
|
13
10
|
export { read, readButDoNotEvaluate } from './read';
|
14
11
|
export { useResult } from './useResult';
|
15
12
|
export { type FragmentReference } from './FragmentReference';
|
16
|
-
export
|
17
|
-
export
|
18
|
-
export type Argument = [ArgumentName, ArgumentValue];
|
19
|
-
export type ArgumentName = string;
|
20
|
-
export type ArgumentValue = {
|
21
|
-
kind: 'Variable';
|
22
|
-
name: string;
|
23
|
-
} | {
|
24
|
-
kind: 'Literal';
|
25
|
-
value: any;
|
26
|
-
};
|
27
|
-
export type ExtractReadFromStore<Type> = Type extends IsographEntrypoint<infer X, any> ? X : never;
|
28
|
-
export type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, infer X> ? X : never;
|
29
|
-
export declare function useLazyReference<TEntrypoint>(entrypoint: TEntrypoint | ((_: any) => any), variables: {
|
30
|
-
[key: string]: Variable;
|
31
|
-
}): {
|
32
|
-
queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
|
33
|
-
};
|
34
|
-
export declare function assertLink(link: DataTypeValue): Link | null;
|
13
|
+
export { useLazyReference } from './useLazyReference';
|
14
|
+
export { ExtractSecondParam, Argument, ArgumentName, ArgumentValue, Arguments, } from './util';
|
package/dist/index.js
CHANGED
@@ -1,69 +1,31 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
4
|
-
const cache_1 = require("./cache");
|
5
|
-
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
6
|
-
const IsographEnvironment_1 = require("./IsographEnvironment");
|
7
|
-
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
8
|
-
const entrypoint_1 = require("./entrypoint");
|
3
|
+
exports.useLazyReference = exports.useResult = exports.readButDoNotEvaluate = exports.read = exports.assertIsEntrypoint = exports.EntrypointReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.subscribe = exports.makeNetworkRequest = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
|
9
4
|
var garbageCollection_1 = require("./garbageCollection");
|
10
5
|
Object.defineProperty(exports, "retainQuery", { enumerable: true, get: function () { return garbageCollection_1.retainQuery; } });
|
11
6
|
Object.defineProperty(exports, "unretainQuery", { enumerable: true, get: function () { return garbageCollection_1.unretainQuery; } });
|
12
7
|
Object.defineProperty(exports, "garbageCollectEnvironment", { enumerable: true, get: function () { return garbageCollection_1.garbageCollectEnvironment; } });
|
13
|
-
var
|
14
|
-
Object.defineProperty(exports, "makeNetworkRequest", { enumerable: true, get: function () { return
|
15
|
-
Object.defineProperty(exports, "subscribe", { enumerable: true, get: function () { return
|
16
|
-
var
|
17
|
-
Object.defineProperty(exports, "ROOT_ID", { enumerable: true, get: function () { return
|
18
|
-
Object.defineProperty(exports, "createIsographEnvironment", { enumerable: true, get: function () { return
|
19
|
-
Object.defineProperty(exports, "createIsographStore", { enumerable: true, get: function () { return
|
20
|
-
Object.defineProperty(exports, "defaultMissingFieldHandler", { enumerable: true, get: function () { return
|
21
|
-
var
|
22
|
-
Object.defineProperty(exports, "IsographEnvironmentProvider", { enumerable: true, get: function () { return
|
23
|
-
Object.defineProperty(exports, "useIsographEnvironment", { enumerable: true, get: function () { return
|
8
|
+
var cache_1 = require("./cache");
|
9
|
+
Object.defineProperty(exports, "makeNetworkRequest", { enumerable: true, get: function () { return cache_1.makeNetworkRequest; } });
|
10
|
+
Object.defineProperty(exports, "subscribe", { enumerable: true, get: function () { return cache_1.subscribe; } });
|
11
|
+
var IsographEnvironment_1 = require("./IsographEnvironment");
|
12
|
+
Object.defineProperty(exports, "ROOT_ID", { enumerable: true, get: function () { return IsographEnvironment_1.ROOT_ID; } });
|
13
|
+
Object.defineProperty(exports, "createIsographEnvironment", { enumerable: true, get: function () { return IsographEnvironment_1.createIsographEnvironment; } });
|
14
|
+
Object.defineProperty(exports, "createIsographStore", { enumerable: true, get: function () { return IsographEnvironment_1.createIsographStore; } });
|
15
|
+
Object.defineProperty(exports, "defaultMissingFieldHandler", { enumerable: true, get: function () { return IsographEnvironment_1.defaultMissingFieldHandler; } });
|
16
|
+
var IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
17
|
+
Object.defineProperty(exports, "IsographEnvironmentProvider", { enumerable: true, get: function () { return IsographEnvironmentProvider_1.IsographEnvironmentProvider; } });
|
18
|
+
Object.defineProperty(exports, "useIsographEnvironment", { enumerable: true, get: function () { return IsographEnvironmentProvider_1.useIsographEnvironment; } });
|
24
19
|
var useImperativeReference_1 = require("./useImperativeReference");
|
25
20
|
Object.defineProperty(exports, "useImperativeReference", { enumerable: true, get: function () { return useImperativeReference_1.useImperativeReference; } });
|
26
21
|
var EntrypointReader_1 = require("./EntrypointReader");
|
27
22
|
Object.defineProperty(exports, "EntrypointReader", { enumerable: true, get: function () { return EntrypointReader_1.EntrypointReader; } });
|
28
|
-
var
|
29
|
-
Object.defineProperty(exports, "assertIsEntrypoint", { enumerable: true, get: function () { return
|
23
|
+
var entrypoint_1 = require("./entrypoint");
|
24
|
+
Object.defineProperty(exports, "assertIsEntrypoint", { enumerable: true, get: function () { return entrypoint_1.assertIsEntrypoint; } });
|
30
25
|
var read_1 = require("./read");
|
31
26
|
Object.defineProperty(exports, "read", { enumerable: true, get: function () { return read_1.read; } });
|
32
27
|
Object.defineProperty(exports, "readButDoNotEvaluate", { enumerable: true, get: function () { return read_1.readButDoNotEvaluate; } });
|
33
28
|
var useResult_1 = require("./useResult");
|
34
29
|
Object.defineProperty(exports, "useResult", { enumerable: true, get: function () { return useResult_1.useResult; } });
|
35
|
-
|
36
|
-
|
37
|
-
// We cannot write TEntrypoint extends IsographEntrypoint<never, never, never>, or else
|
38
|
-
// any actual Entrypoint we pass will not be valid.
|
39
|
-
function useLazyReference(entrypoint, variables) {
|
40
|
-
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
41
|
-
(0, entrypoint_1.assertIsEntrypoint)(entrypoint);
|
42
|
-
const cache = (0, cache_1.getOrCreateCacheForArtifact)(environment, entrypoint, variables);
|
43
|
-
// TODO add comment explaining why we never use this value
|
44
|
-
// @ts-ignore
|
45
|
-
const data = (0, react_disposable_state_1.useLazyDisposableState)(cache).state;
|
46
|
-
return {
|
47
|
-
queryReference: {
|
48
|
-
kind: 'FragmentReference',
|
49
|
-
readerArtifact: entrypoint.readerArtifact,
|
50
|
-
root: IsographEnvironment_1.ROOT_ID,
|
51
|
-
variables,
|
52
|
-
nestedRefetchQueries: entrypoint.nestedRefetchQueries,
|
53
|
-
},
|
54
|
-
};
|
55
|
-
}
|
56
|
-
exports.useLazyReference = useLazyReference;
|
57
|
-
function assertLink(link) {
|
58
|
-
if (Array.isArray(link)) {
|
59
|
-
throw new Error('Unexpected array');
|
60
|
-
}
|
61
|
-
if (link == null) {
|
62
|
-
return null;
|
63
|
-
}
|
64
|
-
if (typeof link === 'object') {
|
65
|
-
return link;
|
66
|
-
}
|
67
|
-
throw new Error('Invalid link');
|
68
|
-
}
|
69
|
-
exports.assertLink = assertLink;
|
30
|
+
var useLazyReference_1 = require("./useLazyReference");
|
31
|
+
Object.defineProperty(exports, "useLazyReference", { enumerable: true, get: function () { return useLazyReference_1.useLazyReference; } });
|
package/dist/read.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { FragmentReference } from './
|
1
|
+
import { FragmentReference } from './FragmentReference';
|
2
2
|
import { IsographEnvironment } from './IsographEnvironment';
|
3
3
|
export declare function read<TReadFromStore extends Object, TResolverResult>(environment: IsographEnvironment, fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
|
4
4
|
export declare function readButDoNotEvaluate<TReadFromStore extends Object>(environment: IsographEnvironment, reference: FragmentReference<TReadFromStore, unknown>): TReadFromStore;
|
package/dist/read.js
CHANGED
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readButDoNotEvaluate = exports.read = void 0;
|
4
4
|
const cache_1 = require("./cache");
|
5
5
|
const componentCache_1 = require("./componentCache");
|
6
|
-
const index_1 = require("./index");
|
7
6
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
8
7
|
function read(environment, fragmentReference) {
|
9
8
|
var _a, _b;
|
@@ -72,7 +71,7 @@ function readData(environment, ast, root, variables, nestedRefetchQueries) {
|
|
72
71
|
if (Array.isArray(value)) {
|
73
72
|
const results = [];
|
74
73
|
for (const item of value) {
|
75
|
-
const link = (0,
|
74
|
+
const link = (0, IsographEnvironment_1.assertLink)(item);
|
76
75
|
if (link === undefined) {
|
77
76
|
return {
|
78
77
|
kind: 'MissingData',
|
@@ -106,7 +105,7 @@ function readData(environment, ast, root, variables, nestedRefetchQueries) {
|
|
106
105
|
target[(_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName] = results;
|
107
106
|
break;
|
108
107
|
}
|
109
|
-
let link = (0,
|
108
|
+
let link = (0, IsographEnvironment_1.assertLink)(value);
|
110
109
|
if (link === undefined) {
|
111
110
|
// TODO make this configurable, and also generated and derived from the schema
|
112
111
|
const missingFieldHandler = (_c = environment.missingFieldHandler) !== null && _c !== void 0 ? _c : IsographEnvironment_1.defaultMissingFieldHandler;
|
package/dist/reader.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import { UnassignedState } from '@isograph/react-disposable-state';
|
2
|
-
import {
|
2
|
+
import { ExtractReadFromStore, ExtractResolverResult, IsographEntrypoint } from './entrypoint';
|
3
|
+
import { FragmentReference } from './FragmentReference';
|
3
4
|
export declare function useImperativeReference<TEntrypoint extends IsographEntrypoint<any, any>>(entrypoint: TEntrypoint): {
|
4
5
|
queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverResult<TEntrypoint>> | UnassignedState;
|
5
6
|
loadQueryReference: (variables: {
|
@@ -2,19 +2,21 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.useImperativeReference = void 0;
|
4
4
|
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
5
|
-
const
|
5
|
+
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
6
|
+
const cache_1 = require("./cache");
|
7
|
+
const IsographEnvironment_1 = require("./IsographEnvironment");
|
6
8
|
function useImperativeReference(entrypoint) {
|
7
9
|
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
8
|
-
const environment = (0,
|
10
|
+
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
9
11
|
return {
|
10
12
|
queryReference: state,
|
11
13
|
loadQueryReference: (variables) => {
|
12
|
-
const [_networkRequest, disposeNetworkRequest] = (0,
|
14
|
+
const [_networkRequest, disposeNetworkRequest] = (0, cache_1.makeNetworkRequest)(environment, entrypoint, variables);
|
13
15
|
setState([
|
14
16
|
{
|
15
17
|
kind: 'FragmentReference',
|
16
18
|
readerArtifact: entrypoint.readerArtifact,
|
17
|
-
root:
|
19
|
+
root: IsographEnvironment_1.ROOT_ID,
|
18
20
|
variables,
|
19
21
|
nestedRefetchQueries: entrypoint.nestedRefetchQueries,
|
20
22
|
},
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { FragmentReference, Variable } from './FragmentReference';
|
2
|
+
import { ExtractReadFromStore, ExtractResolverResult } from './entrypoint';
|
3
|
+
export declare function useLazyReference<TEntrypoint>(entrypoint: TEntrypoint | ((_: any) => any), variables: {
|
4
|
+
[key: string]: Variable;
|
5
|
+
}): {
|
6
|
+
queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
|
7
|
+
};
|
@@ -0,0 +1,30 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useLazyReference = void 0;
|
4
|
+
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
5
|
+
const IsographEnvironment_1 = require("./IsographEnvironment");
|
6
|
+
const entrypoint_1 = require("./entrypoint");
|
7
|
+
const cache_1 = require("./cache");
|
8
|
+
const isograph_react_disposable_state_1 = require("@isograph/isograph-react-disposable-state");
|
9
|
+
// Note: we cannot write TEntrypoint extends IsographEntrypoint<any, any, any>, or else
|
10
|
+
// if we do not explicitly pass a type, the read out type will be any.
|
11
|
+
// We cannot write TEntrypoint extends IsographEntrypoint<never, never, never>, or else
|
12
|
+
// any actual Entrypoint we pass will not be valid.
|
13
|
+
function useLazyReference(entrypoint, variables) {
|
14
|
+
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
15
|
+
(0, entrypoint_1.assertIsEntrypoint)(entrypoint);
|
16
|
+
const cache = (0, cache_1.getOrCreateCacheForArtifact)(environment, entrypoint, variables);
|
17
|
+
// TODO add comment explaining why we never use this value
|
18
|
+
// @ts-ignore
|
19
|
+
const data = (0, isograph_react_disposable_state_1.useLazyDisposableState)(cache).state;
|
20
|
+
return {
|
21
|
+
queryReference: {
|
22
|
+
kind: 'FragmentReference',
|
23
|
+
readerArtifact: entrypoint.readerArtifact,
|
24
|
+
root: IsographEnvironment_1.ROOT_ID,
|
25
|
+
variables,
|
26
|
+
nestedRefetchQueries: entrypoint.nestedRefetchQueries,
|
27
|
+
},
|
28
|
+
};
|
29
|
+
}
|
30
|
+
exports.useLazyReference = useLazyReference;
|
package/dist/useResult.d.ts
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import { FragmentReference } from './
|
1
|
+
import { FragmentReference } from './FragmentReference';
|
2
2
|
export declare function useResult<TReadFromStore extends Object, TResolverResult>(fragmentReference: FragmentReference<TReadFromStore, TResolverResult>): TResolverResult;
|
package/dist/util.d.ts
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> = T extends (arg1: any, arg2: infer P) => any ? P : never;
|
2
|
+
export type Arguments = Argument[];
|
3
|
+
export type Argument = [ArgumentName, ArgumentValue];
|
4
|
+
export type ArgumentName = string;
|
5
|
+
export type ArgumentValue = {
|
6
|
+
kind: 'Variable';
|
7
|
+
name: string;
|
8
|
+
} | {
|
9
|
+
kind: 'Literal';
|
10
|
+
value: any;
|
11
|
+
};
|
package/dist/util.js
ADDED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@isograph/react",
|
3
|
-
"version": "0.0.0-main-
|
3
|
+
"version": "0.0.0-main-4b202045",
|
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-
|
20
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
19
|
+
"@isograph/disposable-types": "0.0.0-main-4b202045",
|
20
|
+
"@isograph/react-disposable-state": "0.0.0-main-4b202045",
|
21
21
|
"react": "^18.2.0"
|
22
22
|
},
|
23
23
|
"devDependencies": {
|
package/src/EntrypointReader.tsx
CHANGED
@@ -1,23 +1,28 @@
|
|
1
1
|
import * as React from 'react';
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
5
|
-
type FragmentReference,
|
6
|
-
useResult,
|
7
|
-
} from './index';
|
2
|
+
import { ExtractReadFromStore, IsographEntrypoint } from './entrypoint';
|
3
|
+
import { FragmentReference } from './FragmentReference';
|
4
|
+
import { useResult } from './useResult';
|
8
5
|
|
9
6
|
export function EntrypointReader<
|
10
7
|
TProps extends Record<any, any>,
|
11
8
|
TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>,
|
12
|
-
>(
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
}
|
9
|
+
>(
|
10
|
+
props: TProps extends Record<string, never>
|
11
|
+
? {
|
12
|
+
queryReference: FragmentReference<
|
13
|
+
ExtractReadFromStore<TEntrypoint>,
|
14
|
+
React.FC<TProps>
|
15
|
+
>;
|
16
|
+
additionalProps?: TProps;
|
17
|
+
}
|
18
|
+
: {
|
19
|
+
queryReference: FragmentReference<
|
20
|
+
ExtractReadFromStore<TEntrypoint>,
|
21
|
+
React.FC<TProps>
|
22
|
+
>;
|
23
|
+
additionalProps: TProps;
|
24
|
+
},
|
25
|
+
): React.ReactNode {
|
21
26
|
const Component = useResult(props.queryReference);
|
22
27
|
return <Component {...props.additionalProps} />;
|
23
28
|
}
|
@@ -113,3 +113,16 @@ export function defaultMissingFieldHandler(
|
|
113
113
|
}
|
114
114
|
}
|
115
115
|
}
|
116
|
+
|
117
|
+
export function assertLink(link: DataTypeValue): Link | null {
|
118
|
+
if (Array.isArray(link)) {
|
119
|
+
throw new Error('Unexpected array');
|
120
|
+
}
|
121
|
+
if (link == null) {
|
122
|
+
return null;
|
123
|
+
}
|
124
|
+
if (typeof link === 'object') {
|
125
|
+
return link;
|
126
|
+
}
|
127
|
+
throw new Error('Invalid link');
|
128
|
+
}
|
package/src/cache.tsx
CHANGED
@@ -4,17 +4,6 @@ import {
|
|
4
4
|
ParentCache,
|
5
5
|
} from '@isograph/react-disposable-state';
|
6
6
|
import { PromiseWrapper, wrapPromise } from './PromiseWrapper';
|
7
|
-
import {
|
8
|
-
Argument,
|
9
|
-
ArgumentValue,
|
10
|
-
IsographEntrypoint,
|
11
|
-
NormalizationAst,
|
12
|
-
NormalizationLinkedField,
|
13
|
-
NormalizationScalarField,
|
14
|
-
ReaderLinkedField,
|
15
|
-
ReaderScalarField,
|
16
|
-
RefetchQueryArtifactWrapper,
|
17
|
-
} from './index';
|
18
7
|
import {
|
19
8
|
DataId,
|
20
9
|
ROOT_ID,
|
@@ -28,6 +17,15 @@ import {
|
|
28
17
|
retainQuery,
|
29
18
|
unretainQuery,
|
30
19
|
} from './garbageCollection';
|
20
|
+
import {
|
21
|
+
IsographEntrypoint,
|
22
|
+
NormalizationAst,
|
23
|
+
NormalizationLinkedField,
|
24
|
+
NormalizationScalarField,
|
25
|
+
RefetchQueryArtifactWrapper,
|
26
|
+
} from './entrypoint';
|
27
|
+
import { ReaderLinkedField, ReaderScalarField } from './reader';
|
28
|
+
import { Argument, ArgumentValue } from './util';
|
31
29
|
|
32
30
|
declare global {
|
33
31
|
interface Window {
|
package/src/componentCache.ts
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
import {
|
2
|
-
ReaderArtifact,
|
3
|
-
RefetchQueryArtifactWrapper,
|
4
|
-
readButDoNotEvaluate,
|
5
|
-
} from './index';
|
6
1
|
import { stableCopy } from './cache';
|
2
|
+
import { RefetchQueryArtifactWrapper } from './entrypoint';
|
7
3
|
import { IsographEnvironment, DataId } from './IsographEnvironment';
|
4
|
+
import { readButDoNotEvaluate } from './read';
|
5
|
+
import { ReaderArtifact } from './reader';
|
8
6
|
|
9
7
|
export function getOrCreateCachedComponent(
|
10
8
|
environment: IsographEnvironment,
|
package/src/entrypoint.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import { Arguments } from './index';
|
2
1
|
import { ReaderArtifact } from './reader';
|
2
|
+
import { Arguments } from './util';
|
3
3
|
|
4
4
|
// This type should be treated as an opaque type.
|
5
5
|
export type IsographEntrypoint<
|
@@ -57,3 +57,8 @@ export function assertIsEntrypoint<
|
|
57
57
|
): asserts value is IsographEntrypoint<TReadFromStore, TResolverResult> {
|
58
58
|
if (typeof value === 'function') throw new Error('Not a string');
|
59
59
|
}
|
60
|
+
|
61
|
+
export type ExtractReadFromStore<Type> =
|
62
|
+
Type extends IsographEntrypoint<infer X, any> ? X : never;
|
63
|
+
export type ExtractResolverResult<Type> =
|
64
|
+
Type extends IsographEntrypoint<any, infer X> ? X : never;
|
package/src/garbageCollection.ts
CHANGED
@@ -4,9 +4,10 @@ import {
|
|
4
4
|
IsographStore,
|
5
5
|
ROOT_ID,
|
6
6
|
StoreRecord,
|
7
|
+
assertLink,
|
7
8
|
} from './IsographEnvironment';
|
8
|
-
import { NormalizationAst, assertLink } from './index';
|
9
9
|
import { getParentRecordKey } from './cache';
|
10
|
+
import { NormalizationAst } from './entrypoint';
|
10
11
|
|
11
12
|
export type RetainedQuery = {
|
12
13
|
normalizationAst: NormalizationAst;
|
package/src/index.tsx
CHANGED
@@ -1,11 +1,3 @@
|
|
1
|
-
import { getOrCreateCacheForArtifact } from './cache';
|
2
|
-
import { useLazyDisposableState } from '@isograph/react-disposable-state';
|
3
|
-
import { type PromiseWrapper } from './PromiseWrapper';
|
4
|
-
import { DataTypeValue, Link, ROOT_ID } from './IsographEnvironment';
|
5
|
-
import { useIsographEnvironment } from './IsographEnvironmentProvider';
|
6
|
-
import { IsographEntrypoint, assertIsEntrypoint } from './entrypoint';
|
7
|
-
import { FragmentReference, Variable } from './FragmentReference';
|
8
|
-
|
9
1
|
export {
|
10
2
|
retainQuery,
|
11
3
|
unretainQuery,
|
@@ -58,83 +50,11 @@ export {
|
|
58
50
|
export { read, readButDoNotEvaluate } from './read';
|
59
51
|
export { useResult } from './useResult';
|
60
52
|
export { type FragmentReference } from './FragmentReference';
|
61
|
-
|
62
|
-
export
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
| {
|
70
|
-
kind: 'Variable';
|
71
|
-
name: string;
|
72
|
-
}
|
73
|
-
| {
|
74
|
-
kind: 'Literal';
|
75
|
-
value: any;
|
76
|
-
};
|
77
|
-
|
78
|
-
export type ExtractReadFromStore<Type> =
|
79
|
-
Type extends IsographEntrypoint<infer X, any> ? X : never;
|
80
|
-
export type ExtractResolverResult<Type> =
|
81
|
-
Type extends IsographEntrypoint<any, infer X> ? X : never;
|
82
|
-
// Note: we cannot write TEntrypoint extends IsographEntrypoint<any, any, any>, or else
|
83
|
-
// if we do not explicitly pass a type, the read out type will be any.
|
84
|
-
// We cannot write TEntrypoint extends IsographEntrypoint<never, never, never>, or else
|
85
|
-
// any actual Entrypoint we pass will not be valid.
|
86
|
-
export function useLazyReference<TEntrypoint>(
|
87
|
-
entrypoint:
|
88
|
-
| TEntrypoint
|
89
|
-
// Temporarily, we need to allow useLazyReference to take the result of calling
|
90
|
-
// iso(`...`). At runtime, we confirm that the passed-in `iso` literal is actually
|
91
|
-
// an entrypoint.
|
92
|
-
| ((_: any) => any),
|
93
|
-
variables: { [key: string]: Variable },
|
94
|
-
): {
|
95
|
-
queryReference: FragmentReference<
|
96
|
-
ExtractReadFromStore<TEntrypoint>,
|
97
|
-
ExtractResolverResult<TEntrypoint>
|
98
|
-
>;
|
99
|
-
} {
|
100
|
-
const environment = useIsographEnvironment();
|
101
|
-
assertIsEntrypoint<
|
102
|
-
ExtractReadFromStore<TEntrypoint>,
|
103
|
-
ExtractResolverResult<TEntrypoint>
|
104
|
-
>(entrypoint);
|
105
|
-
const cache = getOrCreateCacheForArtifact<ExtractResolverResult<TEntrypoint>>(
|
106
|
-
environment,
|
107
|
-
entrypoint,
|
108
|
-
variables,
|
109
|
-
);
|
110
|
-
|
111
|
-
// TODO add comment explaining why we never use this value
|
112
|
-
// @ts-ignore
|
113
|
-
const data =
|
114
|
-
useLazyDisposableState<PromiseWrapper<ExtractResolverResult<TEntrypoint>>>(
|
115
|
-
cache,
|
116
|
-
).state;
|
117
|
-
|
118
|
-
return {
|
119
|
-
queryReference: {
|
120
|
-
kind: 'FragmentReference',
|
121
|
-
readerArtifact: entrypoint.readerArtifact,
|
122
|
-
root: ROOT_ID,
|
123
|
-
variables,
|
124
|
-
nestedRefetchQueries: entrypoint.nestedRefetchQueries,
|
125
|
-
},
|
126
|
-
};
|
127
|
-
}
|
128
|
-
|
129
|
-
export function assertLink(link: DataTypeValue): Link | null {
|
130
|
-
if (Array.isArray(link)) {
|
131
|
-
throw new Error('Unexpected array');
|
132
|
-
}
|
133
|
-
if (link == null) {
|
134
|
-
return null;
|
135
|
-
}
|
136
|
-
if (typeof link === 'object') {
|
137
|
-
return link;
|
138
|
-
}
|
139
|
-
throw new Error('Invalid link');
|
140
|
-
}
|
53
|
+
export { useLazyReference } from './useLazyReference';
|
54
|
+
export {
|
55
|
+
ExtractSecondParam,
|
56
|
+
Argument,
|
57
|
+
ArgumentName,
|
58
|
+
ArgumentValue,
|
59
|
+
Arguments,
|
60
|
+
} from './util';
|
package/src/read.ts
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
import { getParentRecordKey, onNextChange } from './cache';
|
2
2
|
import { getOrCreateCachedComponent } from './componentCache';
|
3
3
|
import { RefetchQueryArtifactWrapper } from './entrypoint';
|
4
|
-
import {
|
4
|
+
import { FragmentReference } from './FragmentReference';
|
5
5
|
import {
|
6
|
+
assertLink,
|
6
7
|
DataId,
|
7
8
|
defaultMissingFieldHandler,
|
8
9
|
IsographEnvironment,
|
9
10
|
} from './IsographEnvironment';
|
11
|
+
import { ReaderAst } from './reader';
|
10
12
|
|
11
13
|
export function read<TReadFromStore extends Object, TResolverResult>(
|
12
14
|
environment: IsographEnvironment,
|
package/src/reader.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
// TODO this should probably be at least three distinct types, for @component,
|
2
2
|
|
3
|
-
import { Arguments } from './
|
3
|
+
import { Arguments } from './util';
|
4
4
|
|
5
5
|
// non-@component and refetch resolvers
|
6
6
|
export type ReaderArtifact<TReadFromStore extends Object, TResolverResult> = {
|
@@ -3,14 +3,14 @@ import {
|
|
3
3
|
useUpdatableDisposableState,
|
4
4
|
} from '@isograph/react-disposable-state';
|
5
5
|
import {
|
6
|
-
type IsographEntrypoint,
|
7
|
-
type FragmentReference,
|
8
6
|
ExtractReadFromStore,
|
9
7
|
ExtractResolverResult,
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
} from './
|
8
|
+
IsographEntrypoint,
|
9
|
+
} from './entrypoint';
|
10
|
+
import { FragmentReference } from './FragmentReference';
|
11
|
+
import { useIsographEnvironment } from './IsographEnvironmentProvider';
|
12
|
+
import { makeNetworkRequest } from './cache';
|
13
|
+
import { ROOT_ID } from './IsographEnvironment';
|
14
14
|
|
15
15
|
export function useImperativeReference<
|
16
16
|
TEntrypoint extends IsographEntrypoint<any, any>,
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import { FragmentReference, Variable } from './FragmentReference';
|
2
|
+
import { useIsographEnvironment } from './IsographEnvironmentProvider';
|
3
|
+
import { ROOT_ID } from './IsographEnvironment';
|
4
|
+
import {
|
5
|
+
ExtractReadFromStore,
|
6
|
+
ExtractResolverResult,
|
7
|
+
assertIsEntrypoint,
|
8
|
+
} from './entrypoint';
|
9
|
+
import { getOrCreateCacheForArtifact } from './cache';
|
10
|
+
import { useLazyDisposableState } from '@isograph/isograph-react-disposable-state';
|
11
|
+
import { type PromiseWrapper } from './PromiseWrapper';
|
12
|
+
|
13
|
+
// Note: we cannot write TEntrypoint extends IsographEntrypoint<any, any, any>, or else
|
14
|
+
// if we do not explicitly pass a type, the read out type will be any.
|
15
|
+
// We cannot write TEntrypoint extends IsographEntrypoint<never, never, never>, or else
|
16
|
+
// any actual Entrypoint we pass will not be valid.
|
17
|
+
export function useLazyReference<TEntrypoint>(
|
18
|
+
entrypoint:
|
19
|
+
| TEntrypoint
|
20
|
+
// Temporarily, we need to allow useLazyReference to take the result of calling
|
21
|
+
// iso(`...`). At runtime, we confirm that the passed-in `iso` literal is actually
|
22
|
+
// an entrypoint.
|
23
|
+
| ((_: any) => any),
|
24
|
+
variables: { [key: string]: Variable },
|
25
|
+
): {
|
26
|
+
queryReference: FragmentReference<
|
27
|
+
ExtractReadFromStore<TEntrypoint>,
|
28
|
+
ExtractResolverResult<TEntrypoint>
|
29
|
+
>;
|
30
|
+
} {
|
31
|
+
const environment = useIsographEnvironment();
|
32
|
+
assertIsEntrypoint<
|
33
|
+
ExtractReadFromStore<TEntrypoint>,
|
34
|
+
ExtractResolverResult<TEntrypoint>
|
35
|
+
>(entrypoint);
|
36
|
+
const cache = getOrCreateCacheForArtifact<ExtractResolverResult<TEntrypoint>>(
|
37
|
+
environment,
|
38
|
+
entrypoint,
|
39
|
+
variables,
|
40
|
+
);
|
41
|
+
|
42
|
+
// TODO add comment explaining why we never use this value
|
43
|
+
// @ts-ignore
|
44
|
+
const data =
|
45
|
+
useLazyDisposableState<PromiseWrapper<ExtractResolverResult<TEntrypoint>>>(
|
46
|
+
cache,
|
47
|
+
).state;
|
48
|
+
|
49
|
+
return {
|
50
|
+
queryReference: {
|
51
|
+
kind: 'FragmentReference',
|
52
|
+
readerArtifact: entrypoint.readerArtifact,
|
53
|
+
root: ROOT_ID,
|
54
|
+
variables,
|
55
|
+
nestedRefetchQueries: entrypoint.nestedRefetchQueries,
|
56
|
+
},
|
57
|
+
};
|
58
|
+
}
|
package/src/useResult.ts
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
import { useEffect, useState } from 'react';
|
2
|
-
import { FragmentReference } from './index';
|
3
2
|
import { useIsographEnvironment } from './IsographEnvironmentProvider';
|
4
3
|
import { subscribe } from './cache';
|
5
4
|
import { read } from './read';
|
5
|
+
import { FragmentReference } from './FragmentReference';
|
6
6
|
|
7
7
|
export function useResult<TReadFromStore extends Object, TResolverResult>(
|
8
8
|
fragmentReference: FragmentReference<TReadFromStore, TResolverResult>,
|
package/src/util.ts
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> =
|
2
|
+
T extends (arg1: any, arg2: infer P) => any ? P : never;
|
3
|
+
|
4
|
+
export type Arguments = Argument[];
|
5
|
+
export type Argument = [ArgumentName, ArgumentValue];
|
6
|
+
export type ArgumentName = string;
|
7
|
+
export type ArgumentValue =
|
8
|
+
| {
|
9
|
+
kind: 'Variable';
|
10
|
+
name: string;
|
11
|
+
}
|
12
|
+
| {
|
13
|
+
kind: 'Literal';
|
14
|
+
value: any;
|
15
|
+
};
|