@isograph/react 0.5.1 → 0.5.4
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-libs.log +9 -6
- package/.turbo/turbo-tsc.log +5 -0
- package/dist/_virtual/{rolldown_runtime.js → rolldown_runtime.cjs} +10 -6
- package/dist/core/{FragmentReference.js → FragmentReference.cjs} +1 -1
- package/dist/core/{FragmentReference.d.ts → FragmentReference.d.cts} +5 -5
- package/dist/core/FragmentReference.d.cts.map +1 -0
- package/dist/core/FragmentReference.d.mts.map +1 -1
- package/dist/core/{IsographEnvironment.js → IsographEnvironment.cjs} +19 -9
- package/dist/core/{IsographEnvironment.d.ts → IsographEnvironment.d.cts} +19 -15
- package/dist/core/IsographEnvironment.d.cts.map +1 -0
- package/dist/core/IsographEnvironment.d.mts +9 -5
- package/dist/core/IsographEnvironment.d.mts.map +1 -1
- package/dist/core/IsographEnvironment.mjs +17 -7
- package/dist/core/IsographEnvironment.mjs.map +1 -1
- package/dist/core/{PromiseWrapper.d.ts → PromiseWrapper.d.cts} +1 -1
- package/dist/core/PromiseWrapper.d.cts.map +1 -0
- package/dist/core/PromiseWrapper.d.mts.map +1 -1
- package/dist/core/PromiseWrapper.mjs.map +1 -1
- package/dist/core/{areEqualWithDeepComparison.js → areEqualWithDeepComparison.cjs} +7 -7
- package/dist/core/areEqualWithDeepComparison.mjs +7 -7
- package/dist/core/areEqualWithDeepComparison.mjs.map +1 -1
- package/dist/core/{brand.d.ts → brand.d.cts} +2 -2
- package/dist/core/brand.d.cts.map +1 -0
- package/dist/core/brand.d.mts +1 -1
- package/dist/core/brand.d.mts.map +1 -1
- package/dist/core/{cache.js → cache.cjs} +16 -29
- package/dist/core/cache.d.cts +44 -0
- package/dist/core/cache.d.cts.map +1 -0
- package/dist/core/cache.d.mts +29 -4
- package/dist/core/cache.d.mts.map +1 -1
- package/dist/core/cache.mjs +9 -21
- package/dist/core/cache.mjs.map +1 -1
- package/dist/core/{check.js → check.cjs} +4 -4
- package/dist/core/{check.d.ts → check.d.cts} +4 -4
- package/dist/core/check.d.cts.map +1 -0
- package/dist/core/check.d.mts.map +1 -1
- package/dist/core/check.mjs.map +1 -1
- package/dist/core/{componentCache.js → componentCache.cjs} +2 -2
- package/dist/core/{entrypoint.d.ts → entrypoint.d.cts} +16 -9
- package/dist/core/entrypoint.d.cts.map +1 -0
- package/dist/core/entrypoint.d.mts +9 -2
- package/dist/core/entrypoint.d.mts.map +1 -1
- package/dist/core/entrypoint.mjs.map +1 -1
- package/dist/core/{garbageCollection.js → garbageCollection.cjs} +3 -3
- package/dist/core/{garbageCollection.d.ts → garbageCollection.d.cts} +4 -4
- package/dist/core/garbageCollection.d.cts.map +1 -0
- package/dist/core/garbageCollection.d.mts.map +1 -1
- package/dist/core/garbageCollection.mjs.map +1 -1
- package/dist/core/{getOrCreateCacheForArtifact.js → getOrCreateCacheForArtifact.cjs} +4 -4
- package/dist/core/getOrCreateCacheForArtifact.mjs.map +1 -1
- package/dist/core/{logging.d.ts → logging.d.cts} +9 -10
- package/dist/core/logging.d.cts.map +1 -0
- package/dist/core/logging.d.mts +0 -1
- package/dist/core/logging.d.mts.map +1 -1
- package/dist/core/{makeNetworkRequest.js → makeNetworkRequest.cjs} +21 -21
- package/dist/core/{makeNetworkRequest.d.ts → makeNetworkRequest.d.cts} +7 -7
- package/dist/core/makeNetworkRequest.d.cts.map +1 -0
- package/dist/core/makeNetworkRequest.d.mts.map +1 -1
- package/dist/core/makeNetworkRequest.mjs +10 -10
- package/dist/core/makeNetworkRequest.mjs.map +1 -1
- package/dist/core/{optimisticProxy.js → optimisticProxy.cjs} +2 -2
- package/dist/core/{optimisticProxy.d.ts → optimisticProxy.d.cts} +2 -3
- package/dist/core/optimisticProxy.d.cts.map +1 -0
- package/dist/core/optimisticProxy.d.mts +0 -1
- package/dist/core/optimisticProxy.d.mts.map +1 -1
- package/dist/core/optimisticProxy.mjs.map +1 -1
- package/dist/core/{read.js → read.cjs} +66 -63
- package/dist/core/{read.d.ts → read.d.cts} +4 -5
- package/dist/core/read.d.cts.map +1 -0
- package/dist/core/read.d.mts.map +1 -1
- package/dist/core/read.mjs +58 -55
- package/dist/core/read.mjs.map +1 -1
- package/dist/core/{reader.d.ts → reader.d.cts} +11 -9
- package/dist/core/reader.d.cts.map +1 -0
- package/dist/core/reader.d.mts +5 -3
- package/dist/core/reader.d.mts.map +1 -1
- package/dist/core/{startUpdate.js → startUpdate.cjs} +14 -14
- package/dist/core/startUpdate.mjs +6 -6
- package/dist/core/startUpdate.mjs.map +1 -1
- package/dist/core/{subscribe.js → subscribe.cjs} +3 -3
- package/dist/core/{subscribe.d.ts → subscribe.d.cts} +6 -6
- package/dist/core/subscribe.d.cts.map +1 -0
- package/dist/core/subscribe.d.mts.map +1 -1
- package/dist/core/subscribe.mjs.map +1 -1
- package/dist/core/{util.d.ts → util.d.cts} +1 -1
- package/dist/core/util.d.cts.map +1 -0
- package/dist/core/util.d.mts.map +1 -1
- package/dist/core/util.mjs.map +1 -1
- package/dist/core/{writeData.js → writeData.cjs} +6 -6
- package/dist/core/{writeData.d.ts → writeData.d.cts} +6 -6
- package/dist/core/writeData.d.cts.map +1 -0
- package/dist/core/writeData.d.mts +1 -1
- package/dist/core/writeData.d.mts.map +1 -1
- package/dist/core/writeData.mjs.map +1 -1
- package/dist/{index.js → index.cjs} +29 -29
- package/dist/index.d.cts +32 -0
- package/dist/index.d.mts +2 -2
- package/dist/loadable-hooks/useClientSideDefer.cjs +14 -0
- package/dist/loadable-hooks/{useClientSideDefer.d.ts → useClientSideDefer.d.cts} +4 -4
- package/dist/loadable-hooks/useClientSideDefer.d.cts.map +1 -0
- package/dist/loadable-hooks/useClientSideDefer.d.mts.map +1 -1
- package/dist/loadable-hooks/{useConnectionSpecPagination.js → useConnectionSpecPagination.cjs} +13 -16
- package/dist/loadable-hooks/{useConnectionSpecPagination.d.ts → useConnectionSpecPagination.d.cts} +4 -4
- package/dist/loadable-hooks/useConnectionSpecPagination.d.cts.map +1 -0
- package/dist/loadable-hooks/useConnectionSpecPagination.d.mts.map +1 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.mjs.map +1 -1
- package/dist/loadable-hooks/{useImperativeExposedMutationField.d.ts → useImperativeExposedMutationField.d.cts} +1 -1
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.cts.map +1 -0
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.mts.map +1 -1
- package/dist/loadable-hooks/{useImperativeLoadableField.js → useImperativeLoadableField.cjs} +4 -5
- package/dist/loadable-hooks/{useImperativeLoadableField.d.ts → useImperativeLoadableField.d.cts} +4 -4
- package/dist/loadable-hooks/useImperativeLoadableField.d.cts.map +1 -0
- package/dist/loadable-hooks/useImperativeLoadableField.d.mts.map +1 -1
- package/dist/loadable-hooks/{useSkipLimitPagination.js → useSkipLimitPagination.cjs} +13 -16
- package/dist/loadable-hooks/{useSkipLimitPagination.d.ts → useSkipLimitPagination.d.cts} +4 -4
- package/dist/loadable-hooks/useSkipLimitPagination.d.cts.map +1 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.mts.map +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.mjs.map +1 -1
- package/dist/react/{FragmentReader.js → FragmentReader.cjs} +1 -1
- package/dist/react/{FragmentReader.d.ts → FragmentReader.d.cts} +5 -5
- package/dist/react/FragmentReader.d.cts.map +1 -0
- package/dist/react/FragmentReader.d.mts.map +1 -1
- package/dist/react/{FragmentRenderer.js → FragmentRenderer.cjs} +2 -2
- package/dist/react/{FragmentRenderer.d.ts → FragmentRenderer.d.cts} +5 -5
- package/dist/react/FragmentRenderer.d.cts.map +1 -0
- package/dist/react/FragmentRenderer.d.mts.map +1 -1
- package/dist/react/{IsographEnvironmentProvider.js → IsographEnvironmentProvider.cjs} +1 -1
- package/dist/react/{IsographEnvironmentProvider.d.ts → IsographEnvironmentProvider.d.cts} +2 -2
- package/dist/react/IsographEnvironmentProvider.d.cts.map +1 -0
- package/dist/react/IsographEnvironmentProvider.d.mts.map +1 -1
- package/dist/react/{LoadableFieldReader.js → LoadableFieldReader.cjs} +3 -3
- package/dist/react/{LoadableFieldReader.d.ts → LoadableFieldReader.d.cts} +5 -5
- package/dist/react/LoadableFieldReader.d.cts.map +1 -0
- package/dist/react/LoadableFieldReader.d.mts.map +1 -1
- package/dist/react/{LoadableFieldRenderer.js → LoadableFieldRenderer.cjs} +3 -3
- package/dist/react/{LoadableFieldRenderer.d.ts → LoadableFieldRenderer.d.cts} +5 -5
- package/dist/react/LoadableFieldRenderer.d.cts.map +1 -0
- package/dist/react/LoadableFieldRenderer.d.mts.map +1 -1
- package/dist/react/{RenderAfterCommit__DO_NOT_USE.js → RenderAfterCommit__DO_NOT_USE.cjs} +1 -2
- package/dist/react/{RenderAfterCommit__DO_NOT_USE.d.ts → RenderAfterCommit__DO_NOT_USE.d.cts} +1 -2
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.cts.map +1 -0
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts +0 -1
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.mts.map +1 -1
- package/dist/react/{createIsographEnvironment.js → createIsographEnvironment.cjs} +2 -2
- package/dist/react/{createIsographEnvironment.d.ts → createIsographEnvironment.d.cts} +3 -3
- package/dist/react/createIsographEnvironment.d.cts.map +1 -0
- package/dist/react/createIsographEnvironment.d.mts +0 -1
- package/dist/react/createIsographEnvironment.d.mts.map +1 -1
- package/dist/react/{maybeUnwrapNetworkRequest.js → maybeUnwrapNetworkRequest.cjs} +1 -1
- package/dist/react/{useImperativeReference.js → useImperativeReference.cjs} +7 -8
- package/dist/react/{useImperativeReference.d.ts → useImperativeReference.d.cts} +5 -6
- package/dist/react/useImperativeReference.d.cts.map +1 -0
- package/dist/react/useImperativeReference.d.mts +0 -1
- package/dist/react/useImperativeReference.d.mts.map +1 -1
- package/dist/react/useLazyReference.cjs +18 -0
- package/dist/react/{useLazyReference.d.ts → useLazyReference.d.cts} +5 -6
- package/dist/react/useLazyReference.d.cts.map +1 -0
- package/dist/react/useLazyReference.d.mts +0 -1
- package/dist/react/useLazyReference.d.mts.map +1 -1
- package/dist/react/{useReadAndSubscribe.js → useReadAndSubscribe.cjs} +9 -10
- package/dist/react/{useReadAndSubscribe.d.ts → useReadAndSubscribe.d.cts} +4 -5
- package/dist/react/useReadAndSubscribe.d.cts.map +1 -0
- package/dist/react/useReadAndSubscribe.d.mts +0 -1
- package/dist/react/useReadAndSubscribe.d.mts.map +1 -1
- package/dist/react/useReadAndSubscribe.mjs.map +1 -1
- package/dist/react/{useRerenderOnChange.js → useRerenderOnChange.cjs} +3 -4
- package/dist/react/{useRerenderOnChange.d.ts → useRerenderOnChange.d.cts} +4 -4
- package/dist/react/useRerenderOnChange.d.cts.map +1 -0
- package/dist/react/useRerenderOnChange.d.mts.map +1 -1
- package/dist/react/{useResult.js → useResult.cjs} +7 -7
- package/dist/react/{useResult.d.ts → useResult.d.cts} +3 -3
- package/dist/react/useResult.d.cts.map +1 -0
- package/dist/react/useResult.d.mts.map +1 -1
- package/package.json +9 -9
- package/src/core/IsographEnvironment.ts +47 -22
- package/src/core/cache.ts +76 -55
- package/src/core/entrypoint.ts +18 -2
- package/src/core/getOrCreateCacheForArtifact.ts +2 -2
- package/src/core/makeNetworkRequest.ts +10 -12
- package/src/core/read.ts +21 -19
- package/src/core/reader.ts +9 -5
- package/src/core/writeData.ts +4 -4
- package/src/index.ts +2 -1
- package/src/tests/__isograph/Economist/__link/output_type.ts +2 -1
- package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +4 -3
- package/src/tests/__isograph/Query/linkedUpdate/normalization_ast.ts +12 -0
- package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +9 -3
- package/src/tests/__isograph/Query/meName/normalization_ast.ts +3 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -3
- package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +8 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +8 -3
- package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +3 -0
- package/src/tests/__isograph/Query/nodeField/raw_response_type.ts +1 -1
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -3
- package/src/tests/__isograph/Query/normalizeUndefinedField/normalization_ast.ts +3 -0
- package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +5 -3
- package/src/tests/__isograph/Query/startUpdate/normalization_ast.ts +6 -0
- package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +6 -3
- package/src/tests/__isograph/Query/subquery/normalization_ast.ts +4 -0
- package/src/tests/__isograph/Query/subquery/raw_response_type.ts +1 -1
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +6 -3
- package/src/tests/garbageCollection.test.ts +11 -11
- package/src/tests/normalizeData.test.ts +11 -3
- package/src/tests/optimisticProxy.test.ts +23 -23
- package/src/tests/startUpdate.test.ts +2 -2
- package/tsconfig.json +5 -4
- package/tsconfig.package.json +8 -0
- package/tsconfig.test.json +12 -0
- package/tsdown.config.ts +8 -0
- package/vitest.config.ts +1 -1
- package/dist/core/FragmentReference.d.ts.map +0 -1
- package/dist/core/IsographEnvironment.d.ts.map +0 -1
- package/dist/core/PromiseWrapper.d.ts.map +0 -1
- package/dist/core/brand.d.ts.map +0 -1
- package/dist/core/cache.d.ts +0 -20
- package/dist/core/cache.d.ts.map +0 -1
- package/dist/core/check.d.ts.map +0 -1
- package/dist/core/entrypoint.d.ts.map +0 -1
- package/dist/core/garbageCollection.d.ts.map +0 -1
- package/dist/core/logging.d.ts.map +0 -1
- package/dist/core/makeNetworkRequest.d.ts.map +0 -1
- package/dist/core/optimisticProxy.d.ts.map +0 -1
- package/dist/core/read.d.ts.map +0 -1
- package/dist/core/reader.d.ts.map +0 -1
- package/dist/core/subscribe.d.ts.map +0 -1
- package/dist/core/util.d.ts.map +0 -1
- package/dist/core/writeData.d.ts.map +0 -1
- package/dist/index.d.ts +0 -32
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +0 -1
- package/dist/loadable-hooks/useClientSideDefer.js +0 -15
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +0 -1
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +0 -1
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +0 -1
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +0 -1
- package/dist/react/FragmentReader.d.ts.map +0 -1
- package/dist/react/FragmentRenderer.d.ts.map +0 -1
- package/dist/react/IsographEnvironmentProvider.d.ts.map +0 -1
- package/dist/react/LoadableFieldReader.d.ts.map +0 -1
- package/dist/react/LoadableFieldRenderer.d.ts.map +0 -1
- package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +0 -1
- package/dist/react/createIsographEnvironment.d.ts.map +0 -1
- package/dist/react/useImperativeReference.d.ts.map +0 -1
- package/dist/react/useLazyReference.d.ts.map +0 -1
- package/dist/react/useLazyReference.js +0 -19
- package/dist/react/useReadAndSubscribe.d.ts.map +0 -1
- package/dist/react/useRerenderOnChange.d.ts.map +0 -1
- package/dist/react/useResult.d.ts.map +0 -1
- package/src/tests/tsconfig.json +0 -21
- package/tsconfig.pkg.json +0 -16
- /package/dist/core/{PromiseWrapper.js → PromiseWrapper.cjs} +0 -0
- /package/dist/core/{entrypoint.js → entrypoint.cjs} +0 -0
- /package/dist/core/{logging.js → logging.cjs} +0 -0
- /package/dist/core/{util.js → util.cjs} +0 -0
- /package/dist/loadable-hooks/{useImperativeExposedMutationField.js → useImperativeExposedMutationField.cjs} +0 -0
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.
|
|
2
|
-
const require_util = require('./util.
|
|
3
|
-
const require_IsographEnvironment = require('./IsographEnvironment.
|
|
4
|
-
const require_logging = require('./logging.
|
|
5
|
-
const require_optimisticProxy = require('./optimisticProxy.
|
|
6
|
-
let
|
|
7
|
-
__isograph_react_disposable_state = require_rolldown_runtime.__toESM(__isograph_react_disposable_state);
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_util = require('./util.cjs');
|
|
3
|
+
const require_IsographEnvironment = require('./IsographEnvironment.cjs');
|
|
4
|
+
const require_logging = require('./logging.cjs');
|
|
5
|
+
const require_optimisticProxy = require('./optimisticProxy.cjs');
|
|
6
|
+
let _isograph_react_disposable_state = require("@isograph/react-disposable-state");
|
|
8
7
|
|
|
9
8
|
//#region src/core/cache.ts
|
|
10
9
|
const TYPENAME_FIELD_NAME = "__typename";
|
|
11
10
|
function getOrCreateItemInSuspenseCache(environment, index, factory) {
|
|
12
|
-
if (environment.fragmentCache[index] == null) environment.fragmentCache[index] = new
|
|
11
|
+
if (environment.fragmentCache[index] == null) environment.fragmentCache[index] = new _isograph_react_disposable_state.ParentCache(factory);
|
|
13
12
|
return environment.fragmentCache[index];
|
|
14
13
|
}
|
|
15
14
|
function normalizeData(environment, storeLayer, normalizationAst, networkResponse, variables, root, encounteredIds) {
|
|
@@ -88,10 +87,8 @@ function normalizeScalarField(astNode, networkResponseParentRecord, targetStoreR
|
|
|
88
87
|
targetStoreRecord[parentRecordKey] = null;
|
|
89
88
|
return existingValue === void 0 || existingValue != null;
|
|
90
89
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return existingValue !== networkResponseData;
|
|
94
|
-
} else throw new Error("Unexpected object array when normalizing scalar");
|
|
90
|
+
targetStoreRecord[parentRecordKey] = networkResponseData;
|
|
91
|
+
return existingValue !== networkResponseData;
|
|
95
92
|
}
|
|
96
93
|
/**
|
|
97
94
|
* Mutate targetParentRecord with a given linked field ast node.
|
|
@@ -104,7 +101,6 @@ function normalizeLinkedField(environment, storeLayer, astNode, networkResponseP
|
|
|
104
101
|
targetParentRecord[parentRecordKey] = null;
|
|
105
102
|
return existingValue === void 0 || existingValue != null;
|
|
106
103
|
}
|
|
107
|
-
if (isScalarOrEmptyArray(networkResponseData) && !isNullOrEmptyArray(networkResponseData)) throw new Error("Unexpected scalar network response when normalizing a linked field");
|
|
108
104
|
if (require_util.isArray(networkResponseData)) {
|
|
109
105
|
const dataIds = [];
|
|
110
106
|
for (let i = 0; i < networkResponseData.length; i++) {
|
|
@@ -165,17 +161,6 @@ function normalizeNetworkResponseObject(environment, storeLayer, astNode, networ
|
|
|
165
161
|
normalizeDataIntoRecord(environment, storeLayer, astNode.selections, networkResponseData, newStoreRecord, link, variables, mutableEncounteredIds);
|
|
166
162
|
return newStoreRecordId;
|
|
167
163
|
}
|
|
168
|
-
function isScalarOrEmptyArray(data) {
|
|
169
|
-
if (require_util.isArray(data)) return data.every((x) => isScalarOrEmptyArray(x));
|
|
170
|
-
return data == null || typeof data === "string" || typeof data === "number" || typeof data === "boolean";
|
|
171
|
-
}
|
|
172
|
-
function isNullOrEmptyArray(data) {
|
|
173
|
-
if (require_util.isArray(data)) {
|
|
174
|
-
if (data.length === 0) return true;
|
|
175
|
-
return data.every((x) => isNullOrEmptyArray(x));
|
|
176
|
-
}
|
|
177
|
-
return data == null;
|
|
178
|
-
}
|
|
179
164
|
function getParentRecordKey(astNode, variables) {
|
|
180
165
|
let parentRecordKey = astNode.fieldName;
|
|
181
166
|
const fieldParameters = astNode.arguments;
|
|
@@ -184,8 +169,8 @@ function getParentRecordKey(astNode, variables) {
|
|
|
184
169
|
}
|
|
185
170
|
function getStoreKeyChunkForArgumentValue(argumentValue, variables) {
|
|
186
171
|
switch (argumentValue.kind) {
|
|
187
|
-
case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue
|
|
188
|
-
return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue
|
|
172
|
+
case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue]) => {
|
|
173
|
+
return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue, variables)];
|
|
189
174
|
}));
|
|
190
175
|
case "Literal": return argumentValue.value;
|
|
191
176
|
case "Variable": return variables[argumentValue.name] ?? "null";
|
|
@@ -210,8 +195,8 @@ function getNetworkResponseKey(astNode) {
|
|
|
210
195
|
}
|
|
211
196
|
function getArgumentValueChunk(argumentValue) {
|
|
212
197
|
switch (argumentValue.kind) {
|
|
213
|
-
case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue
|
|
214
|
-
return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue
|
|
198
|
+
case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue]) => {
|
|
199
|
+
return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue);
|
|
215
200
|
}).join("_") + "_c";
|
|
216
201
|
case "Literal": return "l_" + argumentValue.value;
|
|
217
202
|
case "Variable": return "v_" + argumentValue.name;
|
|
@@ -223,7 +208,9 @@ const FIRST_SPLIT_KEY = "____";
|
|
|
223
208
|
const SECOND_SPLIT_KEY = "___";
|
|
224
209
|
const THIRD_SPLIT_KEY = "__";
|
|
225
210
|
function getDataIdOfNetworkResponse(parentRecordLink, dataToNormalize, astNode, variables, index) {
|
|
226
|
-
|
|
211
|
+
const __typename = astNode.concreteType ?? dataToNormalize[TYPENAME_FIELD_NAME];
|
|
212
|
+
if (__typename == null) throw new Error("Unexpected missing __typename in network response when normalizing a linked field. This is indicative of a bug in Isograph.");
|
|
213
|
+
if (__typename === "Query") return require_IsographEnvironment.ROOT_ID;
|
|
227
214
|
const dataId = dataToNormalize.id;
|
|
228
215
|
if (dataId != null) return dataId;
|
|
229
216
|
let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { StoreLayerWithData } from "./optimisticProxy.cjs";
|
|
2
|
+
import { DataId, IsographEnvironment, StoreLink, TypeName } from "./IsographEnvironment.cjs";
|
|
3
|
+
import { Variables } from "./FragmentReference.cjs";
|
|
4
|
+
import { NormalizationAstNodes } from "./entrypoint.cjs";
|
|
5
|
+
import { ParentCache } from "@isograph/react-disposable-state";
|
|
6
|
+
|
|
7
|
+
//#region src/core/cache.d.ts
|
|
8
|
+
type NetworkResponsePlural<T> = null | T | readonly T[] | readonly (null | T)[];
|
|
9
|
+
type NetworkResponseScalarValue = string | number | boolean | unknown;
|
|
10
|
+
type NetworkResponseValue = NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
|
|
11
|
+
type NetworkResponseObject = {
|
|
12
|
+
readonly [key: ScalarNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue>;
|
|
13
|
+
readonly [key: LinkedNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseObject>;
|
|
14
|
+
readonly [key: NetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
|
|
15
|
+
readonly id?: DataId;
|
|
16
|
+
readonly __typename?: TypeName;
|
|
17
|
+
};
|
|
18
|
+
declare function normalizeData(environment: IsographEnvironment, storeLayer: StoreLayerWithData, normalizationAst: NormalizationAstNodes, networkResponse: NetworkResponseObject, variables: Variables, root: StoreLink, encounteredIds: EncounteredIds): EncounteredIds;
|
|
19
|
+
type EncounteredIds = Map<TypeName, Set<DataId>>;
|
|
20
|
+
type ParentRecordKey = string;
|
|
21
|
+
/**
|
|
22
|
+
* these don't actually start with the different prefixes, but they let
|
|
23
|
+
* us use multiple indexes, e.g.
|
|
24
|
+
* {
|
|
25
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string} `]: ...
|
|
26
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string} `]: ...
|
|
27
|
+
* }
|
|
28
|
+
*/
|
|
29
|
+
type LinkedParentRecordKey = `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string}`;
|
|
30
|
+
type ScalarParentRecordKey = `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string}`;
|
|
31
|
+
type NetworkResponseKey = string;
|
|
32
|
+
/**
|
|
33
|
+
* these don't actually start with the different prefixes, but they let
|
|
34
|
+
* us use multiple indexes, e.g.
|
|
35
|
+
* {
|
|
36
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string} `]: ...
|
|
37
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string} `]: ...
|
|
38
|
+
* }
|
|
39
|
+
*/
|
|
40
|
+
type LinkedNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string}`;
|
|
41
|
+
type ScalarNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string}`;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { EncounteredIds, LinkedParentRecordKey, NetworkResponseObject, NetworkResponseScalarValue, NetworkResponseValue, ParentRecordKey, ScalarParentRecordKey, normalizeData };
|
|
44
|
+
//# sourceMappingURL=cache.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.cts","names":[],"sources":["../../src/core/cache.ts"],"mappings":";;;;;;;KAgDY,qBAAA,aAER,CAAA,YACS,CAAA,sBACQ,CAAA;AAAA,KACT,0BAAA;AAAA,KAEA,oBAAA,GACR,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;AAAA,KAEd,qBAAA;EAAA,UAGA,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,0BAAA;EAAA,UAChB,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,qBAAA;EAAA,UAChB,GAAA,EAAK,kBAAA,eAEX,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;EAAA,SACjB,EAAA,GAAK,MAAA;EAAA,SACL,UAAA,GAAa,QAAA;AAAA;AAAA,iBAGR,aAAA,CACd,WAAA,EAAa,mBAAA,EACb,UAAA,EAAY,kBAAA,EACZ,gBAAA,EAAkB,qBAAA,EAClB,eAAA,EAAiB,qBAAA,EACjB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,EACN,cAAA,EAAgB,cAAA,GACf,cAAA;AAAA,KAkES,cAAA,GAAiB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,MAAA;AAAA,KAgSnC,eAAA;;AA/XZ;;;;;;;KAyYY,qBAAA;AAAA,KAEA,qBAAA;AAAA,KAwEA,kBAAA;;;;AA/cZ;;;;;KAydY,wBAAA;AAAA,KAEA,wBAAA"}
|
package/dist/core/cache.d.mts
CHANGED
|
@@ -6,15 +6,40 @@ import { NormalizationAstNodes } from "./entrypoint.mjs";
|
|
|
6
6
|
import { ParentCache } from "@isograph/react-disposable-state";
|
|
7
7
|
|
|
8
8
|
//#region src/core/cache.d.ts
|
|
9
|
-
type
|
|
10
|
-
type
|
|
9
|
+
type NetworkResponsePlural<T> = null | T | readonly T[] | readonly (null | T)[];
|
|
10
|
+
type NetworkResponseScalarValue = string | number | boolean | unknown;
|
|
11
|
+
type NetworkResponseValue = NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
|
|
11
12
|
type NetworkResponseObject = {
|
|
12
|
-
readonly [
|
|
13
|
+
readonly [key: ScalarNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue>;
|
|
14
|
+
readonly [key: LinkedNetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseObject>;
|
|
15
|
+
readonly [key: NetworkResponseKey]: undefined | NetworkResponsePlural<NetworkResponseScalarValue> | NetworkResponsePlural<NetworkResponseObject>;
|
|
13
16
|
readonly id?: DataId;
|
|
14
17
|
readonly __typename?: TypeName;
|
|
15
18
|
};
|
|
16
19
|
declare function normalizeData(environment: IsographEnvironment, storeLayer: StoreLayerWithData, normalizationAst: NormalizationAstNodes, networkResponse: NetworkResponseObject, variables: Variables, root: StoreLink, encounteredIds: EncounteredIds): EncounteredIds;
|
|
17
20
|
type EncounteredIds = Map<TypeName, Set<DataId>>;
|
|
21
|
+
type ParentRecordKey = string;
|
|
22
|
+
/**
|
|
23
|
+
* these don't actually start with the different prefixes, but they let
|
|
24
|
+
* us use multiple indexes, e.g.
|
|
25
|
+
* {
|
|
26
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string} `]: ...
|
|
27
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string} `]: ...
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
type LinkedParentRecordKey = `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string}`;
|
|
31
|
+
type ScalarParentRecordKey = `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string}`;
|
|
32
|
+
type NetworkResponseKey = string;
|
|
33
|
+
/**
|
|
34
|
+
* these don't actually start with the different prefixes, but they let
|
|
35
|
+
* us use multiple indexes, e.g.
|
|
36
|
+
* {
|
|
37
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string} `]: ...
|
|
38
|
+
* readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string} `]: ...
|
|
39
|
+
* }
|
|
40
|
+
*/
|
|
41
|
+
type LinkedNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string}`;
|
|
42
|
+
type ScalarNetworkResponseKey = `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string}`;
|
|
18
43
|
//#endregion
|
|
19
|
-
export { EncounteredIds, NetworkResponseObject, NetworkResponseScalarValue, NetworkResponseValue, normalizeData };
|
|
44
|
+
export { EncounteredIds, LinkedParentRecordKey, NetworkResponseObject, NetworkResponseScalarValue, NetworkResponseValue, ParentRecordKey, ScalarParentRecordKey, normalizeData };
|
|
20
45
|
//# sourceMappingURL=cache.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.mts","names":[],"sources":["../../src/core/cache.ts"],"
|
|
1
|
+
{"version":3,"file":"cache.d.mts","names":[],"sources":["../../src/core/cache.ts"],"mappings":";;;;;;;;KAgDY,qBAAA,aAER,CAAA,YACS,CAAA,sBACQ,CAAA;AAAA,KACT,0BAAA;AAAA,KAEA,oBAAA,GACR,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;AAAA,KAEd,qBAAA;EAAA,UAGA,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,0BAAA;EAAA,UAChB,GAAA,EAAK,wBAAA,eAEX,qBAAA,CAAsB,qBAAA;EAAA,UAChB,GAAA,EAAK,kBAAA,eAEX,qBAAA,CAAsB,0BAAA,IACtB,qBAAA,CAAsB,qBAAA;EAAA,SACjB,EAAA,GAAK,MAAA;EAAA,SACL,UAAA,GAAa,QAAA;AAAA;AAAA,iBAGR,aAAA,CACd,WAAA,EAAa,mBAAA,EACb,UAAA,EAAY,kBAAA,EACZ,gBAAA,EAAkB,qBAAA,EAClB,eAAA,EAAiB,qBAAA,EACjB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,EACN,cAAA,EAAgB,cAAA,GACf,cAAA;AAAA,KAkES,cAAA,GAAiB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,MAAA;AAAA,KAgSnC,eAAA;;;AA/XZ;;;;;;KAyYY,qBAAA;AAAA,KAEA,qBAAA;AAAA,KAwEA,kBAAA;;;;;AA/cZ;;;;KAydY,wBAAA;AAAA,KAEA,wBAAA"}
|
package/dist/core/cache.mjs
CHANGED
|
@@ -86,10 +86,8 @@ function normalizeScalarField(astNode, networkResponseParentRecord, targetStoreR
|
|
|
86
86
|
targetStoreRecord[parentRecordKey] = null;
|
|
87
87
|
return existingValue === void 0 || existingValue != null;
|
|
88
88
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
return existingValue !== networkResponseData;
|
|
92
|
-
} else throw new Error("Unexpected object array when normalizing scalar");
|
|
89
|
+
targetStoreRecord[parentRecordKey] = networkResponseData;
|
|
90
|
+
return existingValue !== networkResponseData;
|
|
93
91
|
}
|
|
94
92
|
/**
|
|
95
93
|
* Mutate targetParentRecord with a given linked field ast node.
|
|
@@ -102,7 +100,6 @@ function normalizeLinkedField(environment, storeLayer, astNode, networkResponseP
|
|
|
102
100
|
targetParentRecord[parentRecordKey] = null;
|
|
103
101
|
return existingValue === void 0 || existingValue != null;
|
|
104
102
|
}
|
|
105
|
-
if (isScalarOrEmptyArray(networkResponseData) && !isNullOrEmptyArray(networkResponseData)) throw new Error("Unexpected scalar network response when normalizing a linked field");
|
|
106
103
|
if (isArray(networkResponseData)) {
|
|
107
104
|
const dataIds = [];
|
|
108
105
|
for (let i = 0; i < networkResponseData.length; i++) {
|
|
@@ -163,17 +160,6 @@ function normalizeNetworkResponseObject(environment, storeLayer, astNode, networ
|
|
|
163
160
|
normalizeDataIntoRecord(environment, storeLayer, astNode.selections, networkResponseData, newStoreRecord, link, variables, mutableEncounteredIds);
|
|
164
161
|
return newStoreRecordId;
|
|
165
162
|
}
|
|
166
|
-
function isScalarOrEmptyArray(data) {
|
|
167
|
-
if (isArray(data)) return data.every((x) => isScalarOrEmptyArray(x));
|
|
168
|
-
return data == null || typeof data === "string" || typeof data === "number" || typeof data === "boolean";
|
|
169
|
-
}
|
|
170
|
-
function isNullOrEmptyArray(data) {
|
|
171
|
-
if (isArray(data)) {
|
|
172
|
-
if (data.length === 0) return true;
|
|
173
|
-
return data.every((x) => isNullOrEmptyArray(x));
|
|
174
|
-
}
|
|
175
|
-
return data == null;
|
|
176
|
-
}
|
|
177
163
|
function getParentRecordKey(astNode, variables) {
|
|
178
164
|
let parentRecordKey = astNode.fieldName;
|
|
179
165
|
const fieldParameters = astNode.arguments;
|
|
@@ -182,8 +168,8 @@ function getParentRecordKey(astNode, variables) {
|
|
|
182
168
|
}
|
|
183
169
|
function getStoreKeyChunkForArgumentValue(argumentValue, variables) {
|
|
184
170
|
switch (argumentValue.kind) {
|
|
185
|
-
case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue
|
|
186
|
-
return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue
|
|
171
|
+
case "Object": return Object.fromEntries(argumentValue.value.map(([argumentName, argumentValue]) => {
|
|
172
|
+
return [argumentName, getStoreKeyChunkForArgumentValue(argumentValue, variables)];
|
|
187
173
|
}));
|
|
188
174
|
case "Literal": return argumentValue.value;
|
|
189
175
|
case "Variable": return variables[argumentValue.name] ?? "null";
|
|
@@ -208,8 +194,8 @@ function getNetworkResponseKey(astNode) {
|
|
|
208
194
|
}
|
|
209
195
|
function getArgumentValueChunk(argumentValue) {
|
|
210
196
|
switch (argumentValue.kind) {
|
|
211
|
-
case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue
|
|
212
|
-
return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue
|
|
197
|
+
case "Object": return "o_" + argumentValue.value.map(([argumentName, argumentValue]) => {
|
|
198
|
+
return argumentName + THIRD_SPLIT_KEY + getArgumentValueChunk(argumentValue);
|
|
213
199
|
}).join("_") + "_c";
|
|
214
200
|
case "Literal": return "l_" + argumentValue.value;
|
|
215
201
|
case "Variable": return "v_" + argumentValue.name;
|
|
@@ -221,7 +207,9 @@ const FIRST_SPLIT_KEY = "____";
|
|
|
221
207
|
const SECOND_SPLIT_KEY = "___";
|
|
222
208
|
const THIRD_SPLIT_KEY = "__";
|
|
223
209
|
function getDataIdOfNetworkResponse(parentRecordLink, dataToNormalize, astNode, variables, index) {
|
|
224
|
-
|
|
210
|
+
const __typename = astNode.concreteType ?? dataToNormalize[TYPENAME_FIELD_NAME];
|
|
211
|
+
if (__typename == null) throw new Error("Unexpected missing __typename in network response when normalizing a linked field. This is indicative of a bug in Isograph.");
|
|
212
|
+
if (__typename === "Query") return ROOT_ID;
|
|
225
213
|
const dataId = dataToNormalize.id;
|
|
226
214
|
if (dataId != null) return dataId;
|
|
227
215
|
let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;
|
package/dist/core/cache.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.mjs","names":["dataIds: (StoreLink | null)[]","argumentValue"],"sources":["../../src/core/cache.ts"],"sourcesContent":["import { type Factory, ParentCache } from '@isograph/react-disposable-state';\nimport type {\n NormalizationAstNodes,\n NormalizationInlineFragment,\n NormalizationLinkedField,\n NormalizationScalarField,\n} from './entrypoint';\nimport type {\n FragmentReference,\n UnknownTReadFromStore,\n Variables,\n VariableValue,\n} from './FragmentReference';\nimport {\n type DataId,\n type DataTypeValue,\n getLink,\n type IsographEnvironment,\n ROOT_ID,\n type StoreLink,\n type StoreRecord,\n type TypeName,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n getMutableStoreRecordProxy,\n type StoreLayerWithData,\n} from './optimisticProxy';\nimport type { ReaderLinkedField, ReaderScalarField } from './reader';\nimport { type Argument, type ArgumentValue, isArray, stableCopy } from './util';\n\nexport const TYPENAME_FIELD_NAME = '__typename';\n\nexport function getOrCreateItemInSuspenseCache<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n>(\n environment: IsographEnvironment,\n index: string,\n factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>,\n): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {\n if (environment.fragmentCache[index] == null) {\n environment.fragmentCache[index] = new ParentCache(factory);\n }\n\n return environment.fragmentCache[index];\n}\n\nexport type NetworkResponseScalarValue = string | number | boolean;\nexport type NetworkResponseValue =\n | NetworkResponseScalarValue\n | null\n | NetworkResponseObject\n | readonly (NetworkResponseObject | null)[]\n | readonly (NetworkResponseScalarValue | null)[];\n\nexport type NetworkResponseObject = {\n // N.B. undefined is here to support optional id's, but\n // undefined should not *actually* be present in the network response.\n readonly [index: string]: undefined | NetworkResponseValue;\n readonly id?: DataId;\n readonly __typename?: TypeName;\n};\n\nexport function normalizeData(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n normalizationAst: NormalizationAstNodes,\n networkResponse: NetworkResponseObject,\n variables: Variables,\n root: StoreLink,\n encounteredIds: EncounteredIds,\n): EncounteredIds {\n logMessage(environment, () => ({\n kind: 'AboutToNormalize',\n normalizationAst,\n networkResponse,\n variables,\n }));\n\n const newStoreRecord = getMutableStoreRecordProxy(storeLayer, root);\n\n normalizeDataIntoRecord(\n environment,\n storeLayer,\n normalizationAst,\n networkResponse,\n newStoreRecord,\n root,\n variables,\n encounteredIds,\n );\n\n return encounteredIds;\n}\n\nexport function subscribeToAnyChange(\n environment: IsographEnvironment,\n callback: () => void,\n): () => void {\n const subscription = {\n kind: 'AnyRecords',\n callback,\n } as const;\n environment.subscriptions.add(subscription);\n return () => environment.subscriptions.delete(subscription);\n}\n\nexport function subscribeToAnyChangesToRecord(\n environment: IsographEnvironment,\n recordLink: StoreLink,\n callback: () => void,\n): () => void {\n const subscription = {\n kind: 'AnyChangesToRecord',\n recordLink,\n callback,\n } as const;\n environment.subscriptions.add(subscription);\n return () => environment.subscriptions.delete(subscription);\n}\n\nexport function onNextChangeToRecord(\n environment: IsographEnvironment,\n recordLink: StoreLink,\n): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = subscribeToAnyChangesToRecord(\n environment,\n recordLink,\n () => {\n unsubscribe();\n resolve();\n },\n );\n });\n}\n\nexport type EncounteredIds = Map<TypeName, Set<DataId>>;\n/**\n * Mutate targetParentRecord according to the normalizationAst and networkResponseParentRecord.\n */\nfunction normalizeDataIntoRecord(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n normalizationAst: NormalizationAstNodes,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n let recordHasBeenUpdated = false;\n for (const normalizationNode of normalizationAst) {\n switch (normalizationNode.kind) {\n case 'Scalar': {\n const scalarFieldResultedInChange = normalizeScalarField(\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n variables,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || scalarFieldResultedInChange;\n break;\n }\n case 'Linked': {\n const linkedFieldResultedInChange = normalizeLinkedField(\n environment,\n storeLayer,\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || linkedFieldResultedInChange;\n break;\n }\n case 'InlineFragment': {\n const inlineFragmentResultedInChange = normalizeInlineFragment(\n environment,\n storeLayer,\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || inlineFragmentResultedInChange;\n break;\n }\n }\n }\n if (recordHasBeenUpdated) {\n let encounteredRecordsIds = insertEmptySetIfMissing(\n mutableEncounteredIds,\n targetParentRecordLink.__typename,\n );\n\n encounteredRecordsIds.add(targetParentRecordLink.__link);\n }\n return recordHasBeenUpdated;\n}\n\nexport function insertEmptySetIfMissing<K, V>(map: Map<K, Set<V>>, key: K) {\n let result = map.get(key);\n if (result === undefined) {\n result = new Set();\n map.set(key, result);\n }\n return result;\n}\n\ntype RecordHasBeenUpdated = boolean;\nfunction normalizeScalarField(\n astNode: NormalizationScalarField,\n networkResponseParentRecord: NetworkResponseObject,\n targetStoreRecord: StoreRecord,\n variables: Variables,\n): RecordHasBeenUpdated {\n const networkResponseKey = getNetworkResponseKey(astNode);\n const networkResponseData = networkResponseParentRecord[networkResponseKey];\n const parentRecordKey = getParentRecordKey(astNode, variables);\n const existingValue = targetStoreRecord[parentRecordKey];\n\n if (networkResponseData == null) {\n targetStoreRecord[parentRecordKey] = null;\n return existingValue === undefined || existingValue != null;\n }\n\n if (isScalarOrEmptyArray(networkResponseData)) {\n targetStoreRecord[parentRecordKey] = networkResponseData;\n return existingValue !== networkResponseData;\n } else {\n throw new Error('Unexpected object array when normalizing scalar');\n }\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeLinkedField(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationLinkedField,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n const networkResponseKey = getNetworkResponseKey(astNode);\n const networkResponseData = networkResponseParentRecord[networkResponseKey];\n const parentRecordKey = getParentRecordKey(astNode, variables);\n const existingValue = targetParentRecord[parentRecordKey];\n\n if (networkResponseData == null) {\n targetParentRecord[parentRecordKey] = null;\n return existingValue === undefined || existingValue != null;\n }\n\n if (\n isScalarOrEmptyArray(networkResponseData) &&\n !isNullOrEmptyArray(networkResponseData)\n ) {\n throw new Error(\n 'Unexpected scalar network response when normalizing a linked field',\n );\n }\n\n if (isArray(networkResponseData)) {\n // TODO check astNode.plural or the like\n const dataIds: (StoreLink | null)[] = [];\n for (let i = 0; i < networkResponseData.length; i++) {\n const networkResponseObject = networkResponseData[i];\n if (networkResponseObject == null) {\n dataIds.push(null);\n continue;\n }\n const newStoreRecordId = normalizeNetworkResponseObject(\n environment,\n storeLayer,\n astNode,\n networkResponseObject,\n targetParentRecordLink,\n variables,\n i,\n mutableEncounteredIds,\n );\n\n const __typename =\n astNode.concreteType ?? networkResponseObject[TYPENAME_FIELD_NAME];\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response when normalizing a linked field. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n dataIds.push({\n __link: newStoreRecordId,\n __typename,\n });\n }\n targetParentRecord[parentRecordKey] = dataIds;\n return !dataIdsAreTheSame(existingValue, dataIds);\n } else {\n const newStoreRecordId = normalizeNetworkResponseObject(\n environment,\n storeLayer,\n astNode,\n networkResponseData,\n targetParentRecordLink,\n variables,\n null,\n mutableEncounteredIds,\n );\n\n let __typename =\n astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response when normalizing a linked field. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n targetParentRecord[parentRecordKey] = {\n __link: newStoreRecordId,\n __typename,\n };\n\n const link = getLink(existingValue);\n return link?.__link !== newStoreRecordId || link.__typename !== __typename;\n }\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeInlineFragment(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationInlineFragment,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n const typeToRefineTo = astNode.type;\n if (networkResponseParentRecord[TYPENAME_FIELD_NAME] === typeToRefineTo) {\n const hasBeenModified = normalizeDataIntoRecord(\n environment,\n storeLayer,\n astNode.selections,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n return hasBeenModified;\n }\n return false;\n}\n\nfunction dataIdsAreTheSame(\n existingValue: DataTypeValue,\n newDataIds: (StoreLink | null)[],\n): boolean {\n if (isArray(existingValue)) {\n if (newDataIds.length !== existingValue.length) {\n return false;\n }\n for (let i = 0; i < newDataIds.length; i++) {\n const maybeLink = getLink(existingValue[i]);\n if (\n newDataIds[i]?.__link !== maybeLink?.__link ||\n newDataIds[i]?.__typename !== maybeLink?.__typename\n ) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction normalizeNetworkResponseObject(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationLinkedField,\n networkResponseData: NetworkResponseObject,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n index: number | null,\n mutableEncounteredIds: EncounteredIds,\n): DataId /* The id of the modified or newly created item */ {\n const newStoreRecordId = getDataIdOfNetworkResponse(\n targetParentRecordLink,\n networkResponseData,\n astNode,\n variables,\n index,\n );\n const __typename =\n astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response object. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const link = { __link: newStoreRecordId, __typename };\n const newStoreRecord = getMutableStoreRecordProxy(storeLayer, link);\n\n normalizeDataIntoRecord(\n environment,\n storeLayer,\n astNode.selections,\n networkResponseData,\n newStoreRecord,\n link,\n variables,\n mutableEncounteredIds,\n );\n\n return newStoreRecordId;\n}\n\nfunction isScalarOrEmptyArray(\n data: NetworkResponseValue,\n): data is\n | NetworkResponseScalarValue\n | readonly (NetworkResponseScalarValue | null)[] {\n // N.B. empty arrays count as empty arrays of scalar fields.\n if (isArray(data)) {\n return data.every((x) => isScalarOrEmptyArray(x));\n }\n const isScalarValue =\n data == null ||\n typeof data === 'string' ||\n typeof data === 'number' ||\n typeof data === 'boolean';\n return isScalarValue;\n}\n\nfunction isNullOrEmptyArray(\n data: unknown,\n): data is readonly never[] | null[] | null {\n if (isArray(data)) {\n if (data.length === 0) {\n return true;\n }\n return data.every((x) => isNullOrEmptyArray(x));\n }\n\n return data == null;\n}\n\nexport function getParentRecordKey(\n astNode:\n | NormalizationLinkedField\n | NormalizationScalarField\n | ReaderLinkedField\n | ReaderScalarField,\n variables: Variables,\n): string {\n let parentRecordKey = astNode.fieldName;\n const fieldParameters = astNode.arguments;\n if (fieldParameters != null) {\n for (const fieldParameter of fieldParameters) {\n parentRecordKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n }\n }\n\n return parentRecordKey;\n}\n\nfunction getStoreKeyChunkForArgumentValue(\n argumentValue: ArgumentValue,\n variables: Variables,\n): VariableValue {\n switch (argumentValue.kind) {\n case 'Object': {\n return Object.fromEntries(\n argumentValue.value.map(([argumentName, argumentValue]) => {\n return [\n argumentName,\n // substitute variables\n getStoreKeyChunkForArgumentValue(argumentValue, variables),\n ];\n }),\n );\n }\n case 'Literal': {\n return argumentValue.value;\n }\n case 'Variable': {\n return variables[argumentValue.name] ?? 'null';\n }\n case 'String': {\n return argumentValue.value;\n }\n case 'Enum': {\n return argumentValue.value;\n }\n }\n}\n\nfunction getStoreKeyChunkForArgument(argument: Argument, variables: Variables) {\n const [argumentName, argumentValue] = argument;\n let chunk = getStoreKeyChunkForArgumentValue(argumentValue, variables);\n\n if (typeof chunk === 'object') {\n chunk = JSON.stringify(stableCopy(chunk));\n }\n\n return `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${chunk}`;\n}\n\nfunction getNetworkResponseKey(\n astNode: NormalizationLinkedField | NormalizationScalarField,\n): string {\n let networkResponseKey = astNode.fieldName;\n const fieldParameters = astNode.arguments;\n\n if (fieldParameters != null) {\n for (const [argumentName, argumentValue] of fieldParameters) {\n let argumentValueChunk = getArgumentValueChunk(argumentValue);\n networkResponseKey += `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${argumentValueChunk}`;\n }\n }\n\n return networkResponseKey;\n}\n\nfunction getArgumentValueChunk(argumentValue: ArgumentValue): string {\n switch (argumentValue.kind) {\n case 'Object': {\n return (\n 'o_' +\n argumentValue.value\n .map(([argumentName, argumentValue]) => {\n return (\n argumentName +\n THIRD_SPLIT_KEY +\n getArgumentValueChunk(argumentValue)\n );\n })\n .join('_') +\n '_c'\n );\n }\n case 'Literal': {\n return 'l_' + argumentValue.value;\n }\n case 'Variable': {\n return 'v_' + argumentValue.name;\n }\n case 'String': {\n // replace all non-word characters (alphanumeric & underscore) with underscores\n return 's_' + argumentValue.value.replaceAll(/\\W/g, '_');\n }\n case 'Enum': {\n return 'e_' + argumentValue.value;\n }\n }\n}\n\n// an alias might be pullRequests____first___first____after___cursor\nexport const FIRST_SPLIT_KEY = '____';\nexport const SECOND_SPLIT_KEY = '___';\nexport const THIRD_SPLIT_KEY = '__';\n\n// Returns a key to look up an item in the store\nfunction getDataIdOfNetworkResponse(\n parentRecordLink: StoreLink,\n dataToNormalize: NetworkResponseObject,\n astNode: NormalizationLinkedField,\n variables: Variables,\n index: number | null,\n): DataId {\n // If we are dealing with nested Query, use __ROOT as id\n // TODO do not hard code this value here\n if (astNode.concreteType === 'Query') {\n return ROOT_ID;\n }\n\n // Check whether the dataToNormalize has an id field. If so, that is the key.\n // If not, we construct an id from the parentRecordId and the field parameters.\n\n const dataId = dataToNormalize.id;\n if (dataId != null) {\n return dataId;\n }\n\n let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;\n if (index != null) {\n storeKey += `.${index}`;\n }\n\n const fieldParameters = astNode.arguments;\n if (fieldParameters == null) {\n return storeKey;\n }\n\n for (const fieldParameter of fieldParameters) {\n storeKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n }\n return storeKey;\n}\n"],"mappings":";;;;;;;AA+BA,MAAa,sBAAsB;AAEnC,SAAgB,+BAId,aACA,OACA,SACmE;AACnE,KAAI,YAAY,cAAc,UAAU,KACtC,aAAY,cAAc,SAAS,IAAI,YAAY,QAAQ;AAG7D,QAAO,YAAY,cAAc;;AAmBnC,SAAgB,cACd,aACA,YACA,kBACA,iBACA,WACA,MACA,gBACgB;AAChB,YAAW,oBAAoB;EAC7B,MAAM;EACN;EACA;EACA;EACD,EAAE;AAIH,yBACE,aACA,YACA,kBACA,iBANqB,2BAA2B,YAAY,KAAK,EAQjE,MACA,WACA,eACD;AAED,QAAO;;AAGT,SAAgB,qBACd,aACA,UACY;CACZ,MAAM,eAAe;EACnB,MAAM;EACN;EACD;AACD,aAAY,cAAc,IAAI,aAAa;AAC3C,cAAa,YAAY,cAAc,OAAO,aAAa;;AAG7D,SAAgB,8BACd,aACA,YACA,UACY;CACZ,MAAM,eAAe;EACnB,MAAM;EACN;EACA;EACD;AACD,aAAY,cAAc,IAAI,aAAa;AAC3C,cAAa,YAAY,cAAc,OAAO,aAAa;;AAG7D,SAAgB,qBACd,aACA,YACe;AACf,QAAO,IAAI,SAAS,YAAY;EAC9B,MAAM,cAAc,8BAClB,aACA,kBACM;AACJ,gBAAa;AACb,YAAS;IAEZ;GACD;;;;;AAOJ,SAAS,wBACP,aACA,YACA,kBACA,6BACA,oBACA,wBACA,WACA,uBACsB;CACtB,IAAI,uBAAuB;AAC3B,MAAK,MAAM,qBAAqB,iBAC9B,SAAQ,kBAAkB,MAA1B;EACE,KAAK,UAAU;GACb,MAAM,8BAA8B,qBAClC,mBACA,6BACA,oBACA,UACD;AACD,0BACE,wBAAwB;AAC1B;;EAEF,KAAK,UAAU;GACb,MAAM,8BAA8B,qBAClC,aACA,YACA,mBACA,6BACA,oBACA,wBACA,WACA,sBACD;AACD,0BACE,wBAAwB;AAC1B;;EAEF,KAAK,kBAAkB;GACrB,MAAM,iCAAiC,wBACrC,aACA,YACA,mBACA,6BACA,oBACA,wBACA,WACA,sBACD;AACD,0BACE,wBAAwB;AAC1B;;;AAIN,KAAI,qBAMF,CAL4B,wBAC1B,uBACA,uBAAuB,WACxB,CAEqB,IAAI,uBAAuB,OAAO;AAE1D,QAAO;;AAGT,SAAgB,wBAA8B,KAAqB,KAAQ;CACzE,IAAI,SAAS,IAAI,IAAI,IAAI;AACzB,KAAI,WAAW,QAAW;AACxB,2BAAS,IAAI,KAAK;AAClB,MAAI,IAAI,KAAK,OAAO;;AAEtB,QAAO;;AAIT,SAAS,qBACP,SACA,6BACA,mBACA,WACsB;CAEtB,MAAM,sBAAsB,4BADD,sBAAsB,QAAQ;CAEzD,MAAM,kBAAkB,mBAAmB,SAAS,UAAU;CAC9D,MAAM,gBAAgB,kBAAkB;AAExC,KAAI,uBAAuB,MAAM;AAC/B,oBAAkB,mBAAmB;AACrC,SAAO,kBAAkB,UAAa,iBAAiB;;AAGzD,KAAI,qBAAqB,oBAAoB,EAAE;AAC7C,oBAAkB,mBAAmB;AACrC,SAAO,kBAAkB;OAEzB,OAAM,IAAI,MAAM,kDAAkD;;;;;AAOtE,SAAS,qBACP,aACA,YACA,SACA,6BACA,oBACA,wBACA,WACA,uBACsB;CAEtB,MAAM,sBAAsB,4BADD,sBAAsB,QAAQ;CAEzD,MAAM,kBAAkB,mBAAmB,SAAS,UAAU;CAC9D,MAAM,gBAAgB,mBAAmB;AAEzC,KAAI,uBAAuB,MAAM;AAC/B,qBAAmB,mBAAmB;AACtC,SAAO,kBAAkB,UAAa,iBAAiB;;AAGzD,KACE,qBAAqB,oBAAoB,IACzC,CAAC,mBAAmB,oBAAoB,CAExC,OAAM,IAAI,MACR,qEACD;AAGH,KAAI,QAAQ,oBAAoB,EAAE;EAEhC,MAAMA,UAAgC,EAAE;AACxC,OAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;GACnD,MAAM,wBAAwB,oBAAoB;AAClD,OAAI,yBAAyB,MAAM;AACjC,YAAQ,KAAK,KAAK;AAClB;;GAEF,MAAM,mBAAmB,+BACvB,aACA,YACA,SACA,uBACA,wBACA,WACA,GACA,sBACD;GAED,MAAM,aACJ,QAAQ,gBAAgB,sBAAsB;AAChD,OAAI,cAAc,KAChB,OAAM,IAAI,MACR,8HAED;AAEH,WAAQ,KAAK;IACX,QAAQ;IACR;IACD,CAAC;;AAEJ,qBAAmB,mBAAmB;AACtC,SAAO,CAAC,kBAAkB,eAAe,QAAQ;QAC5C;EACL,MAAM,mBAAmB,+BACvB,aACA,YACA,SACA,qBACA,wBACA,WACA,MACA,sBACD;EAED,IAAI,aACF,QAAQ,gBAAgB,oBAAoB;AAE9C,MAAI,cAAc,KAChB,OAAM,IAAI,MACR,8HAED;AAGH,qBAAmB,mBAAmB;GACpC,QAAQ;GACR;GACD;EAED,MAAM,OAAO,QAAQ,cAAc;AACnC,SAAO,MAAM,WAAW,oBAAoB,KAAK,eAAe;;;;;;AAOpE,SAAS,wBACP,aACA,YACA,SACA,6BACA,oBACA,wBACA,WACA,uBACsB;CACtB,MAAM,iBAAiB,QAAQ;AAC/B,KAAI,4BAA4B,yBAAyB,eAWvD,QAVwB,wBACtB,aACA,YACA,QAAQ,YACR,6BACA,oBACA,wBACA,WACA,sBACD;AAGH,QAAO;;AAGT,SAAS,kBACP,eACA,YACS;AACT,KAAI,QAAQ,cAAc,EAAE;AAC1B,MAAI,WAAW,WAAW,cAAc,OACtC,QAAO;AAET,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;GAC1C,MAAM,YAAY,QAAQ,cAAc,GAAG;AAC3C,OACE,WAAW,IAAI,WAAW,WAAW,UACrC,WAAW,IAAI,eAAe,WAAW,WAEzC,QAAO;;AAGX,SAAO;OAEP,QAAO;;AAIX,SAAS,+BACP,aACA,YACA,SACA,qBACA,wBACA,WACA,OACA,uBAC2D;CAC3D,MAAM,mBAAmB,2BACvB,wBACA,qBACA,SACA,WACA,MACD;CACD,MAAM,aACJ,QAAQ,gBAAgB,oBAAoB;AAE9C,KAAI,cAAc,KAChB,OAAM,IAAI,MACR,qGAED;CAGH,MAAM,OAAO;EAAE,QAAQ;EAAkB;EAAY;CACrD,MAAM,iBAAiB,2BAA2B,YAAY,KAAK;AAEnE,yBACE,aACA,YACA,QAAQ,YACR,qBACA,gBACA,MACA,WACA,sBACD;AAED,QAAO;;AAGT,SAAS,qBACP,MAGiD;AAEjD,KAAI,QAAQ,KAAK,CACf,QAAO,KAAK,OAAO,MAAM,qBAAqB,EAAE,CAAC;AAOnD,QAJE,QAAQ,QACR,OAAO,SAAS,YAChB,OAAO,SAAS,YAChB,OAAO,SAAS;;AAIpB,SAAS,mBACP,MAC0C;AAC1C,KAAI,QAAQ,KAAK,EAAE;AACjB,MAAI,KAAK,WAAW,EAClB,QAAO;AAET,SAAO,KAAK,OAAO,MAAM,mBAAmB,EAAE,CAAC;;AAGjD,QAAO,QAAQ;;AAGjB,SAAgB,mBACd,SAKA,WACQ;CACR,IAAI,kBAAkB,QAAQ;CAC9B,MAAM,kBAAkB,QAAQ;AAChC,KAAI,mBAAmB,KACrB,MAAK,MAAM,kBAAkB,gBAC3B,oBAAmB,4BAA4B,gBAAgB,UAAU;AAI7E,QAAO;;AAGT,SAAS,iCACP,eACA,WACe;AACf,SAAQ,cAAc,MAAtB;EACE,KAAK,SACH,QAAO,OAAO,YACZ,cAAc,MAAM,KAAK,CAAC,cAAcC,qBAAmB;AACzD,UAAO,CACL,cAEA,iCAAiCA,iBAAe,UAAU,CAC3D;IACD,CACH;EAEH,KAAK,UACH,QAAO,cAAc;EAEvB,KAAK,WACH,QAAO,UAAU,cAAc,SAAS;EAE1C,KAAK,SACH,QAAO,cAAc;EAEvB,KAAK,OACH,QAAO,cAAc;;;AAK3B,SAAS,4BAA4B,UAAoB,WAAsB;CAC7E,MAAM,CAAC,cAAc,iBAAiB;CACtC,IAAI,QAAQ,iCAAiC,eAAe,UAAU;AAEtE,KAAI,OAAO,UAAU,SACnB,SAAQ,KAAK,UAAU,WAAW,MAAM,CAAC;AAG3C,QAAO,GAAG,kBAAkB,eAAe,mBAAmB;;AAGhE,SAAS,sBACP,SACQ;CACR,IAAI,qBAAqB,QAAQ;CACjC,MAAM,kBAAkB,QAAQ;AAEhC,KAAI,mBAAmB,KACrB,MAAK,MAAM,CAAC,cAAc,kBAAkB,iBAAiB;EAC3D,IAAI,qBAAqB,sBAAsB,cAAc;AAC7D,wBAAsB,GAAG,kBAAkB,eAAe,mBAAmB;;AAIjF,QAAO;;AAGT,SAAS,sBAAsB,eAAsC;AACnE,SAAQ,cAAc,MAAtB;EACE,KAAK,SACH,QACE,OACA,cAAc,MACX,KAAK,CAAC,cAAcA,qBAAmB;AACtC,UACE,eACA,kBACA,sBAAsBA,gBAAc;IAEtC,CACD,KAAK,IAAI,GACZ;EAGJ,KAAK,UACH,QAAO,OAAO,cAAc;EAE9B,KAAK,WACH,QAAO,OAAO,cAAc;EAE9B,KAAK,SAEH,QAAO,OAAO,cAAc,MAAM,WAAW,OAAO,IAAI;EAE1D,KAAK,OACH,QAAO,OAAO,cAAc;;;AAMlC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,kBAAkB;AAG/B,SAAS,2BACP,kBACA,iBACA,SACA,WACA,OACQ;AAGR,KAAI,QAAQ,iBAAiB,QAC3B,QAAO;CAMT,MAAM,SAAS,gBAAgB;AAC/B,KAAI,UAAU,KACZ,QAAO;CAGT,IAAI,WAAW,GAAG,iBAAiB,WAAW,GAAG,iBAAiB,OAAO,GAAG,QAAQ;AACpF,KAAI,SAAS,KACX,aAAY,IAAI;CAGlB,MAAM,kBAAkB,QAAQ;AAChC,KAAI,mBAAmB,KACrB,QAAO;AAGT,MAAK,MAAM,kBAAkB,gBAC3B,aAAY,4BAA4B,gBAAgB,UAAU;AAEpE,QAAO"}
|
|
1
|
+
{"version":3,"file":"cache.mjs","names":[],"sources":["../../src/core/cache.ts"],"sourcesContent":["import { type Factory, ParentCache } from '@isograph/react-disposable-state';\nimport type {\n NormalizationAstNodes,\n NormalizationInlineFragment,\n NormalizationLinkedField,\n NormalizationScalarField,\n} from './entrypoint';\nimport type {\n FragmentReference,\n UnknownTReadFromStore,\n Variables,\n VariableValue,\n} from './FragmentReference';\nimport {\n type DataId,\n type DataTypeValueLinked,\n getLink,\n type IsographEnvironment,\n ROOT_ID,\n type StoreLink,\n type StoreRecord,\n type TypeName,\n} from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport {\n getMutableStoreRecordProxy,\n type StoreLayerWithData,\n} from './optimisticProxy';\nimport type { ReaderLinkedField, ReaderScalarField } from './reader';\nimport { type Argument, type ArgumentValue, isArray, stableCopy } from './util';\n\nexport const TYPENAME_FIELD_NAME = '__typename';\n\nexport function getOrCreateItemInSuspenseCache<\n TReadFromStore extends UnknownTReadFromStore,\n TClientFieldValue,\n>(\n environment: IsographEnvironment,\n index: string,\n factory: Factory<FragmentReference<TReadFromStore, TClientFieldValue>>,\n): ParentCache<FragmentReference<TReadFromStore, TClientFieldValue>> {\n if (environment.fragmentCache[index] == null) {\n environment.fragmentCache[index] = new ParentCache(factory);\n }\n\n return environment.fragmentCache[index];\n}\n\nexport type NetworkResponsePlural<T> =\n | null\n | T\n | readonly T[]\n | readonly (null | T)[];\nexport type NetworkResponseScalarValue = string | number | boolean | unknown;\n\nexport type NetworkResponseValue =\n | NetworkResponsePlural<NetworkResponseScalarValue>\n | NetworkResponsePlural<NetworkResponseObject>;\n\nexport type NetworkResponseObject = {\n // N.B. undefined is here to support optional id's, but\n // undefined should not *actually* be present in the network response.\n readonly [key: ScalarNetworkResponseKey]:\n | undefined\n | NetworkResponsePlural<NetworkResponseScalarValue>;\n readonly [key: LinkedNetworkResponseKey]:\n | undefined\n | NetworkResponsePlural<NetworkResponseObject>;\n readonly [key: NetworkResponseKey]:\n | undefined\n | NetworkResponsePlural<NetworkResponseScalarValue>\n | NetworkResponsePlural<NetworkResponseObject>;\n readonly id?: DataId;\n readonly __typename?: TypeName;\n};\n\nexport function normalizeData(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n normalizationAst: NormalizationAstNodes,\n networkResponse: NetworkResponseObject,\n variables: Variables,\n root: StoreLink,\n encounteredIds: EncounteredIds,\n): EncounteredIds {\n logMessage(environment, () => ({\n kind: 'AboutToNormalize',\n normalizationAst,\n networkResponse,\n variables,\n }));\n\n const newStoreRecord = getMutableStoreRecordProxy(storeLayer, root);\n\n normalizeDataIntoRecord(\n environment,\n storeLayer,\n normalizationAst,\n networkResponse,\n newStoreRecord,\n root,\n variables,\n encounteredIds,\n );\n\n return encounteredIds;\n}\n\nexport function subscribeToAnyChange(\n environment: IsographEnvironment,\n callback: () => void,\n): () => void {\n const subscription = {\n kind: 'AnyRecords',\n callback,\n } as const;\n environment.subscriptions.add(subscription);\n return () => environment.subscriptions.delete(subscription);\n}\n\nexport function subscribeToAnyChangesToRecord(\n environment: IsographEnvironment,\n recordLink: StoreLink,\n callback: () => void,\n): () => void {\n const subscription = {\n kind: 'AnyChangesToRecord',\n recordLink,\n callback,\n } as const;\n environment.subscriptions.add(subscription);\n return () => environment.subscriptions.delete(subscription);\n}\n\nexport function onNextChangeToRecord(\n environment: IsographEnvironment,\n recordLink: StoreLink,\n): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = subscribeToAnyChangesToRecord(\n environment,\n recordLink,\n () => {\n unsubscribe();\n resolve();\n },\n );\n });\n}\n\nexport type EncounteredIds = Map<TypeName, Set<DataId>>;\n/**\n * Mutate targetParentRecord according to the normalizationAst and networkResponseParentRecord.\n */\nfunction normalizeDataIntoRecord(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n normalizationAst: NormalizationAstNodes,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n let recordHasBeenUpdated = false;\n for (const normalizationNode of normalizationAst) {\n switch (normalizationNode.kind) {\n case 'Scalar': {\n const scalarFieldResultedInChange = normalizeScalarField(\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n variables,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || scalarFieldResultedInChange;\n break;\n }\n case 'Linked': {\n const linkedFieldResultedInChange = normalizeLinkedField(\n environment,\n storeLayer,\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || linkedFieldResultedInChange;\n break;\n }\n case 'InlineFragment': {\n const inlineFragmentResultedInChange = normalizeInlineFragment(\n environment,\n storeLayer,\n normalizationNode,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n recordHasBeenUpdated =\n recordHasBeenUpdated || inlineFragmentResultedInChange;\n break;\n }\n }\n }\n if (recordHasBeenUpdated) {\n let encounteredRecordsIds = insertEmptySetIfMissing(\n mutableEncounteredIds,\n targetParentRecordLink.__typename,\n );\n\n encounteredRecordsIds.add(targetParentRecordLink.__link);\n }\n return recordHasBeenUpdated;\n}\n\nexport function insertEmptySetIfMissing<K, V>(map: Map<K, Set<V>>, key: K) {\n let result = map.get(key);\n if (result === undefined) {\n result = new Set();\n map.set(key, result);\n }\n return result;\n}\n\ntype RecordHasBeenUpdated = boolean;\nfunction normalizeScalarField(\n astNode: NormalizationScalarField,\n networkResponseParentRecord: NetworkResponseObject,\n targetStoreRecord: StoreRecord,\n variables: Variables,\n): RecordHasBeenUpdated {\n const networkResponseKey = getNetworkResponseKey(astNode);\n const networkResponseData = networkResponseParentRecord[networkResponseKey];\n const parentRecordKey = getParentRecordKey(astNode, variables);\n const existingValue = targetStoreRecord[parentRecordKey];\n\n if (networkResponseData == null) {\n targetStoreRecord[parentRecordKey] = null;\n return existingValue === undefined || existingValue != null;\n }\n\n targetStoreRecord[parentRecordKey] = networkResponseData;\n return existingValue !== networkResponseData;\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeLinkedField(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationLinkedField,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n const networkResponseKey = getNetworkResponseKey(astNode);\n const networkResponseData = networkResponseParentRecord[networkResponseKey];\n const parentRecordKey = getParentRecordKey(astNode, variables);\n const existingValue = targetParentRecord[parentRecordKey];\n\n if (networkResponseData == null) {\n targetParentRecord[parentRecordKey] = null;\n return existingValue === undefined || existingValue != null;\n }\n\n if (isArray(networkResponseData)) {\n // TODO check astNode.plural or the like\n const dataIds: (StoreLink | null)[] = [];\n for (let i = 0; i < networkResponseData.length; i++) {\n const networkResponseObject = networkResponseData[i];\n if (networkResponseObject == null) {\n dataIds.push(null);\n continue;\n }\n const newStoreRecordId = normalizeNetworkResponseObject(\n environment,\n storeLayer,\n astNode,\n networkResponseObject,\n targetParentRecordLink,\n variables,\n i,\n mutableEncounteredIds,\n );\n\n const __typename =\n astNode.concreteType ?? networkResponseObject[TYPENAME_FIELD_NAME];\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response when normalizing a linked field. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n dataIds.push({\n __link: newStoreRecordId,\n __typename,\n });\n }\n targetParentRecord[parentRecordKey] = dataIds;\n return !dataIdsAreTheSame(existingValue, dataIds);\n } else {\n const newStoreRecordId = normalizeNetworkResponseObject(\n environment,\n storeLayer,\n astNode,\n networkResponseData,\n targetParentRecordLink,\n variables,\n null,\n mutableEncounteredIds,\n );\n\n let __typename =\n astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response when normalizing a linked field. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n targetParentRecord[parentRecordKey] = {\n __link: newStoreRecordId,\n __typename,\n };\n\n const link = getLink(existingValue);\n return link?.__link !== newStoreRecordId || link.__typename !== __typename;\n }\n}\n\n/**\n * Mutate targetParentRecord with a given linked field ast node.\n */\nfunction normalizeInlineFragment(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationInlineFragment,\n networkResponseParentRecord: NetworkResponseObject,\n targetParentRecord: StoreRecord,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n mutableEncounteredIds: EncounteredIds,\n): RecordHasBeenUpdated {\n const typeToRefineTo = astNode.type;\n if (networkResponseParentRecord[TYPENAME_FIELD_NAME] === typeToRefineTo) {\n const hasBeenModified = normalizeDataIntoRecord(\n environment,\n storeLayer,\n astNode.selections,\n networkResponseParentRecord,\n targetParentRecord,\n targetParentRecordLink,\n variables,\n mutableEncounteredIds,\n );\n return hasBeenModified;\n }\n return false;\n}\n\nfunction dataIdsAreTheSame(\n existingValue: DataTypeValueLinked,\n newDataIds: (StoreLink | null)[],\n): boolean {\n if (isArray(existingValue)) {\n if (newDataIds.length !== existingValue.length) {\n return false;\n }\n for (let i = 0; i < newDataIds.length; i++) {\n const maybeLink = getLink(existingValue[i]);\n if (\n newDataIds[i]?.__link !== maybeLink?.__link ||\n newDataIds[i]?.__typename !== maybeLink?.__typename\n ) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction normalizeNetworkResponseObject(\n environment: IsographEnvironment,\n storeLayer: StoreLayerWithData,\n astNode: NormalizationLinkedField,\n networkResponseData: NetworkResponseObject,\n targetParentRecordLink: StoreLink,\n variables: Variables,\n index: number | null,\n mutableEncounteredIds: EncounteredIds,\n): DataId /* The id of the modified or newly created item */ {\n const newStoreRecordId = getDataIdOfNetworkResponse(\n targetParentRecordLink,\n networkResponseData,\n astNode,\n variables,\n index,\n );\n const __typename =\n astNode.concreteType ?? networkResponseData[TYPENAME_FIELD_NAME];\n\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response object. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const link = { __link: newStoreRecordId, __typename };\n const newStoreRecord = getMutableStoreRecordProxy(storeLayer, link);\n\n normalizeDataIntoRecord(\n environment,\n storeLayer,\n astNode.selections,\n networkResponseData,\n newStoreRecord,\n link,\n variables,\n mutableEncounteredIds,\n );\n\n return newStoreRecordId;\n}\n\nexport type ParentRecordKey = string;\n\n/**\n * these don't actually start with the different prefixes, but they let\n * us use multiple indexes, e.g.\n * {\n * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string} `]: ...\n * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string} `]: ...\n * }\n */\nexport type LinkedParentRecordKey =\n `NOT_AN_ACTUAL_TYPE_LinkedParentRecordKey_${string}`;\nexport type ScalarParentRecordKey =\n `NOT_AN_ACTUAL_TYPE_ScalarParentRecordKey_${string}`;\n\nexport function getParentRecordKey(\n astNode: NormalizationLinkedField | ReaderLinkedField,\n variables: Variables,\n): LinkedParentRecordKey;\nexport function getParentRecordKey(\n astNode: NormalizationScalarField | ReaderScalarField,\n variables: Variables,\n): ScalarParentRecordKey;\nexport function getParentRecordKey(\n astNode:\n | NormalizationLinkedField\n | NormalizationScalarField\n | ReaderLinkedField\n | ReaderScalarField,\n variables: Variables,\n): ParentRecordKey {\n let parentRecordKey = astNode.fieldName;\n const fieldParameters = astNode.arguments;\n if (fieldParameters != null) {\n for (const fieldParameter of fieldParameters) {\n parentRecordKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n }\n }\n\n return parentRecordKey;\n}\n\nfunction getStoreKeyChunkForArgumentValue(\n argumentValue: ArgumentValue,\n variables: Variables,\n): VariableValue {\n switch (argumentValue.kind) {\n case 'Object': {\n return Object.fromEntries(\n argumentValue.value.map(([argumentName, argumentValue]) => {\n return [\n argumentName,\n // substitute variables\n getStoreKeyChunkForArgumentValue(argumentValue, variables),\n ];\n }),\n );\n }\n case 'Literal': {\n return argumentValue.value;\n }\n case 'Variable': {\n return variables[argumentValue.name] ?? 'null';\n }\n case 'String': {\n return argumentValue.value;\n }\n case 'Enum': {\n return argumentValue.value;\n }\n }\n}\n\nfunction getStoreKeyChunkForArgument(argument: Argument, variables: Variables) {\n const [argumentName, argumentValue] = argument;\n let chunk = getStoreKeyChunkForArgumentValue(argumentValue, variables);\n\n if (typeof chunk === 'object') {\n chunk = JSON.stringify(stableCopy(chunk));\n }\n\n return `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${chunk}`;\n}\n\nexport type NetworkResponseKey = string;\n\n/**\n * these don't actually start with the different prefixes, but they let\n * us use multiple indexes, e.g.\n * {\n * readonly [key: `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string} `]: ...\n * readonly [key: `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string} `]: ...\n * }\n */\nexport type LinkedNetworkResponseKey =\n `NOT_AN_ACTUAL_TYPE_LinkedNetworkResponseKey_${string}`;\nexport type ScalarNetworkResponseKey =\n `NOT_AN_ACTUAL_TYPE_ScalarNetworkResponseKey_${string}`;\n\nfunction getNetworkResponseKey(\n astNode: NormalizationLinkedField,\n): LinkedNetworkResponseKey;\nfunction getNetworkResponseKey(\n astNode: NormalizationScalarField,\n): ScalarNetworkResponseKey;\nfunction getNetworkResponseKey(\n astNode: NormalizationLinkedField | NormalizationScalarField,\n): NetworkResponseKey {\n let networkResponseKey = astNode.fieldName;\n const fieldParameters = astNode.arguments;\n\n if (fieldParameters != null) {\n for (const [argumentName, argumentValue] of fieldParameters) {\n let argumentValueChunk = getArgumentValueChunk(argumentValue);\n networkResponseKey += `${FIRST_SPLIT_KEY}${argumentName}${SECOND_SPLIT_KEY}${argumentValueChunk}`;\n }\n }\n\n return networkResponseKey;\n}\n\nfunction getArgumentValueChunk(argumentValue: ArgumentValue): string {\n switch (argumentValue.kind) {\n case 'Object': {\n return (\n 'o_' +\n argumentValue.value\n .map(([argumentName, argumentValue]) => {\n return (\n argumentName +\n THIRD_SPLIT_KEY +\n getArgumentValueChunk(argumentValue)\n );\n })\n .join('_') +\n '_c'\n );\n }\n case 'Literal': {\n return 'l_' + argumentValue.value;\n }\n case 'Variable': {\n return 'v_' + argumentValue.name;\n }\n case 'String': {\n // replace all non-word characters (alphanumeric & underscore) with underscores\n return 's_' + argumentValue.value.replaceAll(/\\W/g, '_');\n }\n case 'Enum': {\n return 'e_' + argumentValue.value;\n }\n }\n}\n\n// an alias might be pullRequests____first___first____after___cursor\nexport const FIRST_SPLIT_KEY = '____';\nexport const SECOND_SPLIT_KEY = '___';\nexport const THIRD_SPLIT_KEY = '__';\n\n// Returns a key to look up an item in the store\nfunction getDataIdOfNetworkResponse(\n parentRecordLink: StoreLink,\n dataToNormalize: NetworkResponseObject,\n astNode: NormalizationLinkedField,\n variables: Variables,\n index: number | null,\n): DataId {\n const __typename =\n astNode.concreteType ?? dataToNormalize[TYPENAME_FIELD_NAME];\n if (__typename == null) {\n throw new Error(\n 'Unexpected missing __typename in network response when normalizing a linked field. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n // If we are dealing with nested Query, use __ROOT as id\n // TODO do not hard code this value here\n if (__typename === 'Query') {\n return ROOT_ID;\n }\n\n // Check whether the dataToNormalize has an id field. If so, that is the key.\n // If not, we construct an id from the parentRecordId and the field parameters.\n\n const dataId = dataToNormalize.id;\n if (dataId != null) {\n return dataId;\n }\n\n let storeKey = `${parentRecordLink.__typename}:${parentRecordLink.__link}.${astNode.fieldName}`;\n if (index != null) {\n storeKey += `.${index}`;\n }\n\n const fieldParameters = astNode.arguments;\n if (fieldParameters == null) {\n return storeKey;\n }\n\n for (const fieldParameter of fieldParameters) {\n storeKey += getStoreKeyChunkForArgument(fieldParameter, variables);\n }\n return storeKey;\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const require_IsographEnvironment = require('./IsographEnvironment.
|
|
2
|
-
const require_logging = require('./logging.
|
|
3
|
-
const require_optimisticProxy = require('./optimisticProxy.
|
|
4
|
-
const require_cache = require('./cache.
|
|
1
|
+
const require_IsographEnvironment = require('./IsographEnvironment.cjs');
|
|
2
|
+
const require_logging = require('./logging.cjs');
|
|
3
|
+
const require_optimisticProxy = require('./optimisticProxy.cjs');
|
|
4
|
+
const require_cache = require('./cache.cjs');
|
|
5
5
|
|
|
6
6
|
//#region src/core/check.ts
|
|
7
7
|
const DEFAULT_SHOULD_FETCH_VALUE = "IfNecessary";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { IsographEnvironment, StoreLink } from "./IsographEnvironment.
|
|
2
|
-
import { Variables } from "./FragmentReference.
|
|
3
|
-
import { NormalizationAstNodes } from "./entrypoint.
|
|
1
|
+
import { IsographEnvironment, StoreLink } from "./IsographEnvironment.cjs";
|
|
2
|
+
import { Variables } from "./FragmentReference.cjs";
|
|
3
|
+
import { NormalizationAstNodes } from "./entrypoint.cjs";
|
|
4
4
|
|
|
5
5
|
//#region src/core/check.d.ts
|
|
6
6
|
type ShouldFetch = RequiredShouldFetch | 'IfNecessary';
|
|
@@ -25,4 +25,4 @@ type CheckResult = {
|
|
|
25
25
|
declare function check(environment: IsographEnvironment, normalizationAst: NormalizationAstNodes, variables: Variables, root: StoreLink): CheckResult;
|
|
26
26
|
//#endregion
|
|
27
27
|
export { CheckResult, FetchOptions, RequiredFetchOptions, RequiredShouldFetch, ShouldFetch, check };
|
|
28
|
-
//# sourceMappingURL=check.d.
|
|
28
|
+
//# sourceMappingURL=check.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.cts","names":[],"sources":["../../src/core/check.ts"],"mappings":";;;;;KAYY,WAAA,GAAc,mBAAA;AAAA,KACd,mBAAA;AAAA,KAIP,kBAAA;EACH,UAAA,IAAc,IAAA,EAAM,YAAA;EACpB,OAAA;AAAA;AAAA,UAGe,YAAA,yCACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,GAAc,WAAA;EACd,yBAAA,GAA4B,gBAAA;AAAA;AAAA,UAGb,oBAAA,uBACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,EAAa,mBAAA;AAAA;AAAA,KAGH,WAAA;EAEN,IAAA;AAAA;EAGA,IAAA;EACA,MAAA,EAAQ,SAAA;AAAA;AAAA,iBAGE,KAAA,CACd,WAAA,EAAa,mBAAA,EACb,gBAAA,EAAkB,qBAAA,EAClB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,GACL,WAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.mts","names":[],"sources":["../../src/core/check.ts"],"
|
|
1
|
+
{"version":3,"file":"check.d.mts","names":[],"sources":["../../src/core/check.ts"],"mappings":";;;;;KAYY,WAAA,GAAc,mBAAA;AAAA,KACd,mBAAA;AAAA,KAIP,kBAAA;EACH,UAAA,IAAc,IAAA,EAAM,YAAA;EACpB,OAAA;AAAA;AAAA,UAGe,YAAA,yCACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,GAAc,WAAA;EACd,yBAAA,GAA4B,gBAAA;AAAA;AAAA,UAGb,oBAAA,uBACP,kBAAA,CAAmB,YAAA;EAC3B,WAAA,EAAa,mBAAA;AAAA;AAAA,KAGH,WAAA;EAEN,IAAA;AAAA;EAGA,IAAA;EACA,MAAA,EAAQ,SAAA;AAAA;AAAA,iBAGE,KAAA,CACd,WAAA,EAAa,mBAAA,EACb,gBAAA,EAAkB,qBAAA,EAClB,SAAA,EAAW,SAAA,EACX,IAAA,EAAM,SAAA,GACL,WAAA"}
|
package/dist/core/check.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.mjs","names":[
|
|
1
|
+
{"version":3,"file":"check.mjs","names":[],"sources":["../../src/core/check.ts"],"sourcesContent":["import { getParentRecordKey } from './cache';\nimport type { NormalizationAstNodes } from './entrypoint';\nimport type { Variables } from './FragmentReference';\nimport type {\n IsographEnvironment,\n StoreLink,\n StoreRecord,\n} from './IsographEnvironment';\nimport { getLink } from './IsographEnvironment';\nimport { logMessage } from './logging';\nimport { getStoreRecordProxy } from './optimisticProxy';\n\nexport type ShouldFetch = RequiredShouldFetch | 'IfNecessary';\nexport type RequiredShouldFetch = 'Yes' | 'No';\n\nexport const DEFAULT_SHOULD_FETCH_VALUE: ShouldFetch = 'IfNecessary';\n\ntype FetchOptionsShared<TReadOutData> = {\n onComplete?: (data: TReadOutData) => void;\n onError?: () => void;\n};\n\nexport interface FetchOptions<TReadOutData, TRawResponseType>\n extends FetchOptionsShared<TReadOutData> {\n shouldFetch?: ShouldFetch;\n optimisticNetworkResponse?: TRawResponseType;\n}\n\nexport interface RequiredFetchOptions<TReadOutData>\n extends FetchOptionsShared<TReadOutData> {\n shouldFetch: RequiredShouldFetch;\n}\n\nexport type CheckResult =\n | {\n kind: 'EnoughData';\n }\n | {\n kind: 'MissingData';\n record: StoreLink;\n };\n\nexport function check(\n environment: IsographEnvironment,\n normalizationAst: NormalizationAstNodes,\n variables: Variables,\n root: StoreLink,\n): CheckResult {\n const newStoreRecord = getStoreRecordProxy(environment.store, root);\n\n if (newStoreRecord == null) {\n return {\n kind: 'MissingData',\n record: root,\n };\n }\n\n const checkResult = checkFromRecord(\n environment,\n normalizationAst,\n variables,\n newStoreRecord,\n root,\n );\n logMessage(environment, () => ({\n kind: 'EnvironmentCheck',\n result: checkResult,\n }));\n return checkResult;\n}\n\nfunction checkFromRecord(\n environment: IsographEnvironment,\n normalizationAst: NormalizationAstNodes,\n variables: Variables,\n record: StoreRecord,\n recordLink: StoreLink,\n): CheckResult {\n normalizationAstLoop: for (const normalizationAstNode of normalizationAst) {\n switch (normalizationAstNode.kind) {\n case 'Scalar': {\n const parentRecordKey = getParentRecordKey(\n normalizationAstNode,\n variables,\n );\n const scalarValue = record[parentRecordKey];\n\n // null means the value is known to be missing, so it must\n // be exactly undefined\n if (scalarValue === undefined) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n }\n continue normalizationAstLoop;\n }\n case 'Linked': {\n const parentRecordKey = getParentRecordKey(\n normalizationAstNode,\n variables,\n );\n\n const linkedValue = record[parentRecordKey];\n\n if (linkedValue === undefined) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n } else if (linkedValue == null) {\n continue;\n } else if (Array.isArray(linkedValue)) {\n arrayItemsLoop: for (const item of linkedValue) {\n const link = getLink(item);\n if (link == null) {\n throw new Error(\n 'Unexpected non-link in the Isograph store. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n if (linkedRecord === undefined) {\n return {\n kind: 'MissingData',\n record: link,\n };\n } else if (linkedRecord == null) {\n continue arrayItemsLoop;\n } else {\n // TODO in __DEV__ assert linkedRecord is an object\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n linkedRecord,\n link,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n }\n } else {\n const link = getLink(linkedValue);\n if (link == null) {\n throw new Error(\n 'Unexpected non-link in the Isograph store. ' +\n 'This is indicative of a bug in Isograph.',\n );\n }\n\n const linkedRecord = getStoreRecordProxy(environment.store, link);\n\n if (linkedRecord === undefined) {\n return {\n kind: 'MissingData',\n record: link,\n };\n } else if (linkedRecord == null) {\n continue normalizationAstLoop;\n } else {\n // TODO in __DEV__ assert linkedRecord is an object\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n linkedRecord,\n link,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n }\n\n continue normalizationAstLoop;\n }\n case 'InlineFragment': {\n const existingRecordTypename = record['__typename'];\n\n if (existingRecordTypename == null) {\n return {\n kind: 'MissingData',\n record: recordLink,\n };\n }\n\n if (existingRecordTypename === normalizationAstNode.type) {\n const result = checkFromRecord(\n environment,\n normalizationAstNode.selections,\n variables,\n record,\n recordLink,\n );\n\n if (result.kind === 'MissingData') {\n return result;\n }\n }\n\n continue normalizationAstLoop;\n }\n }\n }\n\n return {\n kind: 'EnoughData',\n };\n}\n"],"mappings":";;;;;;AAeA,MAAa,6BAA0C;AA2BvD,SAAgB,MACd,aACA,kBACA,WACA,MACa;CACb,MAAM,iBAAiB,oBAAoB,YAAY,OAAO,KAAK;AAEnE,KAAI,kBAAkB,KACpB,QAAO;EACL,MAAM;EACN,QAAQ;EACT;CAGH,MAAM,cAAc,gBAClB,aACA,kBACA,WACA,gBACA,KACD;AACD,YAAW,oBAAoB;EAC7B,MAAM;EACN,QAAQ;EACT,EAAE;AACH,QAAO;;AAGT,SAAS,gBACP,aACA,kBACA,WACA,QACA,YACa;AACb,sBAAsB,MAAK,MAAM,wBAAwB,iBACvD,SAAQ,qBAAqB,MAA7B;EACE,KAAK;AASH,OAJoB,OAJI,mBACtB,sBACA,UACD,MAKmB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAEH,YAAS;EAEX,KAAK,UAAU;GAMb,MAAM,cAAc,OALI,mBACtB,sBACA,UACD;AAID,OAAI,gBAAgB,OAClB,QAAO;IACL,MAAM;IACN,QAAQ;IACT;YACQ,eAAe,KACxB;YACS,MAAM,QAAQ,YAAY,CACnC,gBAAgB,MAAK,MAAM,QAAQ,aAAa;IAC9C,MAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;QAIR;IACL,MAAM,OAAO,QAAQ,YAAY;AACjC,QAAI,QAAQ,KACV,OAAM,IAAI,MACR,sFAED;IAGH,MAAM,eAAe,oBAAoB,YAAY,OAAO,KAAK;AAEjE,QAAI,iBAAiB,OACnB,QAAO;KACL,MAAM;KACN,QAAQ;KACT;aACQ,gBAAgB,KACzB,UAAS;SACJ;KAEL,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,cACA,KACD;AAED,SAAI,OAAO,SAAS,cAClB,QAAO;;;AAKb,YAAS;;EAEX,KAAK,kBAAkB;GACrB,MAAM,yBAAyB,OAAO;AAEtC,OAAI,0BAA0B,KAC5B,QAAO;IACL,MAAM;IACN,QAAQ;IACT;AAGH,OAAI,2BAA2B,qBAAqB,MAAM;IACxD,MAAM,SAAS,gBACb,aACA,qBAAqB,YACrB,WACA,QACA,WACD;AAED,QAAI,OAAO,SAAS,cAClB,QAAO;;AAIX,YAAS;;;AAKf,QAAO,EACL,MAAM,cACP"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const require_FragmentReference = require('./FragmentReference.
|
|
2
|
-
const require_startUpdate = require('./startUpdate.
|
|
1
|
+
const require_FragmentReference = require('./FragmentReference.cjs');
|
|
2
|
+
const require_startUpdate = require('./startUpdate.cjs');
|
|
3
3
|
|
|
4
4
|
//#region src/core/componentCache.ts
|
|
5
5
|
function getOrCreateCachedComponent(environment, fragmentReference, networkRequestOptions) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Contravariant, PhantomData } from "./brand.
|
|
2
|
-
import { Arguments } from "./util.
|
|
3
|
-
import { TopLevelReaderArtifact } from "./reader.
|
|
4
|
-
import { ComponentOrFieldName, TypeName } from "./IsographEnvironment.
|
|
5
|
-
import { FragmentReference, UnknownTReadFromStore } from "./FragmentReference.
|
|
6
|
-
import { NetworkResponseObject } from "./cache.
|
|
1
|
+
import { Contravariant, PhantomData } from "./brand.cjs";
|
|
2
|
+
import { Arguments } from "./util.cjs";
|
|
3
|
+
import { TopLevelReaderArtifact } from "./reader.cjs";
|
|
4
|
+
import { ComponentOrFieldName, TypeName } from "./IsographEnvironment.cjs";
|
|
5
|
+
import { FragmentReference, UnknownTReadFromStore } from "./FragmentReference.cjs";
|
|
6
|
+
import { NetworkResponseObject } from "./cache.cjs";
|
|
7
7
|
|
|
8
8
|
//#region src/core/entrypoint.d.ts
|
|
9
9
|
type ReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
|
|
@@ -11,11 +11,16 @@ type ReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TCli
|
|
|
11
11
|
readonly readerArtifact: TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
|
|
12
12
|
readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
|
|
13
13
|
};
|
|
14
|
+
type RawReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
|
|
15
|
+
readonly kind: 'ReaderWithRefetchQueries';
|
|
16
|
+
readonly readerArtifact: () => TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
|
|
17
|
+
readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
|
|
18
|
+
};
|
|
14
19
|
type ReaderWithRefetchQueriesLoader<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
|
|
15
20
|
readonly kind: 'ReaderWithRefetchQueriesLoader';
|
|
16
21
|
readonly fieldName: ComponentOrFieldName;
|
|
17
22
|
readonly readerArtifactKind: 'EagerReaderArtifact' | 'ComponentReaderArtifact';
|
|
18
|
-
readonly loader: () => Promise<
|
|
23
|
+
readonly loader: () => Promise<RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
|
|
19
24
|
};
|
|
20
25
|
type NetworkRequestInfo<TNormalizationAst> = {
|
|
21
26
|
readonly kind: 'NetworkRequestInfo';
|
|
@@ -39,7 +44,7 @@ type IsographPersistedOperationExtraInfo = {
|
|
|
39
44
|
type IsographEntrypoint<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader, TRawResponseType extends NetworkResponseObject> = {
|
|
40
45
|
readonly kind: 'Entrypoint';
|
|
41
46
|
readonly networkRequestInfo: NetworkRequestInfo<TNormalizationAst>;
|
|
42
|
-
readonly readerWithRefetchQueries:
|
|
47
|
+
readonly readerWithRefetchQueries: RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue> | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
|
|
43
48
|
readonly concreteType: TypeName;
|
|
44
49
|
/**
|
|
45
50
|
* This field exists solely for typechecking, and will not exist at runtime.
|
|
@@ -65,11 +70,13 @@ type NormalizationAstLoader = {
|
|
|
65
70
|
};
|
|
66
71
|
type NormalizationScalarField = {
|
|
67
72
|
readonly kind: 'Scalar';
|
|
73
|
+
readonly isFallible: boolean;
|
|
68
74
|
readonly fieldName: string;
|
|
69
75
|
readonly arguments: Arguments | null;
|
|
70
76
|
};
|
|
71
77
|
type NormalizationLinkedField = {
|
|
72
78
|
readonly kind: 'Linked';
|
|
79
|
+
readonly isFallible: boolean;
|
|
73
80
|
readonly fieldName: string;
|
|
74
81
|
readonly arguments: Arguments | null;
|
|
75
82
|
readonly selections: NormalizationAstNodes;
|
|
@@ -96,4 +103,4 @@ type ExtractResolverResult<Type> = Type extends IsographEntrypoint<any, infer X,
|
|
|
96
103
|
type ExtractProps<Type> = Type extends React.FC<infer X> ? X : never;
|
|
97
104
|
//#endregion
|
|
98
105
|
export { ExtractClientFieldValue, ExtractProps, ExtractReadFromStore, ExtractResolverResult, FragmentReferenceOfEntrypoint, IsographEntrypoint, IsographEntrypointLoader, IsographOperation, IsographPersistedOperation, IsographPersistedOperationExtraInfo, NetworkRequestInfo, NormalizationAst, NormalizationAstLoader, NormalizationAstNode, NormalizationAstNodes, NormalizationInlineFragment, NormalizationLinkedField, NormalizationScalarField, ReaderWithRefetchQueries, RefetchQueryNormalizationArtifact, RefetchQueryNormalizationArtifactWrapper, assertIsEntrypoint };
|
|
99
|
-
//# sourceMappingURL=entrypoint.d.
|
|
106
|
+
//# sourceMappingURL=entrypoint.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entrypoint.d.cts","names":[],"sources":["../../src/core/entrypoint.ts"],"mappings":"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"}
|
|
@@ -11,11 +11,16 @@ type ReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TCli
|
|
|
11
11
|
readonly readerArtifact: TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
|
|
12
12
|
readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
|
|
13
13
|
};
|
|
14
|
+
type RawReaderWithRefetchQueries<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
|
|
15
|
+
readonly kind: 'ReaderWithRefetchQueries';
|
|
16
|
+
readonly readerArtifact: () => TopLevelReaderArtifact<TReadFromStore, TClientFieldValue, any>;
|
|
17
|
+
readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
|
|
18
|
+
};
|
|
14
19
|
type ReaderWithRefetchQueriesLoader<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue> = {
|
|
15
20
|
readonly kind: 'ReaderWithRefetchQueriesLoader';
|
|
16
21
|
readonly fieldName: ComponentOrFieldName;
|
|
17
22
|
readonly readerArtifactKind: 'EagerReaderArtifact' | 'ComponentReaderArtifact';
|
|
18
|
-
readonly loader: () => Promise<
|
|
23
|
+
readonly loader: () => Promise<RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>>;
|
|
19
24
|
};
|
|
20
25
|
type NetworkRequestInfo<TNormalizationAst> = {
|
|
21
26
|
readonly kind: 'NetworkRequestInfo';
|
|
@@ -39,7 +44,7 @@ type IsographPersistedOperationExtraInfo = {
|
|
|
39
44
|
type IsographEntrypoint<TReadFromStore extends UnknownTReadFromStore, TClientFieldValue, TNormalizationAst extends NormalizationAst | NormalizationAstLoader, TRawResponseType extends NetworkResponseObject> = {
|
|
40
45
|
readonly kind: 'Entrypoint';
|
|
41
46
|
readonly networkRequestInfo: NetworkRequestInfo<TNormalizationAst>;
|
|
42
|
-
readonly readerWithRefetchQueries:
|
|
47
|
+
readonly readerWithRefetchQueries: RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue> | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
|
|
43
48
|
readonly concreteType: TypeName;
|
|
44
49
|
/**
|
|
45
50
|
* This field exists solely for typechecking, and will not exist at runtime.
|
|
@@ -65,11 +70,13 @@ type NormalizationAstLoader = {
|
|
|
65
70
|
};
|
|
66
71
|
type NormalizationScalarField = {
|
|
67
72
|
readonly kind: 'Scalar';
|
|
73
|
+
readonly isFallible: boolean;
|
|
68
74
|
readonly fieldName: string;
|
|
69
75
|
readonly arguments: Arguments | null;
|
|
70
76
|
};
|
|
71
77
|
type NormalizationLinkedField = {
|
|
72
78
|
readonly kind: 'Linked';
|
|
79
|
+
readonly isFallible: boolean;
|
|
73
80
|
readonly fieldName: string;
|
|
74
81
|
readonly arguments: Arguments | null;
|
|
75
82
|
readonly selections: NormalizationAstNodes;
|