@isograph/react 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-compile-typescript.log +4 -0
- package/dist/core/FragmentReference.d.ts +25 -6
- package/dist/core/FragmentReference.d.ts.map +1 -0
- package/dist/core/FragmentReference.js +3 -13
- package/dist/core/IsographEnvironment.d.ts +34 -26
- package/dist/core/IsographEnvironment.d.ts.map +1 -0
- package/dist/core/IsographEnvironment.js +19 -22
- package/dist/core/PromiseWrapper.d.ts +4 -4
- package/dist/core/PromiseWrapper.d.ts.map +1 -0
- package/dist/core/PromiseWrapper.js +9 -9
- package/dist/core/areEqualWithDeepComparison.d.ts +5 -3
- package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -0
- package/dist/core/areEqualWithDeepComparison.js +89 -39
- package/dist/core/cache.d.ts +20 -13
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +205 -128
- package/dist/core/check.d.ts +22 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +127 -0
- package/dist/core/componentCache.d.ts +2 -2
- package/dist/core/componentCache.d.ts.map +1 -0
- package/dist/core/componentCache.js +28 -32
- package/dist/core/entrypoint.d.ts +31 -15
- package/dist/core/entrypoint.d.ts.map +1 -0
- package/dist/core/entrypoint.js +1 -2
- package/dist/core/garbageCollection.d.ts +6 -5
- package/dist/core/garbageCollection.d.ts.map +1 -0
- package/dist/core/garbageCollection.js +49 -16
- package/dist/core/logging.d.ts +68 -0
- package/dist/core/logging.d.ts.map +1 -0
- package/dist/core/logging.js +22 -0
- package/dist/core/makeNetworkRequest.d.ts +6 -3
- package/dist/core/makeNetworkRequest.d.ts.map +1 -0
- package/dist/core/makeNetworkRequest.js +160 -19
- package/dist/core/read.d.ts +25 -5
- package/dist/core/read.d.ts.map +1 -0
- package/dist/core/read.js +416 -259
- package/dist/core/reader.d.ts +31 -15
- package/dist/core/reader.d.ts.map +1 -0
- package/dist/core/startUpdate.d.ts +5 -0
- package/dist/core/startUpdate.d.ts.map +1 -0
- package/dist/core/startUpdate.js +15 -0
- package/dist/core/util.d.ts +5 -0
- package/dist/core/util.d.ts.map +1 -0
- package/dist/index.d.ts +19 -14
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -2
- package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -3
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -0
- package/dist/loadable-hooks/useClientSideDefer.js +6 -8
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +27 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.js +162 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +2 -2
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.js +1 -2
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +13 -7
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -0
- package/dist/loadable-hooks/useImperativeLoadableField.js +4 -5
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +13 -26
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -0
- package/dist/loadable-hooks/useSkipLimitPagination.js +93 -47
- package/dist/react/FragmentReader.d.ts +6 -4
- package/dist/react/FragmentReader.d.ts.map +1 -0
- package/dist/react/FragmentReader.js +4 -2
- package/dist/react/IsographEnvironmentProvider.d.ts +1 -0
- package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -0
- package/dist/react/IsographEnvironmentProvider.js +3 -3
- 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 +8 -6
- package/dist/react/useImperativeReference.d.ts.map +1 -0
- package/dist/react/useImperativeReference.js +6 -8
- package/dist/react/useLazyReference.d.ts +5 -3
- package/dist/react/useLazyReference.d.ts.map +1 -0
- package/dist/react/useLazyReference.js +34 -6
- package/dist/react/useReadAndSubscribe.d.ts +6 -3
- package/dist/react/useReadAndSubscribe.d.ts.map +1 -0
- package/dist/react/useReadAndSubscribe.js +13 -10
- package/dist/react/useRerenderOnChange.d.ts +7 -2
- package/dist/react/useRerenderOnChange.d.ts.map +1 -0
- package/dist/react/useRerenderOnChange.js +3 -4
- package/dist/react/useResult.d.ts +4 -3
- package/dist/react/useResult.d.ts.map +1 -0
- package/dist/react/useResult.js +14 -9
- package/isograph.config.json +8 -0
- package/package.json +14 -9
- package/{src/tests/schema.graphql → schema.graphql} +1 -0
- package/src/core/FragmentReference.ts +44 -17
- package/src/core/IsographEnvironment.ts +67 -50
- package/src/core/PromiseWrapper.ts +3 -3
- package/src/core/areEqualWithDeepComparison.ts +95 -41
- package/src/core/cache.ts +316 -169
- package/src/core/check.ts +212 -0
- package/src/core/componentCache.ts +40 -46
- package/src/core/entrypoint.ts +41 -16
- package/src/core/garbageCollection.ts +77 -26
- package/src/core/logging.ts +118 -0
- package/src/core/makeNetworkRequest.ts +249 -20
- package/src/core/read.ts +658 -368
- package/src/core/reader.ts +61 -21
- package/src/core/startUpdate.ts +28 -0
- package/src/core/util.ts +8 -0
- package/src/index.ts +94 -8
- package/src/loadable-hooks/useClientSideDefer.ts +48 -17
- package/src/loadable-hooks/useConnectionSpecPagination.ts +344 -0
- package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
- package/src/loadable-hooks/useImperativeLoadableField.ts +36 -12
- package/src/loadable-hooks/useSkipLimitPagination.ts +253 -94
- package/src/react/FragmentReader.tsx +15 -6
- package/src/react/IsographEnvironmentProvider.tsx +1 -1
- package/src/react/RenderAfterCommit__DO_NOT_USE.tsx +17 -0
- package/src/react/useImperativeReference.ts +50 -18
- package/src/react/useLazyReference.ts +79 -11
- package/src/react/useReadAndSubscribe.ts +33 -10
- package/src/react/useRerenderOnChange.ts +7 -2
- package/src/react/useResult.ts +30 -9
- package/src/tests/__isograph/Query/meName/entrypoint.ts +10 -29
- package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
- package/src/tests/__isograph/Query/meName/param_type.ts +5 -2
- package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -0
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +10 -65
- package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
- package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +9 -6
- package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +10 -0
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +10 -28
- package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
- package/src/tests/__isograph/Query/nodeField/param_type.ts +7 -3
- package/src/tests/__isograph/Query/nodeField/parameters_type.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -0
- package/src/tests/__isograph/Query/subquery/entrypoint.ts +28 -0
- package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -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/query_text.ts +8 -0
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +52 -0
- package/src/tests/__isograph/iso.ts +24 -12
- package/src/tests/garbageCollection.test.ts +53 -45
- package/src/tests/meNameSuccessor.ts +8 -3
- package/src/tests/nodeQuery.ts +7 -4
- package/src/tests/normalizeData.test.ts +120 -0
- package/src/tests/tsconfig.json +3 -3
- package/tsconfig.json +2 -2
- package/tsconfig.pkg.json +7 -3
- package/vitest.config.ts +20 -0
- package/src/tests/isograph.config.json +0 -7
@@ -1,33 +1,20 @@
|
|
1
|
+
import { FetchOptions } from '../core/check';
|
2
|
+
import { FragmentReference, type UnknownTReadFromStore } from '../core/FragmentReference';
|
1
3
|
import { LoadableField } from '../core/reader';
|
2
|
-
|
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> = {
|
4
|
+
export type UseSkipLimitReturnValue<TReadFromStore extends UnknownTReadFromStore, TItem> = {
|
6
5
|
readonly kind: 'Complete';
|
7
|
-
readonly fetchMore: (
|
6
|
+
readonly fetchMore: (count: number, fetchOptions?: FetchOptions<ReadonlyArray<TItem>>) => void;
|
8
7
|
readonly results: ReadonlyArray<TItem>;
|
9
8
|
} | {
|
10
9
|
readonly kind: 'Pending';
|
11
10
|
readonly results: ReadonlyArray<TItem>;
|
12
|
-
readonly pendingFragment: FragmentReference<
|
11
|
+
readonly pendingFragment: FragmentReference<TReadFromStore, ReadonlyArray<TItem>>;
|
13
12
|
};
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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 {};
|
13
|
+
export type UseSkipLimitPaginationArgs = {
|
14
|
+
skip: number;
|
15
|
+
limit: number;
|
16
|
+
};
|
17
|
+
export declare function useSkipLimitPagination<TItem, TReadFromStore extends UnknownTReadFromStore>(loadableField: LoadableField<TReadFromStore, ReadonlyArray<TItem>, UseSkipLimitPaginationArgs>, initialState?: {
|
18
|
+
skip?: number | void | null;
|
19
|
+
}): UseSkipLimitReturnValue<TReadFromStore, TItem>;
|
20
|
+
//# sourceMappingURL=useSkipLimitPagination.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useSkipLimitPagination.d.ts","sourceRoot":"","sources":["../../src/loadable-hooks/useSkipLimitPagination.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AAMnC,OAAO,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAM/D,MAAM,MAAM,uBAAuB,CACjC,cAAc,SAAS,qBAAqB,EAC5C,KAAK,IAEH;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,KAC9C,IAAI,CAAC;IACV,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,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,KAAK,EACL,cAAc,SAAS,qBAAqB,EAE5C,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,CA2OhD"}
|
@@ -1,12 +1,16 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.useSkipLimitPagination =
|
4
|
-
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
5
|
-
const useResult_1 = require("../react/useResult");
|
6
|
-
const read_1 = require("../core/read");
|
3
|
+
exports.useSkipLimitPagination = useSkipLimitPagination;
|
7
4
|
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
8
5
|
const reference_counted_pointer_1 = require("@isograph/reference-counted-pointer");
|
6
|
+
const react_1 = require("react");
|
7
|
+
const cache_1 = require("../core/cache");
|
9
8
|
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
9
|
+
const read_1 = require("../core/read");
|
10
|
+
const startUpdate_1 = require("../core/startUpdate");
|
11
|
+
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
12
|
+
const useReadAndSubscribe_1 = require("../react/useReadAndSubscribe");
|
13
|
+
const useResult_1 = require("../react/useResult");
|
10
14
|
function flatten(arr) {
|
11
15
|
let outArray = [];
|
12
16
|
for (const subarr of arr) {
|
@@ -16,54 +20,67 @@ function flatten(arr) {
|
|
16
20
|
}
|
17
21
|
return outArray;
|
18
22
|
}
|
19
|
-
|
20
|
-
|
21
|
-
* and returns:
|
22
|
-
* - a fetchMore function that, when called, triggers a network
|
23
|
-
* request for additional data, and
|
24
|
-
* - the data received so far.
|
25
|
-
*
|
26
|
-
* This hook will suspend if any network request is in flight.
|
27
|
-
*
|
28
|
-
* Calling fetchMore before the hook mounts is a no-op.
|
29
|
-
*
|
30
|
-
* NOTE: this hook does not subscribe to changes. This is a known
|
31
|
-
* issue. If you are running into this issue, reach out on GitHub/
|
32
|
-
* Twitter, and we'll fix the issue.
|
33
|
-
*/
|
34
|
-
function useSkipLimitPagination(loadableField) {
|
23
|
+
function useSkipLimitPagination(loadableField, initialState) {
|
24
|
+
var _a;
|
35
25
|
const networkRequestOptions = {
|
36
26
|
suspendIfInFlight: true,
|
37
27
|
throwOnNetworkError: true,
|
38
28
|
};
|
39
29
|
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
40
30
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
31
|
+
// TODO move this out of useSkipLimitPagination, and pass environment and networkRequestOptions
|
32
|
+
// as parameters (or recreate networkRequestOptions)
|
41
33
|
function readCompletedFragmentReferences(completedReferences) {
|
42
|
-
|
43
|
-
|
44
|
-
const results = completedReferences.map(([pointer]) => {
|
45
|
-
const fragmentReference = pointer.getItemIfNotDisposed();
|
46
|
-
if (fragmentReference == null) {
|
47
|
-
throw new Error('FragmentReference is unexpectedly disposed. \
|
48
|
-
This is indicative of a bug in Isograph.');
|
49
|
-
}
|
50
|
-
(0, useResult_1.maybeUnwrapNetworkRequest)(fragmentReference.networkRequest, networkRequestOptions);
|
51
|
-
const data = (0, read_1.readButDoNotEvaluate)(environment, fragmentReference, networkRequestOptions);
|
34
|
+
const results = completedReferences.map((fragmentReference, i) => {
|
35
|
+
var _a;
|
52
36
|
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
53
|
-
|
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 = Object.assign({ data, parameters: fragmentReference.variables }, (readerWithRefetchQueries.readerArtifact.hasUpdatable
|
43
|
+
? {
|
44
|
+
startUpdate: (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragmentReference, readerWithRefetchQueries.readerArtifact.kind),
|
45
|
+
}
|
46
|
+
: undefined));
|
47
|
+
if (readerWithRefetchQueries.readerArtifact.kind !== 'EagerReaderArtifact') {
|
48
|
+
throw new Error(`@loadable field of kind "${readerWithRefetchQueries.readerArtifact.kind}" is not supported by useSkipLimitPagination`);
|
49
|
+
}
|
50
|
+
return readerWithRefetchQueries.readerArtifact.resolver(firstParameter);
|
54
51
|
});
|
55
52
|
const items = flatten(results);
|
56
53
|
return items;
|
57
54
|
}
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
function subscribeCompletedFragmentReferences(completedReferences) {
|
56
|
+
return completedReferences.map((fragmentReference, i) => {
|
57
|
+
(0, useResult_1.maybeUnwrapNetworkRequest)(fragmentReference.networkRequest, networkRequestOptions);
|
58
|
+
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
59
|
+
const records = readOutDataAndRecords[i];
|
60
|
+
if (records == null) {
|
61
|
+
throw new Error('subscribeCompletedFragmentReferences records is unexpectedly null');
|
62
|
+
}
|
63
|
+
return {
|
64
|
+
fragmentReference,
|
65
|
+
readerAst: readerWithRefetchQueries.readerArtifact.readerAst,
|
66
|
+
records,
|
67
|
+
callback(_data) {
|
68
|
+
rerender({});
|
69
|
+
},
|
70
|
+
};
|
71
|
+
});
|
72
|
+
}
|
73
|
+
const getFetchMore = (loadedSoFar) => (count, fetchOptions) => {
|
74
|
+
const loadedField = loadableField({
|
75
|
+
skip: loadedSoFar,
|
76
|
+
limit: count,
|
77
|
+
}, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : {})[1]();
|
61
78
|
const newPointer = (0, reference_counted_pointer_1.createReferenceCountedPointer)(loadedField);
|
62
79
|
const clonedPointers = loadedReferences.map(([refCountedPointer]) => {
|
63
80
|
const clonedRefCountedPointer = refCountedPointer.cloneIfNotDisposed();
|
64
81
|
if (clonedRefCountedPointer == null) {
|
65
82
|
throw new Error('This reference counted pointer has already been disposed. \
|
66
|
-
|
83
|
+
This is indicative of a bug in useSkipLimitPagination.');
|
67
84
|
}
|
68
85
|
return clonedRefCountedPointer;
|
69
86
|
});
|
@@ -78,24 +95,42 @@ function useSkipLimitPagination(loadableField) {
|
|
78
95
|
];
|
79
96
|
setState(totalItemCleanupPair);
|
80
97
|
};
|
98
|
+
const [, rerender] = (0, react_1.useState)({});
|
81
99
|
const loadedReferences = state === react_disposable_state_1.UNASSIGNED_STATE ? [] : state;
|
82
|
-
|
100
|
+
const mostRecentItem = loadedReferences[loadedReferences.length - 1];
|
101
|
+
const mostRecentFragmentReference = mostRecentItem === null || mostRecentItem === void 0 ? void 0 : mostRecentItem[0].getItemIfNotDisposed();
|
102
|
+
if (mostRecentItem && mostRecentFragmentReference === null) {
|
103
|
+
throw new Error('FragmentReference is unexpectedly disposed. \
|
104
|
+
This is indicative of a bug in Isograph.');
|
105
|
+
}
|
106
|
+
const networkRequestStatus = mostRecentFragmentReference &&
|
107
|
+
(0, PromiseWrapper_1.getPromiseState)(mostRecentFragmentReference.networkRequest);
|
108
|
+
const slicedFragmentReferences = (networkRequestStatus === null || networkRequestStatus === void 0 ? void 0 : networkRequestStatus.kind) === 'Ok'
|
109
|
+
? loadedReferences
|
110
|
+
: loadedReferences.slice(0, loadedReferences.length - 1);
|
111
|
+
const completedFragmentReferences = slicedFragmentReferences.map(([pointer]) => {
|
112
|
+
const fragmentReference = pointer.getItemIfNotDisposed();
|
113
|
+
if (fragmentReference == null) {
|
114
|
+
throw new Error('FragmentReference is unexpectedly disposed. \
|
115
|
+
This is indicative of a bug in Isograph.');
|
116
|
+
}
|
117
|
+
return fragmentReference;
|
118
|
+
});
|
119
|
+
const readOutDataAndRecords = completedFragmentReferences.map((fragmentReference) => (0, read_1.readButDoNotEvaluate)(environment, fragmentReference, networkRequestOptions));
|
120
|
+
(0, useReadAndSubscribe_1.useSubscribeToMultiple)(subscribeCompletedFragmentReferences(completedFragmentReferences));
|
121
|
+
if (!networkRequestStatus) {
|
83
122
|
return {
|
84
123
|
kind: 'Complete',
|
85
|
-
fetchMore: getFetchMore(0),
|
124
|
+
fetchMore: getFetchMore((_a = initialState === null || initialState === void 0 ? void 0 : initialState.skip) !== null && _a !== void 0 ? _a : 0),
|
86
125
|
results: [],
|
87
126
|
};
|
88
127
|
}
|
89
|
-
const mostRecentItem = loadedReferences[loadedReferences.length - 1];
|
90
|
-
const mostRecentFragmentReference = mostRecentItem[0].getItemIfNotDisposed();
|
91
|
-
if (mostRecentFragmentReference === null) {
|
92
|
-
throw new Error('FragmentReference is unexpectedly disposed. \
|
93
|
-
This is indicative of a bug in Isograph.');
|
94
|
-
}
|
95
|
-
const networkRequestStatus = (0, PromiseWrapper_1.getPromiseState)(mostRecentFragmentReference.networkRequest);
|
96
128
|
switch (networkRequestStatus.kind) {
|
97
129
|
case 'Pending': {
|
98
|
-
const
|
130
|
+
const unsubscribe = (0, cache_1.subscribeToAnyChange)(environment, () => {
|
131
|
+
unsubscribe();
|
132
|
+
rerender({});
|
133
|
+
});
|
99
134
|
return {
|
100
135
|
kind: 'Pending',
|
101
136
|
pendingFragment: mostRecentFragmentReference,
|
@@ -106,7 +141,7 @@ function useSkipLimitPagination(loadableField) {
|
|
106
141
|
throw networkRequestStatus.error;
|
107
142
|
}
|
108
143
|
case 'Ok': {
|
109
|
-
const results = readCompletedFragmentReferences(
|
144
|
+
const results = readCompletedFragmentReferences(completedFragmentReferences);
|
110
145
|
return {
|
111
146
|
kind: 'Complete',
|
112
147
|
results,
|
@@ -115,4 +150,15 @@ function useSkipLimitPagination(loadableField) {
|
|
115
150
|
}
|
116
151
|
}
|
117
152
|
}
|
118
|
-
|
153
|
+
// @ts-ignore
|
154
|
+
function tsTests() {
|
155
|
+
let basicLoadable;
|
156
|
+
useSkipLimitPagination(basicLoadable);
|
157
|
+
useSkipLimitPagination(basicLoadable, {});
|
158
|
+
useSkipLimitPagination(basicLoadable, { skip: 10 });
|
159
|
+
let unprovidedSearchLoadable;
|
160
|
+
// @ts-expect-error
|
161
|
+
useSkipLimitPagination(unprovidedSearchLoadable);
|
162
|
+
let providedSearchLoadable;
|
163
|
+
useSkipLimitPagination(providedSearchLoadable);
|
164
|
+
}
|
@@ -2,12 +2,14 @@ import * as React from 'react';
|
|
2
2
|
import { ExtractReadFromStore, IsographEntrypoint } from '../core/entrypoint';
|
3
3
|
import { FragmentReference } from '../core/FragmentReference';
|
4
4
|
import { NetworkRequestReaderOptions } from '../core/read';
|
5
|
-
export
|
6
|
-
|
7
|
-
|
5
|
+
export 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>, any>>(props: IsExactlyIntrinsicAttributes<TProps> extends true ? {
|
7
|
+
fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<TProps>>;
|
8
|
+
additionalProps?: Record<PropertyKey, never>;
|
8
9
|
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
9
10
|
} : {
|
10
11
|
fragmentReference: FragmentReference<ExtractReadFromStore<TEntrypoint>, React.FC<TProps>>;
|
11
|
-
additionalProps: TProps
|
12
|
+
additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
|
12
13
|
networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
|
13
14
|
}): React.ReactNode;
|
15
|
+
//# 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;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAG3D,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,mBAAmB,GAC3E,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,EAAE,GAAG,CAAC,EAElE,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.FragmentReader =
|
26
|
+
exports.FragmentReader = FragmentReader;
|
27
27
|
const React = __importStar(require("react"));
|
28
28
|
const useResult_1 = require("./useResult");
|
29
29
|
function FragmentReader(props) {
|
30
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.FragmentReader = FragmentReader;
|
@@ -8,3 +8,4 @@ export type IsographEnvironmentProviderProps = {
|
|
8
8
|
};
|
9
9
|
export declare function IsographEnvironmentProvider({ environment, children, }: IsographEnvironmentProviderProps): React.ReactElement;
|
10
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,EAAiB,SAAS,EAAc,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,14 +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.
|
26
|
+
exports.IsographEnvironmentContext = void 0;
|
27
|
+
exports.IsographEnvironmentProvider = IsographEnvironmentProvider;
|
28
|
+
exports.useIsographEnvironment = useIsographEnvironment;
|
27
29
|
const React = __importStar(require("react"));
|
28
30
|
const react_1 = require("react");
|
29
31
|
exports.IsographEnvironmentContext = (0, react_1.createContext)(null);
|
30
32
|
function IsographEnvironmentProvider({ environment, children, }) {
|
31
33
|
return (React.createElement(exports.IsographEnvironmentContext.Provider, { value: environment }, children));
|
32
34
|
}
|
33
|
-
exports.IsographEnvironmentProvider = IsographEnvironmentProvider;
|
34
35
|
function useIsographEnvironment() {
|
35
36
|
const context = (0, react_1.useContext)(exports.IsographEnvironmentContext);
|
36
37
|
if (context == null) {
|
@@ -39,4 +40,3 @@ function useIsographEnvironment() {
|
|
39
40
|
}
|
40
41
|
return context;
|
41
42
|
}
|
42
|
-
exports.useIsographEnvironment = useIsographEnvironment;
|
@@ -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
|
+
}
|
@@ -1,7 +1,9 @@
|
|
1
|
-
import {
|
2
|
-
import { IsographEntrypoint } from '../core/entrypoint';
|
3
|
-
import { FragmentReference,
|
4
|
-
export
|
5
|
-
fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue> |
|
6
|
-
loadFragmentReference: (variables:
|
1
|
+
import { FetchOptions, type RequiredFetchOptions } from '../core/check';
|
2
|
+
import { IsographEntrypoint, type NormalizationAst, type NormalizationAstLoader } from '../core/entrypoint';
|
3
|
+
import { ExtractParameters, FragmentReference, type UnknownTReadFromStore } from '../core/FragmentReference';
|
4
|
+
export type UseImperativeReferenceResult<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader> = {
|
5
|
+
fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue> | null;
|
6
|
+
loadFragmentReference: (variables: ExtractParameters<TReadFromStore>, ...[fetchOptions]: NormalizationAstLoader extends TNormalizationAst ? [fetchOptions: RequiredFetchOptions<TClientFieldValue>] : [fetchOptions?: FetchOptions<TClientFieldValue>]) => void;
|
7
7
|
};
|
8
|
+
export declare function useImperativeReference<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader>(entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>): UseImperativeReferenceResult<TReadFromStore, TClientFieldValue, TNormalizationAst>;
|
9
|
+
//# sourceMappingURL=useImperativeReference.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useImperativeReference.d.ts","sourceRoot":"","sources":["../../src/react/useImperativeReference.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AAMnC,MAAM,MAAM,4BAA4B,CACtC,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,IACjE;IACF,iBAAiB,EAAE,iBAAiB,CAClC,cAAc,EACd,iBAAiB,CAClB,GAAG,IAAI,CAAC;IACT,qBAAqB,EAAE,CACrB,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,GAAG,CAAC,YAAY,CAAC,EAAE,sBAAsB,SAAS,iBAAiB,GAC/D,CAAC,YAAY,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,GACvD,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC,KACjD,IAAI,CAAC;CACX,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,EAEnE,UAAU,EAAE,kBAAkB,CAC5B,cAAc,EACd,iBAAiB,EACjB,iBAAiB,CAClB,GACA,4BAA4B,CAC7B,cAAc,EACd,iBAAiB,EACjB,iBAAiB,CAClB,CAqCA"}
|
@@ -1,19 +1,18 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.useImperativeReference =
|
3
|
+
exports.useImperativeReference = useImperativeReference;
|
4
4
|
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
5
|
-
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
6
5
|
const IsographEnvironment_1 = require("../core/IsographEnvironment");
|
7
6
|
const makeNetworkRequest_1 = require("../core/makeNetworkRequest");
|
8
7
|
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
9
|
-
|
8
|
+
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
10
9
|
function useImperativeReference(entrypoint) {
|
11
10
|
const { state, setState } = (0, react_disposable_state_1.useUpdatableDisposableState)();
|
12
11
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
13
12
|
return {
|
14
|
-
fragmentReference: state,
|
15
|
-
loadFragmentReference: (variables) => {
|
16
|
-
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.
|
13
|
+
fragmentReference: state !== react_disposable_state_1.UNASSIGNED_STATE ? state : null,
|
14
|
+
loadFragmentReference: (variables, fetchOptions) => {
|
15
|
+
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, variables, fetchOptions);
|
17
16
|
setState([
|
18
17
|
{
|
19
18
|
kind: 'FragmentReference',
|
@@ -22,7 +21,7 @@ function useImperativeReference(entrypoint) {
|
|
22
21
|
readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
|
23
22
|
nestedRefetchQueries: entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
|
24
23
|
}),
|
25
|
-
root: IsographEnvironment_1.ROOT_ID,
|
24
|
+
root: { __link: IsographEnvironment_1.ROOT_ID, __typename: entrypoint.concreteType },
|
26
25
|
variables,
|
27
26
|
networkRequest,
|
28
27
|
},
|
@@ -33,4 +32,3 @@ function useImperativeReference(entrypoint) {
|
|
33
32
|
},
|
34
33
|
};
|
35
34
|
}
|
36
|
-
exports.useImperativeReference = useImperativeReference;
|
@@ -1,5 +1,7 @@
|
|
1
|
-
import {
|
2
|
-
import { IsographEntrypoint } from '../core/entrypoint';
|
3
|
-
|
1
|
+
import { FetchOptions, type RequiredFetchOptions } from '../core/check';
|
2
|
+
import { IsographEntrypoint, type NormalizationAst, type NormalizationAstLoader } from '../core/entrypoint';
|
3
|
+
import { ExtractParameters, FragmentReference, type UnknownTReadFromStore } from '../core/FragmentReference';
|
4
|
+
export declare function useLazyReference<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader>(entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>, variables: ExtractParameters<TReadFromStore>, ...[fetchOptions]: TNormalizationAst extends NormalizationAstLoader ? [fetchOptions: RequiredFetchOptions<TClientFieldValue>] : [fetchOptions?: FetchOptions<TClientFieldValue>]): NormalizationAst | NormalizationAstLoader extends TNormalizationAst ? unknown : {
|
4
5
|
fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>;
|
5
6
|
};
|
7
|
+
//# sourceMappingURL=useLazyReference.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useLazyReference.d.ts","sourceRoot":"","sources":["../../src/react/useLazyReference.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AAInC,wBAAgB,gBAAgB,CAC9B,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,EAEnE,UAAU,EAAE,kBAAkB,CAC5B,cAAc,EACd,iBAAiB,EACjB,iBAAiB,CAClB,EACD,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,GAAG,CAAC,YAAY,CAAC,EAAE,iBAAiB,SAAS,sBAAsB,GAC/D,CAAC,YAAY,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,GACvD,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC,GACnD,gBAAgB,GAAG,sBAAsB,SAAS,iBAAiB,GAClE,OAAO,GACP;IACE,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;CACzE,CAqBJ"}
|
@@ -1,14 +1,42 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.useLazyReference =
|
4
|
-
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
5
|
-
const cache_1 = require("../core/cache");
|
3
|
+
exports.useLazyReference = useLazyReference;
|
6
4
|
const react_disposable_state_1 = require("@isograph/react-disposable-state");
|
7
|
-
|
5
|
+
const cache_1 = require("../core/cache");
|
6
|
+
const logging_1 = require("../core/logging");
|
7
|
+
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
8
|
+
function useLazyReference(entrypoint, variables, ...[fetchOptions]) {
|
8
9
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
9
|
-
|
10
|
+
if ((entrypoint === null || entrypoint === void 0 ? void 0 : entrypoint.kind) !== 'Entrypoint') {
|
11
|
+
// TODO have a separate error logger
|
12
|
+
(0, logging_1.logMessage)(environment, () => ({
|
13
|
+
kind: 'NonEntrypointReceived',
|
14
|
+
entrypoint,
|
15
|
+
}));
|
16
|
+
}
|
17
|
+
const cache = (0, cache_1.getOrCreateCacheForArtifact)(environment, entrypoint, variables, fetchOptions);
|
10
18
|
return {
|
11
19
|
fragmentReference: (0, react_disposable_state_1.useLazyDisposableState)(cache).state,
|
12
20
|
};
|
13
21
|
}
|
14
|
-
|
22
|
+
// @ts-ignore
|
23
|
+
function tsTests() {
|
24
|
+
let withAst;
|
25
|
+
let withAstLoader;
|
26
|
+
let withAstOrLoader;
|
27
|
+
useLazyReference(withAst, {});
|
28
|
+
useLazyReference(withAst, {}, { shouldFetch: 'Yes' });
|
29
|
+
useLazyReference(withAst, {}, { shouldFetch: 'IfNecessary' });
|
30
|
+
// @ts-expect-error if there's no ast, require `shouldFetch` to be specified
|
31
|
+
useLazyReference(withAstLoader, {});
|
32
|
+
useLazyReference(withAstLoader, {}, { shouldFetch: 'Yes' });
|
33
|
+
// @ts-expect-error if there's no ast, `shouldFetch` can't be `IfNecessary`
|
34
|
+
useLazyReference(withAstLoader, {}, { shouldFetch: 'IfNecessary' });
|
35
|
+
// if the type is unknown there can be no ast so we should use the same rules
|
36
|
+
// but because of TS bugs with inference we just return unknown
|
37
|
+
// @ts-expect-error this returns unknown which doesn't satisfy the constraint
|
38
|
+
useLazyReference(withAstOrLoader, {});
|
39
|
+
// @ts-expect-error this returns unknown which doesn't satisfy the constraint
|
40
|
+
useLazyReference(withAstOrLoader, {}, { shouldFetch: 'Yes' });
|
41
|
+
useLazyReference(withAstOrLoader, {}, { shouldFetch: 'IfNecessary' });
|
42
|
+
}
|
@@ -1,11 +1,14 @@
|
|
1
|
-
import { FragmentReference } from '../core/FragmentReference';
|
1
|
+
import { ExtractData, FragmentReference, type UnknownTReadFromStore } from '../core/FragmentReference';
|
2
2
|
import { NetworkRequestReaderOptions, WithEncounteredRecords } from '../core/read';
|
3
|
+
import type { ReaderAst } from '../core/reader';
|
3
4
|
/**
|
4
5
|
* Read the data from a fragment reference and subscribe to updates.
|
5
6
|
*/
|
6
|
-
export declare function useReadAndSubscribe<TReadFromStore extends
|
7
|
-
export declare function useSubscribeToMultiple<TReadFromStore extends
|
7
|
+
export declare function useReadAndSubscribe<TReadFromStore extends UnknownTReadFromStore>(fragmentReference: FragmentReference<TReadFromStore, any>, networkRequestOptions: NetworkRequestReaderOptions, readerAst: ReaderAst<TReadFromStore>): ExtractData<TReadFromStore>;
|
8
|
+
export declare function useSubscribeToMultiple<TReadFromStore extends UnknownTReadFromStore>(items: ReadonlyArray<{
|
8
9
|
records: WithEncounteredRecords<TReadFromStore>;
|
9
10
|
callback: (updatedRecords: WithEncounteredRecords<TReadFromStore>) => void;
|
10
11
|
fragmentReference: FragmentReference<TReadFromStore, any>;
|
12
|
+
readerAst: ReaderAst<TReadFromStore>;
|
11
13
|
}>): void;
|
14
|
+
//# sourceMappingURL=useReadAndSubscribe.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useReadAndSubscribe.d.ts","sourceRoot":"","sources":["../../src/react/useReadAndSubscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,iBAAiB,EAEjB,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,2BAA2B,EAE3B,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,SAAS,qBAAqB,EAE5C,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,EACzD,qBAAqB,EAAE,2BAA2B,EAClD,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,GACnC,WAAW,CAAC,cAAc,CAAC,CAY7B;AAED,wBAAgB,sBAAsB,CACpC,cAAc,SAAS,qBAAqB,EAE5C,KAAK,EAAE,aAAa,CAAC;IACnB,OAAO,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC1D,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACtC,CAAC,QAuCH"}
|
@@ -1,27 +1,28 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.useReadAndSubscribe = useReadAndSubscribe;
|
4
|
+
exports.useSubscribeToMultiple = useSubscribeToMultiple;
|
4
5
|
const react_1 = require("react");
|
6
|
+
const cache_1 = require("../core/cache");
|
5
7
|
const FragmentReference_1 = require("../core/FragmentReference");
|
8
|
+
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
6
9
|
const read_1 = require("../core/read");
|
7
|
-
const useRerenderOnChange_1 = require("./useRerenderOnChange");
|
8
10
|
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
9
|
-
const
|
11
|
+
const useRerenderOnChange_1 = require("./useRerenderOnChange");
|
10
12
|
/**
|
11
13
|
* Read the data from a fragment reference and subscribe to updates.
|
12
14
|
*/
|
13
|
-
function useReadAndSubscribe(fragmentReference, networkRequestOptions) {
|
15
|
+
function useReadAndSubscribe(fragmentReference, networkRequestOptions, readerAst) {
|
14
16
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
15
17
|
const [readOutDataAndRecords, setReadOutDataAndRecords] = (0, react_1.useState)(() => (0, read_1.readButDoNotEvaluate)(environment, fragmentReference, networkRequestOptions));
|
16
|
-
(0, useRerenderOnChange_1.useRerenderOnChange)(readOutDataAndRecords, fragmentReference, setReadOutDataAndRecords);
|
18
|
+
(0, useRerenderOnChange_1.useRerenderOnChange)(readOutDataAndRecords, fragmentReference, setReadOutDataAndRecords, readerAst);
|
17
19
|
return readOutDataAndRecords.item;
|
18
20
|
}
|
19
|
-
exports.useReadAndSubscribe = useReadAndSubscribe;
|
20
21
|
function useSubscribeToMultiple(items) {
|
21
22
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
22
23
|
(0, react_1.useEffect)(() => {
|
23
|
-
const cleanupFns = items.map(({ records, callback, fragmentReference }) => {
|
24
|
-
return (0, cache_1.subscribe)(environment, records, fragmentReference, callback);
|
24
|
+
const cleanupFns = items.map(({ records, callback, fragmentReference, readerAst }) => {
|
25
|
+
return (0, cache_1.subscribe)(environment, records, fragmentReference, callback, readerAst);
|
25
26
|
});
|
26
27
|
return () => {
|
27
28
|
cleanupFns.forEach((loader) => {
|
@@ -34,8 +35,10 @@ function useSubscribeToMultiple(items) {
|
|
34
35
|
// TODO find out
|
35
36
|
[
|
36
37
|
items
|
37
|
-
.map(({ fragmentReference }) =>
|
38
|
+
.map(({ fragmentReference }) => {
|
39
|
+
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
40
|
+
(0, FragmentReference_1.stableIdForFragmentReference)(fragmentReference, readerWithRefetchQueries.readerArtifact.fieldName);
|
41
|
+
})
|
38
42
|
.join('.'),
|
39
43
|
]);
|
40
44
|
}
|
41
|
-
exports.useSubscribeToMultiple = useSubscribeToMultiple;
|
@@ -1,3 +1,8 @@
|
|
1
|
-
import { WithEncounteredRecords } from '../core/read';
|
2
1
|
import { FragmentReference } from '../core/FragmentReference';
|
3
|
-
|
2
|
+
import { WithEncounteredRecords } from '../core/read';
|
3
|
+
import type { ReaderAst } from '../core/reader';
|
4
|
+
export declare function useRerenderOnChange<TReadFromStore extends {
|
5
|
+
parameters: object;
|
6
|
+
data: object;
|
7
|
+
}>(encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>, fragmentReference: FragmentReference<any, any>, setEncounteredDataAndRecords: (data: WithEncounteredRecords<TReadFromStore>) => void, readerAst: ReaderAst<TReadFromStore>): void;
|
8
|
+
//# sourceMappingURL=useRerenderOnChange.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useRerenderOnChange.d.ts","sourceRoot":"","sources":["../../src/react/useRerenderOnChange.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,wBAAgB,mBAAmB,CACjC,cAAc,SAAS;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAE3D,yBAAyB,EAAE,sBAAsB,CAAC,cAAc,CAAC,EACjE,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,EAC9C,4BAA4B,EAAE,CAC5B,IAAI,EAAE,sBAAsB,CAAC,cAAc,CAAC,KACzC,IAAI,EACT,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,QAoBrC"}
|
@@ -1,17 +1,17 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.useRerenderOnChange =
|
3
|
+
exports.useRerenderOnChange = useRerenderOnChange;
|
4
4
|
const react_1 = require("react");
|
5
5
|
const cache_1 = require("../core/cache");
|
6
6
|
const IsographEnvironmentProvider_1 = require("./IsographEnvironmentProvider");
|
7
7
|
// TODO add unit tests for this. Add integration tests that test
|
8
8
|
// behavior when the encounteredRecords underneath a fragment change.
|
9
|
-
function useRerenderOnChange(encounteredDataAndRecords, fragmentReference, setEncounteredDataAndRecords) {
|
9
|
+
function useRerenderOnChange(encounteredDataAndRecords, fragmentReference, setEncounteredDataAndRecords, readerAst) {
|
10
10
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
11
11
|
(0, react_1.useEffect)(() => {
|
12
12
|
return (0, cache_1.subscribe)(environment, encounteredDataAndRecords, fragmentReference, (newEncounteredDataAndRecords) => {
|
13
13
|
setEncounteredDataAndRecords(newEncounteredDataAndRecords);
|
14
|
-
});
|
14
|
+
}, readerAst);
|
15
15
|
// Note: this is an empty array on purpose:
|
16
16
|
// - the fragment reference is stable for the life of the component
|
17
17
|
// - ownership of encounteredDataAndRecords is transferred into the
|
@@ -20,4 +20,3 @@ function useRerenderOnChange(encounteredDataAndRecords, fragmentReference, setEn
|
|
20
20
|
// the dependency array
|
21
21
|
}, []);
|
22
22
|
}
|
23
|
-
exports.useRerenderOnChange = useRerenderOnChange;
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import { FragmentReference } from '../core/FragmentReference';
|
2
|
-
import { NetworkRequestReaderOptions } from '../core/read';
|
1
|
+
import { FragmentReference, type UnknownTReadFromStore } from '../core/FragmentReference';
|
3
2
|
import { PromiseWrapper } from '../core/PromiseWrapper';
|
4
|
-
|
3
|
+
import { NetworkRequestReaderOptions } from '../core/read';
|
4
|
+
export declare function useResult<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue>(fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>, partialNetworkRequestOptions?: Partial<NetworkRequestReaderOptions> | void): TClientFieldValue;
|
5
5
|
export declare function maybeUnwrapNetworkRequest(networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions): void;
|
6
|
+
//# sourceMappingURL=useResult.d.ts.map
|