UNPKG

apollo-client-cors-hack

Version:

A simple yet functional GraphQL client.

256 lines 10.4 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); 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 { getDefaultValues, getOperationDefinition, getQueryDefinition, getFragmentDefinitions, createFragmentMap, } from '../queries/getFromAST'; import { storeKeyNameFromField, resultKeyNameFromField, isField, isInlineFragment, } from './storeUtils'; import { isIdValue, } from './storeUtils'; import { shouldInclude, } from '../queries/directives'; import { isProduction, } from '../util/environment'; import { assign, } from '../util/assign'; var WriteError = (function (_super) { __extends(WriteError, _super); function WriteError() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = 'WriteError'; return _this; } return WriteError; }(Error)); 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, fragmentMatcherFunction = _a.fragmentMatcherFunction; var queryDefinition = getQueryDefinition(query); variables = assign({}, getDefaultValues(queryDefinition), variables); return writeSelectionSetToStore({ dataId: 'ROOT_QUERY', result: result, selectionSet: queryDefinition.selectionSet, context: { store: store, variables: variables, dataIdFromObject: dataIdFromObject, fragmentMap: fragmentMap, fragmentMatcherFunction: fragmentMatcherFunction, }, }); } export function writeResultToStore(_a) { var dataId = _a.dataId, result = _a.result, document = _a.document, _b = _a.store, store = _b === void 0 ? {} : _b, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject, fragmentMatcherFunction = _a.fragmentMatcherFunction; var operationDefinition = getOperationDefinition(document); var selectionSet = operationDefinition.selectionSet; var fragmentMap = createFragmentMap(getFragmentDefinitions(document)); variables = assign({}, getDefaultValues(operationDefinition), variables); try { return writeSelectionSetToStore({ result: result, dataId: dataId, selectionSet: selectionSet, context: { store: store, variables: variables, dataIdFromObject: dataIdFromObject, fragmentMap: fragmentMap, fragmentMatcherFunction: fragmentMatcherFunction, }, }); } catch (e) { var e2 = new Error("Error writing result to store for query " + (document.loc && document.loc.source.body)); e2.message += '/n' + e.message; e2.stack = e.stack; throw e2; } } 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 (included) { if (typeof value !== 'undefined') { writeFieldToStore({ dataId: dataId, value: value, field: selection, context: context, }); } else { if (context.fragmentMatcherFunction) { if (!isProduction()) { console.warn("Missing field " + resultFieldKey); } } } } } 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 + "."); } } var matches = true; if (context.fragmentMatcherFunction && fragment.typeCondition) { var idValue = { type: 'id', id: 'self', generated: false }; var fakeContext = { store: { 'self': result }, returnPartialData: false, hasMissingField: false, customResolvers: {}, }; matches = context.fragmentMatcherFunction(idValue, fragment.typeCondition.name.value, fakeContext); if (fakeContext.returnPartialData) { console.error('WARNING: heuristic fragment matching going on!'); } } if (included && matches) { 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