@isograph/react 0.0.0-main-6815ceff → 0.0.0-main-17115d24
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 +1 -1
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +6 -13
- package/dist/core/check.js +2 -2
- package/dist/core/componentCache.js +2 -2
- package/dist/core/logging.d.ts +3 -6
- package/dist/core/logging.d.ts.map +1 -1
- package/dist/core/logging.js +8 -5
- package/dist/core/makeNetworkRequest.js +6 -6
- package/dist/core/read.d.ts +2 -1
- package/dist/core/read.d.ts.map +1 -1
- package/dist/core/read.js +109 -99
- package/dist/react/useLazyReference.js +2 -2
- package/package.json +4 -4
- package/src/core/cache.ts +6 -13
- package/src/core/check.ts +2 -2
- package/src/core/componentCache.ts +2 -2
- package/src/core/logging.ts +10 -11
- package/src/core/makeNetworkRequest.ts +6 -6
- package/src/core/read.ts +178 -162
- package/src/react/useLazyReference.ts +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @isograph/react@0.0.0-main-
|
|
2
|
+
> @isograph/react@0.0.0-main-17115d24 compile-typescript /Users/runner/work/isograph/isograph/libs/isograph-react
|
|
3
3
|
> rm -rf dist/* && tsc -p tsconfig.pkg.json
|
|
4
4
|
|
package/dist/core/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAEP,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAElB,wBAAwB,EACxB,wBAAwB,EACxB,wCAAwC,EACxC,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,KAAK,qBAAqB,EAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,MAAM,EAIN,IAAI,EAGJ,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACd,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAwB,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAGhF,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,wBAAgB,8BAA8B,CAC5C,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EAEjB,WAAW,EAAE,mBAAmB,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC,GACrE,WAAW,CAAC,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/core/cache.js
CHANGED
|
@@ -20,13 +20,6 @@ const PromiseWrapper_1 = require("./PromiseWrapper");
|
|
|
20
20
|
const read_1 = require("./read");
|
|
21
21
|
exports.TYPENAME_FIELD_NAME = '__typename';
|
|
22
22
|
function getOrCreateItemInSuspenseCache(environment, index, factory) {
|
|
23
|
-
// TODO this is probably a useless message, we should remove it
|
|
24
|
-
(0, logging_1.logMessage)(environment, {
|
|
25
|
-
kind: 'GettingSuspenseCacheItem',
|
|
26
|
-
index,
|
|
27
|
-
availableCacheItems: Object.keys(environment.fragmentCache),
|
|
28
|
-
found: !!environment.fragmentCache[index],
|
|
29
|
-
});
|
|
30
23
|
if (environment.fragmentCache[index] == null) {
|
|
31
24
|
environment.fragmentCache[index] = new react_disposable_state_1.ParentCache(factory);
|
|
32
25
|
}
|
|
@@ -80,20 +73,20 @@ function normalizeData(environment, normalizationAst, networkResponse, variables
|
|
|
80
73
|
var _a, _b;
|
|
81
74
|
var _c, _d, _e;
|
|
82
75
|
const encounteredIds = new Map();
|
|
83
|
-
(0, logging_1.logMessage)(environment, {
|
|
76
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
84
77
|
kind: 'AboutToNormalize',
|
|
85
78
|
normalizationAst,
|
|
86
79
|
networkResponse,
|
|
87
80
|
variables,
|
|
88
|
-
});
|
|
81
|
+
}));
|
|
89
82
|
const recordsById = ((_a = (_c = environment.store)[_d = root.__typename]) !== null && _a !== void 0 ? _a : (_c[_d] = {}));
|
|
90
83
|
const newStoreRecord = ((_b = recordsById[_e = root.__link]) !== null && _b !== void 0 ? _b : (recordsById[_e] = {}));
|
|
91
84
|
normalizeDataIntoRecord(environment, normalizationAst, networkResponse, newStoreRecord, root, variables, nestedRefetchQueries, encounteredIds);
|
|
92
|
-
(0, logging_1.logMessage)(environment, {
|
|
85
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
93
86
|
kind: 'AfterNormalization',
|
|
94
87
|
store: environment.store,
|
|
95
88
|
encounteredIds,
|
|
96
|
-
});
|
|
89
|
+
}));
|
|
97
90
|
callSubscriptions(environment, encounteredIds);
|
|
98
91
|
return encounteredIds;
|
|
99
92
|
}
|
|
@@ -174,13 +167,13 @@ function callSubscriptions(environment, recordsEncounteredWhenNormalizing) {
|
|
|
174
167
|
throwOnNetworkError: false,
|
|
175
168
|
});
|
|
176
169
|
const mergedItem = (0, areEqualWithDeepComparison_1.mergeObjectsUsingReaderAst)(subscription.readerAst, subscription.encounteredDataAndRecords.item, newEncounteredDataAndRecords.item);
|
|
177
|
-
(0, logging_1.logMessage)(environment, {
|
|
170
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
178
171
|
kind: 'DeepEqualityCheck',
|
|
179
172
|
fragmentReference: subscription.fragmentReference,
|
|
180
173
|
old: subscription.encounteredDataAndRecords.item,
|
|
181
174
|
new: newEncounteredDataAndRecords.item,
|
|
182
175
|
deeplyEqual: mergedItem === subscription.encounteredDataAndRecords.item,
|
|
183
|
-
});
|
|
176
|
+
}));
|
|
184
177
|
if (mergedItem !== subscription.encounteredDataAndRecords.item) {
|
|
185
178
|
subscription.callback(newEncounteredDataAndRecords);
|
|
186
179
|
}
|
package/dist/core/check.js
CHANGED
|
@@ -12,10 +12,10 @@ function check(environment, normalizationAst, variables, root) {
|
|
|
12
12
|
const recordsById = ((_a = (_c = environment.store)[_d = root.__typename]) !== null && _a !== void 0 ? _a : (_c[_d] = {}));
|
|
13
13
|
const newStoreRecord = ((_b = recordsById[_e = root.__link]) !== null && _b !== void 0 ? _b : (recordsById[_e] = {}));
|
|
14
14
|
const checkResult = checkFromRecord(environment, normalizationAst, variables, newStoreRecord, root);
|
|
15
|
-
(0, logging_1.logMessage)(environment, {
|
|
15
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
16
16
|
kind: 'EnvironmentCheck',
|
|
17
17
|
result: checkResult,
|
|
18
|
-
});
|
|
18
|
+
}));
|
|
19
19
|
return checkResult;
|
|
20
20
|
}
|
|
21
21
|
function checkFromRecord(environment, normalizationAst, variables, record, recordLink) {
|
|
@@ -15,11 +15,11 @@ function getOrCreateCachedComponent(environment, componentName, fragmentReferenc
|
|
|
15
15
|
function Component(additionalRuntimeProps) {
|
|
16
16
|
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
|
17
17
|
const data = (0, useReadAndSubscribe_1.useReadAndSubscribe)(fragmentReference, networkRequestOptions, readerWithRefetchQueries.readerArtifact.readerAst);
|
|
18
|
-
(0, logging_1.logMessage)(environment, {
|
|
18
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
19
19
|
kind: 'ComponentRerendered',
|
|
20
20
|
componentName,
|
|
21
21
|
rootLink: fragmentReference.root,
|
|
22
|
-
});
|
|
22
|
+
}));
|
|
23
23
|
return readerWithRefetchQueries.readerArtifact.resolver({
|
|
24
24
|
data,
|
|
25
25
|
parameters: fragmentReference.variables,
|
package/dist/core/logging.d.ts
CHANGED
|
@@ -7,11 +7,6 @@ import { IsographEnvironment, IsographStore, StoreRecord, type Link } from './Is
|
|
|
7
7
|
import { ReadDataResult } from './read';
|
|
8
8
|
import { Arguments } from './util';
|
|
9
9
|
export type LogMessage = {
|
|
10
|
-
kind: 'GettingSuspenseCacheItem';
|
|
11
|
-
index: string;
|
|
12
|
-
availableCacheItems: ReadonlyArray<string>;
|
|
13
|
-
found: boolean;
|
|
14
|
-
} | {
|
|
15
10
|
kind: 'AboutToNormalize';
|
|
16
11
|
normalizationAst: NormalizationAstNodes;
|
|
17
12
|
networkResponse: NetworkResponseObject;
|
|
@@ -53,6 +48,8 @@ export type LogMessage = {
|
|
|
53
48
|
} | {
|
|
54
49
|
kind: 'DoneReading';
|
|
55
50
|
response: ReadDataResult<any>;
|
|
51
|
+
fieldName: string;
|
|
52
|
+
root: Link;
|
|
56
53
|
} | {
|
|
57
54
|
kind: 'NonEntrypointReceived';
|
|
58
55
|
entrypoint: any;
|
|
@@ -66,6 +63,6 @@ export type LogFunction = (logMessage: LogMessage) => void;
|
|
|
66
63
|
export type WrappedLogFunction = {
|
|
67
64
|
log: LogFunction;
|
|
68
65
|
};
|
|
69
|
-
export declare function logMessage(environment: IsographEnvironment,
|
|
66
|
+
export declare function logMessage(environment: IsographEnvironment, getMessage: () => LogMessage): void;
|
|
70
67
|
export declare function registerLogger(environment: IsographEnvironment, log: LogFunction): CleanupFn;
|
|
71
68
|
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EACjC,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,KAAK,IAAI,EACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"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"}
|
package/dist/core/logging.js
CHANGED
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logMessage = logMessage;
|
|
4
4
|
exports.registerLogger = registerLogger;
|
|
5
|
-
function logMessage(environment,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
function logMessage(environment, getMessage) {
|
|
6
|
+
if (environment.loggers.size > 0) {
|
|
7
|
+
const message = getMessage();
|
|
8
|
+
for (const logger of environment.loggers) {
|
|
9
|
+
try {
|
|
10
|
+
logger.log(message);
|
|
11
|
+
}
|
|
12
|
+
catch (_a) { }
|
|
9
13
|
}
|
|
10
|
-
catch (_a) { }
|
|
11
14
|
}
|
|
12
15
|
}
|
|
13
16
|
function registerLogger(environment, log) {
|
|
@@ -53,12 +53,12 @@ function makeNetworkRequest(environment, artifact, variables, fetchOptions) {
|
|
|
53
53
|
// TODO this should be a DataId and stored in the store
|
|
54
54
|
const myNetworkRequestId = networkRequestId + '';
|
|
55
55
|
networkRequestId++;
|
|
56
|
-
(0, logging_1.logMessage)(environment, {
|
|
56
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
57
57
|
kind: 'MakeNetworkRequest',
|
|
58
58
|
artifact,
|
|
59
59
|
variables,
|
|
60
60
|
networkRequestId: myNetworkRequestId,
|
|
61
|
-
});
|
|
61
|
+
}));
|
|
62
62
|
let status = {
|
|
63
63
|
kind: 'UndisposedIncomplete',
|
|
64
64
|
};
|
|
@@ -69,11 +69,11 @@ function makeNetworkRequest(environment, artifact, variables, fetchOptions) {
|
|
|
69
69
|
])
|
|
70
70
|
.then(([networkResponse, normalizationAst]) => {
|
|
71
71
|
var _a, _b;
|
|
72
|
-
(0, logging_1.logMessage)(environment, {
|
|
72
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
73
73
|
kind: 'ReceivedNetworkResponse',
|
|
74
74
|
networkResponse,
|
|
75
75
|
networkRequestId: myNetworkRequestId,
|
|
76
|
-
});
|
|
76
|
+
}));
|
|
77
77
|
if (networkResponse.errors != null) {
|
|
78
78
|
try {
|
|
79
79
|
(_a = fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.onError) === null || _a === void 0 ? void 0 : _a.call(fetchOptions);
|
|
@@ -114,11 +114,11 @@ function makeNetworkRequest(environment, artifact, variables, fetchOptions) {
|
|
|
114
114
|
})
|
|
115
115
|
.catch((e) => {
|
|
116
116
|
var _a;
|
|
117
|
-
(0, logging_1.logMessage)(environment, {
|
|
117
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
118
118
|
kind: 'ReceivedNetworkError',
|
|
119
119
|
networkRequestId: myNetworkRequestId,
|
|
120
120
|
error: e,
|
|
121
|
-
});
|
|
121
|
+
}));
|
|
122
122
|
try {
|
|
123
123
|
(_a = fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.onError) === null || _a === void 0 ? void 0 : _a.call(fetchOptions);
|
|
124
124
|
}
|
package/dist/core/read.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
|
|
|
3
3
|
import { ExtractData, FragmentReference, Variables, type UnknownTReadFromStore } from './FragmentReference';
|
|
4
4
|
import { IsographEnvironment, type DataTypeValue, type Link, type StoreRecord } from './IsographEnvironment';
|
|
5
5
|
import { PromiseWrapper } from './PromiseWrapper';
|
|
6
|
-
import { ReaderAst, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
|
|
6
|
+
import { ReaderAst, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderLoadableField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
|
|
7
7
|
export type WithEncounteredRecords<T> = {
|
|
8
8
|
readonly encounteredRecords: EncounteredIds;
|
|
9
9
|
readonly item: ExtractData<T>;
|
|
@@ -19,6 +19,7 @@ export type ReadDataResult<Data> = ReadDataResultSuccess<Data> | {
|
|
|
19
19
|
readonly nestedReason?: ReadDataResult<unknown>;
|
|
20
20
|
readonly recordLink: Link;
|
|
21
21
|
};
|
|
22
|
+
export declare function readLoadablySelectedFieldData(environment: IsographEnvironment, field: ReaderLoadableField, root: Link, variables: Variables, networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
|
|
22
23
|
export declare function readResolverFieldData(environment: IsographEnvironment, field: ReaderNonLoadableResolverField, root: Link, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
|
|
23
24
|
export declare function readScalarFieldData(field: ReaderScalarField, storeRecord: StoreRecord, root: Link, variables: Variables): ReadDataResult<string | number | boolean | Link | DataTypeValue[] | null>;
|
|
24
25
|
export declare function readLinkedFieldData(environment: IsographEnvironment, field: ReaderLinkedField, storeRecord: StoreRecord, root: Link, variables: Variables, networkRequest: PromiseWrapper<void, any>, readData: <TReadFromStore>(ast: ReaderAst<TReadFromStore>, root: Link) => ReadDataResult<object>): ReadDataResult<unknown>;
|
package/dist/core/read.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAEL,wCAAwC,EAEzC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,IAAI,EACT,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAEL,cAAc,EAKf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,KAAK,6BAA6B,EAClC,KAAK,iBAAiB,EACtB,KAAK,8BAA8B,EACnC,KAAK,iBAAiB,EACvB,MAAM,UAAU,CAAC;AAIlB,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;IACtC,QAAQ,CAAC,kBAAkB,EAAE,cAAc,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,cAAc,SAAS,qBAAqB,EAE5C,WAAW,EAAE,mBAAmB,EAChC,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,qBAAqB,EAAE,2BAA2B,GACjD,sBAAsB,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"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"}
|
package/dist/core/read.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readButDoNotEvaluate = readButDoNotEvaluate;
|
|
4
|
+
exports.readLoadablySelectedFieldData = readLoadablySelectedFieldData;
|
|
4
5
|
exports.readResolverFieldData = readResolverFieldData;
|
|
5
6
|
exports.readScalarFieldData = readScalarFieldData;
|
|
6
7
|
exports.readLinkedFieldData = readLinkedFieldData;
|
|
@@ -19,10 +20,12 @@ function readButDoNotEvaluate(environment, fragmentReference, networkRequestOpti
|
|
|
19
20
|
// TODO consider moving this to the outside
|
|
20
21
|
const readerWithRefetchQueries = (0, PromiseWrapper_1.readPromise)(fragmentReference.readerWithRefetchQueries);
|
|
21
22
|
const response = readData(environment, readerWithRefetchQueries.readerArtifact.readerAst, fragmentReference.root, (_a = fragmentReference.variables) !== null && _a !== void 0 ? _a : {}, readerWithRefetchQueries.nestedRefetchQueries, fragmentReference.networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
22
|
-
(0, logging_1.logMessage)(environment, {
|
|
23
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
23
24
|
kind: 'DoneReading',
|
|
24
25
|
response,
|
|
25
|
-
|
|
26
|
+
fieldName: readerWithRefetchQueries.readerArtifact.fieldName,
|
|
27
|
+
root: fragmentReference.root,
|
|
28
|
+
}));
|
|
26
29
|
if (response.kind === 'MissingData') {
|
|
27
30
|
// There are two cases here that we care about:
|
|
28
31
|
// 1. the network request is in flight, we haven't suspended on it, and we want
|
|
@@ -117,102 +120,11 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
|
|
|
117
120
|
break;
|
|
118
121
|
}
|
|
119
122
|
case 'LoadablySelectedField': {
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (refetchReaderParams.kind === 'MissingData') {
|
|
124
|
-
return {
|
|
125
|
-
kind: 'MissingData',
|
|
126
|
-
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
127
|
-
nestedReason: refetchReaderParams,
|
|
128
|
-
recordLink: refetchReaderParams.recordLink,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
target[field.alias] = (args,
|
|
133
|
-
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
134
|
-
fetchOptions) => {
|
|
135
|
-
// TODO we should use the reader AST for this
|
|
136
|
-
const includeReadOutData = (variables, readOutData) => {
|
|
137
|
-
variables.id = readOutData.id;
|
|
138
|
-
return variables;
|
|
139
|
-
};
|
|
140
|
-
const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
|
|
141
|
-
writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
|
|
142
|
-
return [
|
|
143
|
-
// Stable id
|
|
144
|
-
root.__typename +
|
|
145
|
-
':' +
|
|
146
|
-
root.__link +
|
|
147
|
-
'/' +
|
|
148
|
-
field.name +
|
|
149
|
-
'/' +
|
|
150
|
-
stableStringifyArgs(localVariables),
|
|
151
|
-
// Fetcher
|
|
152
|
-
() => {
|
|
153
|
-
const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
|
|
154
|
-
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
155
|
-
const fragmentReference = {
|
|
156
|
-
kind: 'FragmentReference',
|
|
157
|
-
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
|
|
158
|
-
kind: 'ReaderWithRefetchQueries',
|
|
159
|
-
readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
160
|
-
nestedRefetchQueries: entrypoint.readerWithRefetchQueries
|
|
161
|
-
.nestedRefetchQueries,
|
|
162
|
-
}),
|
|
163
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
164
|
-
root,
|
|
165
|
-
variables: localVariables,
|
|
166
|
-
networkRequest,
|
|
167
|
-
};
|
|
168
|
-
return [fragmentReference, disposeNetworkRequest];
|
|
169
|
-
};
|
|
170
|
-
if (field.entrypoint.kind === 'Entrypoint') {
|
|
171
|
-
return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
const isographArtifactPromiseWrapper = (0, IsographEnvironment_1.getOrLoadIsographArtifact)(environment, field.entrypoint.typeAndField, field.entrypoint.loader);
|
|
175
|
-
const state = (0, PromiseWrapper_1.getPromiseState)(isographArtifactPromiseWrapper);
|
|
176
|
-
if (state.kind === 'Ok') {
|
|
177
|
-
return fragmentReferenceAndDisposeFromEntrypoint(state.value);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
// Promise is pending or thrown
|
|
181
|
-
let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
|
|
182
|
-
const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
|
|
183
|
-
if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
|
|
184
|
-
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
185
|
-
entrypointLoaderState = {
|
|
186
|
-
kind: 'NetworkRequestStarted',
|
|
187
|
-
disposeNetworkRequest,
|
|
188
|
-
};
|
|
189
|
-
return networkRequest.promise;
|
|
190
|
-
}
|
|
191
|
-
}));
|
|
192
|
-
const readerWithRefetchPromise = isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries);
|
|
193
|
-
const fragmentReference = {
|
|
194
|
-
kind: 'FragmentReference',
|
|
195
|
-
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapPromise)(readerWithRefetchPromise),
|
|
196
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
197
|
-
root,
|
|
198
|
-
variables: localVariables,
|
|
199
|
-
networkRequest,
|
|
200
|
-
};
|
|
201
|
-
return [
|
|
202
|
-
fragmentReference,
|
|
203
|
-
() => {
|
|
204
|
-
if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
|
|
205
|
-
entrypointLoaderState.disposeNetworkRequest();
|
|
206
|
-
}
|
|
207
|
-
entrypointLoaderState = { kind: 'Disposed' };
|
|
208
|
-
},
|
|
209
|
-
];
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
},
|
|
213
|
-
];
|
|
214
|
-
};
|
|
123
|
+
const data = readLoadablySelectedFieldData(environment, field, root, variables, networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
124
|
+
if (data.kind === 'MissingData') {
|
|
125
|
+
return data;
|
|
215
126
|
}
|
|
127
|
+
target[field.alias] = data.data;
|
|
216
128
|
break;
|
|
217
129
|
}
|
|
218
130
|
default: {
|
|
@@ -228,6 +140,104 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
|
|
|
228
140
|
data: target,
|
|
229
141
|
};
|
|
230
142
|
}
|
|
143
|
+
function readLoadablySelectedFieldData(environment, field, root, variables, networkRequest, networkRequestOptions, mutableEncounteredRecords) {
|
|
144
|
+
const refetchReaderParams = readData(environment, field.refetchReaderAst, root, variables,
|
|
145
|
+
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
146
|
+
[], networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
147
|
+
if (refetchReaderParams.kind === 'MissingData') {
|
|
148
|
+
return {
|
|
149
|
+
kind: 'MissingData',
|
|
150
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
151
|
+
nestedReason: refetchReaderParams,
|
|
152
|
+
recordLink: refetchReaderParams.recordLink,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
kind: 'Success',
|
|
157
|
+
data: (args,
|
|
158
|
+
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
159
|
+
fetchOptions) => {
|
|
160
|
+
// TODO we should use the reader AST for this
|
|
161
|
+
const includeReadOutData = (variables, readOutData) => {
|
|
162
|
+
variables.id = readOutData.id;
|
|
163
|
+
return variables;
|
|
164
|
+
};
|
|
165
|
+
const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
|
|
166
|
+
writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
|
|
167
|
+
return [
|
|
168
|
+
// Stable id
|
|
169
|
+
root.__typename +
|
|
170
|
+
':' +
|
|
171
|
+
root.__link +
|
|
172
|
+
'/' +
|
|
173
|
+
field.name +
|
|
174
|
+
'/' +
|
|
175
|
+
stableStringifyArgs(localVariables),
|
|
176
|
+
// Fetcher
|
|
177
|
+
() => {
|
|
178
|
+
const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
|
|
179
|
+
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
180
|
+
const fragmentReference = {
|
|
181
|
+
kind: 'FragmentReference',
|
|
182
|
+
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
|
|
183
|
+
kind: 'ReaderWithRefetchQueries',
|
|
184
|
+
readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
185
|
+
nestedRefetchQueries: entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
|
|
186
|
+
}),
|
|
187
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
188
|
+
root,
|
|
189
|
+
variables: localVariables,
|
|
190
|
+
networkRequest,
|
|
191
|
+
};
|
|
192
|
+
return [fragmentReference, disposeNetworkRequest];
|
|
193
|
+
};
|
|
194
|
+
if (field.entrypoint.kind === 'Entrypoint') {
|
|
195
|
+
return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const isographArtifactPromiseWrapper = (0, IsographEnvironment_1.getOrLoadIsographArtifact)(environment, field.entrypoint.typeAndField, field.entrypoint.loader);
|
|
199
|
+
const state = (0, PromiseWrapper_1.getPromiseState)(isographArtifactPromiseWrapper);
|
|
200
|
+
if (state.kind === 'Ok') {
|
|
201
|
+
return fragmentReferenceAndDisposeFromEntrypoint(state.value);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// Promise is pending or thrown
|
|
205
|
+
let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
|
|
206
|
+
const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
|
|
207
|
+
if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
|
|
208
|
+
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
209
|
+
entrypointLoaderState = {
|
|
210
|
+
kind: 'NetworkRequestStarted',
|
|
211
|
+
disposeNetworkRequest,
|
|
212
|
+
};
|
|
213
|
+
return networkRequest.promise;
|
|
214
|
+
}
|
|
215
|
+
}));
|
|
216
|
+
const readerWithRefetchPromise = isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries);
|
|
217
|
+
const fragmentReference = {
|
|
218
|
+
kind: 'FragmentReference',
|
|
219
|
+
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapPromise)(readerWithRefetchPromise),
|
|
220
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
221
|
+
root,
|
|
222
|
+
variables: localVariables,
|
|
223
|
+
networkRequest,
|
|
224
|
+
};
|
|
225
|
+
return [
|
|
226
|
+
fragmentReference,
|
|
227
|
+
() => {
|
|
228
|
+
if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
|
|
229
|
+
entrypointLoaderState.disposeNetworkRequest();
|
|
230
|
+
}
|
|
231
|
+
entrypointLoaderState = { kind: 'Disposed' };
|
|
232
|
+
},
|
|
233
|
+
];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
];
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
231
241
|
function filterVariables(variables, allowedVariables) {
|
|
232
242
|
const result = {};
|
|
233
243
|
for (const key of allowedVariables) {
|
|
@@ -457,14 +467,14 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
|
|
|
457
467
|
// TODO make this configurable, and also generated and derived from the schema
|
|
458
468
|
const missingFieldHandler = environment.missingFieldHandler;
|
|
459
469
|
const altLink = missingFieldHandler === null || missingFieldHandler === void 0 ? void 0 : missingFieldHandler(storeRecord, root, field.fieldName, field.arguments, variables);
|
|
460
|
-
(0, logging_1.logMessage)(environment, {
|
|
470
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
461
471
|
kind: 'MissingFieldHandlerCalled',
|
|
462
472
|
root,
|
|
463
473
|
storeRecord,
|
|
464
474
|
fieldName: field.fieldName,
|
|
465
475
|
arguments: field.arguments,
|
|
466
476
|
variables,
|
|
467
|
-
});
|
|
477
|
+
}));
|
|
468
478
|
if (altLink === undefined) {
|
|
469
479
|
return {
|
|
470
480
|
kind: 'MissingData',
|
|
@@ -9,10 +9,10 @@ function useLazyReference(entrypoint, variables, ...[fetchOptions]) {
|
|
|
9
9
|
const environment = (0, IsographEnvironmentProvider_1.useIsographEnvironment)();
|
|
10
10
|
if ((entrypoint === null || entrypoint === void 0 ? void 0 : entrypoint.kind) !== 'Entrypoint') {
|
|
11
11
|
// TODO have a separate error logger
|
|
12
|
-
(0, logging_1.logMessage)(environment, {
|
|
12
|
+
(0, logging_1.logMessage)(environment, () => ({
|
|
13
13
|
kind: 'NonEntrypointReceived',
|
|
14
14
|
entrypoint,
|
|
15
|
-
});
|
|
15
|
+
}));
|
|
16
16
|
}
|
|
17
17
|
const cache = (0, cache_1.getOrCreateCacheForArtifact)(environment, entrypoint, variables, fetchOptions);
|
|
18
18
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isograph/react",
|
|
3
|
-
"version": "0.0.0-main-
|
|
3
|
+
"version": "0.0.0-main-17115d24",
|
|
4
4
|
"description": "Use Isograph with React",
|
|
5
5
|
"homepage": "https://isograph.dev",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"iso-watch": "cross-env ../../target/debug/isograph_cli --config ./isograph.config.json --watch"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@isograph/disposable-types": "0.0.0-main-
|
|
24
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
|
25
|
-
"@isograph/reference-counted-pointer": "0.0.0-main-
|
|
23
|
+
"@isograph/disposable-types": "0.0.0-main-17115d24",
|
|
24
|
+
"@isograph/react-disposable-state": "0.0.0-main-17115d24",
|
|
25
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-17115d24"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"react": "^18.0.0 || ^19.0.0"
|
package/src/core/cache.ts
CHANGED
|
@@ -50,13 +50,6 @@ export function getOrCreateItemInSuspenseCache<
|
|
|
50
50
|
index: string,
|
|
51
51
|
factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>,
|
|
52
52
|
): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {
|
|
53
|
-
// TODO this is probably a useless message, we should remove it
|
|
54
|
-
logMessage(environment, {
|
|
55
|
-
kind: 'GettingSuspenseCacheItem',
|
|
56
|
-
index,
|
|
57
|
-
availableCacheItems: Object.keys(environment.fragmentCache),
|
|
58
|
-
found: !!environment.fragmentCache[index],
|
|
59
|
-
});
|
|
60
53
|
if (environment.fragmentCache[index] == null) {
|
|
61
54
|
environment.fragmentCache[index] = new ParentCache(factory);
|
|
62
55
|
}
|
|
@@ -159,12 +152,12 @@ export function normalizeData(
|
|
|
159
152
|
): EncounteredIds {
|
|
160
153
|
const encounteredIds: EncounteredIds = new Map();
|
|
161
154
|
|
|
162
|
-
logMessage(environment, {
|
|
155
|
+
logMessage(environment, () => ({
|
|
163
156
|
kind: 'AboutToNormalize',
|
|
164
157
|
normalizationAst,
|
|
165
158
|
networkResponse,
|
|
166
159
|
variables,
|
|
167
|
-
});
|
|
160
|
+
}));
|
|
168
161
|
|
|
169
162
|
const recordsById = (environment.store[root.__typename] ??= {});
|
|
170
163
|
const newStoreRecord = (recordsById[root.__link] ??= {});
|
|
@@ -180,11 +173,11 @@ export function normalizeData(
|
|
|
180
173
|
encounteredIds,
|
|
181
174
|
);
|
|
182
175
|
|
|
183
|
-
logMessage(environment, {
|
|
176
|
+
logMessage(environment, () => ({
|
|
184
177
|
kind: 'AfterNormalization',
|
|
185
178
|
store: environment.store,
|
|
186
179
|
encounteredIds,
|
|
187
|
-
});
|
|
180
|
+
}));
|
|
188
181
|
|
|
189
182
|
callSubscriptions(environment, encounteredIds);
|
|
190
183
|
return encounteredIds;
|
|
@@ -310,14 +303,14 @@ function callSubscriptions(
|
|
|
310
303
|
newEncounteredDataAndRecords.item,
|
|
311
304
|
);
|
|
312
305
|
|
|
313
|
-
logMessage(environment, {
|
|
306
|
+
logMessage(environment, () => ({
|
|
314
307
|
kind: 'DeepEqualityCheck',
|
|
315
308
|
fragmentReference: subscription.fragmentReference,
|
|
316
309
|
old: subscription.encounteredDataAndRecords.item,
|
|
317
310
|
new: newEncounteredDataAndRecords.item,
|
|
318
311
|
deeplyEqual:
|
|
319
312
|
mergedItem === subscription.encounteredDataAndRecords.item,
|
|
320
|
-
});
|
|
313
|
+
}));
|
|
321
314
|
|
|
322
315
|
if (mergedItem !== subscription.encounteredDataAndRecords.item) {
|
|
323
316
|
subscription.callback(newEncounteredDataAndRecords);
|
package/src/core/check.ts
CHANGED
|
@@ -32,11 +32,11 @@ export function getOrCreateCachedComponent(
|
|
|
32
32
|
readerWithRefetchQueries.readerArtifact.readerAst,
|
|
33
33
|
);
|
|
34
34
|
|
|
35
|
-
logMessage(environment, {
|
|
35
|
+
logMessage(environment, () => ({
|
|
36
36
|
kind: 'ComponentRerendered',
|
|
37
37
|
componentName,
|
|
38
38
|
rootLink: fragmentReference.root,
|
|
39
|
-
});
|
|
39
|
+
}));
|
|
40
40
|
|
|
41
41
|
return readerWithRefetchQueries.readerArtifact.resolver(
|
|
42
42
|
{
|
package/src/core/logging.ts
CHANGED
|
@@ -17,12 +17,6 @@ import { ReadDataResult } from './read';
|
|
|
17
17
|
import { Arguments } from './util';
|
|
18
18
|
|
|
19
19
|
export type LogMessage =
|
|
20
|
-
| {
|
|
21
|
-
kind: 'GettingSuspenseCacheItem';
|
|
22
|
-
index: string;
|
|
23
|
-
availableCacheItems: ReadonlyArray<string>;
|
|
24
|
-
found: boolean;
|
|
25
|
-
}
|
|
26
20
|
| {
|
|
27
21
|
kind: 'AboutToNormalize';
|
|
28
22
|
normalizationAst: NormalizationAstNodes;
|
|
@@ -76,6 +70,8 @@ export type LogMessage =
|
|
|
76
70
|
| {
|
|
77
71
|
kind: 'DoneReading';
|
|
78
72
|
response: ReadDataResult<any>;
|
|
73
|
+
fieldName: string;
|
|
74
|
+
root: Link;
|
|
79
75
|
}
|
|
80
76
|
| {
|
|
81
77
|
kind: 'NonEntrypointReceived';
|
|
@@ -98,12 +94,15 @@ export type WrappedLogFunction = {
|
|
|
98
94
|
|
|
99
95
|
export function logMessage(
|
|
100
96
|
environment: IsographEnvironment,
|
|
101
|
-
|
|
97
|
+
getMessage: () => LogMessage,
|
|
102
98
|
) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
99
|
+
if (environment.loggers.size > 0) {
|
|
100
|
+
const message = getMessage();
|
|
101
|
+
for (const logger of environment.loggers) {
|
|
102
|
+
try {
|
|
103
|
+
logger.log(message);
|
|
104
|
+
} catch {}
|
|
105
|
+
}
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
108
|
|
|
@@ -113,12 +113,12 @@ export function makeNetworkRequest<
|
|
|
113
113
|
const myNetworkRequestId = networkRequestId + '';
|
|
114
114
|
networkRequestId++;
|
|
115
115
|
|
|
116
|
-
logMessage(environment, {
|
|
116
|
+
logMessage(environment, () => ({
|
|
117
117
|
kind: 'MakeNetworkRequest',
|
|
118
118
|
artifact,
|
|
119
119
|
variables,
|
|
120
120
|
networkRequestId: myNetworkRequestId,
|
|
121
|
-
});
|
|
121
|
+
}));
|
|
122
122
|
|
|
123
123
|
let status: NetworkRequestStatus = {
|
|
124
124
|
kind: 'UndisposedIncomplete',
|
|
@@ -132,11 +132,11 @@ export function makeNetworkRequest<
|
|
|
132
132
|
loadNormalizationAst(artifact.networkRequestInfo.normalizationAst),
|
|
133
133
|
])
|
|
134
134
|
.then(([networkResponse, normalizationAst]) => {
|
|
135
|
-
logMessage(environment, {
|
|
135
|
+
logMessage(environment, () => ({
|
|
136
136
|
kind: 'ReceivedNetworkResponse',
|
|
137
137
|
networkResponse,
|
|
138
138
|
networkRequestId: myNetworkRequestId,
|
|
139
|
-
});
|
|
139
|
+
}));
|
|
140
140
|
|
|
141
141
|
if (networkResponse.errors != null) {
|
|
142
142
|
try {
|
|
@@ -190,11 +190,11 @@ export function makeNetworkRequest<
|
|
|
190
190
|
}
|
|
191
191
|
})
|
|
192
192
|
.catch((e) => {
|
|
193
|
-
logMessage(environment, {
|
|
193
|
+
logMessage(environment, () => ({
|
|
194
194
|
kind: 'ReceivedNetworkError',
|
|
195
195
|
networkRequestId: myNetworkRequestId,
|
|
196
196
|
error: e,
|
|
197
|
-
});
|
|
197
|
+
}));
|
|
198
198
|
try {
|
|
199
199
|
fetchOptions?.onError?.();
|
|
200
200
|
} catch {}
|
package/src/core/read.ts
CHANGED
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
ReaderAst,
|
|
41
41
|
type ReaderImperativelyLoadedField,
|
|
42
42
|
type ReaderLinkedField,
|
|
43
|
+
type ReaderLoadableField,
|
|
43
44
|
type ReaderNonLoadableResolverField,
|
|
44
45
|
type ReaderScalarField,
|
|
45
46
|
} from './reader';
|
|
@@ -76,10 +77,12 @@ export function readButDoNotEvaluate<
|
|
|
76
77
|
mutableEncounteredRecords,
|
|
77
78
|
);
|
|
78
79
|
|
|
79
|
-
logMessage(environment, {
|
|
80
|
+
logMessage(environment, () => ({
|
|
80
81
|
kind: 'DoneReading',
|
|
81
82
|
response,
|
|
82
|
-
|
|
83
|
+
fieldName: readerWithRefetchQueries.readerArtifact.fieldName,
|
|
84
|
+
root: fragmentReference.root,
|
|
85
|
+
}));
|
|
83
86
|
|
|
84
87
|
if (response.kind === 'MissingData') {
|
|
85
88
|
// There are two cases here that we care about:
|
|
@@ -247,172 +250,19 @@ function readData<TReadFromStore>(
|
|
|
247
250
|
break;
|
|
248
251
|
}
|
|
249
252
|
case 'LoadablySelectedField': {
|
|
250
|
-
const
|
|
253
|
+
const data = readLoadablySelectedFieldData(
|
|
251
254
|
environment,
|
|
252
|
-
field
|
|
255
|
+
field,
|
|
253
256
|
root,
|
|
254
257
|
variables,
|
|
255
|
-
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
256
|
-
[],
|
|
257
258
|
networkRequest,
|
|
258
259
|
networkRequestOptions,
|
|
259
260
|
mutableEncounteredRecords,
|
|
260
261
|
);
|
|
261
|
-
if (
|
|
262
|
-
return
|
|
263
|
-
kind: 'MissingData',
|
|
264
|
-
reason:
|
|
265
|
-
'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
266
|
-
nestedReason: refetchReaderParams,
|
|
267
|
-
recordLink: refetchReaderParams.recordLink,
|
|
268
|
-
};
|
|
269
|
-
} else {
|
|
270
|
-
target[field.alias] = (
|
|
271
|
-
args: any,
|
|
272
|
-
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
273
|
-
fetchOptions?: FetchOptions<any>,
|
|
274
|
-
) => {
|
|
275
|
-
// TODO we should use the reader AST for this
|
|
276
|
-
const includeReadOutData = (variables: any, readOutData: any) => {
|
|
277
|
-
variables.id = readOutData.id;
|
|
278
|
-
return variables;
|
|
279
|
-
};
|
|
280
|
-
const localVariables = includeReadOutData(
|
|
281
|
-
args ?? {},
|
|
282
|
-
refetchReaderParams.data,
|
|
283
|
-
);
|
|
284
|
-
writeQueryArgsToVariables(
|
|
285
|
-
localVariables,
|
|
286
|
-
field.queryArguments,
|
|
287
|
-
variables,
|
|
288
|
-
);
|
|
289
|
-
|
|
290
|
-
return [
|
|
291
|
-
// Stable id
|
|
292
|
-
root.__typename +
|
|
293
|
-
':' +
|
|
294
|
-
root.__link +
|
|
295
|
-
'/' +
|
|
296
|
-
field.name +
|
|
297
|
-
'/' +
|
|
298
|
-
stableStringifyArgs(localVariables),
|
|
299
|
-
// Fetcher
|
|
300
|
-
() => {
|
|
301
|
-
const fragmentReferenceAndDisposeFromEntrypoint = (
|
|
302
|
-
entrypoint: IsographEntrypoint<any, any, any>,
|
|
303
|
-
): [FragmentReference<any, any>, CleanupFn] => {
|
|
304
|
-
const [networkRequest, disposeNetworkRequest] =
|
|
305
|
-
maybeMakeNetworkRequest(
|
|
306
|
-
environment,
|
|
307
|
-
entrypoint,
|
|
308
|
-
localVariables,
|
|
309
|
-
fetchOptions,
|
|
310
|
-
);
|
|
311
|
-
|
|
312
|
-
const fragmentReference: FragmentReference<any, any> = {
|
|
313
|
-
kind: 'FragmentReference',
|
|
314
|
-
readerWithRefetchQueries: wrapResolvedValue({
|
|
315
|
-
kind: 'ReaderWithRefetchQueries',
|
|
316
|
-
readerArtifact:
|
|
317
|
-
entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
318
|
-
nestedRefetchQueries:
|
|
319
|
-
entrypoint.readerWithRefetchQueries
|
|
320
|
-
.nestedRefetchQueries,
|
|
321
|
-
} as const),
|
|
322
|
-
|
|
323
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
324
|
-
root,
|
|
325
|
-
variables: localVariables,
|
|
326
|
-
networkRequest,
|
|
327
|
-
};
|
|
328
|
-
return [fragmentReference, disposeNetworkRequest];
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
if (field.entrypoint.kind === 'Entrypoint') {
|
|
332
|
-
return fragmentReferenceAndDisposeFromEntrypoint(
|
|
333
|
-
field.entrypoint,
|
|
334
|
-
);
|
|
335
|
-
} else {
|
|
336
|
-
const isographArtifactPromiseWrapper =
|
|
337
|
-
getOrLoadIsographArtifact(
|
|
338
|
-
environment,
|
|
339
|
-
field.entrypoint.typeAndField,
|
|
340
|
-
field.entrypoint.loader,
|
|
341
|
-
);
|
|
342
|
-
const state = getPromiseState(isographArtifactPromiseWrapper);
|
|
343
|
-
if (state.kind === 'Ok') {
|
|
344
|
-
return fragmentReferenceAndDisposeFromEntrypoint(
|
|
345
|
-
state.value,
|
|
346
|
-
);
|
|
347
|
-
} else {
|
|
348
|
-
// Promise is pending or thrown
|
|
349
|
-
|
|
350
|
-
let entrypointLoaderState:
|
|
351
|
-
| {
|
|
352
|
-
kind: 'EntrypointNotLoaded';
|
|
353
|
-
}
|
|
354
|
-
| {
|
|
355
|
-
kind: 'NetworkRequestStarted';
|
|
356
|
-
disposeNetworkRequest: CleanupFn;
|
|
357
|
-
}
|
|
358
|
-
| { kind: 'Disposed' } = { kind: 'EntrypointNotLoaded' };
|
|
359
|
-
|
|
360
|
-
const networkRequest = wrapPromise(
|
|
361
|
-
isographArtifactPromiseWrapper.promise.then(
|
|
362
|
-
(entrypoint) => {
|
|
363
|
-
if (
|
|
364
|
-
entrypointLoaderState.kind === 'EntrypointNotLoaded'
|
|
365
|
-
) {
|
|
366
|
-
const [networkRequest, disposeNetworkRequest] =
|
|
367
|
-
maybeMakeNetworkRequest(
|
|
368
|
-
environment,
|
|
369
|
-
entrypoint,
|
|
370
|
-
localVariables,
|
|
371
|
-
fetchOptions,
|
|
372
|
-
);
|
|
373
|
-
entrypointLoaderState = {
|
|
374
|
-
kind: 'NetworkRequestStarted',
|
|
375
|
-
disposeNetworkRequest,
|
|
376
|
-
};
|
|
377
|
-
return networkRequest.promise;
|
|
378
|
-
}
|
|
379
|
-
},
|
|
380
|
-
),
|
|
381
|
-
);
|
|
382
|
-
const readerWithRefetchPromise =
|
|
383
|
-
isographArtifactPromiseWrapper.promise.then(
|
|
384
|
-
(entrypoint) => entrypoint.readerWithRefetchQueries,
|
|
385
|
-
);
|
|
386
|
-
|
|
387
|
-
const fragmentReference: FragmentReference<any, any> = {
|
|
388
|
-
kind: 'FragmentReference',
|
|
389
|
-
readerWithRefetchQueries: wrapPromise(
|
|
390
|
-
readerWithRefetchPromise,
|
|
391
|
-
),
|
|
392
|
-
|
|
393
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
394
|
-
root,
|
|
395
|
-
variables: localVariables,
|
|
396
|
-
networkRequest,
|
|
397
|
-
};
|
|
398
|
-
|
|
399
|
-
return [
|
|
400
|
-
fragmentReference,
|
|
401
|
-
() => {
|
|
402
|
-
if (
|
|
403
|
-
entrypointLoaderState.kind === 'NetworkRequestStarted'
|
|
404
|
-
) {
|
|
405
|
-
entrypointLoaderState.disposeNetworkRequest();
|
|
406
|
-
}
|
|
407
|
-
entrypointLoaderState = { kind: 'Disposed' };
|
|
408
|
-
},
|
|
409
|
-
];
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
},
|
|
413
|
-
];
|
|
414
|
-
};
|
|
262
|
+
if (data.kind === 'MissingData') {
|
|
263
|
+
return data;
|
|
415
264
|
}
|
|
265
|
+
target[field.alias] = data.data;
|
|
416
266
|
break;
|
|
417
267
|
}
|
|
418
268
|
|
|
@@ -430,6 +280,172 @@ function readData<TReadFromStore>(
|
|
|
430
280
|
};
|
|
431
281
|
}
|
|
432
282
|
|
|
283
|
+
export function readLoadablySelectedFieldData(
|
|
284
|
+
environment: IsographEnvironment,
|
|
285
|
+
field: ReaderLoadableField,
|
|
286
|
+
root: Link,
|
|
287
|
+
variables: Variables,
|
|
288
|
+
networkRequest: PromiseWrapper<void, any>,
|
|
289
|
+
networkRequestOptions: NetworkRequestReaderOptions,
|
|
290
|
+
mutableEncounteredRecords: EncounteredIds,
|
|
291
|
+
): ReadDataResult<unknown> {
|
|
292
|
+
const refetchReaderParams = readData(
|
|
293
|
+
environment,
|
|
294
|
+
field.refetchReaderAst,
|
|
295
|
+
root,
|
|
296
|
+
variables,
|
|
297
|
+
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
298
|
+
[],
|
|
299
|
+
networkRequest,
|
|
300
|
+
networkRequestOptions,
|
|
301
|
+
mutableEncounteredRecords,
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
if (refetchReaderParams.kind === 'MissingData') {
|
|
305
|
+
return {
|
|
306
|
+
kind: 'MissingData',
|
|
307
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
308
|
+
nestedReason: refetchReaderParams,
|
|
309
|
+
recordLink: refetchReaderParams.recordLink,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return {
|
|
314
|
+
kind: 'Success',
|
|
315
|
+
data: (
|
|
316
|
+
args: any,
|
|
317
|
+
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
318
|
+
fetchOptions?: FetchOptions<any>,
|
|
319
|
+
) => {
|
|
320
|
+
// TODO we should use the reader AST for this
|
|
321
|
+
const includeReadOutData = (variables: any, readOutData: any) => {
|
|
322
|
+
variables.id = readOutData.id;
|
|
323
|
+
return variables;
|
|
324
|
+
};
|
|
325
|
+
const localVariables = includeReadOutData(
|
|
326
|
+
args ?? {},
|
|
327
|
+
refetchReaderParams.data,
|
|
328
|
+
);
|
|
329
|
+
writeQueryArgsToVariables(
|
|
330
|
+
localVariables,
|
|
331
|
+
field.queryArguments,
|
|
332
|
+
variables,
|
|
333
|
+
);
|
|
334
|
+
|
|
335
|
+
return [
|
|
336
|
+
// Stable id
|
|
337
|
+
root.__typename +
|
|
338
|
+
':' +
|
|
339
|
+
root.__link +
|
|
340
|
+
'/' +
|
|
341
|
+
field.name +
|
|
342
|
+
'/' +
|
|
343
|
+
stableStringifyArgs(localVariables),
|
|
344
|
+
// Fetcher
|
|
345
|
+
() => {
|
|
346
|
+
const fragmentReferenceAndDisposeFromEntrypoint = (
|
|
347
|
+
entrypoint: IsographEntrypoint<any, any, any>,
|
|
348
|
+
): [FragmentReference<any, any>, CleanupFn] => {
|
|
349
|
+
const [networkRequest, disposeNetworkRequest] =
|
|
350
|
+
maybeMakeNetworkRequest(
|
|
351
|
+
environment,
|
|
352
|
+
entrypoint,
|
|
353
|
+
localVariables,
|
|
354
|
+
fetchOptions,
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
const fragmentReference: FragmentReference<any, any> = {
|
|
358
|
+
kind: 'FragmentReference',
|
|
359
|
+
readerWithRefetchQueries: wrapResolvedValue({
|
|
360
|
+
kind: 'ReaderWithRefetchQueries',
|
|
361
|
+
readerArtifact:
|
|
362
|
+
entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
363
|
+
nestedRefetchQueries:
|
|
364
|
+
entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
|
|
365
|
+
} as const),
|
|
366
|
+
|
|
367
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
368
|
+
root,
|
|
369
|
+
variables: localVariables,
|
|
370
|
+
networkRequest,
|
|
371
|
+
};
|
|
372
|
+
return [fragmentReference, disposeNetworkRequest];
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
if (field.entrypoint.kind === 'Entrypoint') {
|
|
376
|
+
return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
|
|
377
|
+
} else {
|
|
378
|
+
const isographArtifactPromiseWrapper = getOrLoadIsographArtifact(
|
|
379
|
+
environment,
|
|
380
|
+
field.entrypoint.typeAndField,
|
|
381
|
+
field.entrypoint.loader,
|
|
382
|
+
);
|
|
383
|
+
const state = getPromiseState(isographArtifactPromiseWrapper);
|
|
384
|
+
if (state.kind === 'Ok') {
|
|
385
|
+
return fragmentReferenceAndDisposeFromEntrypoint(state.value);
|
|
386
|
+
} else {
|
|
387
|
+
// Promise is pending or thrown
|
|
388
|
+
|
|
389
|
+
let entrypointLoaderState:
|
|
390
|
+
| {
|
|
391
|
+
kind: 'EntrypointNotLoaded';
|
|
392
|
+
}
|
|
393
|
+
| {
|
|
394
|
+
kind: 'NetworkRequestStarted';
|
|
395
|
+
disposeNetworkRequest: CleanupFn;
|
|
396
|
+
}
|
|
397
|
+
| { kind: 'Disposed' } = { kind: 'EntrypointNotLoaded' };
|
|
398
|
+
|
|
399
|
+
const networkRequest = wrapPromise(
|
|
400
|
+
isographArtifactPromiseWrapper.promise.then((entrypoint) => {
|
|
401
|
+
if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
|
|
402
|
+
const [networkRequest, disposeNetworkRequest] =
|
|
403
|
+
maybeMakeNetworkRequest(
|
|
404
|
+
environment,
|
|
405
|
+
entrypoint,
|
|
406
|
+
localVariables,
|
|
407
|
+
fetchOptions,
|
|
408
|
+
);
|
|
409
|
+
entrypointLoaderState = {
|
|
410
|
+
kind: 'NetworkRequestStarted',
|
|
411
|
+
disposeNetworkRequest,
|
|
412
|
+
};
|
|
413
|
+
return networkRequest.promise;
|
|
414
|
+
}
|
|
415
|
+
}),
|
|
416
|
+
);
|
|
417
|
+
const readerWithRefetchPromise =
|
|
418
|
+
isographArtifactPromiseWrapper.promise.then(
|
|
419
|
+
(entrypoint) => entrypoint.readerWithRefetchQueries,
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
const fragmentReference: FragmentReference<any, any> = {
|
|
423
|
+
kind: 'FragmentReference',
|
|
424
|
+
readerWithRefetchQueries: wrapPromise(readerWithRefetchPromise),
|
|
425
|
+
|
|
426
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
427
|
+
root,
|
|
428
|
+
variables: localVariables,
|
|
429
|
+
networkRequest,
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
return [
|
|
433
|
+
fragmentReference,
|
|
434
|
+
() => {
|
|
435
|
+
if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
|
|
436
|
+
entrypointLoaderState.disposeNetworkRequest();
|
|
437
|
+
}
|
|
438
|
+
entrypointLoaderState = { kind: 'Disposed' };
|
|
439
|
+
},
|
|
440
|
+
];
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
];
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
|
|
433
449
|
function filterVariables(
|
|
434
450
|
variables: Variables,
|
|
435
451
|
allowedVariables: string[],
|
|
@@ -750,14 +766,14 @@ export function readLinkedFieldData(
|
|
|
750
766
|
field.arguments,
|
|
751
767
|
variables,
|
|
752
768
|
);
|
|
753
|
-
logMessage(environment, {
|
|
769
|
+
logMessage(environment, () => ({
|
|
754
770
|
kind: 'MissingFieldHandlerCalled',
|
|
755
771
|
root,
|
|
756
772
|
storeRecord,
|
|
757
773
|
fieldName: field.fieldName,
|
|
758
774
|
arguments: field.arguments,
|
|
759
775
|
variables,
|
|
760
|
-
});
|
|
776
|
+
}));
|
|
761
777
|
|
|
762
778
|
if (altLink === undefined) {
|
|
763
779
|
return {
|
|
@@ -37,10 +37,10 @@ export function useLazyReference<
|
|
|
37
37
|
|
|
38
38
|
if (entrypoint?.kind !== 'Entrypoint') {
|
|
39
39
|
// TODO have a separate error logger
|
|
40
|
-
logMessage(environment, {
|
|
40
|
+
logMessage(environment, () => ({
|
|
41
41
|
kind: 'NonEntrypointReceived',
|
|
42
42
|
entrypoint,
|
|
43
|
-
});
|
|
43
|
+
}));
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
const cache = getOrCreateCacheForArtifact(
|