@isograph/react 0.1.1 → 0.3.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 +25 -0
- package/dist/core/FragmentReference.d.ts.map +1 -0
- package/dist/core/FragmentReference.js +16 -0
- package/dist/core/IsographEnvironment.d.ts +89 -0
- package/dist/core/IsographEnvironment.d.ts.map +1 -0
- package/dist/core/IsographEnvironment.js +65 -0
- package/dist/core/PromiseWrapper.d.ts +28 -0
- package/dist/core/PromiseWrapper.d.ts.map +1 -0
- package/dist/core/PromiseWrapper.js +57 -0
- package/dist/core/areEqualWithDeepComparison.d.ts +5 -0
- package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -0
- package/dist/core/areEqualWithDeepComparison.js +95 -0
- package/dist/core/cache.d.ts +44 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +514 -0
- package/dist/core/check.d.ts +18 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +127 -0
- package/dist/core/componentCache.d.ts +5 -0
- package/dist/core/componentCache.d.ts.map +1 -0
- package/dist/core/componentCache.js +38 -0
- package/dist/core/entrypoint.d.ts +69 -0
- package/dist/core/entrypoint.d.ts.map +1 -0
- package/dist/core/entrypoint.js +7 -0
- package/dist/core/garbageCollection.d.ts +13 -0
- package/dist/core/garbageCollection.d.ts.map +1 -0
- package/dist/core/garbageCollection.js +107 -0
- package/dist/core/logging.d.ts +69 -0
- package/dist/core/logging.d.ts.map +1 -0
- package/dist/core/logging.js +19 -0
- package/dist/core/makeNetworkRequest.d.ts +9 -0
- package/dist/core/makeNetworkRequest.d.ts.map +1 -0
- package/dist/core/makeNetworkRequest.js +118 -0
- package/dist/core/read.d.ts +27 -0
- package/dist/core/read.d.ts.map +1 -0
- package/dist/core/read.js +478 -0
- package/dist/core/reader.d.ts +87 -0
- package/dist/core/reader.d.ts.map +1 -0
- package/dist/core/reader.js +2 -0
- package/dist/core/util.d.ts +19 -0
- package/dist/core/util.d.ts.map +1 -0
- package/dist/core/util.js +2 -0
- package/dist/index.d.ts +26 -120
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -306
- package/dist/loadable-hooks/useClientSideDefer.d.ts +16 -0
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -0
- package/dist/loadable-hooks/useClientSideDefer.js +13 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +34 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.js +160 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +6 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.js +14 -0
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +17 -0
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -0
- package/dist/loadable-hooks/useImperativeLoadableField.js +14 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +27 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -0
- package/dist/loadable-hooks/useSkipLimitPagination.js +162 -0
- package/dist/react/FragmentReader.d.ts +16 -0
- package/dist/react/FragmentReader.d.ts.map +1 -0
- package/dist/{EntrypointReader.js → react/FragmentReader.js} +7 -5
- package/dist/react/IsographEnvironmentProvider.d.ts +11 -0
- package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -0
- package/dist/{IsographEnvironment.js → react/IsographEnvironmentProvider.js} +4 -22
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +10 -0
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -0
- package/dist/react/RenderAfterCommit__DO_NOT_USE.js +15 -0
- package/dist/react/useImperativeReference.d.ts +12 -0
- package/dist/react/useImperativeReference.d.ts.map +1 -0
- package/dist/react/useImperativeReference.js +35 -0
- package/dist/react/useLazyReference.d.ts +10 -0
- package/dist/react/useLazyReference.d.ts.map +1 -0
- package/dist/react/useLazyReference.js +21 -0
- package/dist/react/useReadAndSubscribe.d.ts +20 -0
- package/dist/react/useReadAndSubscribe.d.ts.map +1 -0
- package/dist/react/useReadAndSubscribe.js +40 -0
- package/dist/react/useRerenderOnChange.d.ts +8 -0
- package/dist/react/useRerenderOnChange.d.ts.map +1 -0
- package/dist/react/useRerenderOnChange.js +22 -0
- package/dist/react/useResult.d.ts +9 -0
- package/dist/react/useResult.d.ts.map +1 -0
- package/dist/react/useResult.js +39 -0
- package/docs/how-useLazyReference-works.md +117 -0
- package/isograph.config.json +7 -0
- package/package.json +18 -9
- package/schema.graphql +17 -0
- package/src/core/FragmentReference.ts +49 -0
- package/src/core/IsographEnvironment.ts +192 -0
- package/src/core/PromiseWrapper.ts +86 -0
- package/src/core/areEqualWithDeepComparison.ts +112 -0
- package/src/core/cache.ts +835 -0
- package/src/core/check.ts +207 -0
- package/src/core/componentCache.ts +62 -0
- package/src/core/entrypoint.ts +106 -0
- package/src/core/garbageCollection.ts +173 -0
- package/src/core/logging.ts +116 -0
- package/src/core/makeNetworkRequest.ts +175 -0
- package/src/core/read.ts +722 -0
- package/src/core/reader.ts +160 -0
- package/src/core/util.ts +27 -0
- package/src/index.ts +99 -0
- package/src/loadable-hooks/useClientSideDefer.ts +58 -0
- package/src/loadable-hooks/useConnectionSpecPagination.ts +331 -0
- package/src/loadable-hooks/useImperativeExposedMutationField.ts +17 -0
- package/src/loadable-hooks/useImperativeLoadableField.ts +52 -0
- package/src/loadable-hooks/useSkipLimitPagination.ts +352 -0
- package/src/react/FragmentReader.tsx +43 -0
- package/src/react/IsographEnvironmentProvider.tsx +33 -0
- package/src/react/RenderAfterCommit__DO_NOT_USE.tsx +17 -0
- package/src/react/useImperativeReference.ts +68 -0
- package/src/react/useLazyReference.ts +42 -0
- package/src/react/useReadAndSubscribe.ts +81 -0
- package/src/react/useRerenderOnChange.ts +38 -0
- package/src/react/useResult.ts +73 -0
- package/src/tests/__isograph/Query/meName/entrypoint.ts +52 -0
- package/src/tests/__isograph/Query/meName/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meName/param_type.ts +9 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +33 -0
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +90 -0
- package/src/tests/__isograph/Query/meNameSuccessor/output_type.ts +3 -0
- package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +14 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +57 -0
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +57 -0
- package/src/tests/__isograph/Query/nodeField/output_type.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/param_type.ts +10 -0
- package/src/tests/__isograph/Query/nodeField/parameters_type.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +38 -0
- package/src/tests/__isograph/Query/subquery/entrypoint.ts +67 -0
- package/src/tests/__isograph/Query/subquery/output_type.ts +3 -0
- package/src/tests/__isograph/Query/subquery/param_type.ts +12 -0
- package/src/tests/__isograph/Query/subquery/parameters_type.ts +3 -0
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +47 -0
- package/src/tests/__isograph/iso.ts +99 -0
- package/src/tests/garbageCollection.test.ts +142 -0
- package/src/tests/meNameSuccessor.ts +25 -0
- package/src/tests/nodeQuery.ts +19 -0
- package/src/tests/normalizeData.test.ts +120 -0
- package/src/tests/tsconfig.json +21 -0
- package/tsconfig.json +6 -0
- package/tsconfig.pkg.json +7 -1
- package/vitest.config.ts +20 -0
- package/dist/EntrypointReader.d.ts +0 -6
- 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/dist/useImperativeReference.d.ts +0 -8
- package/dist/useImperativeReference.js +0 -28
- package/src/EntrypointReader.tsx +0 -20
- package/src/IsographEnvironment.tsx +0 -120
- package/src/PromiseWrapper.ts +0 -29
- package/src/cache.tsx +0 -484
- package/src/componentCache.ts +0 -41
- package/src/index.tsx +0 -617
- package/src/useImperativeReference.ts +0 -58
@@ -0,0 +1,160 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useConnectionSpecPagination = useConnectionSpecPagination;
|
4
|
+
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
5
|
+
const reference_counted_pointer_1 = require("@isograph/reference-counted-pointer");
|
6
|
+
const react_1 = require("react");
|
7
|
+
const cache_1 = require("../core/cache");
|
8
|
+
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
9
|
+
const read_1 = require("../core/read");
|
10
|
+
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
11
|
+
const useReadAndSubscribe_1 = require("../react/useReadAndSubscribe");
|
12
|
+
const useResult_1 = require("../react/useResult");
|
13
|
+
function flatten(arr) {
|
14
|
+
let outArray = [];
|
15
|
+
for (const subarr of arr) {
|
16
|
+
for (const item of subarr) {
|
17
|
+
outArray.push(item);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
return outArray;
|
21
|
+
}
|
22
|
+
function useConnectionSpecPagination(loadableField, initialState) {
|
23
|
+
var _a, _b;
|
24
|
+
const networkRequestOptions = {
|
25
|
+
suspendIfInFlight: true,
|
26
|
+
throwOnNetworkError: true,
|
27
|
+
};
|
28
|
+
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
29
|
+
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
30
|
+
// TODO move this out of useSkipLimitPagination, and pass environment and networkRequestOptions
|
31
|
+
// as parameters (or recreate networkRequestOptions)
|
32
|
+
function readCompletedFragmentReferences(completedReferences) {
|
33
|
+
var _a, _b;
|
34
|
+
const results = completedReferences.map((fragmentReference, i) => {
|
35
|
+
var _a;
|
36
|
+
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
37
|
+
// invariant: readOutDataAndRecords.length === completedReferences.length
|
38
|
+
const data = (_a = readOutDataAndRecords[i]) === null || _a === void 0 ? void 0 : _a.item;
|
39
|
+
if (data == null) {
|
40
|
+
throw new Error('Parameter data is unexpectedly null. This is indicative of a bug in Isograph.');
|
41
|
+
}
|
42
|
+
const firstParameter = {
|
43
|
+
data,
|
44
|
+
parameters: fragmentReference.variables,
|
45
|
+
};
|
46
|
+
if (readerWithRefetchQueries.readerArtifact.kind !== 'EagerReaderArtifact') {
|
47
|
+
throw new Error(`@loadable field of kind "${readerWithRefetchQueries.readerArtifact.kind}" is not supported by useSkipLimitPagination`);
|
48
|
+
}
|
49
|
+
return readerWithRefetchQueries.readerArtifact.resolver(firstParameter);
|
50
|
+
});
|
51
|
+
const items = flatten(results.map((result) => { var _a; return (_a = result.edges) !== null && _a !== void 0 ? _a : []; }));
|
52
|
+
return {
|
53
|
+
edges: items,
|
54
|
+
pageInfo: (_b = (_a = results[results.length - 1]) === null || _a === void 0 ? void 0 : _a.pageInfo) !== null && _b !== void 0 ? _b : {
|
55
|
+
endCursor: null,
|
56
|
+
hasNextPage: true,
|
57
|
+
},
|
58
|
+
};
|
59
|
+
}
|
60
|
+
function subscribeCompletedFragmentReferences(completedReferences) {
|
61
|
+
return completedReferences.map((fragmentReference, i) => {
|
62
|
+
(0, useResult_1.maybeUnwrapNetworkRequest)(fragmentReference.networkRequest, networkRequestOptions);
|
63
|
+
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
64
|
+
const records = readOutDataAndRecords[i];
|
65
|
+
if (records == null) {
|
66
|
+
throw new Error('subscribeCompletedFragmentReferences records is unexpectedly null');
|
67
|
+
}
|
68
|
+
return {
|
69
|
+
fragmentReference,
|
70
|
+
readerAst: readerWithRefetchQueries.readerArtifact.readerAst,
|
71
|
+
records,
|
72
|
+
callback(_data) {
|
73
|
+
rerender({});
|
74
|
+
},
|
75
|
+
};
|
76
|
+
});
|
77
|
+
}
|
78
|
+
const getFetchMore = (after) => (count, fetchOptions) => {
|
79
|
+
const loadedField = loadableField({
|
80
|
+
after: after,
|
81
|
+
first: count,
|
82
|
+
}, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : {})[1]();
|
83
|
+
const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
|
84
|
+
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
85
|
+
const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
|
86
|
+
if (clonedRefCountedPointer == null) {
|
87
|
+
throw new Error('This reference counted pointer has already been disposed. \
|
88
|
+
This is indicative of a bug in useSkipLimitPagination.');
|
89
|
+
}
|
90
|
+
return clonedRefCountedPointer;
|
91
|
+
});
|
92
|
+
clonedPointers.push(newPointer);
|
93
|
+
const totalItemCleanupPair = [
|
94
|
+
clonedPointers,
|
95
|
+
() => {
|
96
|
+
clonedPointers.forEach(([, dispose]) => {
|
97
|
+
dispose();
|
98
|
+
});
|
99
|
+
},
|
100
|
+
];
|
101
|
+
setState(totalItemCleanupPair);
|
102
|
+
};
|
103
|
+
const [, rerender] = (0, react_1.useState)({});
|
104
|
+
const loadedReferences = state === react_disposable_state_1.UNASSIGNED_STATE ? [] : state;
|
105
|
+
const mostRecentItem = loadedReferences[loadedReferences.length - 1];
|
106
|
+
const mostRecentFragmentReference = mostRecentItem === null || mostRecentItem === void 0 ? void 0 : mostRecentItem[0].getItemIfNotDisposed();
|
107
|
+
if (mostRecentItem && mostRecentFragmentReference === null) {
|
108
|
+
throw new Error('FragmentReference is unexpectedly disposed. \
|
109
|
+
This is indicative of a bug in Isograph.');
|
110
|
+
}
|
111
|
+
const networkRequestStatus = mostRecentFragmentReference &&
|
112
|
+
(0, PromiseWrapper_1.getPromiseState)(mostRecentFragmentReference.networkRequest);
|
113
|
+
const slicedFragmentReferences = (networkRequestStatus === null || networkRequestStatus === void 0 ? void 0 : networkRequestStatus.kind) === 'Ok'
|
114
|
+
? loadedReferences
|
115
|
+
: loadedReferences.slice(0, loadedReferences.length - 1);
|
116
|
+
const completedFragmentReferences = slicedFragmentReferences.map(([pointer]) => {
|
117
|
+
const fragmentReference = pointer.getItemIfNotDisposed();
|
118
|
+
if (fragmentReference == null) {
|
119
|
+
throw new Error('FragmentReference is unexpectedly disposed. \
|
120
|
+
This is indicative of a bug in Isograph.');
|
121
|
+
}
|
122
|
+
return fragmentReference;
|
123
|
+
});
|
124
|
+
const readOutDataAndRecords = completedFragmentReferences.map((fragmentReference) => (0, read_1.readButDoNotEvaluate)(environment, fragmentReference, networkRequestOptions));
|
125
|
+
(0, useReadAndSubscribe_1.useSubscribeToMultiple)(subscribeCompletedFragmentReferences(completedFragmentReferences));
|
126
|
+
if (!networkRequestStatus) {
|
127
|
+
return {
|
128
|
+
kind: 'Complete',
|
129
|
+
fetchMore: getFetchMore((_a = initialState === null || initialState === void 0 ? void 0 : initialState.endCursor) !== null && _a !== void 0 ? _a : null),
|
130
|
+
results: [],
|
131
|
+
hasNextPage: (_b = initialState === null || initialState === void 0 ? void 0 : initialState.hasNextPage) !== null && _b !== void 0 ? _b : true,
|
132
|
+
};
|
133
|
+
}
|
134
|
+
switch (networkRequestStatus.kind) {
|
135
|
+
case 'Pending': {
|
136
|
+
const unsubscribe = (0, cache_1.subscribeToAnyChange)(environment, () => {
|
137
|
+
unsubscribe();
|
138
|
+
rerender({});
|
139
|
+
});
|
140
|
+
const results = readCompletedFragmentReferences(completedFragmentReferences);
|
141
|
+
return {
|
142
|
+
results: results.edges,
|
143
|
+
kind: 'Pending',
|
144
|
+
pendingFragment: mostRecentFragmentReference,
|
145
|
+
};
|
146
|
+
}
|
147
|
+
case 'Err': {
|
148
|
+
throw networkRequestStatus.error;
|
149
|
+
}
|
150
|
+
case 'Ok': {
|
151
|
+
const results = readCompletedFragmentReferences(completedFragmentReferences);
|
152
|
+
return {
|
153
|
+
results: results.edges,
|
154
|
+
hasNextPage: results.pageInfo.hasNextPage,
|
155
|
+
kind: 'Complete',
|
156
|
+
fetchMore: getFetchMore(results.pageInfo.endCursor),
|
157
|
+
};
|
158
|
+
}
|
159
|
+
}
|
160
|
+
}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
type UseImperativeLoadableFieldReturn<TArgs> = {
|
2
|
+
loadField: (args: TArgs) => void;
|
3
|
+
};
|
4
|
+
export declare function useImperativeExposedMutationField<TArgs>(exposedField: (args: TArgs) => [string, () => void]): UseImperativeLoadableFieldReturn<TArgs>;
|
5
|
+
export {};
|
6
|
+
//# sourceMappingURL=useImperativeExposedMutationField.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useImperativeExposedMutationField.d.ts","sourceRoot":"","sources":["../../src/loadable-hooks/useImperativeExposedMutationField.ts"],"names":[],"mappings":"AAAA,KAAK,gCAAgC,CAAC,KAAK,IAAI;IAC7C,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AAKF,wBAAgB,iCAAiC,CAAC,KAAK,EACrD,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,GAClD,gCAAgC,CAAC,KAAK,CAAC,CAOzC"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useImperativeExposedMutationField = useImperativeExposedMutationField;
|
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
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { ExtractParameters, FragmentReference } from '../core/FragmentReference';
|
2
|
+
import { UnassignedState } from '@isograph/react-disposable-state';
|
3
|
+
import { LoadableField } from '../core/reader';
|
4
|
+
import { FetchOptions } from '../core/check';
|
5
|
+
type UseImperativeLoadableFieldReturn<TReadFromStore extends {
|
6
|
+
data: object;
|
7
|
+
parameters: object;
|
8
|
+
}, TResult, TProvidedArgs extends object> = {
|
9
|
+
fragmentReference: FragmentReference<TReadFromStore, TResult> | UnassignedState;
|
10
|
+
loadField: (args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs> | void, fetchOptions?: FetchOptions) => void;
|
11
|
+
};
|
12
|
+
export declare function useImperativeLoadableField<TReadFromStore extends {
|
13
|
+
data: object;
|
14
|
+
parameters: object;
|
15
|
+
}, TResult, TProvidedArgs extends object>(loadableField: LoadableField<TReadFromStore, TResult, Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>>): UseImperativeLoadableFieldReturn<TReadFromStore, TResult, TProvidedArgs>;
|
16
|
+
export {};
|
17
|
+
//# sourceMappingURL=useImperativeLoadableField.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useImperativeLoadableField.d.ts","sourceRoot":"","sources":["../../src/loadable-hooks/useImperativeLoadableField.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,KAAK,gCAAgC,CACnC,cAAc,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC3D,OAAO,EACP,aAAa,SAAS,MAAM,IAC1B;IACF,iBAAiB,EACb,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,GAC1C,eAAe,CAAC;IACpB,SAAS,EAAE,CAGT,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,MAAM,aAAa,CAAC,GAAG,IAAI,EACzE,YAAY,CAAC,EAAE,YAAY,KACxB,IAAI,CAAC;CACX,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,cAAc,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC3D,OAAO,EACP,aAAa,SAAS,MAAM,EAE5B,aAAa,EAAE,aAAa,CAC1B,cAAc,EACd,OAAO,EACP,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,MAAM,aAAa,CAAC,CAC7D,GACA,gCAAgC,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC,CAc1E"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useImperativeLoadableField = useImperativeLoadableField;
|
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, fetchOptions) => {
|
9
|
+
const [_id, loader] = loadableField(args, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : {});
|
10
|
+
setState(loader());
|
11
|
+
},
|
12
|
+
fragmentReference: state,
|
13
|
+
};
|
14
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { LoadableField } from '../core/reader';
|
2
|
+
import { FragmentReference } from '../core/FragmentReference';
|
3
|
+
import { FetchOptions } from '../core/check';
|
4
|
+
type UseSkipLimitReturnValue<TReadFromStore extends {
|
5
|
+
data: object;
|
6
|
+
parameters: object;
|
7
|
+
}, TItem> = {
|
8
|
+
readonly kind: 'Complete';
|
9
|
+
readonly fetchMore: (count: number, fetchOptions?: FetchOptions) => void;
|
10
|
+
readonly results: ReadonlyArray<TItem>;
|
11
|
+
} | {
|
12
|
+
readonly kind: 'Pending';
|
13
|
+
readonly results: ReadonlyArray<TItem>;
|
14
|
+
readonly pendingFragment: FragmentReference<TReadFromStore, ReadonlyArray<TItem>>;
|
15
|
+
};
|
16
|
+
type UseSkipLimitPaginationArgs = {
|
17
|
+
skip: number;
|
18
|
+
limit: number;
|
19
|
+
};
|
20
|
+
export declare function useSkipLimitPagination<TItem, TReadFromStore extends {
|
21
|
+
parameters: object;
|
22
|
+
data: object;
|
23
|
+
}>(loadableField: LoadableField<TReadFromStore, ReadonlyArray<TItem>, UseSkipLimitPaginationArgs>, initialState?: {
|
24
|
+
skip?: number | void | null;
|
25
|
+
}): UseSkipLimitReturnValue<TReadFromStore, TItem>;
|
26
|
+
export {};
|
27
|
+
//# sourceMappingURL=useSkipLimitPagination.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useSkipLimitPagination.d.ts","sourceRoot":"","sources":["../../src/loadable-hooks/useSkipLimitPagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAgB9D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,KAAK,uBAAuB,CAC1B,cAAc,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC3D,KAAK,IAEH;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;CACxC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CACzC,cAAc,EACd,aAAa,CAAC,KAAK,CAAC,CACrB,CAAC;CACH,CAAC;AA6BN,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,KAAK,EACL,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,EAED,aAAa,EAAE,aAAa,CAC1B,cAAc,EACd,aAAa,CAAC,KAAK,CAAC,EACpB,0BAA0B,CAC3B,EACD,YAAY,CAAC,EAAE;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAC7B,GACA,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC,CA+NhD"}
|
@@ -0,0 +1,162 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useSkipLimitPagination = useSkipLimitPagination;
|
4
|
+
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
5
|
+
const useResult_1 = require("../react/useResult");
|
6
|
+
const read_1 = require("../core/read");
|
7
|
+
const cache_1 = require("../core/cache");
|
8
|
+
const react_1 = require("react");
|
9
|
+
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
10
|
+
const reference_counted_pointer_1 = require("@isograph/reference-counted-pointer");
|
11
|
+
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
12
|
+
const useReadAndSubscribe_1 = require("../react/useReadAndSubscribe");
|
13
|
+
function flatten(arr) {
|
14
|
+
let outArray = [];
|
15
|
+
for (const subarr of arr) {
|
16
|
+
for (const item of subarr) {
|
17
|
+
outArray.push(item);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
return outArray;
|
21
|
+
}
|
22
|
+
function useSkipLimitPagination(loadableField, initialState) {
|
23
|
+
var _a;
|
24
|
+
const networkRequestOptions = {
|
25
|
+
suspendIfInFlight: true,
|
26
|
+
throwOnNetworkError: true,
|
27
|
+
};
|
28
|
+
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
29
|
+
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
30
|
+
// TODO move this out of useSkipLimitPagination, and pass environment and networkRequestOptions
|
31
|
+
// as parameters (or recreate networkRequestOptions)
|
32
|
+
function readCompletedFragmentReferences(completedReferences) {
|
33
|
+
const results = completedReferences.map((fragmentReference, i) => {
|
34
|
+
var _a;
|
35
|
+
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
36
|
+
// invariant: readOutDataAndRecords.length === completedReferences.length
|
37
|
+
const data = (_a = readOutDataAndRecords[i]) === null || _a === void 0 ? void 0 : _a.item;
|
38
|
+
if (data == null) {
|
39
|
+
throw new Error('Parameter data is unexpectedly null. This is indicative of a bug in Isograph.');
|
40
|
+
}
|
41
|
+
const firstParameter = {
|
42
|
+
data,
|
43
|
+
parameters: fragmentReference.variables,
|
44
|
+
};
|
45
|
+
if (readerWithRefetchQueries.readerArtifact.kind !== 'EagerReaderArtifact') {
|
46
|
+
throw new Error(`@loadable field of kind "${readerWithRefetchQueries.readerArtifact.kind}" is not supported by useSkipLimitPagination`);
|
47
|
+
}
|
48
|
+
return readerWithRefetchQueries.readerArtifact.resolver(firstParameter);
|
49
|
+
});
|
50
|
+
const items = flatten(results);
|
51
|
+
return items;
|
52
|
+
}
|
53
|
+
function subscribeCompletedFragmentReferences(completedReferences) {
|
54
|
+
return completedReferences.map((fragmentReference, i) => {
|
55
|
+
(0, useResult_1.maybeUnwrapNetworkRequest)(fragmentReference.networkRequest, networkRequestOptions);
|
56
|
+
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
57
|
+
const records = readOutDataAndRecords[i];
|
58
|
+
if (records == null) {
|
59
|
+
throw new Error('subscribeCompletedFragmentReferences records is unexpectedly null');
|
60
|
+
}
|
61
|
+
return {
|
62
|
+
fragmentReference,
|
63
|
+
readerAst: readerWithRefetchQueries.readerArtifact.readerAst,
|
64
|
+
records,
|
65
|
+
callback(_data) {
|
66
|
+
rerender({});
|
67
|
+
},
|
68
|
+
};
|
69
|
+
});
|
70
|
+
}
|
71
|
+
const getFetchMore = (loadedSoFar) => (count, fetchOptions) => {
|
72
|
+
const loadedField = loadableField({
|
73
|
+
skip: loadedSoFar,
|
74
|
+
limit: count,
|
75
|
+
}, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : {})[1]();
|
76
|
+
const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
|
77
|
+
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
78
|
+
const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
|
79
|
+
if (clonedRefCountedPointer == null) {
|
80
|
+
throw new Error('This reference counted pointer has already been disposed. \
|
81
|
+
This is indicative of a bug in useSkipLimitPagination.');
|
82
|
+
}
|
83
|
+
return clonedRefCountedPointer;
|
84
|
+
});
|
85
|
+
clonedPointers.push(newPointer);
|
86
|
+
const totalItemCleanupPair = [
|
87
|
+
clonedPointers,
|
88
|
+
() => {
|
89
|
+
clonedPointers.forEach(([, dispose]) => {
|
90
|
+
dispose();
|
91
|
+
});
|
92
|
+
},
|
93
|
+
];
|
94
|
+
setState(totalItemCleanupPair);
|
95
|
+
};
|
96
|
+
const [, rerender] = (0, react_1.useState)({});
|
97
|
+
const loadedReferences = state === react_disposable_state_1.UNASSIGNED_STATE ? [] : state;
|
98
|
+
const mostRecentItem = loadedReferences[loadedReferences.length - 1];
|
99
|
+
const mostRecentFragmentReference = mostRecentItem === null || mostRecentItem === void 0 ? void 0 : mostRecentItem[0].getItemIfNotDisposed();
|
100
|
+
if (mostRecentItem && mostRecentFragmentReference === null) {
|
101
|
+
throw new Error('FragmentReference is unexpectedly disposed. \
|
102
|
+
This is indicative of a bug in Isograph.');
|
103
|
+
}
|
104
|
+
const networkRequestStatus = mostRecentFragmentReference &&
|
105
|
+
(0, PromiseWrapper_1.getPromiseState)(mostRecentFragmentReference.networkRequest);
|
106
|
+
const slicedFragmentReferences = (networkRequestStatus === null || networkRequestStatus === void 0 ? void 0 : networkRequestStatus.kind) === 'Ok'
|
107
|
+
? loadedReferences
|
108
|
+
: loadedReferences.slice(0, loadedReferences.length - 1);
|
109
|
+
const completedFragmentReferences = slicedFragmentReferences.map(([pointer]) => {
|
110
|
+
const fragmentReference = pointer.getItemIfNotDisposed();
|
111
|
+
if (fragmentReference == null) {
|
112
|
+
throw new Error('FragmentReference is unexpectedly disposed. \
|
113
|
+
This is indicative of a bug in Isograph.');
|
114
|
+
}
|
115
|
+
return fragmentReference;
|
116
|
+
});
|
117
|
+
const readOutDataAndRecords = completedFragmentReferences.map((fragmentReference) => (0, read_1.readButDoNotEvaluate)(environment, fragmentReference, networkRequestOptions));
|
118
|
+
(0, useReadAndSubscribe_1.useSubscribeToMultiple)(subscribeCompletedFragmentReferences(completedFragmentReferences));
|
119
|
+
if (!networkRequestStatus) {
|
120
|
+
return {
|
121
|
+
kind: 'Complete',
|
122
|
+
fetchMore: getFetchMore((_a = initialState === null || initialState === void 0 ? void 0 : initialState.skip) !== null && _a !== void 0 ? _a : 0),
|
123
|
+
results: [],
|
124
|
+
};
|
125
|
+
}
|
126
|
+
switch (networkRequestStatus.kind) {
|
127
|
+
case 'Pending': {
|
128
|
+
const unsubscribe = (0, cache_1.subscribeToAnyChange)(environment, () => {
|
129
|
+
unsubscribe();
|
130
|
+
rerender({});
|
131
|
+
});
|
132
|
+
return {
|
133
|
+
kind: 'Pending',
|
134
|
+
pendingFragment: mostRecentFragmentReference,
|
135
|
+
results: readCompletedFragmentReferences(completedFragmentReferences),
|
136
|
+
};
|
137
|
+
}
|
138
|
+
case 'Err': {
|
139
|
+
throw networkRequestStatus.error;
|
140
|
+
}
|
141
|
+
case 'Ok': {
|
142
|
+
const results = readCompletedFragmentReferences(completedFragmentReferences);
|
143
|
+
return {
|
144
|
+
kind: 'Complete',
|
145
|
+
results,
|
146
|
+
fetchMore: getFetchMore(results.length),
|
147
|
+
};
|
148
|
+
}
|
149
|
+
}
|
150
|
+
}
|
151
|
+
// @ts-ignore
|
152
|
+
function tsTests() {
|
153
|
+
let basicLoadable;
|
154
|
+
useSkipLimitPagination(basicLoadable);
|
155
|
+
useSkipLimitPagination(basicLoadable, {});
|
156
|
+
useSkipLimitPagination(basicLoadable, { skip: 10 });
|
157
|
+
let unprovidedSearchLoadable;
|
158
|
+
// @ts-expect-error
|
159
|
+
useSkipLimitPagination(unprovidedSearchLoadable);
|
160
|
+
let providedSearchLoadable;
|
161
|
+
useSkipLimitPagination(providedSearchLoadable);
|
162
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
import { ExtractReadFromStore, IsographEntrypoint } from '../core/entrypoint';
|
3
|
+
import { FragmentReference } from '../core/FragmentReference';
|
4
|
+
import { NetworkRequestReaderOptions } from '../core/read';
|
5
|
+
type IsExactlyIntrinsicAttributes<T> = T extends JSX.IntrinsicAttributes ? JSX.IntrinsicAttributes extends T ? true : false : false;
|
6
|
+
export declare function FragmentReader<TProps extends Record<any, any>, TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>>(props: IsExactlyIntrinsicAttributes<TProps> extends true ? {
|
7
|
+
fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<TProps>>;
|
8
|
+
additionalProps?: Record<PropertyKey, never>;
|
9
|
+
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
10
|
+
} : {
|
11
|
+
fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<TProps>>;
|
12
|
+
additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
|
13
|
+
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
14
|
+
}): React.ReactNode;
|
15
|
+
export {};
|
16
|
+
//# sourceMappingURL=FragmentReader.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FragmentReader.d.ts","sourceRoot":"","sources":["../../src/react/FragmentReader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,KAAK,4BAA4B,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,mBAAmB,GACpE,GAAG,CAAC,mBAAmB,SAAS,CAAC,GAC/B,IAAI,GACJ,KAAK,GACP,KAAK,CAAC;AAEV,wBAAgB,cAAc,CAC5B,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC/B,WAAW,SAAS,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAE7D,KAAK,EAAE,4BAA4B,CAAC,MAAM,CAAC,SAAS,IAAI,GACpD;IACE,iBAAiB,EAAE,iBAAiB,CAClC,oBAAoB,CAAC,WAAW,CAAC,EACjC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CACjB,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC7C,qBAAqB,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAC9D,GACD;IACE,iBAAiB,EAAE,iBAAiB,CAClC,oBAAoB,CAAC,WAAW,CAAC,EACjC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CACjB,CAAC;IACF,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC7D,qBAAqB,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAC9D,GACJ,KAAK,CAAC,SAAS,CASjB"}
|
@@ -23,11 +23,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
23
|
return result;
|
24
24
|
};
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
-
exports.
|
26
|
+
exports.FragmentReader = FragmentReader;
|
27
27
|
const React = __importStar(require("react"));
|
28
|
-
const
|
29
|
-
function
|
30
|
-
const Component = (0,
|
28
|
+
const useResult_1 = require("./useResult");
|
29
|
+
function FragmentReader(props) {
|
30
|
+
const Component = (0, useResult_1.useResult)(props.fragmentReference, props.networkRequestOptions);
|
31
|
+
// TypeScript is not understanding that if additionalProps is Record<PropertyKey, never>,
|
32
|
+
// it means that TProps === JSX.IntrinsicAttributes.
|
33
|
+
// @ts-expect-error
|
31
34
|
return React.createElement(Component, Object.assign({}, props.additionalProps));
|
32
35
|
}
|
33
|
-
exports.EntrypointReader = EntrypointReader;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
import { ReactNode } from 'react';
|
3
|
+
import { type IsographEnvironment } from '../core/IsographEnvironment';
|
4
|
+
export declare const IsographEnvironmentContext: React.Context<IsographEnvironment | null>;
|
5
|
+
export type IsographEnvironmentProviderProps = {
|
6
|
+
readonly environment: IsographEnvironment;
|
7
|
+
readonly children: ReactNode;
|
8
|
+
};
|
9
|
+
export declare function IsographEnvironmentProvider({ environment, children, }: IsographEnvironmentProviderProps): React.ReactElement;
|
10
|
+
export declare function useIsographEnvironment(): IsographEnvironment;
|
11
|
+
//# sourceMappingURL=IsographEnvironmentProvider.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"IsographEnvironmentProvider.d.ts","sourceRoot":"","sources":["../../src/react/IsographEnvironmentProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAA6B,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,eAAO,MAAM,0BAA0B,2CACU,CAAC;AAElD,MAAM,MAAM,gCAAgC,GAAG;IAC7C,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,EAC1C,WAAW,EACX,QAAQ,GACT,EAAE,gCAAgC,GAAG,KAAK,CAAC,YAAY,CAMvD;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,CAS5D"}
|
@@ -23,15 +23,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
23
|
return result;
|
24
24
|
};
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
-
exports.
|
27
|
-
|
26
|
+
exports.IsographEnvironmentContext = void 0;
|
27
|
+
exports.IsographEnvironmentProvider = IsographEnvironmentProvider;
|
28
|
+
exports.useIsographEnvironment = useIsographEnvironment;
|
28
29
|
const React = __importStar(require("react"));
|
30
|
+
const react_1 = require("react");
|
29
31
|
exports.IsographEnvironmentContext = (0, react_1.createContext)(null);
|
30
|
-
exports.ROOT_ID = '__ROOT';
|
31
32
|
function IsographEnvironmentProvider({ environment, children, }) {
|
32
33
|
return (React.createElement(exports.IsographEnvironmentContext.Provider, { value: environment }, children));
|
33
34
|
}
|
34
|
-
exports.IsographEnvironmentProvider = IsographEnvironmentProvider;
|
35
35
|
function useIsographEnvironment() {
|
36
36
|
const context = (0, react_1.useContext)(exports.IsographEnvironmentContext);
|
37
37
|
if (context == null) {
|
@@ -40,21 +40,3 @@ function useIsographEnvironment() {
|
|
40
40
|
}
|
41
41
|
return context;
|
42
42
|
}
|
43
|
-
exports.useIsographEnvironment = useIsographEnvironment;
|
44
|
-
function createIsographEnvironment(store, networkFunction, missingFieldHandler) {
|
45
|
-
return {
|
46
|
-
store,
|
47
|
-
networkFunction,
|
48
|
-
missingFieldHandler: missingFieldHandler !== null && missingFieldHandler !== void 0 ? missingFieldHandler : null,
|
49
|
-
componentCache: {},
|
50
|
-
subscriptions: new Set(),
|
51
|
-
suspenseCache: {},
|
52
|
-
};
|
53
|
-
}
|
54
|
-
exports.createIsographEnvironment = createIsographEnvironment;
|
55
|
-
function createIsographStore() {
|
56
|
-
return {
|
57
|
-
[exports.ROOT_ID]: {},
|
58
|
-
};
|
59
|
-
}
|
60
|
-
exports.createIsographStore = createIsographStore;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
/**
|
2
|
+
* This is a function that will render a component only after it commits.
|
3
|
+
* It should not be used in production. It's useful as a way to debug issues
|
4
|
+
* with NextJS, where an indefinite suspense causes the server to hang
|
5
|
+
* forever and never complete the original request.
|
6
|
+
*/
|
7
|
+
export declare function RenderAfterCommit__DO_NOT_USE({ children, }: {
|
8
|
+
children: React.ReactNode;
|
9
|
+
}): import("react").ReactNode;
|
10
|
+
//# sourceMappingURL=RenderAfterCommit__DO_NOT_USE.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"RenderAfterCommit__DO_NOT_USE.d.ts","sourceRoot":"","sources":["../../src/react/RenderAfterCommit__DO_NOT_USE.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAC5C,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,6BAIA"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.RenderAfterCommit__DO_NOT_USE = RenderAfterCommit__DO_NOT_USE;
|
4
|
+
const react_1 = require("react");
|
5
|
+
/**
|
6
|
+
* This is a function that will render a component only after it commits.
|
7
|
+
* It should not be used in production. It's useful as a way to debug issues
|
8
|
+
* with NextJS, where an indefinite suspense causes the server to hang
|
9
|
+
* forever and never complete the original request.
|
10
|
+
*/
|
11
|
+
function RenderAfterCommit__DO_NOT_USE({ children, }) {
|
12
|
+
const [show, setShow] = (0, react_1.useState)(false);
|
13
|
+
(0, react_1.useEffect)(() => setShow(true), []);
|
14
|
+
return show ? children : null;
|
15
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { UnassignedState } from '@isograph/react-disposable-state';
|
2
|
+
import { IsographEntrypoint } from '../core/entrypoint';
|
3
|
+
import { FragmentReference, ExtractParameters } from '../core/FragmentReference';
|
4
|
+
import { FetchOptions } from '../core/check';
|
5
|
+
export declare function useImperativeReference<TReadFromStore extends {
|
6
|
+
parameters: object;
|
7
|
+
data: object;
|
8
|
+
}, TClientFieldValue>(entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>): {
|
9
|
+
fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue> | UnassignedState;
|
10
|
+
loadFragmentReference: (variables: ExtractParameters<TReadFromStore>, fetchOptions?: FetchOptions) => void;
|
11
|
+
};
|
12
|
+
//# sourceMappingURL=useImperativeReference.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useImperativeReference.d.ts","sourceRoot":"","sources":["../../src/react/useImperativeReference.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,wBAAgB,sBAAsB,CACpC,cAAc,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3D,iBAAiB,EAEjB,UAAU,EAAE,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAChE;IACD,iBAAiB,EACb,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,GACpD,eAAe,CAAC;IACpB,qBAAqB,EAAE,CACrB,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,YAAY,CAAC,EAAE,YAAY,KACxB,IAAI,CAAC;CACX,CAqCA"}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useImperativeReference = useImperativeReference;
|
4
|
+
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
5
|
+
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
6
|
+
const IsographEnvironment_1 = require("../core/IsographEnvironment");
|
7
|
+
const makeNetworkRequest_1 = require("../core/makeNetworkRequest");
|
8
|
+
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
9
|
+
// TODO rename this to useImperativelyLoadedEntrypoint
|
10
|
+
function useImperativeReference(entrypoint) {
|
11
|
+
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
12
|
+
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
13
|
+
return {
|
14
|
+
fragmentReference: state,
|
15
|
+
loadFragmentReference: (variables, fetchOptions) => {
|
16
|
+
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, variables, fetchOptions);
|
17
|
+
setState([
|
18
|
+
{
|
19
|
+
kind: 'FragmentReference',
|
20
|
+
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
|
21
|
+
kind: 'ReaderWithRefetchQueries',
|
22
|
+
readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
|
23
|
+
nestedRefetchQueries: entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
|
24
|
+
}),
|
25
|
+
root: { __link: IsographEnvironment_1.ROOT_ID, __typename: entrypoint.concreteType },
|
26
|
+
variables,
|
27
|
+
networkRequest,
|
28
|
+
},
|
29
|
+
() => {
|
30
|
+
disposeNetworkRequest();
|
31
|
+
},
|
32
|
+
]);
|
33
|
+
},
|
34
|
+
};
|
35
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { FragmentReference, ExtractParameters } from '../core/FragmentReference';
|
2
|
+
import { IsographEntrypoint } from '../core/entrypoint';
|
3
|
+
import { FetchOptions } from '../core/check';
|
4
|
+
export declare function useLazyReference<TReadFromStore extends {
|
5
|
+
parameters: object;
|
6
|
+
data: object;
|
7
|
+
}, TClientFieldValue>(entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>, variables: ExtractParameters<TReadFromStore>, fetchOptions?: FetchOptions): {
|
8
|
+
fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>;
|
9
|
+
};
|
10
|
+
//# sourceMappingURL=useLazyReference.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useLazyReference.d.ts","sourceRoot":"","sources":["../../src/react/useLazyReference.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,gBAAgB,CAC9B,cAAc,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3D,iBAAiB,EAEjB,UAAU,EAAE,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,CAAC,EACjE,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,YAAY,CAAC,EAAE,YAAY,GAC1B;IACD,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;CACzE,CAqBA"}
|