@apollo/client 3.12.0-alpha.0 → 3.12.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/brown-readers-smash.md +5 -0
- package/.changeset/cold-apes-bow.md +5 -0
- package/.changeset/early-bobcats-eat.md +5 -0
- package/.changeset/flat-beans-knock.md +15 -0
- package/.changeset/gorgeous-zebras-confess.md +5 -0
- package/.changeset/kind-toys-tie.md +5 -0
- package/.changeset/long-zoos-ring.md +5 -0
- package/.changeset/nervous-owls-hear.md +5 -0
- package/.changeset/nice-countries-share.md +5 -0
- package/.changeset/pre.json +13 -2
- package/.changeset/slimy-points-end.md +5 -0
- package/.changeset/small-bears-confess.md +5 -0
- package/CHANGELOG.md +52 -0
- package/apollo-client.cjs +187 -93
- package/apollo-client.cjs.map +1 -1
- package/apollo-client.min.cjs +1 -1
- package/cache/cache.cjs +59 -25
- package/cache/cache.cjs.map +1 -1
- package/cache/cache.cjs.native.js +59 -25
- package/cache/inmemory/policies.js +12 -9
- package/cache/inmemory/policies.js.map +1 -1
- package/config/jest/setup.js +5 -0
- package/config/jest/setup.js.map +1 -1
- package/core/ApolloClient.js +7 -3
- package/core/ApolloClient.js.map +1 -1
- package/core/ObservableQuery.js +2 -0
- package/core/ObservableQuery.js.map +1 -1
- package/core/QueryManager.d.ts +4 -1
- package/core/QueryManager.js +26 -2
- package/core/QueryManager.js.map +1 -1
- package/core/core.cjs +86 -25
- package/core/core.cjs.map +1 -1
- package/core/core.cjs.native.js +86 -25
- package/core/masking.d.ts +6 -0
- package/core/masking.js +62 -20
- package/core/masking.js.map +1 -1
- package/dev/dev.cjs +66 -62
- package/dev/dev.cjs.map +1 -1
- package/dev/dev.cjs.native.js +66 -62
- package/invariantErrorCodes.js +66 -61
- package/link/core/ApolloLink.js +2 -2
- package/link/core/core.cjs +2 -2
- package/link/core/core.cjs.map +1 -1
- package/link/core/core.cjs.native.js +2 -2
- package/link/http/checkFetcher.js +1 -1
- package/link/http/createHttpLink.js +1 -1
- package/link/http/http.cjs +3 -3
- package/link/http/http.cjs.map +1 -1
- package/link/http/http.cjs.native.js +3 -3
- package/link/http/serializeFetchParameter.js +1 -1
- package/link/persisted-queries/index.js +2 -2
- package/link/persisted-queries/index.js.map +1 -1
- package/link/persisted-queries/persisted-queries.cjs +2 -2
- package/link/persisted-queries/persisted-queries.cjs.map +1 -1
- package/link/persisted-queries/persisted-queries.cjs.native.js +2 -2
- package/link/utils/toPromise.js +1 -1
- package/link/utils/utils.cjs +2 -2
- package/link/utils/utils.cjs.map +1 -1
- package/link/utils/utils.cjs.native.js +2 -2
- package/link/utils/validateOperation.js +1 -1
- package/masking/internal/types.d.ts +2 -2
- package/masking/internal/types.js.map +1 -1
- package/masking/types.d.ts +2 -2
- package/masking/types.js.map +1 -1
- package/package.json +4 -3
- package/react/context/ApolloConsumer.js +1 -1
- package/react/context/ApolloContext.js +1 -1
- package/react/context/ApolloProvider.js +1 -1
- package/react/context/context.cjs +3 -3
- package/react/context/context.cjs.map +1 -1
- package/react/context/context.cjs.native.js +3 -3
- package/react/hoc/hoc-utils.js +1 -1
- package/react/hoc/hoc.cjs +2 -2
- package/react/hoc/hoc.cjs.map +1 -1
- package/react/hoc/hoc.cjs.native.js +2 -2
- package/react/hoc/withApollo.js +1 -1
- package/react/hooks/hooks.cjs +34 -20
- package/react/hooks/hooks.cjs.map +1 -1
- package/react/hooks/hooks.cjs.native.js +34 -20
- package/react/hooks/useApolloClient.js +1 -1
- package/react/hooks/useFragment.d.ts +1 -1
- package/react/hooks/useFragment.js +33 -19
- package/react/hooks/useFragment.js.map +1 -1
- package/react/hooks/useLoadableQuery.js +2 -2
- package/react/hooks/useSubscription.js +3 -3
- package/react/hooks/useSuspenseQuery.js +2 -2
- package/react/hooks/useSyncExternalStore.js +1 -1
- package/react/internal/cache/QueryReference.js +2 -2
- package/react/internal/cache/QueryReference.js.map +1 -1
- package/react/internal/internal.cjs +3 -3
- package/react/internal/internal.cjs.map +1 -1
- package/react/internal/internal.cjs.native.js +3 -3
- package/react/parser/index.js +5 -5
- package/react/parser/parser.cjs +5 -5
- package/react/parser/parser.cjs.map +1 -1
- package/react/parser/parser.cjs.native.js +5 -5
- package/testing/core/core.cjs +2 -2
- package/testing/core/core.cjs.map +1 -1
- package/testing/core/core.cjs.native.js +2 -2
- package/testing/core/mocking/mockLink.js +2 -2
- package/testing/internal/ObservableStream.d.ts +11 -15
- package/testing/internal/ObservableStream.js +18 -62
- package/testing/internal/ObservableStream.js.map +1 -1
- package/testing/internal/index.d.ts +1 -2
- package/testing/internal/index.js +1 -2
- package/testing/internal/index.js.map +1 -1
- package/testing/internal/renderHelpers.d.ts +13 -2
- package/testing/internal/renderHelpers.js +20 -12
- package/testing/internal/renderHelpers.js.map +1 -1
- package/testing/matchers/index.js +0 -3
- package/testing/matchers/index.js.map +1 -1
- package/utilities/globals/globals.cjs +1 -1
- package/utilities/globals/globals.cjs.map +1 -1
- package/utilities/globals/globals.cjs.native.js +1 -1
- package/utilities/graphql/DocumentTransform.js +1 -1
- package/utilities/graphql/directives.js +7 -7
- package/utilities/graphql/fragments.d.ts +1 -0
- package/utilities/graphql/fragments.js +18 -3
- package/utilities/graphql/fragments.js.map +1 -1
- package/utilities/graphql/getFromAST.js +8 -8
- package/utilities/graphql/storeUtils.js +1 -1
- package/utilities/graphql/transform.js +8 -2
- package/utilities/graphql/transform.js.map +1 -1
- package/utilities/index.d.ts +1 -1
- package/utilities/index.js +1 -1
- package/utilities/index.js.map +1 -1
- package/utilities/utilities.cjs +41 -22
- package/utilities/utilities.cjs.map +1 -1
- package/utilities/utilities.cjs.native.js +41 -22
- package/version.js +1 -1
- package/testing/internal/profile/Render.d.ts +0 -69
- package/testing/internal/profile/Render.js +0 -144
- package/testing/internal/profile/Render.js.map +0 -1
- package/testing/internal/profile/context.d.ts +0 -10
- package/testing/internal/profile/context.js +0 -14
- package/testing/internal/profile/context.js.map +0 -1
- package/testing/internal/profile/index.d.ts +0 -4
- package/testing/internal/profile/index.js +0 -2
- package/testing/internal/profile/index.js.map +0 -1
- package/testing/internal/profile/profile.d.ts +0 -109
- package/testing/internal/profile/profile.js +0 -304
- package/testing/internal/profile/profile.js.map +0 -1
- package/testing/internal/profile/traces.d.ts +0 -7
- package/testing/internal/profile/traces.js +0 -30
- package/testing/internal/profile/traces.js.map +0 -1
- package/testing/matchers/ProfiledComponent.d.ts +0 -8
- package/testing/matchers/ProfiledComponent.js +0 -110
- package/testing/matchers/ProfiledComponent.js.map +0 -1
package/core/core.cjs.native.js
CHANGED
|
@@ -12,6 +12,7 @@ var cache = require('../cache');
|
|
|
12
12
|
var errors = require('../errors');
|
|
13
13
|
var trie = require('@wry/trie');
|
|
14
14
|
var graphql = require('graphql');
|
|
15
|
+
var optimism = require('optimism');
|
|
15
16
|
var utils = require('../link/utils');
|
|
16
17
|
var tsInvariant = require('ts-invariant');
|
|
17
18
|
var graphqlTag = require('graphql-tag');
|
|
@@ -20,7 +21,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
|
|
|
20
21
|
|
|
21
22
|
var equal__default = /*#__PURE__*/_interopDefaultLegacy(equal);
|
|
22
23
|
|
|
23
|
-
var version = "3.12.0-
|
|
24
|
+
var version = "3.12.0-rc.1";
|
|
24
25
|
|
|
25
26
|
function isNonNullObject(obj) {
|
|
26
27
|
return obj !== null && typeof obj === "object";
|
|
@@ -758,6 +759,8 @@ var ObservableQuery = (function (_super) {
|
|
|
758
759
|
return result && "data" in result ? tslib.__assign(tslib.__assign({}, result), { data: this.queryManager.maskOperation({
|
|
759
760
|
document: this.query,
|
|
760
761
|
data: result.data,
|
|
762
|
+
fetchPolicy: this.options.fetchPolicy,
|
|
763
|
+
id: this.queryId,
|
|
761
764
|
}) }) : result;
|
|
762
765
|
};
|
|
763
766
|
return ObservableQuery;
|
|
@@ -1071,6 +1074,7 @@ function shouldWriteResult(result, errorPolicy) {
|
|
|
1071
1074
|
return writeWithErrors;
|
|
1072
1075
|
}
|
|
1073
1076
|
|
|
1077
|
+
var disableWarningsSlot = new optimism.Slot();
|
|
1074
1078
|
function maskOperation(data, document, cache) {
|
|
1075
1079
|
var _a;
|
|
1076
1080
|
if (!cache.fragmentMatches) {
|
|
@@ -1080,7 +1084,7 @@ function maskOperation(data, document, cache) {
|
|
|
1080
1084
|
return data;
|
|
1081
1085
|
}
|
|
1082
1086
|
var definition = utilities.getOperationDefinition(document);
|
|
1083
|
-
globals.invariant(definition,
|
|
1087
|
+
globals.invariant(definition, 38);
|
|
1084
1088
|
if (data == null) {
|
|
1085
1089
|
return data;
|
|
1086
1090
|
}
|
|
@@ -1092,9 +1096,7 @@ function maskOperation(data, document, cache) {
|
|
|
1092
1096
|
};
|
|
1093
1097
|
var _b = maskSelectionSet(data, definition.selectionSet, context), masked = _b[0], changed = _b[1];
|
|
1094
1098
|
if (Object.isFrozen(data)) {
|
|
1095
|
-
|
|
1096
|
-
utilities.maybeDeepFreeze(masked);
|
|
1097
|
-
context.disableWarnings = false;
|
|
1099
|
+
disableWarningsSlot.withValue(true, utilities.maybeDeepFreeze, [masked]);
|
|
1098
1100
|
}
|
|
1099
1101
|
return changed ? masked : data;
|
|
1100
1102
|
}
|
|
@@ -1109,14 +1111,17 @@ function maskFragment(data, document, cache, fragmentName) {
|
|
|
1109
1111
|
return node.kind === graphql.Kind.FRAGMENT_DEFINITION;
|
|
1110
1112
|
});
|
|
1111
1113
|
if (typeof fragmentName === "undefined") {
|
|
1112
|
-
globals.invariant(fragments.length === 1,
|
|
1114
|
+
globals.invariant(fragments.length === 1, 39, fragments.length);
|
|
1113
1115
|
fragmentName = fragments[0].name.value;
|
|
1114
1116
|
}
|
|
1115
1117
|
var fragment = fragments.find(function (fragment) { return fragment.name.value === fragmentName; });
|
|
1116
|
-
globals.invariant(!!fragment,
|
|
1118
|
+
globals.invariant(!!fragment, 40, fragmentName);
|
|
1117
1119
|
if (data == null) {
|
|
1118
1120
|
return data;
|
|
1119
1121
|
}
|
|
1122
|
+
if (equal.equal(data, {})) {
|
|
1123
|
+
return data;
|
|
1124
|
+
}
|
|
1120
1125
|
var context = {
|
|
1121
1126
|
operationType: "fragment",
|
|
1122
1127
|
operationName: fragment.name.value,
|
|
@@ -1125,9 +1130,7 @@ function maskFragment(data, document, cache, fragmentName) {
|
|
|
1125
1130
|
};
|
|
1126
1131
|
var _a = maskSelectionSet(data, fragment.selectionSet, context), masked = _a[0], changed = _a[1];
|
|
1127
1132
|
if (Object.isFrozen(data)) {
|
|
1128
|
-
|
|
1129
|
-
utilities.maybeDeepFreeze(masked);
|
|
1130
|
-
context.disableWarnings = false;
|
|
1133
|
+
disableWarningsSlot.withValue(true, utilities.maybeDeepFreeze, [masked]);
|
|
1131
1134
|
}
|
|
1132
1135
|
return changed ? masked : data;
|
|
1133
1136
|
}
|
|
@@ -1144,14 +1147,22 @@ function maskSelectionSet(data, selectionSet, context, path) {
|
|
|
1144
1147
|
});
|
|
1145
1148
|
return [changed_1 ? masked : data, changed_1];
|
|
1146
1149
|
}
|
|
1147
|
-
var result = selectionSet.selections
|
|
1150
|
+
var result = selectionSet.selections
|
|
1151
|
+
.concat()
|
|
1152
|
+
.sort(sortFragmentsLast)
|
|
1153
|
+
.reduce(function (_a, selection) {
|
|
1148
1154
|
var memo = _a[0], changed = _a[1];
|
|
1149
1155
|
switch (selection.kind) {
|
|
1150
1156
|
case graphql.Kind.FIELD: {
|
|
1151
1157
|
var keyName = utilities.resultKeyNameFromField(selection);
|
|
1152
1158
|
var childSelectionSet = selection.selectionSet;
|
|
1153
1159
|
memo[keyName] = data[keyName];
|
|
1154
|
-
if (
|
|
1160
|
+
if (memo[keyName] === void 0) {
|
|
1161
|
+
delete memo[keyName];
|
|
1162
|
+
}
|
|
1163
|
+
if (keyName in memo &&
|
|
1164
|
+
childSelectionSet &&
|
|
1165
|
+
data[keyName] !== null) {
|
|
1155
1166
|
var _b = maskSelectionSet(data[keyName], childSelectionSet, context, globalThis.__DEV__ !== false ? "".concat(path || "", ".").concat(keyName) : void 0), masked = _b[0], childChanged = _b[1];
|
|
1156
1167
|
if (childChanged ||
|
|
1157
1168
|
Object.keys(masked).length !== Object.keys(data[keyName]).length) {
|
|
@@ -1177,7 +1188,7 @@ function maskSelectionSet(data, selectionSet, context, path) {
|
|
|
1177
1188
|
var fragment = context.fragmentMap[fragmentName] ||
|
|
1178
1189
|
(context.fragmentMap[fragmentName] =
|
|
1179
1190
|
context.cache.lookupFragment(fragmentName));
|
|
1180
|
-
globals.invariant(fragment,
|
|
1191
|
+
globals.invariant(fragment, 41, fragmentName);
|
|
1181
1192
|
var mode = utilities.getFragmentMaskMode(selection);
|
|
1182
1193
|
if (mode === "mask") {
|
|
1183
1194
|
return [memo, true];
|
|
@@ -1195,7 +1206,7 @@ function maskSelectionSet(data, selectionSet, context, path) {
|
|
|
1195
1206
|
}
|
|
1196
1207
|
}
|
|
1197
1208
|
}, [Object.create(null), false]);
|
|
1198
|
-
if ("__typename" in data && !("__typename" in result[0])) {
|
|
1209
|
+
if (data && "__typename" in data && !("__typename" in result[0])) {
|
|
1199
1210
|
result[0].__typename = data.__typename;
|
|
1200
1211
|
}
|
|
1201
1212
|
return result;
|
|
@@ -1206,20 +1217,29 @@ function addFieldAccessorWarnings(memo, data, selectionSetNode, path, context) {
|
|
|
1206
1217
|
return addFieldAccessorWarnings(memo[index] || Object.create(null), item, selectionSetNode, "".concat(path, "[").concat(index, "]"), context);
|
|
1207
1218
|
});
|
|
1208
1219
|
}
|
|
1209
|
-
return selectionSetNode.selections
|
|
1220
|
+
return selectionSetNode.selections
|
|
1221
|
+
.concat()
|
|
1222
|
+
.sort(sortFragmentsLast)
|
|
1223
|
+
.reduce(function (memo, selection) {
|
|
1210
1224
|
switch (selection.kind) {
|
|
1211
1225
|
case graphql.Kind.FIELD: {
|
|
1212
1226
|
var keyName = utilities.resultKeyNameFromField(selection);
|
|
1213
1227
|
var childSelectionSet = selection.selectionSet;
|
|
1214
|
-
if (keyName in memo) {
|
|
1228
|
+
if (keyName in memo && !childSelectionSet) {
|
|
1215
1229
|
return memo;
|
|
1216
1230
|
}
|
|
1217
1231
|
var value = data[keyName];
|
|
1218
1232
|
if (childSelectionSet) {
|
|
1219
|
-
value = addFieldAccessorWarnings(memo[keyName] ||
|
|
1233
|
+
value = addFieldAccessorWarnings(memo[keyName] ||
|
|
1234
|
+
(Array.isArray(data[keyName]) ? [] : Object.create(null)), data[keyName], childSelectionSet, "".concat(path, ".").concat(keyName), context);
|
|
1220
1235
|
}
|
|
1221
1236
|
if (globalThis.__DEV__ !== false) {
|
|
1222
|
-
|
|
1237
|
+
if (keyName in memo) {
|
|
1238
|
+
memo[keyName] = value;
|
|
1239
|
+
}
|
|
1240
|
+
else {
|
|
1241
|
+
addAccessorWarning(memo, value, keyName, path, context);
|
|
1242
|
+
}
|
|
1223
1243
|
}
|
|
1224
1244
|
if (!(globalThis.__DEV__ !== false)) {
|
|
1225
1245
|
memo[keyName] = data[keyName];
|
|
@@ -1227,6 +1247,10 @@ function addFieldAccessorWarnings(memo, data, selectionSetNode, path, context) {
|
|
|
1227
1247
|
return memo;
|
|
1228
1248
|
}
|
|
1229
1249
|
case graphql.Kind.INLINE_FRAGMENT: {
|
|
1250
|
+
if (selection.typeCondition &&
|
|
1251
|
+
!context.cache.fragmentMatches(selection, data.__typename)) {
|
|
1252
|
+
return memo;
|
|
1253
|
+
}
|
|
1230
1254
|
return addFieldAccessorWarnings(memo, data, selection.selectionSet, path, context);
|
|
1231
1255
|
}
|
|
1232
1256
|
case graphql.Kind.FRAGMENT_SPREAD: {
|
|
@@ -1245,11 +1269,14 @@ function addFieldAccessorWarnings(memo, data, selectionSetNode, path, context) {
|
|
|
1245
1269
|
}, memo);
|
|
1246
1270
|
}
|
|
1247
1271
|
function addAccessorWarning(data, value, fieldName, path, context) {
|
|
1272
|
+
if (value === void 0) {
|
|
1273
|
+
return;
|
|
1274
|
+
}
|
|
1248
1275
|
var getValue = function () {
|
|
1249
|
-
if (
|
|
1276
|
+
if (disableWarningsSlot.getValue()) {
|
|
1250
1277
|
return value;
|
|
1251
1278
|
}
|
|
1252
|
-
globalThis.__DEV__ !== false && globals.invariant.warn(
|
|
1279
|
+
globalThis.__DEV__ !== false && globals.invariant.warn(42, context.operationName ?
|
|
1253
1280
|
"".concat(context.operationType, " '").concat(context.operationName, "'")
|
|
1254
1281
|
: "anonymous ".concat(context.operationType), "".concat(path, ".").concat(fieldName).replace(/^\./, ""));
|
|
1255
1282
|
getValue = function () { return value; };
|
|
@@ -1270,8 +1297,14 @@ var issuedWarning = false;
|
|
|
1270
1297
|
function warnOnImproperCacheImplementation() {
|
|
1271
1298
|
if (!issuedWarning) {
|
|
1272
1299
|
issuedWarning = true;
|
|
1273
|
-
globalThis.__DEV__ !== false && globals.invariant.warn(
|
|
1300
|
+
globalThis.__DEV__ !== false && globals.invariant.warn(43);
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
function sortFragmentsLast(a, b) {
|
|
1304
|
+
if (a.kind === b.kind) {
|
|
1305
|
+
return 0;
|
|
1274
1306
|
}
|
|
1307
|
+
return a.kind === graphql.Kind.FRAGMENT_SPREAD ? 1 : -1;
|
|
1275
1308
|
}
|
|
1276
1309
|
|
|
1277
1310
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
@@ -1288,6 +1321,7 @@ var QueryManager = (function () {
|
|
|
1288
1321
|
this.requestIdCounter = 1;
|
|
1289
1322
|
this.mutationIdCounter = 1;
|
|
1290
1323
|
this.inFlightLinkObservables = new trie.Trie(false);
|
|
1324
|
+
this.noCacheWarningsByQueryId = new Set();
|
|
1291
1325
|
var defaultDocumentTransform = new utilities.DocumentTransform(function (document) { return _this.cache.transformDocument(document); },
|
|
1292
1326
|
{ cache: false });
|
|
1293
1327
|
this.cache = options.cache;
|
|
@@ -1404,6 +1438,8 @@ var QueryManager = (function () {
|
|
|
1404
1438
|
resolve(tslib.__assign(tslib.__assign({}, storeResult), { data: self.maskOperation({
|
|
1405
1439
|
document: mutation,
|
|
1406
1440
|
data: storeResult.data,
|
|
1441
|
+
fetchPolicy: fetchPolicy,
|
|
1442
|
+
id: mutationId,
|
|
1407
1443
|
}) }));
|
|
1408
1444
|
}
|
|
1409
1445
|
},
|
|
@@ -1665,7 +1701,12 @@ var QueryManager = (function () {
|
|
|
1665
1701
|
var query = this.transform(options.query);
|
|
1666
1702
|
return this.fetchQuery(queryId, tslib.__assign(tslib.__assign({}, options), { query: query }))
|
|
1667
1703
|
.then(function (result) {
|
|
1668
|
-
return result && tslib.__assign(tslib.__assign({}, result), { data: _this.maskOperation({
|
|
1704
|
+
return result && tslib.__assign(tslib.__assign({}, result), { data: _this.maskOperation({
|
|
1705
|
+
document: query,
|
|
1706
|
+
data: result.data,
|
|
1707
|
+
fetchPolicy: options.fetchPolicy,
|
|
1708
|
+
id: queryId,
|
|
1709
|
+
}) });
|
|
1669
1710
|
})
|
|
1670
1711
|
.finally(function () { return _this.stopQuery(queryId); });
|
|
1671
1712
|
};
|
|
@@ -2078,7 +2119,23 @@ var QueryManager = (function () {
|
|
|
2078
2119
|
return results;
|
|
2079
2120
|
};
|
|
2080
2121
|
QueryManager.prototype.maskOperation = function (options) {
|
|
2122
|
+
var _a, _b, _c;
|
|
2081
2123
|
var document = options.document, data = options.data;
|
|
2124
|
+
if (globalThis.__DEV__ !== false) {
|
|
2125
|
+
var fetchPolicy = options.fetchPolicy, id = options.id;
|
|
2126
|
+
var operationType = (_a = utilities.getOperationDefinition(document)) === null || _a === void 0 ? void 0 : _a.operation;
|
|
2127
|
+
var operationId = ((_b = operationType === null || operationType === void 0 ? void 0 : operationType[0]) !== null && _b !== void 0 ? _b : "o") + id;
|
|
2128
|
+
if (this.dataMasking &&
|
|
2129
|
+
fetchPolicy === "no-cache" &&
|
|
2130
|
+
!utilities.isFullyUnmaskedOperation(document) &&
|
|
2131
|
+
!this.noCacheWarningsByQueryId.has(operationId)) {
|
|
2132
|
+
this.noCacheWarningsByQueryId.add(operationId);
|
|
2133
|
+
globalThis.__DEV__ !== false && globals.invariant.warn(
|
|
2134
|
+
37,
|
|
2135
|
+
(_c = utilities.getOperationName(document)) !== null && _c !== void 0 ? _c : "Unnamed ".concat(operationType !== null && operationType !== void 0 ? operationType : "operation")
|
|
2136
|
+
);
|
|
2137
|
+
}
|
|
2138
|
+
}
|
|
2082
2139
|
return (this.dataMasking ?
|
|
2083
2140
|
maskOperation(data, document, this.cache)
|
|
2084
2141
|
: data);
|
|
@@ -2602,13 +2659,14 @@ var hasSuggestedDevtools = false;
|
|
|
2602
2659
|
var ApolloClient = (function () {
|
|
2603
2660
|
function ApolloClient(options) {
|
|
2604
2661
|
var _this = this;
|
|
2662
|
+
var _a;
|
|
2605
2663
|
this.resetStoreCallbacks = [];
|
|
2606
2664
|
this.clearStoreCallbacks = [];
|
|
2607
2665
|
if (!options.cache) {
|
|
2608
2666
|
throw globals.newInvariantError(16);
|
|
2609
2667
|
}
|
|
2610
|
-
var uri = options.uri, credentials = options.credentials, headers = options.headers, cache = options.cache, documentTransform = options.documentTransform,
|
|
2611
|
-
connectToDevTools = options.connectToDevTools,
|
|
2668
|
+
var uri = options.uri, credentials = options.credentials, headers = options.headers, cache = options.cache, documentTransform = options.documentTransform, _b = options.ssrMode, ssrMode = _b === void 0 ? false : _b, _c = options.ssrForceFetchDelay, ssrForceFetchDelay = _c === void 0 ? 0 : _c,
|
|
2669
|
+
connectToDevTools = options.connectToDevTools, _d = options.queryDeduplication, queryDeduplication = _d === void 0 ? true : _d, defaultOptions = options.defaultOptions, defaultContext = options.defaultContext, _e = options.assumeImmutableResults, assumeImmutableResults = _e === void 0 ? cache.assumeImmutableResults : _e, resolvers = options.resolvers, typeDefs = options.typeDefs, fragmentMatcher = options.fragmentMatcher, clientAwarenessName = options.name, clientAwarenessVersion = options.version, devtools = options.devtools, dataMasking = options.dataMasking;
|
|
2612
2670
|
var link = options.link;
|
|
2613
2671
|
if (!link) {
|
|
2614
2672
|
link =
|
|
@@ -2620,7 +2678,7 @@ var ApolloClient = (function () {
|
|
|
2620
2678
|
this.queryDeduplication = queryDeduplication;
|
|
2621
2679
|
this.defaultOptions = defaultOptions || Object.create(null);
|
|
2622
2680
|
this.typeDefs = typeDefs;
|
|
2623
|
-
this.devtoolsConfig = tslib.__assign(tslib.__assign({}, devtools), { enabled: (devtools === null || devtools === void 0 ? void 0 : devtools.enabled)
|
|
2681
|
+
this.devtoolsConfig = tslib.__assign(tslib.__assign({}, devtools), { enabled: (_a = devtools === null || devtools === void 0 ? void 0 : devtools.enabled) !== null && _a !== void 0 ? _a : connectToDevTools });
|
|
2624
2682
|
if (this.devtoolsConfig.enabled === undefined) {
|
|
2625
2683
|
this.devtoolsConfig.enabled = globalThis.__DEV__ !== false;
|
|
2626
2684
|
}
|
|
@@ -2751,11 +2809,14 @@ var ApolloClient = (function () {
|
|
|
2751
2809
|
};
|
|
2752
2810
|
ApolloClient.prototype.subscribe = function (options) {
|
|
2753
2811
|
var _this = this;
|
|
2812
|
+
var id = this.queryManager.generateQueryId();
|
|
2754
2813
|
return this.queryManager
|
|
2755
2814
|
.startGraphQLSubscription(options)
|
|
2756
2815
|
.map(function (result) { return (tslib.__assign(tslib.__assign({}, result), { data: _this.queryManager.maskOperation({
|
|
2757
2816
|
document: options.query,
|
|
2758
2817
|
data: result.data,
|
|
2818
|
+
fetchPolicy: options.fetchPolicy,
|
|
2819
|
+
id: id,
|
|
2759
2820
|
}) })); });
|
|
2760
2821
|
};
|
|
2761
2822
|
ApolloClient.prototype.readQuery = function (options, optimistic) {
|
package/core/masking.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { ApolloCache, DocumentNode, TypedDocumentNode } from "./index.js";
|
|
2
|
+
export declare const disableWarningsSlot: {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
hasValue(): boolean;
|
|
5
|
+
getValue(): boolean | undefined;
|
|
6
|
+
withValue<TResult, TArgs extends any[], TThis = any>(value: boolean, callback: (this: TThis, ...args: TArgs) => TResult, args?: TArgs | undefined, thisArg?: TThis | undefined): TResult;
|
|
7
|
+
};
|
|
2
8
|
export declare function maskOperation<TData = unknown>(data: TData, document: DocumentNode | TypedDocumentNode<TData>, cache: ApolloCache<unknown>): TData;
|
|
3
9
|
export declare function maskFragment<TData = unknown>(data: TData, document: TypedDocumentNode<TData> | DocumentNode, cache: ApolloCache<unknown>, fragmentName?: string): TData;
|
|
4
10
|
//# sourceMappingURL=masking.d.ts.map
|
package/core/masking.js
CHANGED
|
@@ -2,6 +2,11 @@ import { __assign } from "tslib";
|
|
|
2
2
|
import { Kind } from "graphql";
|
|
3
3
|
import { createFragmentMap, resultKeyNameFromField, getFragmentDefinitions, getFragmentMaskMode, getOperationDefinition, maybeDeepFreeze, } from "../utilities/index.js";
|
|
4
4
|
import { invariant } from "../utilities/globals/index.js";
|
|
5
|
+
import { equal } from "@wry/equality";
|
|
6
|
+
import { Slot } from "optimism";
|
|
7
|
+
// Contextual slot that allows us to disable accessor warnings on fields when in
|
|
8
|
+
// migrate mode.
|
|
9
|
+
export var disableWarningsSlot = new Slot();
|
|
5
10
|
export function maskOperation(data, document, cache) {
|
|
6
11
|
var _a;
|
|
7
12
|
if (!cache.fragmentMatches) {
|
|
@@ -11,7 +16,7 @@ export function maskOperation(data, document, cache) {
|
|
|
11
16
|
return data;
|
|
12
17
|
}
|
|
13
18
|
var definition = getOperationDefinition(document);
|
|
14
|
-
invariant(definition,
|
|
19
|
+
invariant(definition, 38);
|
|
15
20
|
if (data == null) {
|
|
16
21
|
// Maintain the original `null` or `undefined` value
|
|
17
22
|
return data;
|
|
@@ -24,9 +29,7 @@ export function maskOperation(data, document, cache) {
|
|
|
24
29
|
};
|
|
25
30
|
var _b = maskSelectionSet(data, definition.selectionSet, context), masked = _b[0], changed = _b[1];
|
|
26
31
|
if (Object.isFrozen(data)) {
|
|
27
|
-
|
|
28
|
-
maybeDeepFreeze(masked);
|
|
29
|
-
context.disableWarnings = false;
|
|
32
|
+
disableWarningsSlot.withValue(true, maybeDeepFreeze, [masked]);
|
|
30
33
|
}
|
|
31
34
|
return changed ? masked : data;
|
|
32
35
|
}
|
|
@@ -41,15 +44,21 @@ export function maskFragment(data, document, cache, fragmentName) {
|
|
|
41
44
|
return node.kind === Kind.FRAGMENT_DEFINITION;
|
|
42
45
|
});
|
|
43
46
|
if (typeof fragmentName === "undefined") {
|
|
44
|
-
invariant(fragments.length === 1,
|
|
47
|
+
invariant(fragments.length === 1, 39, fragments.length);
|
|
45
48
|
fragmentName = fragments[0].name.value;
|
|
46
49
|
}
|
|
47
50
|
var fragment = fragments.find(function (fragment) { return fragment.name.value === fragmentName; });
|
|
48
|
-
invariant(!!fragment,
|
|
51
|
+
invariant(!!fragment, 40, fragmentName);
|
|
49
52
|
if (data == null) {
|
|
50
53
|
// Maintain the original `null` or `undefined` value
|
|
51
54
|
return data;
|
|
52
55
|
}
|
|
56
|
+
if (equal(data, {})) {
|
|
57
|
+
// Return early and skip the masking algorithm if we don't have any data
|
|
58
|
+
// yet. This can happen when cache.diff returns an empty object which is
|
|
59
|
+
// used from watchFragment.
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
53
62
|
var context = {
|
|
54
63
|
operationType: "fragment",
|
|
55
64
|
operationName: fragment.name.value,
|
|
@@ -58,9 +67,7 @@ export function maskFragment(data, document, cache, fragmentName) {
|
|
|
58
67
|
};
|
|
59
68
|
var _a = maskSelectionSet(data, fragment.selectionSet, context), masked = _a[0], changed = _a[1];
|
|
60
69
|
if (Object.isFrozen(data)) {
|
|
61
|
-
|
|
62
|
-
maybeDeepFreeze(masked);
|
|
63
|
-
context.disableWarnings = false;
|
|
70
|
+
disableWarningsSlot.withValue(true, maybeDeepFreeze, [masked]);
|
|
64
71
|
}
|
|
65
72
|
return changed ? masked : data;
|
|
66
73
|
}
|
|
@@ -77,14 +84,22 @@ function maskSelectionSet(data, selectionSet, context, path) {
|
|
|
77
84
|
});
|
|
78
85
|
return [changed_1 ? masked : data, changed_1];
|
|
79
86
|
}
|
|
80
|
-
var result = selectionSet.selections
|
|
87
|
+
var result = selectionSet.selections
|
|
88
|
+
.concat()
|
|
89
|
+
.sort(sortFragmentsLast)
|
|
90
|
+
.reduce(function (_a, selection) {
|
|
81
91
|
var memo = _a[0], changed = _a[1];
|
|
82
92
|
switch (selection.kind) {
|
|
83
93
|
case Kind.FIELD: {
|
|
84
94
|
var keyName = resultKeyNameFromField(selection);
|
|
85
95
|
var childSelectionSet = selection.selectionSet;
|
|
86
96
|
memo[keyName] = data[keyName];
|
|
87
|
-
if (
|
|
97
|
+
if (memo[keyName] === void 0) {
|
|
98
|
+
delete memo[keyName];
|
|
99
|
+
}
|
|
100
|
+
if (keyName in memo &&
|
|
101
|
+
childSelectionSet &&
|
|
102
|
+
data[keyName] !== null) {
|
|
88
103
|
var _b = maskSelectionSet(data[keyName], childSelectionSet, context, globalThis.__DEV__ !== false ? "".concat(path || "", ".").concat(keyName) : void 0), masked = _b[0], childChanged = _b[1];
|
|
89
104
|
if (childChanged ||
|
|
90
105
|
// This check prevents cases where masked fields may accidentally be
|
|
@@ -113,7 +128,7 @@ function maskSelectionSet(data, selectionSet, context, path) {
|
|
|
113
128
|
var fragment = context.fragmentMap[fragmentName] ||
|
|
114
129
|
(context.fragmentMap[fragmentName] =
|
|
115
130
|
context.cache.lookupFragment(fragmentName));
|
|
116
|
-
invariant(fragment,
|
|
131
|
+
invariant(fragment, 41, fragmentName);
|
|
117
132
|
var mode = getFragmentMaskMode(selection);
|
|
118
133
|
if (mode === "mask") {
|
|
119
134
|
return [memo, true];
|
|
@@ -131,7 +146,7 @@ function maskSelectionSet(data, selectionSet, context, path) {
|
|
|
131
146
|
}
|
|
132
147
|
}
|
|
133
148
|
}, [Object.create(null), false]);
|
|
134
|
-
if ("__typename" in data && !("__typename" in result[0])) {
|
|
149
|
+
if (data && "__typename" in data && !("__typename" in result[0])) {
|
|
135
150
|
result[0].__typename = data.__typename;
|
|
136
151
|
}
|
|
137
152
|
return result;
|
|
@@ -142,20 +157,29 @@ function addFieldAccessorWarnings(memo, data, selectionSetNode, path, context) {
|
|
|
142
157
|
return addFieldAccessorWarnings(memo[index] || Object.create(null), item, selectionSetNode, "".concat(path, "[").concat(index, "]"), context);
|
|
143
158
|
});
|
|
144
159
|
}
|
|
145
|
-
return selectionSetNode.selections
|
|
160
|
+
return selectionSetNode.selections
|
|
161
|
+
.concat()
|
|
162
|
+
.sort(sortFragmentsLast)
|
|
163
|
+
.reduce(function (memo, selection) {
|
|
146
164
|
switch (selection.kind) {
|
|
147
165
|
case Kind.FIELD: {
|
|
148
166
|
var keyName = resultKeyNameFromField(selection);
|
|
149
167
|
var childSelectionSet = selection.selectionSet;
|
|
150
|
-
if (keyName in memo) {
|
|
168
|
+
if (keyName in memo && !childSelectionSet) {
|
|
151
169
|
return memo;
|
|
152
170
|
}
|
|
153
171
|
var value = data[keyName];
|
|
154
172
|
if (childSelectionSet) {
|
|
155
|
-
value = addFieldAccessorWarnings(memo[keyName] ||
|
|
173
|
+
value = addFieldAccessorWarnings(memo[keyName] ||
|
|
174
|
+
(Array.isArray(data[keyName]) ? [] : Object.create(null)), data[keyName], childSelectionSet, "".concat(path, ".").concat(keyName), context);
|
|
156
175
|
}
|
|
157
176
|
if (globalThis.__DEV__ !== false) {
|
|
158
|
-
|
|
177
|
+
if (keyName in memo) {
|
|
178
|
+
memo[keyName] = value;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
addAccessorWarning(memo, value, keyName, path, context);
|
|
182
|
+
}
|
|
159
183
|
}
|
|
160
184
|
if (!(globalThis.__DEV__ !== false)) {
|
|
161
185
|
memo[keyName] = data[keyName];
|
|
@@ -163,6 +187,10 @@ function addFieldAccessorWarnings(memo, data, selectionSetNode, path, context) {
|
|
|
163
187
|
return memo;
|
|
164
188
|
}
|
|
165
189
|
case Kind.INLINE_FRAGMENT: {
|
|
190
|
+
if (selection.typeCondition &&
|
|
191
|
+
!context.cache.fragmentMatches(selection, data.__typename)) {
|
|
192
|
+
return memo;
|
|
193
|
+
}
|
|
166
194
|
return addFieldAccessorWarnings(memo, data, selection.selectionSet, path, context);
|
|
167
195
|
}
|
|
168
196
|
case Kind.FRAGMENT_SPREAD: {
|
|
@@ -181,11 +209,19 @@ function addFieldAccessorWarnings(memo, data, selectionSetNode, path, context) {
|
|
|
181
209
|
}, memo);
|
|
182
210
|
}
|
|
183
211
|
function addAccessorWarning(data, value, fieldName, path, context) {
|
|
212
|
+
// In order to preserve the original shape of the data as much as possible, we
|
|
213
|
+
// want to skip adding a property with warning to the final result when the
|
|
214
|
+
// value is missing, otherwise our final result will contain additional
|
|
215
|
+
// properties that our original result did not have. This could happen with a
|
|
216
|
+
// deferred payload for example.
|
|
217
|
+
if (value === void 0) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
184
220
|
var getValue = function () {
|
|
185
|
-
if (
|
|
221
|
+
if (disableWarningsSlot.getValue()) {
|
|
186
222
|
return value;
|
|
187
223
|
}
|
|
188
|
-
globalThis.__DEV__ !== false && invariant.warn(
|
|
224
|
+
globalThis.__DEV__ !== false && invariant.warn(42, context.operationName ?
|
|
189
225
|
"".concat(context.operationType, " '").concat(context.operationName, "'")
|
|
190
226
|
: "anonymous ".concat(context.operationType), "".concat(path, ".").concat(fieldName).replace(/^\./, ""));
|
|
191
227
|
getValue = function () { return value; };
|
|
@@ -206,7 +242,13 @@ var issuedWarning = false;
|
|
|
206
242
|
function warnOnImproperCacheImplementation() {
|
|
207
243
|
if (!issuedWarning) {
|
|
208
244
|
issuedWarning = true;
|
|
209
|
-
globalThis.__DEV__ !== false && invariant.warn(
|
|
245
|
+
globalThis.__DEV__ !== false && invariant.warn(43);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function sortFragmentsLast(a, b) {
|
|
249
|
+
if (a.kind === b.kind) {
|
|
250
|
+
return 0;
|
|
210
251
|
}
|
|
252
|
+
return a.kind === Kind.FRAGMENT_SPREAD ? 1 : -1;
|
|
211
253
|
}
|
|
212
254
|
//# sourceMappingURL=masking.js.map
|
package/core/masking.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masking.js","sourceRoot":"","sources":["../../src/core/masking.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kind } from \"graphql\";\nimport type { FragmentDefinitionNode, SelectionSetNode } from \"graphql\";\nimport {\n createFragmentMap,\n resultKeyNameFromField,\n getFragmentDefinitions,\n getFragmentMaskMode,\n getOperationDefinition,\n maybeDeepFreeze,\n} from \"../utilities/index.js\";\nimport type { FragmentMap } from \"../utilities/index.js\";\nimport type { ApolloCache, DocumentNode, TypedDocumentNode } from \"./index.js\";\nimport { invariant } from \"../utilities/globals/index.js\";\n\ninterface MaskingContext {\n operationType: \"query\" | \"mutation\" | \"subscription\" | \"fragment\";\n operationName: string | undefined;\n fragmentMap: FragmentMap;\n cache: ApolloCache<unknown>;\n disableWarnings?: boolean;\n}\n\nexport function maskOperation<TData = unknown>(\n data: TData,\n document: DocumentNode | TypedDocumentNode<TData>,\n cache: ApolloCache<unknown>\n): TData {\n if (!cache.fragmentMatches) {\n if (__DEV__) {\n warnOnImproperCacheImplementation();\n }\n\n return data;\n }\n\n const definition = getOperationDefinition(document);\n\n invariant(\n definition,\n \"Expected a parsed GraphQL document with a query, mutation, or subscription.\"\n );\n\n if (data == null) {\n // Maintain the original `null` or `undefined` value\n return data;\n }\n\n const context: MaskingContext = {\n operationType: definition.operation,\n operationName: definition.name?.value,\n fragmentMap: createFragmentMap(getFragmentDefinitions(document)),\n cache,\n };\n\n const [masked, changed] = maskSelectionSet(\n data,\n definition.selectionSet,\n context\n );\n\n if (Object.isFrozen(data)) {\n context.disableWarnings = true;\n maybeDeepFreeze(masked);\n context.disableWarnings = false;\n }\n\n return changed ? masked : data;\n}\n\nexport function maskFragment<TData = unknown>(\n data: TData,\n document: TypedDocumentNode<TData> | DocumentNode,\n cache: ApolloCache<unknown>,\n fragmentName?: string\n): TData {\n if (!cache.fragmentMatches) {\n if (__DEV__) {\n warnOnImproperCacheImplementation();\n }\n\n return data;\n }\n\n const fragments = document.definitions.filter(\n (node): node is FragmentDefinitionNode =>\n node.kind === Kind.FRAGMENT_DEFINITION\n );\n\n if (typeof fragmentName === \"undefined\") {\n invariant(\n fragments.length === 1,\n `Found %s fragments. \\`fragmentName\\` must be provided when there is not exactly 1 fragment.`,\n fragments.length\n );\n fragmentName = fragments[0].name.value;\n }\n\n const fragment = fragments.find(\n (fragment) => fragment.name.value === fragmentName\n );\n\n invariant(\n !!fragment,\n `Could not find fragment with name \"%s\".`,\n fragmentName\n );\n\n if (data == null) {\n // Maintain the original `null` or `undefined` value\n return data;\n }\n\n const context: MaskingContext = {\n operationType: \"fragment\",\n operationName: fragment.name.value,\n fragmentMap: createFragmentMap(getFragmentDefinitions(document)),\n cache,\n };\n\n const [masked, changed] = maskSelectionSet(\n data,\n fragment.selectionSet,\n context\n );\n\n if (Object.isFrozen(data)) {\n context.disableWarnings = true;\n maybeDeepFreeze(masked);\n context.disableWarnings = false;\n }\n\n return changed ? masked : data;\n}\n\nfunction maskSelectionSet(\n data: any,\n selectionSet: SelectionSetNode,\n context: MaskingContext,\n path?: string | undefined\n): [data: any, changed: boolean] {\n if (Array.isArray(data)) {\n let changed = false;\n\n const masked = data.map((item, index) => {\n if (item === null) {\n return null;\n }\n\n const [masked, itemChanged] = maskSelectionSet(\n item,\n selectionSet,\n context,\n __DEV__ ? `${path || \"\"}[${index}]` : void 0\n );\n changed ||= itemChanged;\n\n return itemChanged ? masked : item;\n });\n\n return [changed ? masked : data, changed];\n }\n\n const result = selectionSet.selections.reduce<[any, boolean]>(\n ([memo, changed], selection) => {\n switch (selection.kind) {\n case Kind.FIELD: {\n const keyName = resultKeyNameFromField(selection);\n const childSelectionSet = selection.selectionSet;\n\n memo[keyName] = data[keyName];\n\n if (childSelectionSet && data[keyName] !== null) {\n const [masked, childChanged] = maskSelectionSet(\n data[keyName],\n childSelectionSet,\n context,\n __DEV__ ? `${path || \"\"}.${keyName}` : void 0\n );\n\n if (\n childChanged ||\n // This check prevents cases where masked fields may accidentally be\n // returned as part of this object when the fragment also selects\n // additional fields from the same child selection.\n Object.keys(masked).length !== Object.keys(data[keyName]).length\n ) {\n memo[keyName] = masked;\n changed = true;\n }\n }\n\n return [memo, changed];\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n selection.typeCondition &&\n !context.cache.fragmentMatches!(selection, data.__typename)\n ) {\n return [memo, changed];\n }\n\n const [fragmentData, childChanged] = maskSelectionSet(\n data,\n selection.selectionSet,\n context,\n path\n );\n\n return [\n {\n ...memo,\n ...fragmentData,\n },\n changed || childChanged,\n ];\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragmentName = selection.name.value;\n let fragment: FragmentDefinitionNode | null =\n context.fragmentMap[fragmentName] ||\n (context.fragmentMap[fragmentName] =\n context.cache.lookupFragment(fragmentName)!);\n invariant(\n fragment,\n \"Could not find fragment with name '%s'.\",\n fragmentName\n );\n\n const mode = getFragmentMaskMode(selection);\n\n if (mode === \"mask\") {\n return [memo, true];\n }\n\n if (__DEV__) {\n if (mode === \"migrate\") {\n return [\n addFieldAccessorWarnings(\n memo,\n data,\n fragment.selectionSet,\n path || \"\",\n context\n ),\n true,\n ];\n }\n }\n\n const [fragmentData, changed] = maskSelectionSet(\n data,\n fragment.selectionSet,\n context,\n path\n );\n\n return [{ ...memo, ...fragmentData }, changed];\n }\n }\n },\n [Object.create(null), false]\n );\n\n if (\"__typename\" in data && !(\"__typename\" in result[0])) {\n result[0].__typename = data.__typename;\n }\n\n return result;\n}\n\nfunction addFieldAccessorWarnings(\n memo: Record<string, unknown>,\n data: Record<string, unknown>,\n selectionSetNode: SelectionSetNode,\n path: string,\n context: MaskingContext\n) {\n if (Array.isArray(data)) {\n return data.map((item, index): unknown => {\n return addFieldAccessorWarnings(\n memo[index] || Object.create(null),\n item,\n selectionSetNode,\n `${path}[${index}]`,\n context\n );\n });\n }\n\n return selectionSetNode.selections.reduce<any>((memo, selection) => {\n switch (selection.kind) {\n case Kind.FIELD: {\n const keyName = resultKeyNameFromField(selection);\n const childSelectionSet = selection.selectionSet;\n\n if (keyName in memo) {\n return memo;\n }\n\n let value = data[keyName];\n\n if (childSelectionSet) {\n value = addFieldAccessorWarnings(\n memo[keyName] || Object.create(null),\n data[keyName] as Record<string, unknown>,\n childSelectionSet,\n `${path}.${keyName}`,\n context\n );\n }\n\n if (__DEV__) {\n addAccessorWarning(memo, value, keyName, path, context);\n }\n\n if (!__DEV__) {\n memo[keyName] = data[keyName];\n }\n\n return memo;\n }\n case Kind.INLINE_FRAGMENT: {\n return addFieldAccessorWarnings(\n memo,\n data,\n selection.selectionSet,\n path,\n context\n );\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragment = context.fragmentMap[selection.name.value];\n const mode = getFragmentMaskMode(selection);\n\n if (mode === \"mask\") {\n return memo;\n }\n\n if (mode === \"unmask\") {\n const [fragmentData] = maskSelectionSet(\n data,\n fragment.selectionSet,\n context,\n path\n );\n\n return Object.assign(memo, fragmentData);\n }\n\n return addFieldAccessorWarnings(\n memo,\n data,\n fragment.selectionSet,\n path,\n context\n );\n }\n }\n }, memo);\n}\n\nfunction addAccessorWarning(\n data: Record<string, any>,\n value: any,\n fieldName: string,\n path: string,\n context: MaskingContext\n) {\n let getValue = () => {\n if (context.disableWarnings) {\n return value;\n }\n\n invariant.warn(\n \"Accessing unmasked field on %s at path '%s'. This field will not be available when masking is enabled. Please read the field from the fragment instead.\",\n context.operationName ?\n `${context.operationType} '${context.operationName}'`\n : `anonymous ${context.operationType}`,\n `${path}.${fieldName}`.replace(/^\\./, \"\")\n );\n\n getValue = () => value;\n\n return value;\n };\n\n Object.defineProperty(data, fieldName, {\n get() {\n return getValue();\n },\n set(value) {\n getValue = () => value;\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nlet issuedWarning = false;\nfunction warnOnImproperCacheImplementation() {\n if (!issuedWarning) {\n issuedWarning = true;\n invariant.warn(\n \"The configured cache does not support data masking which effectively disables it. Please use a cache that supports data masking or disable data masking to silence this warning.\"\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"masking.js","sourceRoot":"","sources":["../../src/core/masking.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kind } from \"graphql\";\nimport type {\n FragmentDefinitionNode,\n SelectionNode,\n SelectionSetNode,\n} from \"graphql\";\nimport {\n createFragmentMap,\n resultKeyNameFromField,\n getFragmentDefinitions,\n getFragmentMaskMode,\n getOperationDefinition,\n maybeDeepFreeze,\n} from \"../utilities/index.js\";\nimport type { FragmentMap } from \"../utilities/index.js\";\nimport type { ApolloCache, DocumentNode, TypedDocumentNode } from \"./index.js\";\nimport { invariant } from \"../utilities/globals/index.js\";\nimport { equal } from \"@wry/equality\";\nimport { Slot } from \"optimism\";\n\ninterface MaskingContext {\n operationType: \"query\" | \"mutation\" | \"subscription\" | \"fragment\";\n operationName: string | undefined;\n fragmentMap: FragmentMap;\n cache: ApolloCache<unknown>;\n}\n\n// Contextual slot that allows us to disable accessor warnings on fields when in\n// migrate mode.\nexport const disableWarningsSlot = new Slot<boolean>();\n\nexport function maskOperation<TData = unknown>(\n data: TData,\n document: DocumentNode | TypedDocumentNode<TData>,\n cache: ApolloCache<unknown>\n): TData {\n if (!cache.fragmentMatches) {\n if (__DEV__) {\n warnOnImproperCacheImplementation();\n }\n\n return data;\n }\n\n const definition = getOperationDefinition(document);\n\n invariant(\n definition,\n \"Expected a parsed GraphQL document with a query, mutation, or subscription.\"\n );\n\n if (data == null) {\n // Maintain the original `null` or `undefined` value\n return data;\n }\n\n const context: MaskingContext = {\n operationType: definition.operation,\n operationName: definition.name?.value,\n fragmentMap: createFragmentMap(getFragmentDefinitions(document)),\n cache,\n };\n\n const [masked, changed] = maskSelectionSet(\n data,\n definition.selectionSet,\n context\n );\n\n if (Object.isFrozen(data)) {\n disableWarningsSlot.withValue(true, maybeDeepFreeze, [masked]);\n }\n\n return changed ? masked : data;\n}\n\nexport function maskFragment<TData = unknown>(\n data: TData,\n document: TypedDocumentNode<TData> | DocumentNode,\n cache: ApolloCache<unknown>,\n fragmentName?: string\n): TData {\n if (!cache.fragmentMatches) {\n if (__DEV__) {\n warnOnImproperCacheImplementation();\n }\n\n return data;\n }\n\n const fragments = document.definitions.filter(\n (node): node is FragmentDefinitionNode =>\n node.kind === Kind.FRAGMENT_DEFINITION\n );\n\n if (typeof fragmentName === \"undefined\") {\n invariant(\n fragments.length === 1,\n `Found %s fragments. \\`fragmentName\\` must be provided when there is not exactly 1 fragment.`,\n fragments.length\n );\n fragmentName = fragments[0].name.value;\n }\n\n const fragment = fragments.find(\n (fragment) => fragment.name.value === fragmentName\n );\n\n invariant(\n !!fragment,\n `Could not find fragment with name \"%s\".`,\n fragmentName\n );\n\n if (data == null) {\n // Maintain the original `null` or `undefined` value\n return data;\n }\n\n if (equal(data, {})) {\n // Return early and skip the masking algorithm if we don't have any data\n // yet. This can happen when cache.diff returns an empty object which is\n // used from watchFragment.\n return data;\n }\n\n const context: MaskingContext = {\n operationType: \"fragment\",\n operationName: fragment.name.value,\n fragmentMap: createFragmentMap(getFragmentDefinitions(document)),\n cache,\n };\n\n const [masked, changed] = maskSelectionSet(\n data,\n fragment.selectionSet,\n context\n );\n\n if (Object.isFrozen(data)) {\n disableWarningsSlot.withValue(true, maybeDeepFreeze, [masked]);\n }\n\n return changed ? masked : data;\n}\n\nfunction maskSelectionSet(\n data: any,\n selectionSet: SelectionSetNode,\n context: MaskingContext,\n path?: string | undefined\n): [data: any, changed: boolean] {\n if (Array.isArray(data)) {\n let changed = false;\n\n const masked = data.map((item, index) => {\n if (item === null) {\n return null;\n }\n\n const [masked, itemChanged] = maskSelectionSet(\n item,\n selectionSet,\n context,\n __DEV__ ? `${path || \"\"}[${index}]` : void 0\n );\n changed ||= itemChanged;\n\n return itemChanged ? masked : item;\n });\n\n return [changed ? masked : data, changed];\n }\n\n const result = selectionSet.selections\n .concat()\n .sort(sortFragmentsLast)\n .reduce<[any, boolean]>(\n ([memo, changed], selection) => {\n switch (selection.kind) {\n case Kind.FIELD: {\n const keyName = resultKeyNameFromField(selection);\n const childSelectionSet = selection.selectionSet;\n\n memo[keyName] = data[keyName];\n\n if (memo[keyName] === void 0) {\n delete memo[keyName];\n }\n\n if (\n keyName in memo &&\n childSelectionSet &&\n data[keyName] !== null\n ) {\n const [masked, childChanged] = maskSelectionSet(\n data[keyName],\n childSelectionSet,\n context,\n __DEV__ ? `${path || \"\"}.${keyName}` : void 0\n );\n\n if (\n childChanged ||\n // This check prevents cases where masked fields may accidentally be\n // returned as part of this object when the fragment also selects\n // additional fields from the same child selection.\n Object.keys(masked).length !== Object.keys(data[keyName]).length\n ) {\n memo[keyName] = masked;\n changed = true;\n }\n }\n\n return [memo, changed];\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n selection.typeCondition &&\n !context.cache.fragmentMatches!(selection, data.__typename)\n ) {\n return [memo, changed];\n }\n\n const [fragmentData, childChanged] = maskSelectionSet(\n data,\n selection.selectionSet,\n context,\n path\n );\n\n return [\n {\n ...memo,\n ...fragmentData,\n },\n changed || childChanged,\n ];\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragmentName = selection.name.value;\n let fragment: FragmentDefinitionNode | null =\n context.fragmentMap[fragmentName] ||\n (context.fragmentMap[fragmentName] =\n context.cache.lookupFragment(fragmentName)!);\n invariant(\n fragment,\n \"Could not find fragment with name '%s'.\",\n fragmentName\n );\n\n const mode = getFragmentMaskMode(selection);\n\n if (mode === \"mask\") {\n return [memo, true];\n }\n\n if (__DEV__) {\n if (mode === \"migrate\") {\n return [\n addFieldAccessorWarnings(\n memo,\n data,\n fragment.selectionSet,\n path || \"\",\n context\n ),\n true,\n ];\n }\n }\n\n const [fragmentData, changed] = maskSelectionSet(\n data,\n fragment.selectionSet,\n context,\n path\n );\n\n return [{ ...memo, ...fragmentData }, changed];\n }\n }\n },\n [Object.create(null), false]\n );\n\n if (data && \"__typename\" in data && !(\"__typename\" in result[0])) {\n result[0].__typename = data.__typename;\n }\n\n return result;\n}\n\nfunction addFieldAccessorWarnings(\n memo: Record<string, unknown>,\n data: Record<string, unknown>,\n selectionSetNode: SelectionSetNode,\n path: string,\n context: MaskingContext\n) {\n if (Array.isArray(data)) {\n return data.map((item, index): unknown => {\n return addFieldAccessorWarnings(\n memo[index] || Object.create(null),\n item,\n selectionSetNode,\n `${path}[${index}]`,\n context\n );\n });\n }\n\n return selectionSetNode.selections\n .concat()\n .sort(sortFragmentsLast)\n .reduce<any>((memo, selection) => {\n switch (selection.kind) {\n case Kind.FIELD: {\n const keyName = resultKeyNameFromField(selection);\n const childSelectionSet = selection.selectionSet;\n\n if (keyName in memo && !childSelectionSet) {\n return memo;\n }\n\n let value = data[keyName];\n\n if (childSelectionSet) {\n value = addFieldAccessorWarnings(\n memo[keyName] ||\n (Array.isArray(data[keyName]) ? [] : Object.create(null)),\n data[keyName] as Record<string, unknown>,\n childSelectionSet,\n `${path}.${keyName}`,\n context\n );\n }\n\n if (__DEV__) {\n if (keyName in memo) {\n memo[keyName] = value;\n } else {\n addAccessorWarning(memo, value, keyName, path, context);\n }\n }\n\n if (!__DEV__) {\n memo[keyName] = data[keyName];\n }\n\n return memo;\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n selection.typeCondition &&\n !context.cache.fragmentMatches!(selection, (data as any).__typename)\n ) {\n return memo;\n }\n\n return addFieldAccessorWarnings(\n memo,\n data,\n selection.selectionSet,\n path,\n context\n );\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragment = context.fragmentMap[selection.name.value];\n const mode = getFragmentMaskMode(selection);\n\n if (mode === \"mask\") {\n return memo;\n }\n\n if (mode === \"unmask\") {\n const [fragmentData] = maskSelectionSet(\n data,\n fragment.selectionSet,\n context,\n path\n );\n\n return Object.assign(memo, fragmentData);\n }\n\n return addFieldAccessorWarnings(\n memo,\n data,\n fragment.selectionSet,\n path,\n context\n );\n }\n }\n }, memo);\n}\n\nfunction addAccessorWarning(\n data: Record<string, any>,\n value: any,\n fieldName: string,\n path: string,\n context: MaskingContext\n) {\n // In order to preserve the original shape of the data as much as possible, we\n // want to skip adding a property with warning to the final result when the\n // value is missing, otherwise our final result will contain additional\n // properties that our original result did not have. This could happen with a\n // deferred payload for example.\n if (value === void 0) {\n return;\n }\n\n let getValue = () => {\n if (disableWarningsSlot.getValue()) {\n return value;\n }\n\n invariant.warn(\n \"Accessing unmasked field on %s at path '%s'. This field will not be available when masking is enabled. Please read the field from the fragment instead.\",\n context.operationName ?\n `${context.operationType} '${context.operationName}'`\n : `anonymous ${context.operationType}`,\n `${path}.${fieldName}`.replace(/^\\./, \"\")\n );\n\n getValue = () => value;\n\n return value;\n };\n\n Object.defineProperty(data, fieldName, {\n get() {\n return getValue();\n },\n set(value) {\n getValue = () => value;\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nlet issuedWarning = false;\nfunction warnOnImproperCacheImplementation() {\n if (!issuedWarning) {\n issuedWarning = true;\n invariant.warn(\n \"The configured cache does not support data masking which effectively disables it. Please use a cache that supports data masking or disable data masking to silence this warning.\"\n );\n }\n}\n\nfunction sortFragmentsLast(a: SelectionNode, b: SelectionNode) {\n if (a.kind === b.kind) {\n return 0;\n }\n\n return a.kind === Kind.FRAGMENT_SPREAD ? 1 : -1;\n}\n"]}
|