apollo-client
Version:
A simple yet functional GraphQL client.
143 lines • 5.6 kB
JavaScript
"use strict";
var isArray = require('lodash.isarray');
var isNull = require('lodash.isnull');
var isString = require('lodash.isstring');
var isNumber = require('lodash.isnumber');
var isBoolean = require('lodash.isboolean');
var isUndefined = require('lodash.isundefined');
var assign = require('lodash.assign');
var getFromAST_1 = require('../queries/getFromAST');
var storeUtils_1 = require('./storeUtils');
function writeFragmentToStore(_a) {
var result = _a.result, fragment = _a.fragment, _b = _a.store, store = _b === void 0 ? {} : _b, variables = _a.variables, _c = _a.dataIdFromObject, dataIdFromObject = _c === void 0 ? null : _c;
if (!fragment) {
throw new Error('Must pass fragment.');
}
var parsedFragment = getFromAST_1.getFragmentDefinition(fragment);
var selectionSet = parsedFragment.selectionSet;
if (!result['id']) {
throw new Error('Result must have id when writing fragment to store.');
}
return writeSelectionSetToStore({
dataId: result['id'],
result: result,
selectionSet: selectionSet,
store: store,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
}
exports.writeFragmentToStore = writeFragmentToStore;
function writeQueryToStore(_a) {
var result = _a.result, query = _a.query, _b = _a.store, store = _b === void 0 ? {} : _b, variables = _a.variables, _c = _a.dataIdFromObject, dataIdFromObject = _c === void 0 ? null : _c;
var queryDefinition = getFromAST_1.getQueryDefinition(query);
return writeSelectionSetToStore({
dataId: 'ROOT_QUERY',
result: result,
selectionSet: queryDefinition.selectionSet,
store: store,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
}
exports.writeQueryToStore = writeQueryToStore;
function writeSelectionSetToStore(_a) {
var result = _a.result, dataId = _a.dataId, selectionSet = _a.selectionSet, _b = _a.store, store = _b === void 0 ? {} : _b, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject;
selectionSet.selections.forEach(function (selection) {
if (storeUtils_1.isField(selection)) {
var resultFieldKey = storeUtils_1.resultKeyNameFromField(selection);
var value = result[resultFieldKey];
if (isUndefined(value)) {
throw new Error("Can't find field " + resultFieldKey + " on result object " + dataId + ".");
}
writeFieldToStore({
dataId: dataId,
value: value,
variables: variables,
store: store,
field: selection,
dataIdFromObject: dataIdFromObject,
});
}
else if (storeUtils_1.isInlineFragment(selection)) {
writeSelectionSetToStore({
result: result,
selectionSet: selection.selectionSet,
store: store,
variables: variables,
dataId: dataId,
dataIdFromObject: dataIdFromObject,
});
}
else {
throw new Error('Non-inline fragments not supported.');
}
});
return store;
}
exports.writeSelectionSetToStore = writeSelectionSetToStore;
function writeFieldToStore(_a) {
var field = _a.field, value = _a.value, variables = _a.variables, store = _a.store, dataId = _a.dataId, dataIdFromObject = _a.dataIdFromObject;
var storeValue;
var storeFieldName = storeUtils_1.storeKeyNameFromField(field, variables);
if (isString(value) || isNumber(value) || isBoolean(value) || isNull(value)) {
storeValue = value;
}
else if (isArray(value)) {
if (isNull(field.selectionSet)) {
storeValue = value;
}
else {
var thisIdList_1 = [];
value.forEach(function (item, index) {
if (isNull(item)) {
thisIdList_1.push(null);
}
else {
var itemDataId = dataId + "." + storeFieldName + "." + index;
if (dataIdFromObject) {
var semanticId = dataIdFromObject(item);
if (semanticId) {
itemDataId = semanticId;
}
}
thisIdList_1.push(itemDataId);
writeSelectionSetToStore({
dataId: itemDataId,
result: item,
store: store,
selectionSet: field.selectionSet,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
}
});
storeValue = thisIdList_1;
}
}
else {
var valueDataId = dataId + "." + storeFieldName;
if (dataIdFromObject) {
var semanticId = dataIdFromObject(value);
if (semanticId) {
valueDataId = semanticId;
}
}
writeSelectionSetToStore({
dataId: valueDataId,
result: value,
store: store,
selectionSet: field.selectionSet,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
storeValue = valueDataId;
}
var newStoreObj = assign({}, store[dataId], (_b = {},
_b[storeFieldName] = storeValue,
_b
));
store[dataId] = newStoreObj;
var _b;
}
//# sourceMappingURL=writeToStore.js.map