UNPKG

@apollo/client

Version:

A fully-featured caching GraphQL client.

1,125 lines (1,114 loc) 110 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var globals = require('../utilities/globals'); var tslib = require('tslib'); var core = require('../link/core'); var http = require('../link/http'); var equality = require('@wry/equality'); var cache = require('../cache'); var utilities = require('../utilities'); var errors = require('../errors'); var graphql = require('graphql'); var utils = require('../link/utils'); var tsInvariant = require('ts-invariant'); var graphqlTag = require('graphql-tag'); var version = '3.7.10'; function isNonEmptyArray(value) { return Array.isArray(value) && value.length > 0; } function isNonNullObject(obj) { return obj !== null && typeof obj === 'object'; } var hasOwnProperty$2 = Object.prototype.hasOwnProperty; 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$2.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; }()); 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; } exports.NetworkStatus = void 0; (function (NetworkStatus) { NetworkStatus[NetworkStatus["loading"] = 1] = "loading"; NetworkStatus[NetworkStatus["setVariables"] = 2] = "setVariables"; NetworkStatus[NetworkStatus["fetchMore"] = 3] = "fetchMore"; NetworkStatus[NetworkStatus["refetch"] = 4] = "refetch"; NetworkStatus[NetworkStatus["poll"] = 6] = "poll"; NetworkStatus[NetworkStatus["ready"] = 7] = "ready"; NetworkStatus[NetworkStatus["error"] = 8] = "error"; })(exports.NetworkStatus || (exports.NetworkStatus = {})); function isNetworkRequestInFlight(networkStatus) { return networkStatus ? networkStatus < 7 : false; } var assign = Object.assign, hasOwnProperty$1 = Object.hasOwnProperty; var ObservableQuery = (function (_super) { tslib.__extends(ObservableQuery, _super); function ObservableQuery(_a) { var queryManager = _a.queryManager, queryInfo = _a.queryInfo, options = _a.options; var _this = _super.call(this, function (observer) { try { var subObserver = observer._subscription._observer; if (subObserver && !subObserver.error) { subObserver.error = defaultSubscriptionObserverErrorCallback; } } catch (_a) { } var first = !_this.observers.size; _this.observers.add(observer); var last = _this.last; if (last && last.error) { observer.error && observer.error(last.error); } else if (last && last.result) { observer.next && observer.next(last.result); } if (first) { _this.reobserve().catch(function () { }); } return function () { if (_this.observers.delete(observer) && !_this.observers.size) { _this.tearDownQuery(); } }; }) || this; _this.observers = new Set(); _this.subscriptions = new Set(); _this.queryInfo = queryInfo; _this.queryManager = queryManager; _this.isTornDown = false; var _b = queryManager.defaultOptions.watchQuery, _c = _b === void 0 ? {} : _b, _d = _c.fetchPolicy, defaultFetchPolicy = _d === void 0 ? "cache-first" : _d; var _e = options.fetchPolicy, fetchPolicy = _e === void 0 ? defaultFetchPolicy : _e, _f = options.initialFetchPolicy, initialFetchPolicy = _f === void 0 ? (fetchPolicy === "standby" ? defaultFetchPolicy : fetchPolicy) : _f; _this.options = tslib.__assign(tslib.__assign({}, options), { initialFetchPolicy: initialFetchPolicy, fetchPolicy: fetchPolicy }); _this.queryId = queryInfo.queryId || queryManager.generateQueryId(); var opDef = utilities.getOperationDefinition(_this.query); _this.queryName = opDef && opDef.name && opDef.name.value; return _this; } Object.defineProperty(ObservableQuery.prototype, "query", { get: function () { return this.queryManager.transform(this.options.query).document; }, enumerable: false, configurable: true }); Object.defineProperty(ObservableQuery.prototype, "variables", { get: function () { return this.options.variables; }, enumerable: false, configurable: true }); ObservableQuery.prototype.result = function () { var _this = this; return new Promise(function (resolve, reject) { var observer = { next: function (result) { resolve(result); _this.observers.delete(observer); if (!_this.observers.size) { _this.queryManager.removeQuery(_this.queryId); } setTimeout(function () { subscription.unsubscribe(); }, 0); }, error: reject, }; var subscription = _this.subscribe(observer); }); }; ObservableQuery.prototype.getCurrentResult = function (saveAsLastResult) { if (saveAsLastResult === void 0) { saveAsLastResult = true; } var lastResult = this.getLastResult(true); var networkStatus = this.queryInfo.networkStatus || (lastResult && lastResult.networkStatus) || exports.NetworkStatus.ready; var result = tslib.__assign(tslib.__assign({}, lastResult), { loading: isNetworkRequestInFlight(networkStatus), networkStatus: networkStatus }); var _a = this.options.fetchPolicy, fetchPolicy = _a === void 0 ? "cache-first" : _a; if (fetchPolicy === 'network-only' || fetchPolicy === 'no-cache' || fetchPolicy === 'standby' || this.queryManager.transform(this.options.query).hasForcedResolvers) ; else { var diff = this.queryInfo.getDiff(); if (diff.complete || this.options.returnPartialData) { result.data = diff.result; } if (equality.equal(result.data, {})) { result.data = void 0; } if (diff.complete) { delete result.partial; if (diff.complete && result.networkStatus === exports.NetworkStatus.loading && (fetchPolicy === 'cache-first' || fetchPolicy === 'cache-only')) { result.networkStatus = exports.NetworkStatus.ready; result.loading = false; } } else { result.partial = true; } if (__DEV__ && !diff.complete && !this.options.partialRefetch && !result.loading && !result.data && !result.error) { logMissingFieldErrors(diff.missing); } } if (saveAsLastResult) { this.updateLastResult(result); } return result; }; ObservableQuery.prototype.isDifferentFromLastResult = function (newResult, variables) { return (!this.last || !equality.equal(this.last.result, newResult) || (variables && !equality.equal(this.last.variables, variables))); }; ObservableQuery.prototype.getLast = function (key, variablesMustMatch) { var last = this.last; if (last && last[key] && (!variablesMustMatch || equality.equal(last.variables, this.variables))) { return last[key]; } }; ObservableQuery.prototype.getLastResult = function (variablesMustMatch) { return this.getLast("result", variablesMustMatch); }; ObservableQuery.prototype.getLastError = function (variablesMustMatch) { return this.getLast("error", variablesMustMatch); }; ObservableQuery.prototype.resetLastResults = function () { delete this.last; this.isTornDown = false; }; ObservableQuery.prototype.resetQueryStoreErrors = function () { this.queryManager.resetErrors(this.queryId); }; ObservableQuery.prototype.refetch = function (variables) { var _a; var reobserveOptions = { pollInterval: 0, }; var fetchPolicy = this.options.fetchPolicy; if (fetchPolicy === 'cache-and-network') { reobserveOptions.fetchPolicy = fetchPolicy; } else if (fetchPolicy === 'no-cache') { reobserveOptions.fetchPolicy = 'no-cache'; } else { reobserveOptions.fetchPolicy = 'network-only'; } if (__DEV__ && variables && hasOwnProperty$1.call(variables, "variables")) { var queryDef = utilities.getQueryDefinition(this.query); var vars = queryDef.variableDefinitions; if (!vars || !vars.some(function (v) { return v.variable.name.value === "variables"; })) { __DEV__ && globals.invariant.warn("Called refetch(".concat(JSON.stringify(variables), ") for query ").concat(((_a = queryDef.name) === null || _a === void 0 ? void 0 : _a.value) || JSON.stringify(queryDef), ", which does not declare a $variables variable.\nDid you mean to call refetch(variables) instead of refetch({ variables })?")); } } if (variables && !equality.equal(this.options.variables, variables)) { reobserveOptions.variables = this.options.variables = tslib.__assign(tslib.__assign({}, this.options.variables), variables); } this.queryInfo.resetLastWrite(); return this.reobserve(reobserveOptions, exports.NetworkStatus.refetch); }; ObservableQuery.prototype.fetchMore = function (fetchMoreOptions) { var _this = this; var combinedOptions = tslib.__assign(tslib.__assign({}, (fetchMoreOptions.query ? fetchMoreOptions : tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign({}, this.options), { query: this.query }), fetchMoreOptions), { variables: tslib.__assign(tslib.__assign({}, this.options.variables), fetchMoreOptions.variables) }))), { fetchPolicy: "no-cache" }); var qid = this.queryManager.generateQueryId(); var queryInfo = this.queryInfo; var originalNetworkStatus = queryInfo.networkStatus; queryInfo.networkStatus = exports.NetworkStatus.fetchMore; if (combinedOptions.notifyOnNetworkStatusChange) { this.observe(); } var updatedQuerySet = new Set(); return this.queryManager.fetchQuery(qid, combinedOptions, exports.NetworkStatus.fetchMore).then(function (fetchMoreResult) { _this.queryManager.removeQuery(qid); if (queryInfo.networkStatus === exports.NetworkStatus.fetchMore) { queryInfo.networkStatus = originalNetworkStatus; } _this.queryManager.cache.batch({ update: function (cache) { var updateQuery = fetchMoreOptions.updateQuery; if (updateQuery) { cache.updateQuery({ query: _this.query, variables: _this.variables, returnPartialData: true, optimistic: false, }, function (previous) { return updateQuery(previous, { fetchMoreResult: fetchMoreResult.data, variables: combinedOptions.variables, }); }); } else { cache.writeQuery({ query: combinedOptions.query, variables: combinedOptions.variables, data: fetchMoreResult.data, }); } }, onWatchUpdated: function (watch) { updatedQuerySet.add(watch.query); }, }); return fetchMoreResult; }).finally(function () { if (!updatedQuerySet.has(_this.query)) { reobserveCacheFirst(_this); } }); }; ObservableQuery.prototype.subscribeToMore = function (options) { var _this = this; var subscription = this.queryManager .startGraphQLSubscription({ query: options.document, variables: options.variables, context: options.context, }) .subscribe({ next: function (subscriptionData) { var updateQuery = options.updateQuery; if (updateQuery) { _this.updateQuery(function (previous, _a) { var variables = _a.variables; return updateQuery(previous, { subscriptionData: subscriptionData, variables: variables, }); }); } }, error: function (err) { if (options.onError) { options.onError(err); return; } __DEV__ && globals.invariant.error('Unhandled GraphQL subscription error', err); }, }); this.subscriptions.add(subscription); return function () { if (_this.subscriptions.delete(subscription)) { subscription.unsubscribe(); } }; }; ObservableQuery.prototype.setOptions = function (newOptions) { return this.reobserve(newOptions); }; ObservableQuery.prototype.setVariables = function (variables) { if (equality.equal(this.variables, variables)) { return this.observers.size ? this.result() : Promise.resolve(); } this.options.variables = variables; if (!this.observers.size) { return Promise.resolve(); } return this.reobserve({ fetchPolicy: this.options.initialFetchPolicy, variables: variables, }, exports.NetworkStatus.setVariables); }; ObservableQuery.prototype.updateQuery = function (mapFn) { var queryManager = this.queryManager; var result = queryManager.cache.diff({ query: this.options.query, variables: this.variables, returnPartialData: true, optimistic: false, }).result; var newResult = mapFn(result, { variables: this.variables, }); if (newResult) { queryManager.cache.writeQuery({ query: this.options.query, data: newResult, variables: this.variables, }); queryManager.broadcastQueries(); } }; ObservableQuery.prototype.startPolling = function (pollInterval) { this.options.pollInterval = pollInterval; this.updatePolling(); }; ObservableQuery.prototype.stopPolling = function () { this.options.pollInterval = 0; this.updatePolling(); }; ObservableQuery.prototype.applyNextFetchPolicy = function (reason, options) { if (options.nextFetchPolicy) { var _a = options.fetchPolicy, fetchPolicy = _a === void 0 ? "cache-first" : _a, _b = options.initialFetchPolicy, initialFetchPolicy = _b === void 0 ? fetchPolicy : _b; if (fetchPolicy === "standby") ; else if (typeof options.nextFetchPolicy === "function") { options.fetchPolicy = options.nextFetchPolicy(fetchPolicy, { reason: reason, options: options, observable: this, initialFetchPolicy: initialFetchPolicy, }); } else if (reason === "variables-changed") { options.fetchPolicy = initialFetchPolicy; } else { options.fetchPolicy = options.nextFetchPolicy; } } return options.fetchPolicy; }; ObservableQuery.prototype.fetch = function (options, newNetworkStatus) { this.queryManager.setObservableQuery(this); return this.queryManager.fetchQueryObservable(this.queryId, options, newNetworkStatus); }; ObservableQuery.prototype.updatePolling = function () { var _this = this; if (this.queryManager.ssrMode) { return; } var _a = this, pollingInfo = _a.pollingInfo, pollInterval = _a.options.pollInterval; if (!pollInterval) { if (pollingInfo) { clearTimeout(pollingInfo.timeout); delete this.pollingInfo; } return; } if (pollingInfo && pollingInfo.interval === pollInterval) { return; } __DEV__ ? globals.invariant(pollInterval, 'Attempted to start a polling query without a polling interval.') : globals.invariant(pollInterval, 13); var info = pollingInfo || (this.pollingInfo = {}); info.interval = pollInterval; var maybeFetch = function () { if (_this.pollingInfo) { if (!isNetworkRequestInFlight(_this.queryInfo.networkStatus)) { _this.reobserve({ fetchPolicy: _this.options.initialFetchPolicy === 'no-cache' ? 'no-cache' : 'network-only', }, exports.NetworkStatus.poll).then(poll, poll); } else { poll(); } } }; var poll = function () { var info = _this.pollingInfo; if (info) { clearTimeout(info.timeout); info.timeout = setTimeout(maybeFetch, info.interval); } }; poll(); }; ObservableQuery.prototype.updateLastResult = function (newResult, variables) { if (variables === void 0) { variables = this.variables; } this.last = tslib.__assign(tslib.__assign({}, this.last), { result: this.queryManager.assumeImmutableResults ? newResult : utilities.cloneDeep(newResult), variables: variables }); if (!utilities.isNonEmptyArray(newResult.errors)) { delete this.last.error; } return this.last; }; ObservableQuery.prototype.reobserve = function (newOptions, newNetworkStatus) { var _this = this; this.isTornDown = false; var useDisposableConcast = newNetworkStatus === exports.NetworkStatus.refetch || newNetworkStatus === exports.NetworkStatus.fetchMore || newNetworkStatus === exports.NetworkStatus.poll; var oldVariables = this.options.variables; var oldFetchPolicy = this.options.fetchPolicy; var mergedOptions = utilities.compact(this.options, newOptions || {}); var options = useDisposableConcast ? mergedOptions : assign(this.options, mergedOptions); if (!useDisposableConcast) { this.updatePolling(); if (newOptions && newOptions.variables && !equality.equal(newOptions.variables, oldVariables) && options.fetchPolicy !== "standby" && options.fetchPolicy === oldFetchPolicy) { this.applyNextFetchPolicy("variables-changed", options); if (newNetworkStatus === void 0) { newNetworkStatus = exports.NetworkStatus.setVariables; } } } var variables = options.variables && tslib.__assign({}, options.variables); var concast = this.fetch(options, newNetworkStatus); var observer = { next: function (result) { _this.reportResult(result, variables); }, error: function (error) { _this.reportError(error, variables); }, }; if (!useDisposableConcast) { if (this.concast && this.observer) { this.concast.removeObserver(this.observer); } this.concast = concast; this.observer = observer; } concast.addObserver(observer); return concast.promise; }; ObservableQuery.prototype.observe = function () { this.reportResult(this.getCurrentResult(false), this.variables); }; ObservableQuery.prototype.reportResult = function (result, variables) { var lastError = this.getLastError(); if (lastError || this.isDifferentFromLastResult(result, variables)) { if (lastError || !result.partial || this.options.returnPartialData) { this.updateLastResult(result, variables); } utilities.iterateObserversSafely(this.observers, 'next', result); } }; ObservableQuery.prototype.reportError = function (error, variables) { var errorResult = tslib.__assign(tslib.__assign({}, this.getLastResult()), { error: error, errors: error.graphQLErrors, networkStatus: exports.NetworkStatus.error, loading: false }); this.updateLastResult(errorResult, variables); utilities.iterateObserversSafely(this.observers, 'error', this.last.error = error); }; ObservableQuery.prototype.hasObservers = function () { return this.observers.size > 0; }; ObservableQuery.prototype.tearDownQuery = function () { if (this.isTornDown) return; if (this.concast && this.observer) { this.concast.removeObserver(this.observer); delete this.concast; delete this.observer; } this.stopPolling(); this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); }); this.subscriptions.clear(); this.queryManager.stopQuery(this.queryId); this.observers.clear(); this.isTornDown = true; }; return ObservableQuery; }(utilities.Observable)); utilities.fixObservableSubclass(ObservableQuery); function reobserveCacheFirst(obsQuery) { var _a = obsQuery.options, fetchPolicy = _a.fetchPolicy, nextFetchPolicy = _a.nextFetchPolicy; if (fetchPolicy === "cache-and-network" || fetchPolicy === "network-only") { return obsQuery.reobserve({ fetchPolicy: "cache-first", nextFetchPolicy: function () { this.nextFetchPolicy = nextFetchPolicy; if (typeof nextFetchPolicy === "function") { return nextFetchPolicy.apply(this, arguments); } return fetchPolicy; }, }); } return obsQuery.reobserve(); } function defaultSubscriptionObserverErrorCallback(error) { __DEV__ && globals.invariant.error('Unhandled error', error.message, error.stack); } function logMissingFieldErrors(missing) { if (__DEV__ && missing) { __DEV__ && globals.invariant.debug("Missing cache result fields: ".concat(JSON.stringify(missing)), missing); } } var LocalState = (function () { function LocalState(_a) { var cache = _a.cache, client = _a.client, resolvers = _a.resolvers, fragmentMatcher = _a.fragmentMatcher; this.selectionsToResolveCache = new WeakMap(); this.cache = cache; if (client) { this.client = client; } if (resolvers) { this.addResolvers(resolvers); } if (fragmentMatcher) { this.setFragmentMatcher(fragmentMatcher); } } LocalState.prototype.addResolvers = function (resolvers) { var _this = this; this.resolvers = this.resolvers || {}; if (Array.isArray(resolvers)) { resolvers.forEach(function (resolverGroup) { _this.resolvers = utilities.mergeDeep(_this.resolvers, resolverGroup); }); } else { this.resolvers = utilities.mergeDeep(this.resolvers, resolvers); } }; LocalState.prototype.setResolvers = function (resolvers) { this.resolvers = {}; this.addResolvers(resolvers); }; LocalState.prototype.getResolvers = function () { return this.resolvers || {}; }; LocalState.prototype.runResolvers = function (_a) { var document = _a.document, remoteResult = _a.remoteResult, context = _a.context, variables = _a.variables, _b = _a.onlyRunForcedResolvers, onlyRunForcedResolvers = _b === void 0 ? false : _b; return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_c) { if (document) { return [2, this.resolveDocument(document, remoteResult.data, context, variables, this.fragmentMatcher, onlyRunForcedResolvers).then(function (localResult) { return (tslib.__assign(tslib.__assign({}, remoteResult), { data: localResult.result })); })]; } return [2, remoteResult]; }); }); }; LocalState.prototype.setFragmentMatcher = function (fragmentMatcher) { this.fragmentMatcher = fragmentMatcher; }; LocalState.prototype.getFragmentMatcher = function () { return this.fragmentMatcher; }; LocalState.prototype.clientQuery = function (document) { if (utilities.hasDirectives(['client'], document)) { if (this.resolvers) { return document; } } return null; }; LocalState.prototype.serverQuery = function (document) { return utilities.removeClientSetsFromDocument(document); }; LocalState.prototype.prepareContext = function (context) { var cache = this.cache; return tslib.__assign(tslib.__assign({}, context), { cache: cache, getCacheKey: function (obj) { return cache.identify(obj); } }); }; LocalState.prototype.addExportedVariables = function (document, variables, context) { if (variables === void 0) { variables = {}; } if (context === void 0) { context = {}; } return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { if (document) { return [2, this.resolveDocument(document, this.buildRootValueFromCache(document, variables) || {}, this.prepareContext(context), variables).then(function (data) { return (tslib.__assign(tslib.__assign({}, variables), data.exportedVariables)); })]; } return [2, tslib.__assign({}, variables)]; }); }); }; LocalState.prototype.shouldForceResolvers = function (document) { var forceResolvers = false; graphql.visit(document, { Directive: { enter: function (node) { if (node.name.value === 'client' && node.arguments) { forceResolvers = node.arguments.some(function (arg) { return arg.name.value === 'always' && arg.value.kind === 'BooleanValue' && arg.value.value === true; }); if (forceResolvers) { return graphql.BREAK; } } }, }, }); return forceResolvers; }; LocalState.prototype.buildRootValueFromCache = function (document, variables) { return this.cache.diff({ query: utilities.buildQueryFromSelectionSet(document), variables: variables, returnPartialData: true, optimistic: false, }).result; }; LocalState.prototype.resolveDocument = function (document, rootValue, context, variables, fragmentMatcher, onlyRunForcedResolvers) { if (context === void 0) { context = {}; } if (variables === void 0) { variables = {}; } if (fragmentMatcher === void 0) { fragmentMatcher = function () { return true; }; } if (onlyRunForcedResolvers === void 0) { onlyRunForcedResolvers = false; } return tslib.__awaiter(this, void 0, void 0, function () { var mainDefinition, fragments, fragmentMap, selectionsToResolve, definitionOperation, defaultOperationType, _a, cache, client, execContext, isClientFieldDescendant; return tslib.__generator(this, function (_b) { mainDefinition = utilities.getMainDefinition(document); fragments = utilities.getFragmentDefinitions(document); fragmentMap = utilities.createFragmentMap(fragments); selectionsToResolve = this.collectSelectionsToResolve(mainDefinition, fragmentMap); definitionOperation = mainDefinition.operation; defaultOperationType = definitionOperation ? definitionOperation.charAt(0).toUpperCase() + definitionOperation.slice(1) : 'Query'; _a = this, cache = _a.cache, client = _a.client; execContext = { fragmentMap: fragmentMap, context: tslib.__assign(tslib.__assign({}, context), { cache: cache, client: client }), variables: variables, fragmentMatcher: fragmentMatcher, defaultOperationType: defaultOperationType, exportedVariables: {}, selectionsToResolve: selectionsToResolve, onlyRunForcedResolvers: onlyRunForcedResolvers, }; isClientFieldDescendant = false; return [2, this.resolveSelectionSet(mainDefinition.selectionSet, isClientFieldDescendant, rootValue, execContext).then(function (result) { return ({ result: result, exportedVariables: execContext.exportedVariables, }); })]; }); }); }; LocalState.prototype.resolveSelectionSet = function (selectionSet, isClientFieldDescendant, rootValue, execContext) { return tslib.__awaiter(this, void 0, void 0, function () { var fragmentMap, context, variables, resultsToMerge, execute; var _this = this; return tslib.__generator(this, function (_a) { fragmentMap = execContext.fragmentMap, context = execContext.context, variables = execContext.variables; resultsToMerge = [rootValue]; execute = function (selection) { return tslib.__awaiter(_this, void 0, void 0, function () { var fragment, typeCondition; return tslib.__generator(this, function (_a) { if (!isClientFieldDescendant && !execContext.selectionsToResolve.has(selection)) { return [2]; } if (!utilities.shouldInclude(selection, variables)) { return [2]; } if (utilities.isField(selection)) { return [2, this.resolveField(selection, isClientFieldDescendant, rootValue, execContext).then(function (fieldResult) { var _a; if (typeof fieldResult !== 'undefined') { resultsToMerge.push((_a = {}, _a[utilities.resultKeyNameFromField(selection)] = fieldResult, _a)); } })]; } if (utilities.isInlineFragment(selection)) { fragment = selection; } else { fragment = fragmentMap[selection.name.value]; __DEV__ ? globals.invariant(fragment, "No fragment named ".concat(selection.name.value)) : globals.invariant(fragment, 11); } if (fragment && fragment.typeCondition) { typeCondition = fragment.typeCondition.name.value; if (execContext.fragmentMatcher(rootValue, typeCondition, context)) { return [2, this.resolveSelectionSet(fragment.selectionSet, isClientFieldDescendant, rootValue, execContext).then(function (fragmentResult) { resultsToMerge.push(fragmentResult); })]; } } return [2]; }); }); }; return [2, Promise.all(selectionSet.selections.map(execute)).then(function () { return utilities.mergeDeepArray(resultsToMerge); })]; }); }); }; LocalState.prototype.resolveField = function (field, isClientFieldDescendant, rootValue, execContext) { return tslib.__awaiter(this, void 0, void 0, function () { var variables, fieldName, aliasedFieldName, aliasUsed, defaultResult, resultPromise, resolverType, resolverMap, resolve; var _this = this; return tslib.__generator(this, function (_a) { if (!rootValue) { return [2, null]; } variables = execContext.variables; fieldName = field.name.value; aliasedFieldName = utilities.resultKeyNameFromField(field); aliasUsed = fieldName !== aliasedFieldName; defaultResult = rootValue[aliasedFieldName] || rootValue[fieldName]; resultPromise = Promise.resolve(defaultResult); if (!execContext.onlyRunForcedResolvers || this.shouldForceResolvers(field)) { resolverType = rootValue.__typename || execContext.defaultOperationType; resolverMap = this.resolvers && this.resolvers[resolverType]; if (resolverMap) { resolve = resolverMap[aliasUsed ? fieldName : aliasedFieldName]; if (resolve) { resultPromise = Promise.resolve(cache.cacheSlot.withValue(this.cache, resolve, [ rootValue, utilities.argumentsObjectFromField(field, variables), execContext.context, { field: field, fragmentMap: execContext.fragmentMap }, ])); } } } return [2, resultPromise.then(function (result) { var _a, _b; if (result === void 0) { result = defaultResult; } if (field.directives) { field.directives.forEach(function (directive) { if (directive.name.value === 'export' && directive.arguments) { directive.arguments.forEach(function (arg) { if (arg.name.value === 'as' && arg.value.kind === 'StringValue') { execContext.exportedVariables[arg.value.value] = result; } }); } }); } if (!field.selectionSet) { return result; } if (result == null) { return result; } var isClientField = (_b = (_a = field.directives) === null || _a === void 0 ? void 0 : _a.some(function (d) { return d.name.value === 'client'; })) !== null && _b !== void 0 ? _b : false; if (Array.isArray(result)) { return _this.resolveSubSelectedArray(field, isClientFieldDescendant || isClientField, result, execContext); } if (field.selectionSet) { return _this.resolveSelectionSet(field.selectionSet, isClientFieldDescendant || isClientField, result, execContext); } })]; }); }); }; LocalState.prototype.resolveSubSelectedArray = function (field, isClientFieldDescendant, result, execContext) { var _this = this; return Promise.all(result.map(function (item) { if (item === null) { return null; } if (Array.isArray(item)) { return _this.resolveSubSelectedArray(field, isClientFieldDescendant, item, execContext); } if (field.selectionSet) { return _this.resolveSelectionSet(field.selectionSet, isClientFieldDescendant, item, execContext); } })); }; LocalState.prototype.collectSelectionsToResolve = function (mainDefinition, fragmentMap) { var isSingleASTNode = function (node) { return !Array.isArray(node); }; var selectionsToResolveCache = this.selectionsToResolveCache; function collectByDefinition(definitionNode) { if (!selectionsToResolveCache.has(definitionNode)) { var matches_1 = new Set(); selectionsToResolveCache.set(definitionNode, matches_1); graphql.visit(definitionNode, { Directive: function (node, _, __, ___, ancestors) { if (node.name.value === 'client') { ancestors.forEach(function (node) { if (isSingleASTNode(node) && graphql.isSelectionNode(node)) { matches_1.add(node); } }); } }, FragmentSpread: function (spread, _, __, ___, ancestors) { var fragment = fragmentMap[spread.name.value]; __DEV__ ? globals.invariant(fragment, "No fragment named ".concat(spread.name.value)) : globals.invariant(fragment, 12); var fragmentSelections = collectByDefinition(fragment); if (fragmentSelections.size > 0) { ancestors.forEach(function (node) { if (isSingleASTNode(node) && graphql.isSelectionNode(node)) { matches_1.add(node); } }); matches_1.add(spread); fragmentSelections.forEach(function (selection) { matches_1.add(selection); }); } } }); } return selectionsToResolveCache.get(definitionNode); } return collectByDefinition(mainDefinition); }; return LocalState; }()); var destructiveMethodCounts = new (utilities.canUseWeakMap ? WeakMap : Map)(); function wrapDestructiveCacheMethod(cache, methodName) { var original = cache[methodName]; if (typeof original === "function") { cache[methodName] = function () { destructiveMethodCounts.set(cache, (destructiveMethodCounts.get(cache) + 1) % 1e15); return original.apply(this, arguments); }; } } function cancelNotifyTimeout(info) { if (info["notifyTimeout"]) { clearTimeout(info["notifyTimeout"]); info["notifyTimeout"] = void 0; } } var QueryInfo = (function () { function QueryInfo(queryManager, queryId) { if (queryId === void 0) { queryId = queryManager.generateQueryId(); } this.queryId = queryId; this.listeners = new Set(); this.document = null; this.lastRequestId = 1; this.subscriptions = new Set(); this.stopped = false; this.dirty = false; this.observableQuery = null; var cache = this.cache = queryManager.cache; if (!destructiveMethodCounts.has(cache)) { destructiveMethodCounts.set(cache, 0); wrapDestructiveCacheMethod(cache, "evict"); wrapDestructiveCacheMethod(cache, "modify"); wrapDestructiveCacheMethod(cache, "reset"); } } QueryInfo.prototype.init = function (query) { var networkStatus = query.networkStatus || exports.NetworkStatus.loading; if (this.variables && this.networkStatus !== exports.NetworkStatus.loading && !equality.equal(this.variables, query.variables)) { networkStatus = exports.NetworkStatus.setVariables; } if (!equality.equal(query.variables, this.variables)) { this.lastDiff = void 0; } Object.assign(this, { document: query.document, variables: query.variables, networkError: null, graphQLErrors: this.graphQLErrors || [], networkStatus: networkStatus, }); if (query.observableQuery) { this.setObservableQuery(query.observableQuery); } if (query.lastRequestId) { this.lastRequestId = query.lastRequestId; } return this; }; QueryInfo.prototype.reset = function () { cancelNotifyTimeout(this); this.dirty = false; }; QueryInfo.prototype.getDiff = function (variables) { if (variables === void 0) { variables = this.variables; } var options = this.getDiffOptions(variables); if (this.lastDiff && equality.equal(options, this.lastDiff.options)) { return this.lastDiff.diff; } this.updateWatch(this.variables = variables); var oq = this.observableQuery; if (oq && oq.options.fetchPolicy === "no-cache") { return { complete: false }; } var diff = this.cache.diff(options); this.updateLastDiff(diff, options); return diff; }; QueryInfo.prototype.updateLastDiff = function (diff, options) { this.lastDiff = diff ? { diff: diff, options: options || this.getDiffOptions(), } : void 0; }; QueryInfo.prototype.getDiffOptions = function (variables) { var _a; if (variables === void 0) { variables = this.variables; } return { query: this.document, variables: variables, returnPartialData: true, optimistic: true, canonizeResults: (_a = this.observableQuery) === null || _a === void 0 ? void 0 : _a.options.canonizeResults, }; }; QueryInfo.prototype.setDiff = function (diff) { var _this = this; var oldDiff = this.lastDiff && this.lastDiff.diff; this.updateLastDiff(diff); if (!this.dirty && !equality.equal(oldDiff && oldDiff.result, diff && diff.result)) { this.dirty = true; if (!this.notifyTimeout) { this.notifyTimeout = setTimeout(function () { return _this.notify(); }, 0); } } }; QueryInfo.prototype.setObservableQuery = function (oq) { var _this = this; if (oq === this.observableQuery) return; if (this.oqListener) { this.listeners.delete(this.oqListener); } this.observableQuery = oq; if (oq) { oq["queryInfo"] = this; this.listeners.add(this.oqListener = function () { var diff = _this.getDiff(); if (diff.fromOptimisticTransaction) { oq["observe"](); } else { reobserveCacheFirst(oq); } }); } else { delete this.oqListener; } }; QueryInfo.prototype.notify = function () { var _this = this; cancelNotifyTimeout(this); if (this.shouldNotify()) { this.listeners.forEach(function (listener) { return listener(_this); }); } this.dirty = false; }; QueryInfo.prototype.shouldNotify = function () { if (!this.dirty || !this.listeners.size) { return false; } if (isNetworkRequestInFlight(this.networkStatus) && this.observableQuery) { var fetchPolicy = this.observableQuery.options.fetchPolicy; if (fetchPolicy !== "cache-only" && fetchPolicy !== "cache-and-network") { return false; } } return true; }; QueryInfo.prototype.stop = function () { if (!this.stopped) { this.stopped = true; this.reset(); this.cancel(); this.cancel = QueryInfo.prototype.cancel; this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); }); var oq = this.observableQuery; if (oq) oq.stopPolling(); } }; QueryInfo.prototype.cancel = function () { }; QueryInfo.prototype.updateWatch = function (variables) { var _this = this; if (variables === void 0) { variables = this.variables; } var oq = this.observableQuery; if (oq && oq.options.fetchPolicy === "no-cache") { return; } var watchOptions = tslib.__assign(tslib.__assign({}, this.getDiffOptions(variables)), { watcher: this, callback: function (diff) { return _this.setDiff(diff); } }); if (!this.lastWatch || !equality.equal(watchOptions, this.lastWatch)) { this.cancel(); this.cancel = this.cache.watch(this.lastWatch = watchOptions); } }; QueryInfo.prototype.resetLastWrite = function () { this.lastWrite = void 0; }; QueryInfo.prototype.shouldWrite = function (result, variables) { var lastWrite = this.lastWrite; return !(lastWrite && lastWrite.dmCount === destructiveMethodCounts.get(this.cache) && equality.equal(variables, lastWrite.variables) && equality.equal(result.data, lastWrite.result.data)); }; QueryInfo.prototype.markResult = function (result, document, options, cacheWriteBehavior) { var _this = this; var merger = new utilities.DeepMerge