UNPKG

apollo-client

Version:
209 lines 8.07 kB
var __assign = (this && this.__assign) || Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; import { getOperationDefinition, getQueryDefinition, getFragmentDefinitions, createFragmentMap, } from '../queries/getFromAST'; import { storeKeyNameFromField, resultKeyNameFromField, isField, isInlineFragment, } from './storeUtils'; import { isIdValue, } from './storeUtils'; import { shouldInclude, } from '../queries/directives'; export function writeQueryToStore(_a) { var result = _a.result, query = _a.query, _b = _a.store, store = _b === void 0 ? {} : _b, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject, _c = _a.fragmentMap, fragmentMap = _c === void 0 ? {} : _c; var queryDefinition = getQueryDefinition(query); return writeSelectionSetToStore({ dataId: 'ROOT_QUERY', result: result, selectionSet: queryDefinition.selectionSet, context: { store: store, variables: variables, dataIdFromObject: dataIdFromObject, fragmentMap: fragmentMap, }, }); } export function writeResultToStore(_a) { var result = _a.result, dataId = _a.dataId, document = _a.document, _b = _a.store, store = _b === void 0 ? {} : _b, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject; var selectionSet = getOperationDefinition(document).selectionSet; var fragmentMap = createFragmentMap(getFragmentDefinitions(document)); return writeSelectionSetToStore({ result: result, dataId: dataId, selectionSet: selectionSet, context: { store: store, variables: variables, dataIdFromObject: dataIdFromObject, fragmentMap: fragmentMap, }, }); } export function writeSelectionSetToStore(_a) { var result = _a.result, dataId = _a.dataId, selectionSet = _a.selectionSet, context = _a.context; var variables = context.variables, store = context.store, dataIdFromObject = context.dataIdFromObject, fragmentMap = context.fragmentMap; selectionSet.selections.forEach(function (selection) { var included = shouldInclude(selection, variables); if (isField(selection)) { var resultFieldKey = resultKeyNameFromField(selection); var value = result[resultFieldKey]; if (value !== undefined) { writeFieldToStore({ dataId: dataId, value: value, field: selection, context: context, }); } } else if (isInlineFragment(selection)) { if (included) { writeSelectionSetToStore({ result: result, selectionSet: selection.selectionSet, dataId: dataId, context: context, }); } } else { var fragment = void 0; if (isInlineFragment(selection)) { fragment = selection; } else { fragment = (fragmentMap || {})[selection.name.value]; if (!fragment) { throw new Error("No fragment named " + selection.name.value + "."); } } if (included) { writeSelectionSetToStore({ result: result, selectionSet: fragment.selectionSet, dataId: dataId, context: context, }); } } }); return store; } function isGeneratedId(id) { return (id[0] === '$'); } function mergeWithGenerated(generatedKey, realKey, cache) { var generated = cache[generatedKey]; var real = cache[realKey]; Object.keys(generated).forEach(function (key) { var value = generated[key]; var realValue = real[key]; if (isIdValue(value) && isGeneratedId(value.id) && isIdValue(realValue)) { mergeWithGenerated(value.id, realValue.id, cache); } delete cache[generatedKey]; cache[realKey] = __assign({}, generated, real); }); } function writeFieldToStore(_a) { var field = _a.field, value = _a.value, dataId = _a.dataId, context = _a.context; var variables = context.variables, dataIdFromObject = context.dataIdFromObject, store = context.store, fragmentMap = context.fragmentMap; var storeValue; var storeFieldName = storeKeyNameFromField(field, variables); var shouldMerge = false; var generatedKey = ''; 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 = 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); if (semanticId && isGeneratedId(semanticId)) { throw new Error('IDs returned by dataIdFromObject cannot begin with the "$" character.'); } if (semanticId) { valueDataId = semanticId; generated = false; } } writeSelectionSetToStore({ dataId: valueDataId, result: value, selectionSet: field.selectionSet, context: context, }); storeValue = { type: 'id', id: valueDataId, generated: generated, }; if (store[dataId] && store[dataId][storeFieldName] !== storeValue) { var escapedId = store[dataId][storeFieldName]; if (isIdValue(storeValue) && storeValue.generated && isIdValue(escapedId) && !escapedId.generated) { throw new Error("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.")); } if (isIdValue(escapedId) && escapedId.generated) { generatedKey = escapedId.id; shouldMerge = true; } } } var newStoreObj = __assign({}, store[dataId], (_b = {}, _b[storeFieldName] = storeValue, _b)); if (shouldMerge) { mergeWithGenerated(generatedKey, storeValue.id, store); } if (!store[dataId] || storeValue !== store[dataId][storeFieldName]) { store[dataId] = newStoreObj; } var _b; } function processArrayValue(value, generatedId, selectionSet, context) { return value.map(function (item, index) { if (item === null) { return null; } var itemDataId = generatedId + "." + index; if (Array.isArray(item)) { return processArrayValue(item, itemDataId, selectionSet, context); } var generated = true; if (context.dataIdFromObject) { var semanticId = context.dataIdFromObject(item); if (semanticId) { itemDataId = semanticId; generated = false; } } writeSelectionSetToStore({ dataId: itemDataId, result: item, selectionSet: selectionSet, context: context, }); var idStoreValue = { type: 'id', id: itemDataId, generated: generated, }; return idStoreValue; }); } //# sourceMappingURL=writeToStore.js.map