@isograph/react 0.1.0 → 0.2.0
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/core/FragmentReference.d.ts +15 -0
- package/dist/core/FragmentReference.js +17 -0
- package/dist/core/IsographEnvironment.d.ts +71 -0
- package/dist/core/IsographEnvironment.js +72 -0
- package/dist/core/PromiseWrapper.d.ts +27 -0
- package/dist/core/PromiseWrapper.js +58 -0
- package/dist/core/areEqualWithDeepComparison.d.ts +3 -0
- package/dist/core/areEqualWithDeepComparison.js +61 -0
- package/dist/core/cache.d.ts +28 -0
- package/dist/core/cache.js +452 -0
- package/dist/core/componentCache.d.ts +5 -0
- package/dist/core/componentCache.js +38 -0
- package/dist/core/entrypoint.d.ts +50 -0
- package/dist/core/entrypoint.js +8 -0
- package/dist/core/garbageCollection.d.ts +11 -0
- package/dist/core/garbageCollection.js +74 -0
- package/dist/core/makeNetworkRequest.d.ts +6 -0
- package/dist/core/makeNetworkRequest.js +62 -0
- package/dist/core/read.d.ts +12 -0
- package/dist/core/read.js +415 -0
- package/dist/core/reader.d.ts +63 -0
- package/dist/core/reader.js +2 -0
- package/dist/core/util.d.ts +17 -0
- package/dist/core/util.js +2 -0
- package/dist/index.d.ts +21 -118
- package/dist/index.js +50 -303
- package/dist/loadable-hooks/useClientSideDefer.d.ts +4 -0
- package/dist/loadable-hooks/useClientSideDefer.js +15 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +5 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.js +15 -0
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +9 -0
- package/dist/loadable-hooks/useImperativeLoadableField.js +15 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +33 -0
- package/dist/loadable-hooks/useSkipLimitPagination.js +118 -0
- package/dist/react/FragmentReader.d.ts +13 -0
- package/dist/react/FragmentReader.js +33 -0
- package/dist/react/IsographEnvironmentProvider.d.ts +10 -0
- package/dist/{IsographEnvironment.js → react/IsographEnvironmentProvider.js} +2 -20
- package/dist/react/useImperativeReference.d.ts +7 -0
- package/dist/react/useImperativeReference.js +36 -0
- package/dist/react/useLazyReference.d.ts +5 -0
- package/dist/react/useLazyReference.js +14 -0
- package/dist/react/useReadAndSubscribe.d.ts +11 -0
- package/dist/react/useReadAndSubscribe.js +41 -0
- package/dist/react/useRerenderOnChange.d.ts +3 -0
- package/dist/react/useRerenderOnChange.js +23 -0
- package/dist/react/useResult.d.ts +5 -0
- package/dist/react/useResult.js +36 -0
- package/docs/how-useLazyReference-works.md +117 -0
- package/package.json +12 -6
- package/src/core/FragmentReference.ts +37 -0
- package/src/core/IsographEnvironment.ts +183 -0
- package/src/core/PromiseWrapper.ts +86 -0
- package/src/core/areEqualWithDeepComparison.ts +78 -0
- package/src/core/cache.ts +721 -0
- package/src/core/componentCache.ts +61 -0
- package/src/core/entrypoint.ts +99 -0
- package/src/core/garbageCollection.ts +122 -0
- package/src/core/makeNetworkRequest.ts +99 -0
- package/src/core/read.ts +615 -0
- package/src/core/reader.ts +133 -0
- package/src/core/util.ts +23 -0
- package/src/index.ts +86 -0
- package/src/loadable-hooks/useClientSideDefer.ts +28 -0
- package/src/loadable-hooks/useImperativeExposedMutationField.ts +17 -0
- package/src/loadable-hooks/useImperativeLoadableField.ts +26 -0
- package/src/loadable-hooks/useSkipLimitPagination.ts +211 -0
- package/src/react/FragmentReader.tsx +34 -0
- package/src/react/IsographEnvironmentProvider.tsx +33 -0
- package/src/react/useImperativeReference.ts +57 -0
- package/src/react/useLazyReference.ts +22 -0
- package/src/react/useReadAndSubscribe.ts +66 -0
- package/src/react/useRerenderOnChange.ts +33 -0
- package/src/react/useResult.ts +65 -0
- package/src/tests/__isograph/Query/meName/entrypoint.ts +47 -0
- package/src/tests/__isograph/Query/meName/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meName/param_type.ts +6 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +32 -0
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +83 -0
- package/src/tests/__isograph/Query/meNameSuccessor/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +11 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +54 -0
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +46 -0
- package/src/tests/__isograph/Query/nodeField/output_type.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/param_type.ts +6 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +37 -0
- package/src/tests/__isograph/iso.ts +88 -0
- package/src/tests/garbageCollection.test.ts +136 -0
- package/src/tests/isograph.config.json +7 -0
- package/src/tests/meNameSuccessor.ts +20 -0
- package/src/tests/nodeQuery.ts +17 -0
- package/src/tests/schema.graphql +16 -0
- package/src/tests/tsconfig.json +21 -0
- package/tsconfig.json +6 -0
- package/tsconfig.pkg.json +2 -1
- package/dist/IsographEnvironment.d.ts +0 -56
- package/dist/PromiseWrapper.d.ts +0 -13
- package/dist/PromiseWrapper.js +0 -22
- package/dist/cache.d.ts +0 -26
- package/dist/cache.js +0 -274
- package/dist/componentCache.d.ts +0 -6
- package/dist/componentCache.js +0 -31
- package/src/IsographEnvironment.tsx +0 -120
- package/src/PromiseWrapper.ts +0 -29
- package/src/cache.tsx +0 -484
- package/src/componentCache.ts +0 -44
- package/src/index.tsx +0 -651
package/dist/index.d.ts
CHANGED
@@ -1,118 +1,21 @@
|
|
1
|
-
|
2
|
-
export {
|
3
|
-
export {
|
4
|
-
export
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
};
|
11
|
-
export
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
};
|
17
|
-
export
|
18
|
-
export
|
19
|
-
export
|
20
|
-
|
21
|
-
|
22
|
-
alias: string | null;
|
23
|
-
arguments: Arguments | null;
|
24
|
-
};
|
25
|
-
export type ReaderLinkedField = {
|
26
|
-
kind: 'Linked';
|
27
|
-
fieldName: string;
|
28
|
-
alias: string | null;
|
29
|
-
selections: ReaderAst<unknown>;
|
30
|
-
arguments: Arguments | null;
|
31
|
-
};
|
32
|
-
export type ReaderResolverVariant = {
|
33
|
-
kind: 'Eager';
|
34
|
-
} | {
|
35
|
-
kind: 'Component';
|
36
|
-
componentName: string;
|
37
|
-
};
|
38
|
-
export type ReaderResolverField = {
|
39
|
-
kind: 'Resolver';
|
40
|
-
alias: string;
|
41
|
-
readerArtifact: ReaderArtifact<any, any, any>;
|
42
|
-
arguments: Arguments | null;
|
43
|
-
usedRefetchQueries: number[];
|
44
|
-
};
|
45
|
-
export type ReaderRefetchField = {
|
46
|
-
kind: 'RefetchField';
|
47
|
-
alias: string;
|
48
|
-
readerArtifact: ReaderArtifact<any, any, any>;
|
49
|
-
refetchQuery: number;
|
50
|
-
};
|
51
|
-
export type ReaderMutationField = {
|
52
|
-
kind: 'MutationField';
|
53
|
-
alias: string;
|
54
|
-
readerArtifact: ReaderArtifact<any, any, any>;
|
55
|
-
refetchQuery: number;
|
56
|
-
allowedVariables: string[];
|
57
|
-
};
|
58
|
-
export type NormalizationAstNode = NormalizationScalarField | NormalizationLinkedField;
|
59
|
-
export type NormalizationAst = NormalizationAstNode[];
|
60
|
-
export type NormalizationScalarField = {
|
61
|
-
kind: 'Scalar';
|
62
|
-
fieldName: string;
|
63
|
-
arguments: Arguments | null;
|
64
|
-
};
|
65
|
-
export type NormalizationLinkedField = {
|
66
|
-
kind: 'Linked';
|
67
|
-
fieldName: string;
|
68
|
-
arguments: Arguments | null;
|
69
|
-
selections: NormalizationAst;
|
70
|
-
};
|
71
|
-
export type RefetchQueryArtifact = {
|
72
|
-
kind: 'RefetchQuery';
|
73
|
-
queryText: string;
|
74
|
-
normalizationAst: NormalizationAst;
|
75
|
-
};
|
76
|
-
export type RefetchQueryArtifactWrapper = {
|
77
|
-
artifact: RefetchQueryArtifact;
|
78
|
-
allowedVariables: string[];
|
79
|
-
};
|
80
|
-
export type Arguments = Argument[];
|
81
|
-
export type Argument = [ArgumentName, ArgumentValue];
|
82
|
-
export type ArgumentName = string;
|
83
|
-
export type ArgumentValue = {
|
84
|
-
kind: 'Variable';
|
85
|
-
name: string;
|
86
|
-
} | {
|
87
|
-
kind: 'Literal';
|
88
|
-
value: any;
|
89
|
-
};
|
90
|
-
type Variable = any;
|
91
|
-
export type FragmentReference<TReadFromStore extends Object, TResolverProps, TResolverResult> = {
|
92
|
-
kind: 'FragmentReference';
|
93
|
-
readerArtifact: ReaderArtifact<TReadFromStore, TResolverProps, TResolverResult>;
|
94
|
-
root: DataId;
|
95
|
-
variables: {
|
96
|
-
[index: string]: Variable;
|
97
|
-
} | null;
|
98
|
-
nestedRefetchQueries: RefetchQueryArtifactWrapper[];
|
99
|
-
};
|
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 declare function useLazyReference<TEntrypoint>(entrypoint: TEntrypoint | ((_: any) => any), variables: {
|
104
|
-
[key: string]: Variable;
|
105
|
-
}): {
|
106
|
-
queryReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, ExtractResolverProps<TEntrypoint>, ExtractResolverResult<TEntrypoint>>;
|
107
|
-
};
|
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;
|
111
|
-
export declare function defaultMissingFieldHandler(_storeRecord: StoreRecord, _root: DataId, fieldName: string, arguments_: {
|
112
|
-
[index: string]: any;
|
113
|
-
} | null, variables: {
|
114
|
-
[index: string]: any;
|
115
|
-
} | null): Link | undefined;
|
116
|
-
export type IsographComponentProps<TDataType, TOtherProps = Object> = {
|
117
|
-
data: TDataType;
|
118
|
-
} & TOtherProps;
|
1
|
+
export { retainQuery, unretainQuery, type RetainedQuery, garbageCollectEnvironment, } from './core/garbageCollection';
|
2
|
+
export { type PromiseWrapper, readPromise, getPromiseState, wrapResolvedValue, wrapPromise, } from './core/PromiseWrapper';
|
3
|
+
export { subscribe, normalizeData } from './core/cache';
|
4
|
+
export { makeNetworkRequest } from './core/makeNetworkRequest';
|
5
|
+
export { ROOT_ID, type DataId, type DataTypeValue, type IsographEnvironment, type IsographNetworkFunction, type IsographStore, type Link, type StoreRecord, createIsographEnvironment, createIsographStore, defaultMissingFieldHandler, } from './core/IsographEnvironment';
|
6
|
+
export { type EagerReaderArtifact, type ComponentReaderArtifact, type RefetchReaderArtifact, type ReaderAst, type ReaderAstNode, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField, type TopLevelReaderArtifact, type LoadableField, } from './core/reader';
|
7
|
+
export { type NormalizationAst, type NormalizationAstNode, type NormalizationLinkedField, type NormalizationScalarField, type IsographEntrypoint, assertIsEntrypoint, type RefetchQueryNormalizationArtifact, type RefetchQueryNormalizationArtifactWrapper, type ExtractProps, type ExtractReadFromStore, type ExtractResolverResult, } from './core/entrypoint';
|
8
|
+
export { readButDoNotEvaluate } from './core/read';
|
9
|
+
export { type ExtractSecondParam, type Argument, type ArgumentName, type ArgumentValue, type Arguments, } from './core/util';
|
10
|
+
export { type FragmentReference, type Variables, stableIdForFragmentReference, } from './core/FragmentReference';
|
11
|
+
export { IsographEnvironmentProvider, useIsographEnvironment, type IsographEnvironmentProviderProps, } from './react/IsographEnvironmentProvider';
|
12
|
+
export { useImperativeReference } from './react/useImperativeReference';
|
13
|
+
export { FragmentReader } from './react/FragmentReader';
|
14
|
+
export { useResult } from './react/useResult';
|
15
|
+
export { useReadAndSubscribe, useSubscribeToMultiple, } from './react/useReadAndSubscribe';
|
16
|
+
export { useLazyReference } from './react/useLazyReference';
|
17
|
+
export { useRerenderOnChange } from './react/useRerenderOnChange';
|
18
|
+
export { useClientSideDefer } from './loadable-hooks/useClientSideDefer';
|
19
|
+
export { useImperativeExposedMutationField } from './loadable-hooks/useImperativeExposedMutationField';
|
20
|
+
export { useSkipLimitPagination } from './loadable-hooks/useSkipLimitPagination';
|
21
|
+
export { useImperativeLoadableField } from './loadable-hooks/useImperativeLoadableField';
|
package/dist/index.js
CHANGED
@@ -1,305 +1,52 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
Object.defineProperty(exports, "
|
11
|
-
Object.defineProperty(exports, "
|
12
|
-
|
13
|
-
|
14
|
-
Object.defineProperty(exports, "
|
15
|
-
Object.defineProperty(exports, "
|
16
|
-
|
17
|
-
Object.defineProperty(exports, "
|
18
|
-
|
19
|
-
function
|
20
|
-
|
21
|
-
|
22
|
-
}
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
exports.
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
return read(environment, fragmentReference);
|
54
|
-
}
|
55
|
-
exports.useResult = useResult;
|
56
|
-
function read(environment, fragmentReference) {
|
57
|
-
var _a, _b;
|
58
|
-
const variant = fragmentReference.readerArtifact.variant;
|
59
|
-
if (variant.kind === 'Eager') {
|
60
|
-
const data = readData(environment, fragmentReference.readerArtifact.readerAst, fragmentReference.root, (_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {}, fragmentReference.nestedRefetchQueries);
|
61
|
-
if (data.kind === 'MissingData') {
|
62
|
-
throw (0, cache_1.onNextChange)(environment);
|
63
|
-
}
|
64
|
-
else {
|
65
|
-
// @ts-expect-error This not properly typed yet
|
66
|
-
return fragmentReference.readerArtifact.resolver(data.data);
|
67
|
-
}
|
68
|
-
}
|
69
|
-
else if (variant.kind === 'Component') {
|
70
|
-
// @ts-ignore
|
71
|
-
return (0, componentCache_1.getOrCreateCachedComponent)(environment, fragmentReference.root, variant.componentName, fragmentReference.readerArtifact, (_b = fragmentReference.variables) !== null && _b !== void 0 ? _b : {}, fragmentReference.nestedRefetchQueries);
|
72
|
-
}
|
73
|
-
// Why can't Typescript realize that this is unreachable??
|
74
|
-
throw new Error('This is unreachable');
|
75
|
-
}
|
76
|
-
exports.read = read;
|
77
|
-
function readButDoNotEvaluate(environment, reference) {
|
78
|
-
var _a;
|
79
|
-
const response = readData(environment, reference.readerArtifact.readerAst, reference.root, (_a = reference.variables) !== null && _a !== void 0 ? _a : {}, reference.nestedRefetchQueries);
|
80
|
-
if (typeof window !== 'undefined' && window.__LOG) {
|
81
|
-
console.log('done reading', { response });
|
82
|
-
}
|
83
|
-
if (response.kind === 'MissingData') {
|
84
|
-
throw (0, cache_1.onNextChange)(environment);
|
85
|
-
}
|
86
|
-
else {
|
87
|
-
return response.data;
|
88
|
-
}
|
89
|
-
}
|
90
|
-
exports.readButDoNotEvaluate = readButDoNotEvaluate;
|
91
|
-
function readData(environment, ast, root, variables, nestedRefetchQueries) {
|
92
|
-
var _a, _b, _c, _d, _e;
|
93
|
-
let storeRecord = environment.store[root];
|
94
|
-
if (storeRecord === undefined) {
|
95
|
-
return { kind: 'MissingData', reason: 'No record for root ' + root };
|
96
|
-
}
|
97
|
-
if (storeRecord === null) {
|
98
|
-
return { kind: 'Success', data: null };
|
99
|
-
}
|
100
|
-
let target = {};
|
101
|
-
for (const field of ast) {
|
102
|
-
switch (field.kind) {
|
103
|
-
case 'Scalar': {
|
104
|
-
const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
|
105
|
-
const value = storeRecord[storeRecordName];
|
106
|
-
// TODO consider making scalars into discriminated unions. This probably has
|
107
|
-
// to happen for when we handle errors.
|
108
|
-
if (value === undefined) {
|
109
|
-
return {
|
110
|
-
kind: 'MissingData',
|
111
|
-
reason: 'No value for ' + storeRecordName + ' on root ' + root,
|
112
|
-
};
|
113
|
-
}
|
114
|
-
target[(_a = field.alias) !== null && _a !== void 0 ? _a : field.fieldName] = value;
|
115
|
-
break;
|
116
|
-
}
|
117
|
-
case 'Linked': {
|
118
|
-
const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
|
119
|
-
const value = storeRecord[storeRecordName];
|
120
|
-
if (Array.isArray(value)) {
|
121
|
-
const results = [];
|
122
|
-
for (const item of value) {
|
123
|
-
const link = assertLink(item);
|
124
|
-
if (link === undefined) {
|
125
|
-
return {
|
126
|
-
kind: 'MissingData',
|
127
|
-
reason: 'No link for ' +
|
128
|
-
storeRecordName +
|
129
|
-
' on root ' +
|
130
|
-
root +
|
131
|
-
'. Link is ' +
|
132
|
-
JSON.stringify(item),
|
133
|
-
};
|
134
|
-
}
|
135
|
-
else if (link === null) {
|
136
|
-
results.push(null);
|
137
|
-
continue;
|
138
|
-
}
|
139
|
-
const result = readData(environment, field.selections, link.__link, variables, nestedRefetchQueries);
|
140
|
-
if (result.kind === 'MissingData') {
|
141
|
-
return {
|
142
|
-
kind: 'MissingData',
|
143
|
-
reason: 'Missing data for ' +
|
144
|
-
storeRecordName +
|
145
|
-
' on root ' +
|
146
|
-
root +
|
147
|
-
'. Link is ' +
|
148
|
-
JSON.stringify(item),
|
149
|
-
nestedReason: result,
|
150
|
-
};
|
151
|
-
}
|
152
|
-
results.push(result.data);
|
153
|
-
}
|
154
|
-
target[(_b = field.alias) !== null && _b !== void 0 ? _b : field.fieldName] = results;
|
155
|
-
break;
|
156
|
-
}
|
157
|
-
let link = assertLink(value);
|
158
|
-
if (link === undefined) {
|
159
|
-
// TODO make this configurable, and also generated and derived from the schema
|
160
|
-
const missingFieldHandler = (_c = environment.missingFieldHandler) !== null && _c !== void 0 ? _c : defaultMissingFieldHandler;
|
161
|
-
const altLink = missingFieldHandler(storeRecord, root, field.fieldName, field.arguments, variables);
|
162
|
-
if (altLink === undefined) {
|
163
|
-
return {
|
164
|
-
kind: 'MissingData',
|
165
|
-
reason: 'No link for ' +
|
166
|
-
storeRecordName +
|
167
|
-
' on root ' +
|
168
|
-
root +
|
169
|
-
'. Link is ' +
|
170
|
-
JSON.stringify(value),
|
171
|
-
};
|
172
|
-
}
|
173
|
-
else {
|
174
|
-
link = altLink;
|
175
|
-
}
|
176
|
-
}
|
177
|
-
else if (link === null) {
|
178
|
-
target[(_d = field.alias) !== null && _d !== void 0 ? _d : field.fieldName] = null;
|
179
|
-
break;
|
180
|
-
}
|
181
|
-
const targetId = link.__link;
|
182
|
-
const data = readData(environment, field.selections, targetId, variables, nestedRefetchQueries);
|
183
|
-
if (data.kind === 'MissingData') {
|
184
|
-
return {
|
185
|
-
kind: 'MissingData',
|
186
|
-
reason: 'Missing data for ' + storeRecordName + ' on root ' + root,
|
187
|
-
nestedReason: data,
|
188
|
-
};
|
189
|
-
}
|
190
|
-
target[(_e = field.alias) !== null && _e !== void 0 ? _e : field.fieldName] = data.data;
|
191
|
-
break;
|
192
|
-
}
|
193
|
-
case 'RefetchField': {
|
194
|
-
const data = readData(environment, field.readerArtifact.readerAst, root, variables,
|
195
|
-
// Refetch fields just read the id, and don't need refetch query artifacts
|
196
|
-
[]);
|
197
|
-
if (typeof window !== 'undefined' && window.__LOG) {
|
198
|
-
console.log('refetch field data', data, field);
|
199
|
-
}
|
200
|
-
if (data.kind === 'MissingData') {
|
201
|
-
return {
|
202
|
-
kind: 'MissingData',
|
203
|
-
reason: 'Missing data for ' + field.alias + ' on root ' + root,
|
204
|
-
nestedReason: data,
|
205
|
-
};
|
206
|
-
}
|
207
|
-
else {
|
208
|
-
const refetchQueryIndex = field.refetchQuery;
|
209
|
-
if (refetchQueryIndex == null) {
|
210
|
-
throw new Error('refetchQuery is null in RefetchField');
|
211
|
-
}
|
212
|
-
const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
|
213
|
-
const refetchQueryArtifact = refetchQuery.artifact;
|
214
|
-
const allowedVariables = refetchQuery.allowedVariables;
|
215
|
-
target[field.alias] = field.readerArtifact.resolver(environment,
|
216
|
-
// resolvers for refetch fields take 3 args, and this is not reflected in types
|
217
|
-
// @ts-expect-error
|
218
|
-
refetchQueryArtifact, Object.assign(Object.assign({}, data.data), filterVariables(variables, allowedVariables)));
|
219
|
-
}
|
220
|
-
break;
|
221
|
-
}
|
222
|
-
case 'MutationField': {
|
223
|
-
const data = readData(environment, field.readerArtifact.readerAst, root, variables,
|
224
|
-
// Refetch fields just read the id, and don't need refetch query artifacts
|
225
|
-
[]);
|
226
|
-
if (typeof window !== 'undefined' && window.__LOG) {
|
227
|
-
console.log('refetch field data', data, field);
|
228
|
-
}
|
229
|
-
if (data.kind === 'MissingData') {
|
230
|
-
return {
|
231
|
-
kind: 'MissingData',
|
232
|
-
reason: 'Missing data for ' + field.alias + ' on root ' + root,
|
233
|
-
nestedReason: data,
|
234
|
-
};
|
235
|
-
}
|
236
|
-
else {
|
237
|
-
const refetchQueryIndex = field.refetchQuery;
|
238
|
-
if (refetchQueryIndex == null) {
|
239
|
-
throw new Error('refetchQuery is null in MutationField');
|
240
|
-
}
|
241
|
-
const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
|
242
|
-
const refetchQueryArtifact = refetchQuery.artifact;
|
243
|
-
const allowedVariables = refetchQuery.allowedVariables;
|
244
|
-
target[field.alias] = field.readerArtifact.resolver(environment,
|
245
|
-
// @ts-expect-error
|
246
|
-
refetchQueryArtifact, data.data, filterVariables(variables, allowedVariables));
|
247
|
-
}
|
248
|
-
break;
|
249
|
-
}
|
250
|
-
case 'Resolver': {
|
251
|
-
const usedRefetchQueries = field.usedRefetchQueries;
|
252
|
-
const resolverRefetchQueries = usedRefetchQueries.map((index) => nestedRefetchQueries[index]);
|
253
|
-
const variant = field.readerArtifact.variant;
|
254
|
-
if (variant.kind === 'Eager') {
|
255
|
-
const data = readData(environment, field.readerArtifact.readerAst, root, variables, resolverRefetchQueries);
|
256
|
-
if (data.kind === 'MissingData') {
|
257
|
-
return {
|
258
|
-
kind: 'MissingData',
|
259
|
-
reason: 'Missing data for ' + field.alias + ' on root ' + root,
|
260
|
-
nestedReason: data,
|
261
|
-
};
|
262
|
-
}
|
263
|
-
else {
|
264
|
-
target[field.alias] = field.readerArtifact.resolver(data.data);
|
265
|
-
}
|
266
|
-
}
|
267
|
-
else if (variant.kind === 'Component') {
|
268
|
-
target[field.alias] = (0, componentCache_1.getOrCreateCachedComponent)(environment, root, variant.componentName, field.readerArtifact, variables, resolverRefetchQueries);
|
269
|
-
}
|
270
|
-
break;
|
271
|
-
}
|
272
|
-
}
|
273
|
-
}
|
274
|
-
return { kind: 'Success', data: target };
|
275
|
-
}
|
276
|
-
function defaultMissingFieldHandler(_storeRecord, _root, fieldName, arguments_, variables) {
|
277
|
-
if (fieldName === 'node' || fieldName === 'user') {
|
278
|
-
const variable = arguments_ === null || arguments_ === void 0 ? void 0 : arguments_['id'];
|
279
|
-
const value = variables === null || variables === void 0 ? void 0 : variables[variable];
|
280
|
-
// TODO can we handle explicit nulls here too? Probably, after wrapping in objects
|
281
|
-
if (value != null) {
|
282
|
-
return { __link: value };
|
283
|
-
}
|
284
|
-
}
|
285
|
-
}
|
286
|
-
exports.defaultMissingFieldHandler = defaultMissingFieldHandler;
|
287
|
-
function assertLink(link) {
|
288
|
-
if (Array.isArray(link)) {
|
289
|
-
throw new Error('Unexpected array');
|
290
|
-
}
|
291
|
-
if (typeof link === 'object') {
|
292
|
-
return link;
|
293
|
-
}
|
294
|
-
if (link === undefined) {
|
295
|
-
return undefined;
|
296
|
-
}
|
297
|
-
throw new Error('Invalid link');
|
298
|
-
}
|
299
|
-
function filterVariables(variables, allowedVariables) {
|
300
|
-
const result = {};
|
301
|
-
for (const key of allowedVariables) {
|
302
|
-
result[key] = variables[key];
|
303
|
-
}
|
304
|
-
return result;
|
305
|
-
}
|
3
|
+
exports.useImperativeLoadableField = exports.useSkipLimitPagination = exports.useImperativeExposedMutationField = exports.useClientSideDefer = exports.useRerenderOnChange = exports.useLazyReference = exports.useSubscribeToMultiple = exports.useReadAndSubscribe = exports.useResult = exports.FragmentReader = exports.useImperativeReference = exports.useIsographEnvironment = exports.IsographEnvironmentProvider = exports.stableIdForFragmentReference = exports.readButDoNotEvaluate = exports.assertIsEntrypoint = exports.defaultMissingFieldHandler = exports.createIsographStore = exports.createIsographEnvironment = exports.ROOT_ID = exports.makeNetworkRequest = exports.normalizeData = exports.subscribe = exports.wrapPromise = exports.wrapResolvedValue = exports.getPromiseState = exports.readPromise = exports.garbageCollectEnvironment = exports.unretainQuery = exports.retainQuery = void 0;
|
4
|
+
var garbageCollection_1 = require("./core/garbageCollection");
|
5
|
+
Object.defineProperty(exports, "retainQuery", { enumerable: true, get: function () { return garbageCollection_1.retainQuery; } });
|
6
|
+
Object.defineProperty(exports, "unretainQuery", { enumerable: true, get: function () { return garbageCollection_1.unretainQuery; } });
|
7
|
+
Object.defineProperty(exports, "garbageCollectEnvironment", { enumerable: true, get: function () { return garbageCollection_1.garbageCollectEnvironment; } });
|
8
|
+
var PromiseWrapper_1 = require("./core/PromiseWrapper");
|
9
|
+
Object.defineProperty(exports, "readPromise", { enumerable: true, get: function () { return PromiseWrapper_1.readPromise; } });
|
10
|
+
Object.defineProperty(exports, "getPromiseState", { enumerable: true, get: function () { return PromiseWrapper_1.getPromiseState; } });
|
11
|
+
Object.defineProperty(exports, "wrapResolvedValue", { enumerable: true, get: function () { return PromiseWrapper_1.wrapResolvedValue; } });
|
12
|
+
Object.defineProperty(exports, "wrapPromise", { enumerable: true, get: function () { return PromiseWrapper_1.wrapPromise; } });
|
13
|
+
var cache_1 = require("./core/cache");
|
14
|
+
Object.defineProperty(exports, "subscribe", { enumerable: true, get: function () { return cache_1.subscribe; } });
|
15
|
+
Object.defineProperty(exports, "normalizeData", { enumerable: true, get: function () { return cache_1.normalizeData; } });
|
16
|
+
var makeNetworkRequest_1 = require("./core/makeNetworkRequest");
|
17
|
+
Object.defineProperty(exports, "makeNetworkRequest", { enumerable: true, get: function () { return makeNetworkRequest_1.makeNetworkRequest; } });
|
18
|
+
var IsographEnvironment_1 = require("./core/IsographEnvironment");
|
19
|
+
Object.defineProperty(exports, "ROOT_ID", { enumerable: true, get: function () { return IsographEnvironment_1.ROOT_ID; } });
|
20
|
+
Object.defineProperty(exports, "createIsographEnvironment", { enumerable: true, get: function () { return IsographEnvironment_1.createIsographEnvironment; } });
|
21
|
+
Object.defineProperty(exports, "createIsographStore", { enumerable: true, get: function () { return IsographEnvironment_1.createIsographStore; } });
|
22
|
+
Object.defineProperty(exports, "defaultMissingFieldHandler", { enumerable: true, get: function () { return IsographEnvironment_1.defaultMissingFieldHandler; } });
|
23
|
+
var entrypoint_1 = require("./core/entrypoint");
|
24
|
+
Object.defineProperty(exports, "assertIsEntrypoint", { enumerable: true, get: function () { return entrypoint_1.assertIsEntrypoint; } });
|
25
|
+
var read_1 = require("./core/read");
|
26
|
+
Object.defineProperty(exports, "readButDoNotEvaluate", { enumerable: true, get: function () { return read_1.readButDoNotEvaluate; } });
|
27
|
+
var FragmentReference_1 = require("./core/FragmentReference");
|
28
|
+
Object.defineProperty(exports, "stableIdForFragmentReference", { enumerable: true, get: function () { return FragmentReference_1.stableIdForFragmentReference; } });
|
29
|
+
var IsographEnvironmentProvider_1 = require("./react/IsographEnvironmentProvider");
|
30
|
+
Object.defineProperty(exports, "IsographEnvironmentProvider", { enumerable: true, get: function () { return IsographEnvironmentProvider_1.IsographEnvironmentProvider; } });
|
31
|
+
Object.defineProperty(exports, "useIsographEnvironment", { enumerable: true, get: function () { return IsographEnvironmentProvider_1.useIsographEnvironment; } });
|
32
|
+
var useImperativeReference_1 = require("./react/useImperativeReference");
|
33
|
+
Object.defineProperty(exports, "useImperativeReference", { enumerable: true, get: function () { return useImperativeReference_1.useImperativeReference; } });
|
34
|
+
var FragmentReader_1 = require("./react/FragmentReader");
|
35
|
+
Object.defineProperty(exports, "FragmentReader", { enumerable: true, get: function () { return FragmentReader_1.FragmentReader; } });
|
36
|
+
var useResult_1 = require("./react/useResult");
|
37
|
+
Object.defineProperty(exports, "useResult", { enumerable: true, get: function () { return useResult_1.useResult; } });
|
38
|
+
var useReadAndSubscribe_1 = require("./react/useReadAndSubscribe");
|
39
|
+
Object.defineProperty(exports, "useReadAndSubscribe", { enumerable: true, get: function () { return useReadAndSubscribe_1.useReadAndSubscribe; } });
|
40
|
+
Object.defineProperty(exports, "useSubscribeToMultiple", { enumerable: true, get: function () { return useReadAndSubscribe_1.useSubscribeToMultiple; } });
|
41
|
+
var useLazyReference_1 = require("./react/useLazyReference");
|
42
|
+
Object.defineProperty(exports, "useLazyReference", { enumerable: true, get: function () { return useLazyReference_1.useLazyReference; } });
|
43
|
+
var useRerenderOnChange_1 = require("./react/useRerenderOnChange");
|
44
|
+
Object.defineProperty(exports, "useRerenderOnChange", { enumerable: true, get: function () { return useRerenderOnChange_1.useRerenderOnChange; } });
|
45
|
+
var useClientSideDefer_1 = require("./loadable-hooks/useClientSideDefer");
|
46
|
+
Object.defineProperty(exports, "useClientSideDefer", { enumerable: true, get: function () { return useClientSideDefer_1.useClientSideDefer; } });
|
47
|
+
var useImperativeExposedMutationField_1 = require("./loadable-hooks/useImperativeExposedMutationField");
|
48
|
+
Object.defineProperty(exports, "useImperativeExposedMutationField", { enumerable: true, get: function () { return useImperativeExposedMutationField_1.useImperativeExposedMutationField; } });
|
49
|
+
var useSkipLimitPagination_1 = require("./loadable-hooks/useSkipLimitPagination");
|
50
|
+
Object.defineProperty(exports, "useSkipLimitPagination", { enumerable: true, get: function () { return useSkipLimitPagination_1.useSkipLimitPagination; } });
|
51
|
+
var useImperativeLoadableField_1 = require("./loadable-hooks/useImperativeLoadableField");
|
52
|
+
Object.defineProperty(exports, "useImperativeLoadableField", { enumerable: true, get: function () { return useImperativeLoadableField_1.useImperativeLoadableField; } });
|
@@ -0,0 +1,4 @@
|
|
1
|
+
import { FragmentReference } from '../core/FragmentReference';
|
2
|
+
import { LoadableField } from '../core/reader';
|
3
|
+
export declare function useClientSideDefer<TResult>(loadableField: LoadableField<void, TResult>): FragmentReference<Record<string, never>, TResult>;
|
4
|
+
export declare function useClientSideDefer<TArgs extends Object, TResult>(loadableField: LoadableField<TArgs, TResult>, args: TArgs): FragmentReference<TArgs, TResult>;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useClientSideDefer = void 0;
|
4
|
+
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
5
|
+
const cache_1 = require("../core/cache");
|
6
|
+
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
7
|
+
function useClientSideDefer(loadableField, args) {
|
8
|
+
// @ts-expect-error args is missing iff it has the type void
|
9
|
+
const [id, loader] = loadableField(args);
|
10
|
+
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
11
|
+
const cache = (0, cache_1.getOrCreateItemInSuspenseCache)(environment, id, loader);
|
12
|
+
const fragmentReference = (0, react_disposable_state_1.useLazyDisposableState)(cache).state;
|
13
|
+
return fragmentReference;
|
14
|
+
}
|
15
|
+
exports.useClientSideDefer = useClientSideDefer;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useImperativeExposedMutationField = void 0;
|
4
|
+
// Note: this function doesn't seem to work if there are additional arguments,
|
5
|
+
// e.g. with set_pet_tagline. Why? This seems to straightforwardly call
|
6
|
+
// exposedField(args)[1](); Odd.
|
7
|
+
function useImperativeExposedMutationField(exposedField) {
|
8
|
+
return {
|
9
|
+
loadField: (args) => {
|
10
|
+
const [_id, loader] = exposedField(args);
|
11
|
+
loader();
|
12
|
+
},
|
13
|
+
};
|
14
|
+
}
|
15
|
+
exports.useImperativeExposedMutationField = useImperativeExposedMutationField;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { FragmentReference } from '../core/FragmentReference';
|
2
|
+
import { UnassignedState } from '@isograph/react-disposable-state';
|
3
|
+
import { LoadableField } from '../core/reader';
|
4
|
+
type UseImperativeLoadableFieldReturn<TArgs, TResult> = {
|
5
|
+
fragmentReference: FragmentReference<any, TResult> | UnassignedState;
|
6
|
+
loadField: (args: TArgs) => void;
|
7
|
+
};
|
8
|
+
export declare function useImperativeLoadableField<TArgs, TResult>(loadableField: LoadableField<TArgs, TResult>): UseImperativeLoadableFieldReturn<TArgs, TResult>;
|
9
|
+
export {};
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useImperativeLoadableField = void 0;
|
4
|
+
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
5
|
+
function useImperativeLoadableField(loadableField) {
|
6
|
+
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
7
|
+
return {
|
8
|
+
loadField: (args) => {
|
9
|
+
const [_id, loader] = loadableField(args);
|
10
|
+
setState(loader());
|
11
|
+
},
|
12
|
+
fragmentReference: state,
|
13
|
+
};
|
14
|
+
}
|
15
|
+
exports.useImperativeLoadableField = useImperativeLoadableField;
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { LoadableField } from '../core/reader';
|
2
|
+
import { FragmentReference } from '../core/FragmentReference';
|
3
|
+
type SkipOrLimit = 'skip' | 'limit';
|
4
|
+
type OmitSkipLimit<TArgs> = keyof Omit<TArgs, SkipOrLimit> extends never ? void | Record<string, never> : Omit<TArgs, SkipOrLimit>;
|
5
|
+
type UseSkipLimitReturnValue<TArgs, TItem> = {
|
6
|
+
readonly kind: 'Complete';
|
7
|
+
readonly fetchMore: (args: OmitSkipLimit<TArgs>, count: number) => void;
|
8
|
+
readonly results: ReadonlyArray<TItem>;
|
9
|
+
} | {
|
10
|
+
readonly kind: 'Pending';
|
11
|
+
readonly results: ReadonlyArray<TItem>;
|
12
|
+
readonly pendingFragment: FragmentReference<any, ReadonlyArray<TItem>>;
|
13
|
+
};
|
14
|
+
/**
|
15
|
+
* accepts a loadableField that accepts skip and limit arguments
|
16
|
+
* and returns:
|
17
|
+
* - a fetchMore function that, when called, triggers a network
|
18
|
+
* request for additional data, and
|
19
|
+
* - the data received so far.
|
20
|
+
*
|
21
|
+
* This hook will suspend if any network request is in flight.
|
22
|
+
*
|
23
|
+
* Calling fetchMore before the hook mounts is a no-op.
|
24
|
+
*
|
25
|
+
* NOTE: this hook does not subscribe to changes. This is a known
|
26
|
+
* issue. If you are running into this issue, reach out on GitHub/
|
27
|
+
* Twitter, and we'll fix the issue.
|
28
|
+
*/
|
29
|
+
export declare function useSkipLimitPagination<TArgs extends {
|
30
|
+
skip: number | void | null;
|
31
|
+
limit: number | void | null;
|
32
|
+
}, TItem>(loadableField: LoadableField<TArgs, Array<TItem>>): UseSkipLimitReturnValue<TArgs, TItem>;
|
33
|
+
export {};
|