UNPKG

@apollo/client

Version:

A fully-featured caching GraphQL client.

1,341 lines (1,307 loc) 314 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib = require('tslib'); var tsInvariant = require('ts-invariant'); var equality = require('@wry/equality'); var zenObservableTs = require('zen-observable-ts'); require('symbol-observable'); var graphql = require('graphql'); var optimism = require('optimism'); var context = require('@wry/context'); var trie = require('@wry/trie'); var graphqlTag = require('graphql-tag'); var React = require('react'); function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { for (var k in e) { n[k] = e[k]; } } n["default"] = e; return Object.freeze(n); } var React__namespace = /*#__PURE__*/_interopNamespace(React); function maybe(thunk) { try { return thunk(); } catch (_a) { } } function shouldInclude(_a, variables) { var directives = _a.directives; if (!directives || !directives.length) { return true; } return getInclusionDirectives(directives).every(function (_a) { var directive = _a.directive, ifArgument = _a.ifArgument; var evaledValue = false; if (ifArgument.value.kind === 'Variable') { evaledValue = variables && variables[ifArgument.value.name.value]; __DEV__ ? tsInvariant.invariant(evaledValue !== void 0, "Invalid variable referenced in @".concat(directive.name.value, " directive.")) : tsInvariant.invariant(evaledValue !== void 0, 40); } else { evaledValue = ifArgument.value.value; } return directive.name.value === 'skip' ? !evaledValue : evaledValue; }); } function hasDirectives(names, root, all) { var nameSet = new Set(names); var uniqueCount = nameSet.size; graphql.visit(root, { Directive: function (node) { if (nameSet.delete(node.name.value) && (!all || !nameSet.size)) { return graphql.BREAK; } }, }); return all ? !nameSet.size : nameSet.size < uniqueCount; } function hasClientExports(document) { return document && hasDirectives(['client', 'export'], document, true); } function isInclusionDirective(_a) { var value = _a.name.value; return value === 'skip' || value === 'include'; } function getInclusionDirectives(directives) { var result = []; if (directives && directives.length) { directives.forEach(function (directive) { if (!isInclusionDirective(directive)) return; var directiveArguments = directive.arguments; var directiveName = directive.name.value; __DEV__ ? tsInvariant.invariant(directiveArguments && directiveArguments.length === 1, "Incorrect number of arguments for the @".concat(directiveName, " directive.")) : tsInvariant.invariant(directiveArguments && directiveArguments.length === 1, 41); var ifArgument = directiveArguments[0]; __DEV__ ? tsInvariant.invariant(ifArgument.name && ifArgument.name.value === 'if', "Invalid argument for the @".concat(directiveName, " directive.")) : tsInvariant.invariant(ifArgument.name && ifArgument.name.value === 'if', 42); var ifValue = ifArgument.value; __DEV__ ? tsInvariant.invariant(ifValue && (ifValue.kind === 'Variable' || ifValue.kind === 'BooleanValue'), "Argument for the @".concat(directiveName, " directive must be a variable or a boolean value.")) : tsInvariant.invariant(ifValue && (ifValue.kind === 'Variable' || ifValue.kind === 'BooleanValue'), 43); result.push({ directive: directive, ifArgument: ifArgument }); }); } return result; } function getFragmentQueryDocument(document, fragmentName) { var actualFragmentName = fragmentName; var fragments = []; document.definitions.forEach(function (definition) { if (definition.kind === 'OperationDefinition') { throw __DEV__ ? new tsInvariant.InvariantError("Found a ".concat(definition.operation, " operation").concat(definition.name ? " named '".concat(definition.name.value, "'") : '', ". ") + 'No operations are allowed when using a fragment as a query. Only fragments are allowed.') : new tsInvariant.InvariantError(44); } if (definition.kind === 'FragmentDefinition') { fragments.push(definition); } }); if (typeof actualFragmentName === 'undefined') { __DEV__ ? tsInvariant.invariant(fragments.length === 1, "Found ".concat(fragments.length, " fragments. `fragmentName` must be provided when there is not exactly 1 fragment.")) : tsInvariant.invariant(fragments.length === 1, 45); actualFragmentName = fragments[0].name.value; } var query = tslib.__assign(tslib.__assign({}, document), { definitions: tslib.__spreadArray([ { kind: 'OperationDefinition', operation: 'query', selectionSet: { kind: 'SelectionSet', selections: [ { kind: 'FragmentSpread', name: { kind: 'Name', value: actualFragmentName, }, }, ], }, } ], document.definitions, true) }); return query; } function createFragmentMap(fragments) { if (fragments === void 0) { fragments = []; } var symTable = {}; fragments.forEach(function (fragment) { symTable[fragment.name.value] = fragment; }); return symTable; } function getFragmentFromSelection(selection, fragmentMap) { switch (selection.kind) { case 'InlineFragment': return selection; case 'FragmentSpread': { var fragmentName = selection.name.value; if (typeof fragmentMap === "function") { return fragmentMap(fragmentName); } var fragment = fragmentMap && fragmentMap[fragmentName]; __DEV__ ? tsInvariant.invariant(fragment, "No fragment named ".concat(fragmentName)) : tsInvariant.invariant(fragment, 46); return fragment || null; } default: return null; } } function isNonNullObject(obj) { return obj !== null && typeof obj === 'object'; } function makeReference(id) { return { __ref: String(id) }; } function isReference(obj) { return Boolean(obj && typeof obj === 'object' && typeof obj.__ref === 'string'); } function isDocumentNode(value) { return (isNonNullObject(value) && value.kind === "Document" && Array.isArray(value.definitions)); } function isStringValue(value) { return value.kind === 'StringValue'; } function isBooleanValue(value) { return value.kind === 'BooleanValue'; } function isIntValue(value) { return value.kind === 'IntValue'; } function isFloatValue(value) { return value.kind === 'FloatValue'; } function isVariable(value) { return value.kind === 'Variable'; } function isObjectValue(value) { return value.kind === 'ObjectValue'; } function isListValue(value) { return value.kind === 'ListValue'; } function isEnumValue(value) { return value.kind === 'EnumValue'; } function isNullValue(value) { return value.kind === 'NullValue'; } function valueToObjectRepresentation(argObj, name, value, variables) { if (isIntValue(value) || isFloatValue(value)) { argObj[name.value] = Number(value.value); } else if (isBooleanValue(value) || isStringValue(value)) { argObj[name.value] = value.value; } else if (isObjectValue(value)) { var nestedArgObj_1 = {}; value.fields.map(function (obj) { return valueToObjectRepresentation(nestedArgObj_1, obj.name, obj.value, variables); }); argObj[name.value] = nestedArgObj_1; } else if (isVariable(value)) { var variableValue = (variables || {})[value.name.value]; argObj[name.value] = variableValue; } else if (isListValue(value)) { argObj[name.value] = value.values.map(function (listValue) { var nestedArgArrayObj = {}; valueToObjectRepresentation(nestedArgArrayObj, name, listValue, variables); return nestedArgArrayObj[name.value]; }); } else if (isEnumValue(value)) { argObj[name.value] = value.value; } else if (isNullValue(value)) { argObj[name.value] = null; } else { throw __DEV__ ? new tsInvariant.InvariantError("The inline argument \"".concat(name.value, "\" of kind \"").concat(value.kind, "\"") + 'is not supported. Use variables instead of inline arguments to ' + 'overcome this limitation.') : new tsInvariant.InvariantError(55); } } function storeKeyNameFromField(field, variables) { var directivesObj = null; if (field.directives) { directivesObj = {}; field.directives.forEach(function (directive) { directivesObj[directive.name.value] = {}; if (directive.arguments) { directive.arguments.forEach(function (_a) { var name = _a.name, value = _a.value; return valueToObjectRepresentation(directivesObj[directive.name.value], name, value, variables); }); } }); } var argObj = null; if (field.arguments && field.arguments.length) { argObj = {}; field.arguments.forEach(function (_a) { var name = _a.name, value = _a.value; return valueToObjectRepresentation(argObj, name, value, variables); }); } return getStoreKeyName(field.name.value, argObj, directivesObj); } var KNOWN_DIRECTIVES = [ 'connection', 'include', 'skip', 'client', 'rest', 'export', ]; var getStoreKeyName = Object.assign(function (fieldName, args, directives) { if (args && directives && directives['connection'] && directives['connection']['key']) { if (directives['connection']['filter'] && directives['connection']['filter'].length > 0) { var filterKeys = directives['connection']['filter'] ? directives['connection']['filter'] : []; filterKeys.sort(); var filteredArgs_1 = {}; filterKeys.forEach(function (key) { filteredArgs_1[key] = args[key]; }); return "".concat(directives['connection']['key'], "(").concat(stringify(filteredArgs_1), ")"); } else { return directives['connection']['key']; } } var completeFieldName = fieldName; if (args) { var stringifiedArgs = stringify(args); completeFieldName += "(".concat(stringifiedArgs, ")"); } if (directives) { Object.keys(directives).forEach(function (key) { if (KNOWN_DIRECTIVES.indexOf(key) !== -1) return; if (directives[key] && Object.keys(directives[key]).length) { completeFieldName += "@".concat(key, "(").concat(stringify(directives[key]), ")"); } else { completeFieldName += "@".concat(key); } }); } return completeFieldName; }, { setStringify: function (s) { var previous = stringify; stringify = s; return previous; }, }); var stringify = function defaultStringify(value) { return JSON.stringify(value, stringifyReplacer); }; function stringifyReplacer(_key, value) { if (isNonNullObject(value) && !Array.isArray(value)) { value = Object.keys(value).sort().reduce(function (copy, key) { copy[key] = value[key]; return copy; }, {}); } return value; } function argumentsObjectFromField(field, variables) { if (field.arguments && field.arguments.length) { var argObj_1 = {}; field.arguments.forEach(function (_a) { var name = _a.name, value = _a.value; return valueToObjectRepresentation(argObj_1, name, value, variables); }); return argObj_1; } return null; } function resultKeyNameFromField(field) { return field.alias ? field.alias.value : field.name.value; } function getTypenameFromResult(result, selectionSet, fragmentMap) { if (typeof result.__typename === 'string') { return result.__typename; } for (var _i = 0, _a = selectionSet.selections; _i < _a.length; _i++) { var selection = _a[_i]; if (isField(selection)) { if (selection.name.value === '__typename') { return result[resultKeyNameFromField(selection)]; } } else { var typename = getTypenameFromResult(result, getFragmentFromSelection(selection, fragmentMap).selectionSet, fragmentMap); if (typeof typename === 'string') { return typename; } } } } function isField(selection) { return selection.kind === 'Field'; } function isInlineFragment(selection) { return selection.kind === 'InlineFragment'; } function checkDocument(doc) { __DEV__ ? tsInvariant.invariant(doc && doc.kind === 'Document', "Expecting a parsed GraphQL document. Perhaps you need to wrap the query string in a \"gql\" tag? http://docs.apollostack.com/apollo-client/core.html#gql") : tsInvariant.invariant(doc && doc.kind === 'Document', 47); var operations = doc.definitions .filter(function (d) { return d.kind !== 'FragmentDefinition'; }) .map(function (definition) { if (definition.kind !== 'OperationDefinition') { throw __DEV__ ? new tsInvariant.InvariantError("Schema type definitions not allowed in queries. Found: \"".concat(definition.kind, "\"")) : new tsInvariant.InvariantError(48); } return definition; }); __DEV__ ? tsInvariant.invariant(operations.length <= 1, "Ambiguous GraphQL document: contains ".concat(operations.length, " operations")) : tsInvariant.invariant(operations.length <= 1, 49); return doc; } function getOperationDefinition(doc) { checkDocument(doc); return doc.definitions.filter(function (definition) { return definition.kind === 'OperationDefinition'; })[0]; } function getOperationName(doc) { return (doc.definitions .filter(function (definition) { return definition.kind === 'OperationDefinition' && !!definition.name; }) .map(function (x) { return x.name.value; })[0] || null); } function getFragmentDefinitions(doc) { return doc.definitions.filter(function (definition) { return definition.kind === 'FragmentDefinition'; }); } function getQueryDefinition(doc) { var queryDef = getOperationDefinition(doc); __DEV__ ? tsInvariant.invariant(queryDef && queryDef.operation === 'query', 'Must contain a query definition.') : tsInvariant.invariant(queryDef && queryDef.operation === 'query', 50); return queryDef; } function getFragmentDefinition(doc) { __DEV__ ? tsInvariant.invariant(doc.kind === 'Document', "Expecting a parsed GraphQL document. Perhaps you need to wrap the query string in a \"gql\" tag? http://docs.apollostack.com/apollo-client/core.html#gql") : tsInvariant.invariant(doc.kind === 'Document', 51); __DEV__ ? tsInvariant.invariant(doc.definitions.length <= 1, 'Fragment must have exactly one definition.') : tsInvariant.invariant(doc.definitions.length <= 1, 52); var fragmentDef = doc.definitions[0]; __DEV__ ? tsInvariant.invariant(fragmentDef.kind === 'FragmentDefinition', 'Must be a fragment definition.') : tsInvariant.invariant(fragmentDef.kind === 'FragmentDefinition', 53); return fragmentDef; } function getMainDefinition(queryDoc) { checkDocument(queryDoc); var fragmentDefinition; for (var _i = 0, _a = queryDoc.definitions; _i < _a.length; _i++) { var definition = _a[_i]; if (definition.kind === 'OperationDefinition') { var operation = definition.operation; if (operation === 'query' || operation === 'mutation' || operation === 'subscription') { return definition; } } if (definition.kind === 'FragmentDefinition' && !fragmentDefinition) { fragmentDefinition = definition; } } if (fragmentDefinition) { return fragmentDefinition; } throw __DEV__ ? new tsInvariant.InvariantError('Expected a parsed GraphQL query with a query, mutation, subscription, or a fragment.') : new tsInvariant.InvariantError(54); } function getDefaultValues(definition) { var defaultValues = Object.create(null); var defs = definition && definition.variableDefinitions; if (defs && defs.length) { defs.forEach(function (def) { if (def.defaultValue) { valueToObjectRepresentation(defaultValues, def.variable.name, def.defaultValue); } }); } return defaultValues; } var isArray = Array.isArray; function isNonEmptyArray(value) { return Array.isArray(value) && value.length > 0; } var TYPENAME_FIELD = { kind: graphql.Kind.FIELD, name: { kind: graphql.Kind.NAME, value: '__typename', }, }; function isEmpty(op, fragmentMap) { return !op || op.selectionSet.selections.every(function (selection) { return selection.kind === graphql.Kind.FRAGMENT_SPREAD && isEmpty(fragmentMap[selection.name.value], fragmentMap); }); } function nullIfDocIsEmpty(doc) { return isEmpty(getOperationDefinition(doc) || getFragmentDefinition(doc), createFragmentMap(getFragmentDefinitions(doc))) ? null : doc; } function getDirectiveMatcher(directives) { var nameSet = new Set(); var tests = []; directives.forEach(function (directive) { if (directive.name) { nameSet.add(directive.name); } else if (directive.test) { tests.push(directive.test); } }); return function (directive) { return (nameSet.has(directive.name.value) || tests.some(function (test) { return test(directive); })); }; } function makeInUseGetterFunction(defaultKey) { var map = new Map(); return function inUseGetterFunction(key) { if (key === void 0) { key = defaultKey; } var inUse = map.get(key); if (!inUse) { map.set(key, inUse = { variables: new Set, fragmentSpreads: new Set, }); } return inUse; }; } function removeDirectivesFromDocument(directives, doc) { var getInUseByOperationName = makeInUseGetterFunction(""); var getInUseByFragmentName = makeInUseGetterFunction(""); var getInUse = function (ancestors) { for (var p = 0, ancestor = void 0; p < ancestors.length && (ancestor = ancestors[p]); ++p) { if (isArray(ancestor)) continue; if (ancestor.kind === graphql.Kind.OPERATION_DEFINITION) { return getInUseByOperationName(ancestor.name && ancestor.name.value); } if (ancestor.kind === graphql.Kind.FRAGMENT_DEFINITION) { return getInUseByFragmentName(ancestor.name.value); } } __DEV__ && tsInvariant.invariant.error("Could not find operation or fragment"); return null; }; var operationCount = 0; for (var i = doc.definitions.length - 1; i >= 0; --i) { if (doc.definitions[i].kind === graphql.Kind.OPERATION_DEFINITION) { ++operationCount; } } var directiveMatcher = getDirectiveMatcher(directives); var hasRemoveDirective = directives.some(function (directive) { return directive.remove; }); var shouldRemoveField = function (nodeDirectives) { return (hasRemoveDirective && nodeDirectives && nodeDirectives.some(directiveMatcher)); }; var originalFragmentDefsByPath = new Map(); var firstVisitMadeChanges = false; var fieldOrInlineFragmentVisitor = { enter: function (node) { if (shouldRemoveField(node.directives)) { firstVisitMadeChanges = true; return null; } }, }; var docWithoutDirectiveSubtrees = graphql.visit(doc, { Field: fieldOrInlineFragmentVisitor, InlineFragment: fieldOrInlineFragmentVisitor, VariableDefinition: { enter: function () { return false; }, }, Variable: { enter: function (node, _key, _parent, _path, ancestors) { var inUse = getInUse(ancestors); if (inUse) { inUse.variables.add(node.name.value); } }, }, FragmentSpread: { enter: function (node, _key, _parent, _path, ancestors) { if (shouldRemoveField(node.directives)) { firstVisitMadeChanges = true; return null; } var inUse = getInUse(ancestors); if (inUse) { inUse.fragmentSpreads.add(node.name.value); } }, }, FragmentDefinition: { enter: function (node, _key, _parent, path) { originalFragmentDefsByPath.set(JSON.stringify(path), node); }, leave: function (node, _key, _parent, path) { var originalNode = originalFragmentDefsByPath.get(JSON.stringify(path)); if (node === originalNode) { return node; } if (operationCount > 0 && node.selectionSet.selections.every(function (selection) { return (selection.kind === graphql.Kind.FIELD && selection.name.value === '__typename'); })) { getInUseByFragmentName(node.name.value).removed = true; firstVisitMadeChanges = true; return null; } }, }, Directive: { leave: function (node) { if (directiveMatcher(node)) { firstVisitMadeChanges = true; return null; } }, }, }); if (!firstVisitMadeChanges) { return doc; } var populateTransitiveVars = function (inUse) { if (!inUse.transitiveVars) { inUse.transitiveVars = new Set(inUse.variables); if (!inUse.removed) { inUse.fragmentSpreads.forEach(function (childFragmentName) { populateTransitiveVars(getInUseByFragmentName(childFragmentName)).transitiveVars.forEach(function (varName) { inUse.transitiveVars.add(varName); }); }); } } return inUse; }; var allFragmentNamesUsed = new Set(); docWithoutDirectiveSubtrees.definitions.forEach(function (def) { if (def.kind === graphql.Kind.OPERATION_DEFINITION) { populateTransitiveVars(getInUseByOperationName(def.name && def.name.value)).fragmentSpreads.forEach(function (childFragmentName) { allFragmentNamesUsed.add(childFragmentName); }); } else if (def.kind === graphql.Kind.FRAGMENT_DEFINITION && operationCount === 0 && !getInUseByFragmentName(def.name.value).removed) { allFragmentNamesUsed.add(def.name.value); } }); allFragmentNamesUsed.forEach(function (fragmentName) { populateTransitiveVars(getInUseByFragmentName(fragmentName)).fragmentSpreads.forEach(function (childFragmentName) { allFragmentNamesUsed.add(childFragmentName); }); }); var fragmentWillBeRemoved = function (fragmentName) { return !!(!allFragmentNamesUsed.has(fragmentName) || getInUseByFragmentName(fragmentName).removed); }; var enterVisitor = { enter: function (node) { if (fragmentWillBeRemoved(node.name.value)) { return null; } }, }; return nullIfDocIsEmpty(graphql.visit(docWithoutDirectiveSubtrees, { FragmentSpread: enterVisitor, FragmentDefinition: enterVisitor, OperationDefinition: { leave: function (node) { if (node.variableDefinitions) { var usedVariableNames_1 = populateTransitiveVars(getInUseByOperationName(node.name && node.name.value)).transitiveVars; if (usedVariableNames_1.size < node.variableDefinitions.length) { return tslib.__assign(tslib.__assign({}, node), { variableDefinitions: node.variableDefinitions.filter(function (varDef) { return usedVariableNames_1.has(varDef.variable.name.value); }) }); } } }, }, })); } var addTypenameToDocument = Object.assign(function (doc) { return graphql.visit(doc, { SelectionSet: { enter: function (node, _key, parent) { if (parent && parent.kind === graphql.Kind.OPERATION_DEFINITION) { return; } var selections = node.selections; if (!selections) { return; } var skip = selections.some(function (selection) { return (isField(selection) && (selection.name.value === '__typename' || selection.name.value.lastIndexOf('__', 0) === 0)); }); if (skip) { return; } var field = parent; if (isField(field) && field.directives && field.directives.some(function (d) { return d.name.value === 'export'; })) { return; } return tslib.__assign(tslib.__assign({}, node), { selections: tslib.__spreadArray(tslib.__spreadArray([], selections, true), [TYPENAME_FIELD], false) }); }, }, }); }, { added: function (field) { return field === TYPENAME_FIELD; }, }); var connectionRemoveConfig = { test: function (directive) { var willRemove = directive.name.value === 'connection'; if (willRemove) { if (!directive.arguments || !directive.arguments.some(function (arg) { return arg.name.value === 'key'; })) { __DEV__ && tsInvariant.invariant.warn('Removing an @connection directive even though it does not have a key. ' + 'You may want to use the key parameter to specify a store key.'); } } return willRemove; }, }; function removeConnectionDirectiveFromDocument(doc) { return removeDirectivesFromDocument([connectionRemoveConfig], checkDocument(doc)); } function buildQueryFromSelectionSet(document) { var definition = getMainDefinition(document); var definitionOperation = definition.operation; if (definitionOperation === 'query') { return document; } var modifiedDoc = graphql.visit(document, { OperationDefinition: { enter: function (node) { return tslib.__assign(tslib.__assign({}, node), { operation: 'query' }); }, }, }); return modifiedDoc; } function removeClientSetsFromDocument(document) { checkDocument(document); var modifiedDoc = removeDirectivesFromDocument([ { test: function (directive) { return directive.name.value === 'client'; }, remove: true, }, ], document); return modifiedDoc; } var hasOwnProperty$4 = Object.prototype.hasOwnProperty; function mergeDeep() { var sources = []; for (var _i = 0; _i < arguments.length; _i++) { sources[_i] = arguments[_i]; } return mergeDeepArray(sources); } function mergeDeepArray(sources) { var target = sources[0] || {}; var count = sources.length; if (count > 1) { var merger = new DeepMerger(); for (var i = 1; i < count; ++i) { target = merger.merge(target, sources[i]); } } return target; } var defaultReconciler = function (target, source, property) { return this.merge(target[property], source[property]); }; var DeepMerger = (function () { function DeepMerger(reconciler) { if (reconciler === void 0) { reconciler = defaultReconciler; } this.reconciler = reconciler; this.isObject = isNonNullObject; this.pastCopies = new Set(); } DeepMerger.prototype.merge = function (target, source) { var _this = this; var context = []; for (var _i = 2; _i < arguments.length; _i++) { context[_i - 2] = arguments[_i]; } if (isNonNullObject(source) && isNonNullObject(target)) { Object.keys(source).forEach(function (sourceKey) { if (hasOwnProperty$4.call(target, sourceKey)) { var targetValue = target[sourceKey]; if (source[sourceKey] !== targetValue) { var result = _this.reconciler.apply(_this, tslib.__spreadArray([target, source, sourceKey], context, false)); if (result !== targetValue) { target = _this.shallowCopyForMerge(target); target[sourceKey] = result; } } } else { target = _this.shallowCopyForMerge(target); target[sourceKey] = source[sourceKey]; } }); return target; } return source; }; DeepMerger.prototype.shallowCopyForMerge = function (value) { if (isNonNullObject(value)) { if (!this.pastCopies.has(value)) { if (Array.isArray(value)) { value = value.slice(0); } else { value = tslib.__assign({ __proto__: Object.getPrototypeOf(value) }, value); } this.pastCopies.add(value); } } return value; }; return DeepMerger; }()); var toString = Object.prototype.toString; function cloneDeep(value) { return cloneDeepHelper(value); } function cloneDeepHelper(val, seen) { switch (toString.call(val)) { case "[object Array]": { seen = seen || new Map; if (seen.has(val)) return seen.get(val); var copy_1 = val.slice(0); seen.set(val, copy_1); copy_1.forEach(function (child, i) { copy_1[i] = cloneDeepHelper(child, seen); }); return copy_1; } case "[object Object]": { seen = seen || new Map; if (seen.has(val)) return seen.get(val); var copy_2 = Object.create(Object.getPrototypeOf(val)); seen.set(val, copy_2); Object.keys(val).forEach(function (key) { copy_2[key] = cloneDeepHelper(val[key], seen); }); return copy_2; } default: return val; } } function deepFreeze(value) { var workSet = new Set([value]); workSet.forEach(function (obj) { if (isNonNullObject(obj) && shallowFreeze(obj) === obj) { Object.getOwnPropertyNames(obj).forEach(function (name) { if (isNonNullObject(obj[name])) workSet.add(obj[name]); }); } }); return value; } function shallowFreeze(obj) { if (__DEV__ && !Object.isFrozen(obj)) { try { Object.freeze(obj); } catch (e) { if (e instanceof TypeError) return null; throw e; } } return obj; } function maybeDeepFreeze(obj) { if (__DEV__) { deepFreeze(obj); } return obj; } function iterateObserversSafely(observers, method, argument) { var observersWithMethod = []; observers.forEach(function (obs) { return obs[method] && observersWithMethod.push(obs); }); observersWithMethod.forEach(function (obs) { return obs[method](argument); }); } function asyncMap(observable, mapFn, catchFn) { return new zenObservableTs.Observable(function (observer) { var next = observer.next, error = observer.error, complete = observer.complete; var activeCallbackCount = 0; var completed = false; var promiseQueue = { then: function (callback) { return new Promise(function (resolve) { return resolve(callback()); }); }, }; function makeCallback(examiner, delegate) { if (examiner) { return function (arg) { ++activeCallbackCount; var both = function () { return examiner(arg); }; promiseQueue = promiseQueue.then(both, both).then(function (result) { --activeCallbackCount; next && next.call(observer, result); if (completed) { handler.complete(); } }, function (error) { --activeCallbackCount; throw error; }).catch(function (caught) { error && error.call(observer, caught); }); }; } else { return function (arg) { return delegate && delegate.call(observer, arg); }; } } var handler = { next: makeCallback(mapFn, next), error: makeCallback(catchFn, error), complete: function () { completed = true; if (!activeCallbackCount) { complete && complete.call(observer); } }, }; var sub = observable.subscribe(handler); return function () { return sub.unsubscribe(); }; }); } var canUseWeakMap = typeof WeakMap === 'function' && maybe(function () { return navigator.product; }) !== 'ReactNative'; var canUseWeakSet = typeof WeakSet === 'function'; var canUseSymbol = typeof Symbol === 'function' && typeof Symbol.for === 'function'; var canUseAsyncIteratorSymbol = canUseSymbol && Symbol.asyncIterator; var canUseDOM = typeof maybe(function () { return window.document.createElement; }) === "function"; var usingJSDOM = maybe(function () { return navigator.userAgent.indexOf("jsdom") >= 0; }) || false; var canUseLayoutEffect = canUseDOM && !usingJSDOM; function fixObservableSubclass(subclass) { function set(key) { Object.defineProperty(subclass, key, { value: zenObservableTs.Observable }); } if (canUseSymbol && Symbol.species) { set(Symbol.species); } set("@@species"); return subclass; } function isPromiseLike(value) { return value && typeof value.then === "function"; } var Concast = (function (_super) { tslib.__extends(Concast, _super); function Concast(sources) { var _this = _super.call(this, function (observer) { _this.addObserver(observer); return function () { return _this.removeObserver(observer); }; }) || this; _this.observers = new Set(); _this.promise = new Promise(function (resolve, reject) { _this.resolve = resolve; _this.reject = reject; }); _this.handlers = { next: function (result) { if (_this.sub !== null) { _this.latest = ["next", result]; _this.notify("next", result); iterateObserversSafely(_this.observers, "next", result); } }, error: function (error) { var sub = _this.sub; if (sub !== null) { if (sub) setTimeout(function () { return sub.unsubscribe(); }); _this.sub = null; _this.latest = ["error", error]; _this.reject(error); _this.notify("error", error); iterateObserversSafely(_this.observers, "error", error); } }, complete: function () { var _a = _this, sub = _a.sub, _b = _a.sources, sources = _b === void 0 ? [] : _b; if (sub !== null) { var value = sources.shift(); if (!value) { if (sub) setTimeout(function () { return sub.unsubscribe(); }); _this.sub = null; if (_this.latest && _this.latest[0] === "next") { _this.resolve(_this.latest[1]); } else { _this.resolve(); } _this.notify("complete"); iterateObserversSafely(_this.observers, "complete"); } else if (isPromiseLike(value)) { value.then(function (obs) { return _this.sub = obs.subscribe(_this.handlers); }); } else { _this.sub = value.subscribe(_this.handlers); } } }, }; _this.nextResultListeners = new Set(); _this.cancel = function (reason) { _this.reject(reason); _this.sources = []; _this.handlers.complete(); }; _this.promise.catch(function (_) { }); if (typeof sources === "function") { sources = [new zenObservableTs.Observable(sources)]; } if (isPromiseLike(sources)) { sources.then(function (iterable) { return _this.start(iterable); }, _this.handlers.error); } else { _this.start(sources); } return _this; } Concast.prototype.start = function (sources) { if (this.sub !== void 0) return; this.sources = Array.from(sources); this.handlers.complete(); }; Concast.prototype.deliverLastMessage = function (observer) { if (this.latest) { var nextOrError = this.latest[0]; var method = observer[nextOrError]; if (method) { method.call(observer, this.latest[1]); } if (this.sub === null && nextOrError === "next" && observer.complete) { observer.complete(); } } }; Concast.prototype.addObserver = function (observer) { if (!this.observers.has(observer)) { this.deliverLastMessage(observer); this.observers.add(observer); } }; Concast.prototype.removeObserver = function (observer) { if (this.observers.delete(observer) && this.observers.size < 1) { this.handlers.complete(); } }; Concast.prototype.notify = function (method, arg) { var nextResultListeners = this.nextResultListeners; if (nextResultListeners.size) { this.nextResultListeners = new Set; nextResultListeners.forEach(function (listener) { return listener(method, arg); }); } }; Concast.prototype.beforeNext = function (callback) { var called = false; this.nextResultListeners.add(function (method, arg) { if (!called) { called = true; callback(method, arg); } }); }; return Concast; }(zenObservableTs.Observable)); fixObservableSubclass(Concast); function isExecutionPatchIncrementalResult(value) { return "incremental" in value; } function isExecutionPatchInitialResult(value) { return "hasNext" in value && "data" in value; } function isExecutionPatchResult(value) { return (isExecutionPatchIncrementalResult(value) || isExecutionPatchInitialResult(value)); } function mergeIncrementalData(prevResult, result) { var mergedData = prevResult; var merger = new DeepMerger(); if (isExecutionPatchIncrementalResult(result) && isNonEmptyArray(result.incremental)) { result.incremental.forEach(function (_a) { var data = _a.data, path = _a.path; for (var i = path.length - 1; i >= 0; --i) { var key = path[i]; var isNumericKey = !isNaN(+key); var parent_1 = isNumericKey ? [] : {}; parent_1[key] = data; data = parent_1; } mergedData = merger.merge(mergedData, data); }); } return mergedData; } function graphQLResultHasError(result) { var errors = getGraphQLErrorsFromResult(result); return isNonEmptyArray(errors); } function getGraphQLErrorsFromResult(result) { var graphQLErrors = isNonEmptyArray(result.errors) ? result.errors.slice(0) : []; if (isExecutionPatchIncrementalResult(result) && isNonEmptyArray(result.incremental)) { result.incremental.forEach(function (incrementalResult) { if (incrementalResult.errors) { graphQLErrors.push.apply(graphQLErrors, incrementalResult.errors); } }); } return graphQLErrors; } function compact() { var objects = []; for (var _i = 0; _i < arguments.length; _i++) { objects[_i] = arguments[_i]; } var result = Object.create(null); objects.forEach(function (obj) { if (!obj) return; Object.keys(obj).forEach(function (key) { var value = obj[key]; if (value !== void 0) { result[key] = value; } }); }); return result; } var prefixCounts = new Map(); function makeUniqueId(prefix) { var count = prefixCounts.get(prefix) || 1; prefixCounts.set(prefix, count + 1); return "".concat(prefix, ":").concat(count, ":").concat(Math.random().toString(36).slice(2)); } function stringifyForDisplay(value) { var undefId = makeUniqueId("stringifyForDisplay"); return JSON.stringify(value, function (key, value) { return value === void 0 ? undefId : value; }).split(JSON.stringify(undefId)).join("<undefined>"); } function mergeOptions(defaults, options) { return compact(defaults, options, options.variables && { variables: tslib.__assign(tslib.__assign({}, (defaults && defaults.variables)), options.variables), }); } function fromError(errorValue) { return new zenObservableTs.Observable(function (observer) { observer.error(errorValue); }); } function toPromise(observable) { var completed = false; return new Promise(function (resolve, reject) { observable.subscribe({ next: function (data) { if (completed) { __DEV__ && tsInvariant.invariant.warn("Promise Wrapper does not support multiple results from Observable"); } else { completed = true; resolve(data); } }, error: reject, }); }); } function fromPromise(promise) { return new zenObservableTs.Observable(function (observer) { promise .then(function (value) { observer.next(value); observer.complete(); }) .catch(observer.error.bind(observer)); }); } var throwServerError = function (response, result, message) { var error = new Error(message); error.name = 'ServerError'; error.response = response; error.statusCode = response.status; error.result = result; throw error; }; function validateOperation(operation) { var OPERATION_FIELDS = [ 'query', 'operationName', 'variables', 'extensions', 'context', ]; for (var _i = 0, _a = Object.keys(operation); _i < _a.length; _i++) { var key = _a[_i]; if (OPERATION_FIELDS.indexOf(key) < 0) { throw __DEV__ ? new tsInvariant.InvariantError("illegal argument: ".concat(key)) : new tsInvariant.InvariantError(27); } } return operation; } function createOperation(starting, operation) { var context = tslib.__assign({}, starting); var setContext = function (next) { if (typeof next === 'function') { context = tslib.__assign(tslib.__assign({}, context), next(context)); } else { context = tslib.__assign(tslib.__assign({}, context), next); } }; var getContext = function () { return (tslib.__assign({}, context)); }; Object.defineProperty(operation, 'setContext', { enumerable: false, value: setContext, }); Object.defineProperty(operation, 'getContext', { enumerable: false, value: getContext, }); return operation; } function transformOperation(operation) { var transformedOperation = { variables: operation.variables || {}, extensions: operation.extensions || {}, operationName: operation.operationName, query: operation.query, }; if (!transformedOperation.operationName) { transformedOperation.operationName = typeof transformedOperation.query !== 'string' ? getOperationName(transformedOperation.query) || undefined : ''; } return transformedOperation; } function passthrough(op, forward) { return (forward ? forward(op) : zenObservableTs.Observable.of()); } function toLink(handler) { return typeof handler === 'function' ? new ApolloLink(handler) : handler; } function isTerminating(link) { return link.request.length <= 1; } var LinkError = (function (_super) { tslib.__extends(LinkError, _super); function LinkError(message, link) { var _this = _super.call(this, message) || this; _this.link = link; return _this; } return LinkError; }(Error)); var ApolloLink = (function () { function ApolloLink(request) { if (request) this.request = request; } ApolloLink.empty = function () { return new ApolloLink(function () { return zenObservableTs.Observable.of(); }); }; ApolloLink.from = function (links) { if (links.length === 0) return ApolloLink.empty(); return links.map(toLink).reduce(function (x, y) { return x.concat(y); }); }; ApolloLink.split = function (test, left, right) { var leftLink = toLink(left); var rightLink = toLink(right || new ApolloLink(passthrough)); if (isTerminating(leftLink) && isTerminating(rightLink)) { return new ApolloLink(function (operation) { return test(operation) ? leftLink.request(operation) || zenObservableTs.Observable.of() : rightLink.request(operation) || zenObservableTs.Observable.of(); }); } else { return new ApolloLink(function (operation, forward) { return test(operation) ? leftLink.request(operation, forward) || zenObservableTs.Observable.of() : rightLink.request(operation, forward) || zenObservableTs.Observable.of(); }); } }; ApolloLink.execute = function (link, operation) { return (link.request(createOperation(operation.context, transformOperation(validateOperation(operation)))) || zenObservableTs.Observable.of()); }; ApolloLink.concat = function (first, second) { var firstLink = toLink(first); if (isTerminating(firstLink)) { __DEV__ && tsInvariant.invariant.warn(new LinkError("You are calling concat on a terminating link, which will have no effect", firstLink)); return firstLink; } var nextLink = toLink(second); if (isTerminating(nextLink)) { return new ApolloLink(function (operation) { return firstLink.request(operation, function (op) { return nextLink.request(op) || zenObservableTs.Observable.of(); }) || zenObservableTs.Observable.of(); }); } else { return new ApolloLink(function (operation, forward) { return (firstLink.request(operation, function (op) { return nextLink.request(op, forward) || zenObservableTs.Observable.of(); }) || zenObservableTs.Observable.of()); }); } }; ApolloLink.prototype.split = function (test, left, right) { return this.concat(ApolloLink.split(test, left, right || new ApolloLink(passthrough))); }; ApolloLink.prototype.concat = function (next) { return ApolloLink.concat(this, next); }; ApolloLink.prototype.request = function (operation, forward) { throw __DEV__ ? new tsInvariant.InvariantError('request is not implemented') : new tsInvariant.InvariantError(22); }; ApolloLink.prototype.onError = function (error, observer) { if (observer && observer.error) { observer.error(error); return false; } throw