mirror of
https://github.com/CamHenlin/MessagesForMacintosh.git
synced 2024-11-29 08:49:40 +00:00
276 lines
13 KiB
JavaScript
276 lines
13 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var tslib_1 = require("tslib");
|
|
var apollo_utilities_1 = require("apollo-utilities");
|
|
var ts_invariant_1 = require("ts-invariant");
|
|
var objectCache_1 = require("./objectCache");
|
|
var depTrackingCache_1 = require("./depTrackingCache");
|
|
var WriteError = (function (_super) {
|
|
tslib_1.__extends(WriteError, _super);
|
|
function WriteError() {
|
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
_this.type = 'WriteError';
|
|
return _this;
|
|
}
|
|
return WriteError;
|
|
}(Error));
|
|
exports.WriteError = WriteError;
|
|
function enhanceErrorWithDocument(error, document) {
|
|
var enhancedError = new WriteError("Error writing result to store for query:\n " + JSON.stringify(document));
|
|
enhancedError.message += '\n' + error.message;
|
|
enhancedError.stack = error.stack;
|
|
return enhancedError;
|
|
}
|
|
exports.enhanceErrorWithDocument = enhanceErrorWithDocument;
|
|
var StoreWriter = (function () {
|
|
function StoreWriter() {
|
|
}
|
|
StoreWriter.prototype.writeQueryToStore = function (_a) {
|
|
var query = _a.query, result = _a.result, _b = _a.store, store = _b === void 0 ? depTrackingCache_1.defaultNormalizedCacheFactory() : _b, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject, fragmentMatcherFunction = _a.fragmentMatcherFunction;
|
|
return this.writeResultToStore({
|
|
dataId: 'ROOT_QUERY',
|
|
result: result,
|
|
document: query,
|
|
store: store,
|
|
variables: variables,
|
|
dataIdFromObject: dataIdFromObject,
|
|
fragmentMatcherFunction: fragmentMatcherFunction,
|
|
});
|
|
};
|
|
StoreWriter.prototype.writeResultToStore = function (_a) {
|
|
var dataId = _a.dataId, result = _a.result, document = _a.document, _b = _a.store, store = _b === void 0 ? depTrackingCache_1.defaultNormalizedCacheFactory() : _b, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject, fragmentMatcherFunction = _a.fragmentMatcherFunction;
|
|
var operationDefinition = apollo_utilities_1.getOperationDefinition(document);
|
|
try {
|
|
return this.writeSelectionSetToStore({
|
|
result: result,
|
|
dataId: dataId,
|
|
selectionSet: operationDefinition.selectionSet,
|
|
context: {
|
|
store: store,
|
|
processedData: {},
|
|
variables: apollo_utilities_1.assign({}, apollo_utilities_1.getDefaultValues(operationDefinition), variables),
|
|
dataIdFromObject: dataIdFromObject,
|
|
fragmentMap: apollo_utilities_1.createFragmentMap(apollo_utilities_1.getFragmentDefinitions(document)),
|
|
fragmentMatcherFunction: fragmentMatcherFunction,
|
|
},
|
|
});
|
|
}
|
|
catch (e) {
|
|
throw enhanceErrorWithDocument(e, document);
|
|
}
|
|
};
|
|
StoreWriter.prototype.writeSelectionSetToStore = function (_a) {
|
|
var _this = this;
|
|
var result = _a.result, dataId = _a.dataId, selectionSet = _a.selectionSet, context = _a.context;
|
|
var variables = context.variables, store = context.store, fragmentMap = context.fragmentMap;
|
|
selectionSet.selections.forEach(function (selection) {
|
|
var _a;
|
|
if (!apollo_utilities_1.shouldInclude(selection, variables)) {
|
|
return;
|
|
}
|
|
if (apollo_utilities_1.isField(selection)) {
|
|
var resultFieldKey = apollo_utilities_1.resultKeyNameFromField(selection);
|
|
var value = result[resultFieldKey];
|
|
if (typeof value !== 'undefined') {
|
|
_this.writeFieldToStore({
|
|
dataId: dataId,
|
|
value: value,
|
|
field: selection,
|
|
context: context,
|
|
});
|
|
}
|
|
else {
|
|
var isDefered = false;
|
|
var isClient = false;
|
|
if (selection.directives && selection.directives.length) {
|
|
isDefered = selection.directives.some(function (directive) { return directive.name && directive.name.value === 'defer'; });
|
|
isClient = selection.directives.some(function (directive) { return directive.name && directive.name.value === 'client'; });
|
|
}
|
|
if (!isDefered && !isClient && context.fragmentMatcherFunction) {
|
|
ts_invariant_1.invariant.warn("Missing field " + resultFieldKey + " in " + JSON.stringify(result, null, 2).substring(0, 100));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
var fragment = void 0;
|
|
if (apollo_utilities_1.isInlineFragment(selection)) {
|
|
fragment = selection;
|
|
}
|
|
else {
|
|
fragment = (fragmentMap || {})[selection.name.value];
|
|
ts_invariant_1.invariant(fragment, "No fragment named " + selection.name.value + ".");
|
|
}
|
|
var matches = true;
|
|
if (context.fragmentMatcherFunction && fragment.typeCondition) {
|
|
var id = dataId || 'self';
|
|
var idValue = apollo_utilities_1.toIdValue({ id: id, typename: undefined });
|
|
var fakeContext = {
|
|
store: new objectCache_1.ObjectCache((_a = {}, _a[id] = result, _a)),
|
|
cacheRedirects: {},
|
|
};
|
|
var match = context.fragmentMatcherFunction(idValue, fragment.typeCondition.name.value, fakeContext);
|
|
if (!apollo_utilities_1.isProduction() && match === 'heuristic') {
|
|
ts_invariant_1.invariant.error('WARNING: heuristic fragment matching going on!');
|
|
}
|
|
matches = !!match;
|
|
}
|
|
if (matches) {
|
|
_this.writeSelectionSetToStore({
|
|
result: result,
|
|
selectionSet: fragment.selectionSet,
|
|
dataId: dataId,
|
|
context: context,
|
|
});
|
|
}
|
|
}
|
|
});
|
|
return store;
|
|
};
|
|
StoreWriter.prototype.writeFieldToStore = function (_a) {
|
|
var _b;
|
|
var field = _a.field, value = _a.value, dataId = _a.dataId, context = _a.context;
|
|
var variables = context.variables, dataIdFromObject = context.dataIdFromObject, store = context.store;
|
|
var storeValue;
|
|
var storeObject;
|
|
var storeFieldName = apollo_utilities_1.storeKeyNameFromField(field, variables);
|
|
if (!field.selectionSet || value === null) {
|
|
storeValue =
|
|
value != null && typeof value === 'object'
|
|
?
|
|
{ type: 'json', json: value }
|
|
:
|
|
value;
|
|
}
|
|
else if (Array.isArray(value)) {
|
|
var generatedId = dataId + "." + storeFieldName;
|
|
storeValue = this.processArrayValue(value, generatedId, field.selectionSet, context);
|
|
}
|
|
else {
|
|
var valueDataId = dataId + "." + storeFieldName;
|
|
var generated = true;
|
|
if (!isGeneratedId(valueDataId)) {
|
|
valueDataId = '$' + valueDataId;
|
|
}
|
|
if (dataIdFromObject) {
|
|
var semanticId = dataIdFromObject(value);
|
|
ts_invariant_1.invariant(!semanticId || !isGeneratedId(semanticId), 'IDs returned by dataIdFromObject cannot begin with the "$" character.');
|
|
if (semanticId ||
|
|
(typeof semanticId === 'number' && semanticId === 0)) {
|
|
valueDataId = semanticId;
|
|
generated = false;
|
|
}
|
|
}
|
|
if (!isDataProcessed(valueDataId, field, context.processedData)) {
|
|
this.writeSelectionSetToStore({
|
|
dataId: valueDataId,
|
|
result: value,
|
|
selectionSet: field.selectionSet,
|
|
context: context,
|
|
});
|
|
}
|
|
var typename = value.__typename;
|
|
storeValue = apollo_utilities_1.toIdValue({ id: valueDataId, typename: typename }, generated);
|
|
storeObject = store.get(dataId);
|
|
var escapedId = storeObject && storeObject[storeFieldName];
|
|
if (escapedId !== storeValue && apollo_utilities_1.isIdValue(escapedId)) {
|
|
var hadTypename = escapedId.typename !== undefined;
|
|
var hasTypename = typename !== undefined;
|
|
var typenameChanged = hadTypename && hasTypename && escapedId.typename !== typename;
|
|
ts_invariant_1.invariant(!generated || escapedId.generated || typenameChanged, "Store error: the application attempted to write an object with no provided id but the store already contains an id of " + escapedId.id + " for this object. The selectionSet that was trying to be written is:\n" + JSON.stringify(field));
|
|
ts_invariant_1.invariant(!hadTypename || hasTypename, "Store error: the application attempted to write an object with no provided typename but the store already contains an object with typename of " + escapedId.typename + " for the object of id " + escapedId.id + ". The selectionSet that was trying to be written is:\n" + JSON.stringify(field));
|
|
if (escapedId.generated) {
|
|
if (typenameChanged) {
|
|
if (!generated) {
|
|
store.delete(escapedId.id);
|
|
}
|
|
}
|
|
else {
|
|
mergeWithGenerated(escapedId.id, storeValue.id, store);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
storeObject = store.get(dataId);
|
|
if (!storeObject || !apollo_utilities_1.isEqual(storeValue, storeObject[storeFieldName])) {
|
|
store.set(dataId, tslib_1.__assign(tslib_1.__assign({}, storeObject), (_b = {}, _b[storeFieldName] = storeValue, _b)));
|
|
}
|
|
};
|
|
StoreWriter.prototype.processArrayValue = function (value, generatedId, selectionSet, context) {
|
|
var _this = this;
|
|
return value.map(function (item, index) {
|
|
if (item === null) {
|
|
return null;
|
|
}
|
|
var itemDataId = generatedId + "." + index;
|
|
if (Array.isArray(item)) {
|
|
return _this.processArrayValue(item, itemDataId, selectionSet, context);
|
|
}
|
|
var generated = true;
|
|
if (context.dataIdFromObject) {
|
|
var semanticId = context.dataIdFromObject(item);
|
|
if (semanticId) {
|
|
itemDataId = semanticId;
|
|
generated = false;
|
|
}
|
|
}
|
|
if (!isDataProcessed(itemDataId, selectionSet, context.processedData)) {
|
|
_this.writeSelectionSetToStore({
|
|
dataId: itemDataId,
|
|
result: item,
|
|
selectionSet: selectionSet,
|
|
context: context,
|
|
});
|
|
}
|
|
return apollo_utilities_1.toIdValue({ id: itemDataId, typename: item.__typename }, generated);
|
|
});
|
|
};
|
|
return StoreWriter;
|
|
}());
|
|
exports.StoreWriter = StoreWriter;
|
|
function isGeneratedId(id) {
|
|
return id[0] === '$';
|
|
}
|
|
function mergeWithGenerated(generatedKey, realKey, cache) {
|
|
if (generatedKey === realKey) {
|
|
return false;
|
|
}
|
|
var generated = cache.get(generatedKey);
|
|
var real = cache.get(realKey);
|
|
var madeChanges = false;
|
|
Object.keys(generated).forEach(function (key) {
|
|
var value = generated[key];
|
|
var realValue = real[key];
|
|
if (apollo_utilities_1.isIdValue(value) &&
|
|
isGeneratedId(value.id) &&
|
|
apollo_utilities_1.isIdValue(realValue) &&
|
|
!apollo_utilities_1.isEqual(value, realValue) &&
|
|
mergeWithGenerated(value.id, realValue.id, cache)) {
|
|
madeChanges = true;
|
|
}
|
|
});
|
|
cache.delete(generatedKey);
|
|
var newRealValue = tslib_1.__assign(tslib_1.__assign({}, generated), real);
|
|
if (apollo_utilities_1.isEqual(newRealValue, real)) {
|
|
return madeChanges;
|
|
}
|
|
cache.set(realKey, newRealValue);
|
|
return true;
|
|
}
|
|
function isDataProcessed(dataId, field, processedData) {
|
|
if (!processedData) {
|
|
return false;
|
|
}
|
|
if (processedData[dataId]) {
|
|
if (processedData[dataId].indexOf(field) >= 0) {
|
|
return true;
|
|
}
|
|
else {
|
|
processedData[dataId].push(field);
|
|
}
|
|
}
|
|
else {
|
|
processedData[dataId] = [field];
|
|
}
|
|
return false;
|
|
}
|
|
//# sourceMappingURL=writeToStore.js.map
|