apollo-client
Version:
A simple yet functional GraphQL client.
173 lines • 6.33 kB
JavaScript
"use strict";
var isArray = require('lodash.isarray');
var isNull = require('lodash.isnull');
var isString = require('lodash.isstring');
var has = require('lodash.has');
var assign = require('lodash.assign');
var storeUtils_1 = require('./storeUtils');
var getFromAST_1 = require('../queries/getFromAST');
function diffQueryAgainstStore(_a) {
var store = _a.store, query = _a.query, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject;
var queryDef = getFromAST_1.getQueryDefinition(query);
return diffSelectionSetAgainstStore({
store: store,
rootId: 'ROOT_QUERY',
selectionSet: queryDef.selectionSet,
throwOnMissingField: false,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
}
exports.diffQueryAgainstStore = diffQueryAgainstStore;
function diffFragmentAgainstStore(_a) {
var store = _a.store, fragment = _a.fragment, rootId = _a.rootId, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject;
var fragmentDef = getFromAST_1.getFragmentDefinition(fragment);
return diffSelectionSetAgainstStore({
store: store,
rootId: rootId,
selectionSet: fragmentDef.selectionSet,
throwOnMissingField: false,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
}
exports.diffFragmentAgainstStore = diffFragmentAgainstStore;
function diffSelectionSetAgainstStore(_a) {
var selectionSet = _a.selectionSet, store = _a.store, rootId = _a.rootId, _b = _a.throwOnMissingField, throwOnMissingField = _b === void 0 ? false : _b, variables = _a.variables, dataIdFromObject = _a.dataIdFromObject;
if (selectionSet.kind !== 'SelectionSet') {
throw new Error('Must be a selection set.');
}
var result = {};
var missingFields = [];
selectionSet.selections.forEach(function (selection) {
var missingFieldPushed = false;
function pushMissingField(missingField) {
if (!missingFieldPushed) {
missingFields.push(missingField);
missingFieldPushed = true;
}
}
if (storeUtils_1.isField(selection)) {
var _a = diffFieldAgainstStore({
field: selection,
throwOnMissingField: throwOnMissingField,
variables: variables,
rootId: rootId,
store: store,
dataIdFromObject: dataIdFromObject,
}), fieldResult = _a.result, fieldIsMissing = _a.isMissing;
if (fieldIsMissing) {
pushMissingField(selection);
}
else {
var resultFieldKey = storeUtils_1.resultKeyNameFromField(selection);
result[resultFieldKey] = fieldResult;
}
}
else if (storeUtils_1.isInlineFragment(selection)) {
var _b = diffSelectionSetAgainstStore({
selectionSet: selection.selectionSet,
throwOnMissingField: throwOnMissingField,
variables: variables,
rootId: rootId,
store: store,
dataIdFromObject: dataIdFromObject,
}), fieldResult = _b.result, fieldIsMissing = _b.isMissing;
if (fieldIsMissing) {
pushMissingField(selection);
}
else {
assign(result, fieldResult);
}
}
else {
throw new Error('Named fragments not yet supported.');
}
});
var isMissing;
var missingSelectionSets;
if (missingFields.length) {
if (rootId === 'ROOT_QUERY') {
var typeName = 'Query';
missingSelectionSets = [
{
id: rootId,
typeName: typeName,
selectionSet: {
kind: 'SelectionSet',
selections: missingFields,
},
},
];
}
else {
isMissing = 'true';
}
}
return {
result: result,
isMissing: isMissing,
missingSelectionSets: missingSelectionSets,
};
}
exports.diffSelectionSetAgainstStore = diffSelectionSetAgainstStore;
function diffFieldAgainstStore(_a) {
var field = _a.field, throwOnMissingField = _a.throwOnMissingField, variables = _a.variables, rootId = _a.rootId, store = _a.store, dataIdFromObject = _a.dataIdFromObject;
var storeObj = store[rootId] || {};
var storeFieldKey = storeUtils_1.storeKeyNameFromField(field, variables);
if (!has(storeObj, storeFieldKey)) {
if (throwOnMissingField) {
throw new Error("Can't find field " + storeFieldKey + " on object " + storeObj + ".");
}
return {
isMissing: 'true',
};
}
var storeValue = storeObj[storeFieldKey];
if (!field.selectionSet) {
return {
result: storeValue,
};
}
if (isNull(storeValue)) {
return {
result: null,
};
}
if (isArray(storeValue)) {
var isMissing_1;
var result = storeValue.map(function (id) {
if (isNull(id)) {
return null;
}
var itemDiffResult = diffSelectionSetAgainstStore({
store: store,
throwOnMissingField: throwOnMissingField,
rootId: id,
selectionSet: field.selectionSet,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
if (itemDiffResult.isMissing) {
isMissing_1 = 'true';
}
return itemDiffResult.result;
});
return {
result: result,
isMissing: isMissing_1,
};
}
if (isString(storeValue)) {
return diffSelectionSetAgainstStore({
store: store,
throwOnMissingField: throwOnMissingField,
rootId: storeValue,
selectionSet: field.selectionSet,
variables: variables,
dataIdFromObject: dataIdFromObject,
});
}
throw new Error('Unexpected number value in the store where the query had a subselection.');
}
//# sourceMappingURL=diffAgainstStore.js.map