UNPKG

apollo-client

Version:
173 lines 6.33 kB
"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