@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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @isograph/react@0.0.0-main-6815ceff compile-typescript /Users/runner/work/isograph/isograph/libs/isograph-react
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
 
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"}
@@ -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
  }
@@ -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,
@@ -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, message: LogMessage): void;
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":"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"}
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"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"}
@@ -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, message) {
6
- for (const logger of environment.loggers) {
7
- try {
8
- logger.log(message);
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
  }
@@ -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>;
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"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"}
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 refetchReaderParams = readData(environment, field.refetchReaderAst, root, variables,
121
- // Refetch fields just read the id, and don't need refetch query artifacts
122
- [], networkRequest, networkRequestOptions, mutableEncounteredRecords);
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-6815ceff",
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-6815ceff",
24
- "@isograph/react-disposable-state": "0.0.0-main-6815ceff",
25
- "@isograph/reference-counted-pointer": "0.0.0-main-6815ceff"
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
@@ -49,10 +49,10 @@ export function check(
49
49
  newStoreRecord,
50
50
  root,
51
51
  );
52
- logMessage(environment, {
52
+ logMessage(environment, () => ({
53
53
  kind: 'EnvironmentCheck',
54
54
  result: checkResult,
55
- });
55
+ }));
56
56
  return checkResult;
57
57
  }
58
58
 
@@ -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
  {
@@ -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
- message: LogMessage,
97
+ getMessage: () => LogMessage,
102
98
  ) {
103
- for (const logger of environment.loggers) {
104
- try {
105
- logger.log(message);
106
- } catch {}
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 refetchReaderParams = readData(
253
+ const data = readLoadablySelectedFieldData(
251
254
  environment,
252
- field.refetchReaderAst,
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 (refetchReaderParams.kind === 'MissingData') {
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(