@apollo/client 3.4.5 → 3.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apollo-client.cjs.js +1010 -114
- package/apollo-client.cjs.js.map +1 -1
- package/apollo-core.cjs.js +5772 -0
- package/apollo-core.cjs.js.map +1 -0
- package/apollo-core.cjs.min.js +1 -0
- package/cache/cache.cjs.js +22 -19
- package/cache/cache.cjs.js.map +1 -1
- package/cache/index.d.ts.map +1 -1
- package/cache/index.js +2 -3
- package/cache/index.js.map +1 -1
- package/cache/inmemory/entityStore.js +1 -1
- package/cache/inmemory/policies.js +12 -9
- package/cache/inmemory/policies.js.map +1 -1
- package/cache/inmemory/readFromStore.js +3 -3
- package/cache/inmemory/writeToStore.d.ts +1 -1
- package/cache/inmemory/writeToStore.d.ts.map +1 -1
- package/cache/inmemory/writeToStore.js +4 -4
- package/cache/inmemory/writeToStore.js.map +1 -1
- package/core/ApolloClient.js +2 -2
- package/core/LocalState.js +1 -1
- package/core/ObservableQuery.d.ts +9 -6
- package/core/ObservableQuery.d.ts.map +1 -1
- package/core/ObservableQuery.js +70 -45
- package/core/ObservableQuery.js.map +1 -1
- package/core/QueryManager.d.ts +3 -3
- package/core/QueryManager.d.ts.map +1 -1
- package/core/QueryManager.js +20 -19
- package/core/QueryManager.js.map +1 -1
- package/core/core.cjs.js +94 -66
- package/core/core.cjs.js.map +1 -1
- package/core/index.d.ts.map +1 -1
- package/core/index.js +2 -1
- package/core/index.js.map +1 -1
- package/core/watchQueryOptions.d.ts +2 -1
- package/core/watchQueryOptions.d.ts.map +1 -1
- package/core/watchQueryOptions.js.map +1 -1
- package/errors/errors.cjs.js +1 -2
- package/errors/errors.cjs.js.map +1 -1
- package/errors/index.d.ts.map +1 -1
- package/errors/index.js +2 -3
- package/errors/index.js.map +1 -1
- package/invariantErrorCodes.js +59 -82
- package/link/core/ApolloLink.js +1 -1
- package/link/core/core.cjs.js +3 -3
- package/link/core/core.cjs.js.map +1 -1
- package/link/core/index.d.ts.map +1 -1
- package/link/core/index.js +2 -3
- package/link/core/index.js.map +1 -1
- package/link/http/checkFetcher.js +1 -1
- package/link/http/createHttpLink.d.ts.map +1 -1
- package/link/http/createHttpLink.js +7 -5
- package/link/http/createHttpLink.js.map +1 -1
- package/link/http/http.cjs.js +11 -8
- package/link/http/http.cjs.js.map +1 -1
- package/link/http/index.d.ts.map +1 -1
- package/link/http/index.js +2 -0
- package/link/http/index.js.map +1 -1
- package/link/http/serializeFetchParameter.js +1 -1
- package/link/persisted-queries/index.d.ts.map +1 -1
- package/link/persisted-queries/index.js +4 -2
- package/link/persisted-queries/index.js.map +1 -1
- package/link/persisted-queries/persisted-queries.cjs.js +4 -3
- package/link/persisted-queries/persisted-queries.cjs.js.map +1 -1
- package/link/utils/index.d.ts.map +1 -1
- package/link/utils/index.js +2 -0
- package/link/utils/index.js.map +1 -1
- package/link/utils/utils.cjs.js +3 -1
- package/link/utils/utils.cjs.js.map +1 -1
- package/link/utils/validateOperation.js +1 -1
- package/package.json +8 -8
- package/react/context/ApolloConsumer.js +1 -1
- package/react/context/ApolloProvider.js +1 -1
- package/react/context/context.cjs.js +5 -3
- package/react/context/context.cjs.js.map +1 -1
- package/react/context/index.d.ts.map +1 -1
- package/react/context/index.js +2 -0
- package/react/context/index.js.map +1 -1
- package/react/data/OperationData.js +2 -2
- package/react/data/QueryData.d.ts.map +1 -1
- package/react/data/QueryData.js +8 -8
- package/react/data/QueryData.js.map +1 -1
- package/react/data/data.cjs.js +13 -10
- package/react/data/data.cjs.js.map +1 -1
- package/react/data/index.d.ts.map +1 -1
- package/react/data/index.js +2 -0
- package/react/data/index.js.map +1 -1
- package/react/hoc/hoc-utils.js +1 -1
- package/react/hoc/hoc.cjs.js +5 -2
- package/react/hoc/hoc.cjs.js.map +1 -1
- package/react/hoc/index.d.ts.map +1 -1
- package/react/hoc/index.js +2 -0
- package/react/hoc/index.js.map +1 -1
- package/react/hoc/withApollo.js +1 -1
- package/react/hooks/hooks.cjs.js +4 -1
- package/react/hooks/hooks.cjs.js.map +1 -1
- package/react/hooks/index.d.ts.map +1 -1
- package/react/hooks/index.js +2 -0
- package/react/hooks/index.js.map +1 -1
- package/react/hooks/useApolloClient.js +1 -1
- package/react/index.d.ts.map +1 -1
- package/react/index.js +2 -3
- package/react/index.js.map +1 -1
- package/react/parser/index.d.ts.map +1 -1
- package/react/parser/index.js +6 -4
- package/react/parser/index.js.map +1 -1
- package/react/parser/parser.cjs.js +6 -4
- package/react/parser/parser.cjs.js.map +1 -1
- package/react/react.cjs.js +1 -2
- package/react/react.cjs.js.map +1 -1
- package/testing/index.js +2 -3
- package/testing/index.js.map +1 -1
- package/testing/testing.cjs.js +3 -3
- package/testing/testing.cjs.js.map +1 -1
- package/utilities/globals/index.d.ts +1 -0
- package/utilities/globals/index.d.ts.map +1 -1
- package/utilities/globals/index.js +4 -0
- package/utilities/globals/index.js.map +1 -1
- package/utilities/graphql/directives.js +4 -4
- package/utilities/graphql/fragments.js +3 -3
- package/utilities/graphql/getFromAST.js +8 -8
- package/utilities/graphql/storeUtils.js +1 -1
- package/utilities/index.d.ts +3 -2
- package/utilities/index.d.ts.map +1 -1
- package/utilities/index.js +4 -4
- package/utilities/index.js.map +1 -1
- package/utilities/observables/Concast.js +1 -1
- package/utilities/observables/Concast.js.map +1 -1
- package/utilities/testing/mocking/mockLink.js +1 -1
- package/utilities/utilities.cjs.js +23 -18
- package/utilities/utilities.cjs.js.map +1 -1
- package/version.js +1 -1
- package/apollo-client.cjs.min.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeToStore.js","sourceRoot":"","sources":["../../../src/cache/inmemory/writeToStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { SelectionSetNode, FieldNode, SelectionNode } from 'graphql';\nimport { invariant, InvariantError } from 'ts-invariant';\nimport { equal } from '@wry/equality';\n\nimport {\n createFragmentMap,\n FragmentMap,\n getFragmentFromSelection,\n getDefaultValues,\n getFragmentDefinitions,\n getOperationDefinition,\n getTypenameFromResult,\n makeReference,\n isField,\n resultKeyNameFromField,\n StoreValue,\n StoreObject,\n Reference,\n isReference,\n shouldInclude,\n cloneDeep,\n addTypenameToDocument,\n} from '../../utilities';\n\nimport { NormalizedCache, ReadMergeModifyContext, MergeTree } from './types';\nimport { makeProcessedFieldsMerger, fieldNameFromStoreName, storeValueIsStoreObject } from './helpers';\nimport { StoreReader } from './readFromStore';\nimport { InMemoryCache } from './inMemoryCache';\nimport { EntityStore } from './entityStore';\nimport { Cache } from '../../core';\nimport { canonicalStringify } from './object-canon';\n\nexport interface WriteContext extends ReadMergeModifyContext {\n readonly written: {\n [dataId: string]: SelectionSetNode[];\n };\n readonly fragmentMap?: FragmentMap;\n // General-purpose deep-merge function for use during writes.\n merge<T>(existing: T, incoming: T): T;\n // If true, merge functions will be called with undefined existing data.\n overwrite: boolean;\n incomingById: Map<string, {\n fields: StoreObject;\n mergeTree: MergeTree;\n selections: Set<SelectionNode>;\n }>;\n clientOnly: boolean;\n};\n\ninterface ProcessSelectionSetOptions {\n dataId?: string,\n result: Record<string, any>;\n selectionSet: SelectionSetNode;\n context: WriteContext;\n mergeTree: MergeTree;\n}\n\nexport class StoreWriter {\n constructor(\n public readonly cache: InMemoryCache,\n private reader?: StoreReader,\n ) {}\n\n public writeToStore(store: NormalizedCache, {\n query,\n result,\n dataId,\n variables,\n overwrite,\n }: Cache.WriteOptions): Reference | undefined {\n const operationDefinition = getOperationDefinition(query)!;\n const merger = makeProcessedFieldsMerger();\n\n variables = {\n ...getDefaultValues(operationDefinition),\n ...variables!,\n };\n\n const context: WriteContext = {\n store,\n written: Object.create(null),\n merge<T>(existing: T, incoming: T) {\n return merger.merge(existing, incoming) as T;\n },\n variables,\n varString: canonicalStringify(variables),\n fragmentMap: createFragmentMap(getFragmentDefinitions(query)),\n overwrite: !!overwrite,\n incomingById: new Map,\n clientOnly: false,\n };\n\n const ref = this.processSelectionSet({\n result: result || Object.create(null),\n dataId,\n selectionSet: operationDefinition.selectionSet,\n mergeTree: { map: new Map },\n context,\n });\n\n if (!isReference(ref)) {\n throw new InvariantError(`Could not identify object ${JSON.stringify(result)}`);\n }\n\n // So far, the store has not been modified, so now it's time to process\n // context.incomingById and merge those incoming fields into context.store.\n context.incomingById.forEach(({ fields, mergeTree, selections }, dataId) => {\n const entityRef = makeReference(dataId);\n\n if (mergeTree.map.size) {\n const applied = this.applyMerges(mergeTree, entityRef, fields, context);\n if (isReference(applied)) {\n // Assume References returned by applyMerges have already been merged\n // into the store. See makeMergeObjectsFunction in policies.ts for an\n // example of how this can happen.\n return;\n }\n // Otherwise, applyMerges returned a StoreObject, whose fields we should\n // merge into the store (see store.merge statement below).\n fields = applied;\n }\n\n if (__DEV__ && !context.overwrite) {\n const hasSelectionSet = (storeFieldName: string) =>\n fieldsWithSelectionSets.has(fieldNameFromStoreName(storeFieldName));\n const fieldsWithSelectionSets = new Set<string>();\n selections.forEach(selection => {\n if (isField(selection) && selection.selectionSet) {\n fieldsWithSelectionSets.add(selection.name.value);\n }\n });\n\n const hasMergeFunction = (storeFieldName: string) => {\n const childTree = mergeTree.map.get(storeFieldName);\n return Boolean(childTree && childTree.info && childTree.info.merge);\n };\n\n Object.keys(fields).forEach(storeFieldName => {\n // If a merge function was defined for this field, trust that it\n // did the right thing about (not) clobbering data. If the field\n // has no selection set, it's a scalar field, so it doesn't need\n // a merge function (even if it's an object, like JSON data).\n if (hasSelectionSet(storeFieldName) &&\n !hasMergeFunction(storeFieldName)) {\n warnAboutDataLoss(\n entityRef,\n fields,\n storeFieldName,\n context.store,\n );\n }\n });\n }\n\n store.merge(dataId, fields);\n });\n\n // Any IDs written explicitly to the cache will be retained as\n // reachable root IDs for garbage collection purposes. Although this\n // logic includes root IDs like ROOT_QUERY and ROOT_MUTATION, their\n // retainment counts are effectively ignored because cache.gc() always\n // includes them in its root ID set.\n store.retain(ref.__ref);\n\n return ref;\n }\n\n private processSelectionSet({\n dataId,\n result,\n selectionSet,\n context,\n // This object allows processSelectionSet to report useful information\n // to its callers without explicitly returning that information.\n mergeTree,\n }: ProcessSelectionSetOptions): StoreObject | Reference {\n const { policies } = this.cache;\n\n // Identify the result object, even if dataId was already provided,\n // since we always need keyObject below.\n const [id, keyObject] = policies.identify(\n result, selectionSet, context.fragmentMap);\n\n // If dataId was not provided, fall back to the id just generated by\n // policies.identify.\n dataId = dataId || id;\n\n if (\"string\" === typeof dataId) {\n // Avoid processing the same entity object using the same selection\n // set more than once. We use an array instead of a Set since most\n // entity IDs will be written using only one selection set, so the\n // size of this array is likely to be very small, meaning indexOf is\n // likely to be faster than Set.prototype.has.\n const sets = context.written[dataId] || (context.written[dataId] = []);\n const ref = makeReference(dataId);\n if (sets.indexOf(selectionSet) >= 0) return ref;\n sets.push(selectionSet);\n\n // If we're about to write a result object into the store, but we\n // happen to know that the exact same (===) result object would be\n // returned if we were to reread the result with the same inputs,\n // then we can skip the rest of the processSelectionSet work for\n // this object, and immediately return a Reference to it.\n if (this.reader && this.reader.isFresh(\n result,\n ref,\n selectionSet,\n context,\n )) {\n return ref;\n }\n }\n\n // This variable will be repeatedly updated using context.merge to\n // accumulate all fields that need to be written into the store.\n let incomingFields: StoreObject = Object.create(null);\n\n // Write any key fields that were used during identification, even if\n // they were not mentioned in the original query.\n if (keyObject) {\n incomingFields = context.merge(incomingFields, keyObject);\n }\n\n // If typename was not passed in, infer it. Note that typename is\n // always passed in for tricky-to-infer cases such as \"Query\" for\n // ROOT_QUERY.\n const typename: string | undefined =\n (dataId && policies.rootTypenamesById[dataId]) ||\n getTypenameFromResult(result, selectionSet, context.fragmentMap) ||\n (dataId && context.store.get(dataId, \"__typename\") as string);\n\n if (\"string\" === typeof typename) {\n incomingFields.__typename = typename;\n }\n\n const selections = new Set(selectionSet.selections);\n\n selections.forEach(selection => {\n if (!shouldInclude(selection, context.variables)) return;\n\n if (isField(selection)) {\n const resultFieldKey = resultKeyNameFromField(selection);\n const value = result[resultFieldKey];\n\n const wasClientOnly = context.clientOnly;\n context.clientOnly = wasClientOnly || !!(\n selection.directives &&\n selection.directives.some(d => d.name.value === \"client\")\n );\n\n if (value !== void 0) {\n const storeFieldName = policies.getStoreFieldName({\n typename,\n fieldName: selection.name.value,\n field: selection,\n variables: context.variables,\n });\n\n const childTree = getChildMergeTree(mergeTree, storeFieldName);\n\n let incomingValue =\n this.processFieldValue(value, selection, context, childTree);\n\n // To determine if this field holds a child object with a merge\n // function defined in its type policy (see PR #7070), we need to\n // figure out the child object's __typename.\n let childTypename: string | undefined;\n\n // The field's value can be an object that has a __typename only if\n // the field has a selection set. Otherwise incomingValue is scalar.\n if (selection.selectionSet) {\n // We attempt to find the child __typename first in context.store,\n // but the child object may not exist in the store yet, likely\n // because it's being written for the first time, during this very\n // call to writeToStore. Note: if incomingValue is a non-normalized\n // StoreObject (not a Reference), getFieldValue will read from that\n // object's properties to find its __typename.\n childTypename = context.store.getFieldValue<string>(\n incomingValue as StoreObject | Reference,\n \"__typename\",\n );\n\n // If the child object is being written for the first time, but\n // incomingValue is a Reference, then the entity that Reference\n // identifies should have an entry in context.incomingById, which\n // likely contains a __typename field we can use. After all, how\n // could we know the object's ID if it had no __typename? If we\n // wrote data into context.store as each processSelectionSet call\n // finished processing an entity object, the child object would\n // already be in context.store, so we wouldn't need this extra\n // check, but holding all context.store.merge calls until after\n // we've finished all processSelectionSet work is cleaner and solves\n // other problems, such as issue #8370.\n if (!childTypename && isReference(incomingValue)) {\n const info = context.incomingById.get(incomingValue.__ref);\n childTypename = info && info.fields.__typename;\n }\n }\n\n const merge = policies.getMergeFunction(\n typename,\n selection.name.value,\n childTypename,\n );\n\n if (merge) {\n childTree.info = {\n // TODO Check compatibility against any existing\n // childTree.field?\n field: selection,\n typename,\n merge,\n };\n } else {\n maybeRecycleChildMergeTree(mergeTree, storeFieldName);\n }\n\n incomingFields = context.merge(incomingFields, {\n [storeFieldName]: incomingValue,\n });\n\n } else if (\n !context.clientOnly &&\n !addTypenameToDocument.added(selection)\n ) {\n invariant.error(`Missing field '${\n resultKeyNameFromField(selection)\n }' while writing result ${\n JSON.stringify(result, null, 2)\n }`.substring(0, 1000));\n }\n\n context.clientOnly = wasClientOnly;\n\n } else {\n // This is not a field, so it must be a fragment, either inline or named\n const fragment = getFragmentFromSelection(\n selection,\n context.fragmentMap,\n );\n\n if (fragment &&\n // By passing result and context.variables, we enable\n // policies.fragmentMatches to bend the rules when typename is\n // not a known subtype of the fragment type condition, but the\n // result object contains all the keys requested by the\n // fragment, which strongly suggests the fragment probably\n // matched. This fuzzy matching behavior must be enabled by\n // including a regular expression string (such as \".*\" or\n // \"Prefix.*\" or \".*Suffix\") in the possibleTypes array for\n // specific supertypes; otherwise, all matching remains exact.\n // Fuzzy matches are remembered by the Policies object and\n // later used when reading from the cache. Since there is no\n // incoming result object to check when reading, reading does\n // not involve the same fuzzy inference, so the StoreReader\n // class calls policies.fragmentMatches without passing result\n // or context.variables. The flexibility of fuzzy matching\n // allows existing clients to accommodate previously unknown\n // __typename strings produced by server/schema changes, which\n // would otherwise be breaking changes.\n policies.fragmentMatches(fragment, typename, result, context.variables)) {\n fragment.selectionSet.selections.forEach(selections.add, selections);\n }\n }\n });\n\n if (\"string\" === typeof dataId) {\n const previous = context.incomingById.get(dataId);\n if (previous) {\n previous.fields = context.merge(previous.fields, incomingFields);\n previous.mergeTree = mergeMergeTrees(previous.mergeTree, mergeTree);\n // Add all previous SelectionNode objects, rather than creating a new\n // Set, since the original unmerged selections Set is not going to be\n // needed again (only the merged Set).\n previous.selections.forEach(selections.add, selections);\n previous.selections = selections;\n } else {\n context.incomingById.set(dataId, {\n fields: incomingFields,\n mergeTree,\n selections,\n });\n }\n return makeReference(dataId);\n }\n\n return incomingFields;\n }\n\n private processFieldValue(\n value: any,\n field: FieldNode,\n context: WriteContext,\n mergeTree: MergeTree,\n ): StoreValue {\n if (!field.selectionSet || value === null) {\n // In development, we need to clone scalar values so that they can be\n // safely frozen with maybeDeepFreeze in readFromStore.ts. In production,\n // it's cheaper to store the scalar values directly in the cache.\n return __DEV__ ? cloneDeep(value) : value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item, i) => {\n const value = this.processFieldValue(\n item, field, context, getChildMergeTree(mergeTree, i));\n maybeRecycleChildMergeTree(mergeTree, i);\n return value;\n });\n }\n\n return this.processSelectionSet({\n result: value,\n selectionSet: field.selectionSet,\n context,\n mergeTree,\n });\n }\n\n private applyMerges<T extends StoreValue>(\n mergeTree: MergeTree,\n existing: StoreValue,\n incoming: T,\n context: WriteContext,\n getStorageArgs?: Parameters<EntityStore[\"getStorage\"]>,\n ): T | Reference {\n if (mergeTree.map.size && !isReference(incoming)) {\n const e: StoreObject | Reference | undefined = (\n // Items in the same position in different arrays are not\n // necessarily related to each other, so when incoming is an array\n // we process its elements as if there was no existing data.\n !Array.isArray(incoming) &&\n // Likewise, existing must be either a Reference or a StoreObject\n // in order for its fields to be safe to merge with the fields of\n // the incoming object.\n (isReference(existing) || storeValueIsStoreObject(existing))\n ) ? existing : void 0;\n\n // This narrowing is implied by mergeTree.map.size > 0 and\n // !isReference(incoming), though TypeScript understandably cannot\n // hope to infer this type.\n const i = incoming as StoreObject | StoreValue[];\n\n // The options.storage objects provided to read and merge functions\n // are derived from the identity of the parent object plus a\n // sequence of storeFieldName strings/numbers identifying the nested\n // field name path of each field value to be merged.\n if (e && !getStorageArgs) {\n getStorageArgs = [isReference(e) ? e.__ref : e];\n }\n\n // It's possible that applying merge functions to this subtree will\n // not change the incoming data, so this variable tracks the fields\n // that did change, so we can create a new incoming object when (and\n // only when) at least one incoming field has changed. We use a Map\n // to preserve the type of numeric keys.\n let changedFields: Map<string | number, StoreValue> | undefined;\n\n const getValue = (\n from: typeof e | typeof i,\n name: string | number,\n ): StoreValue => {\n return Array.isArray(from)\n ? (typeof name === \"number\" ? from[name] : void 0)\n : context.store.getFieldValue(from, String(name))\n };\n\n mergeTree.map.forEach((childTree, storeFieldName) => {\n const eVal = getValue(e, storeFieldName);\n const iVal = getValue(i, storeFieldName);\n // If we have no incoming data, leave any existing data untouched.\n if (void 0 === iVal) return;\n if (getStorageArgs) {\n getStorageArgs.push(storeFieldName);\n }\n const aVal = this.applyMerges(\n childTree,\n eVal,\n iVal,\n context,\n getStorageArgs,\n );\n if (aVal !== iVal) {\n changedFields = changedFields || new Map;\n changedFields.set(storeFieldName, aVal);\n }\n if (getStorageArgs) {\n invariant(getStorageArgs.pop() === storeFieldName);\n }\n });\n\n if (changedFields) {\n // Shallow clone i so we can add changed fields to it.\n incoming = (Array.isArray(i) ? i.slice(0) : { ...i }) as T;\n changedFields.forEach((value, name) => {\n (incoming as any)[name] = value;\n });\n }\n }\n\n if (mergeTree.info) {\n return this.cache.policies.runMergeFunction(\n existing,\n incoming,\n mergeTree.info,\n context,\n getStorageArgs && context.store.getStorage(...getStorageArgs),\n );\n }\n\n return incoming;\n }\n}\n\nconst emptyMergeTreePool: MergeTree[] = [];\n\nfunction getChildMergeTree(\n { map }: MergeTree,\n name: string | number,\n): MergeTree {\n if (!map.has(name)) {\n map.set(name, emptyMergeTreePool.pop() || { map: new Map });\n }\n return map.get(name)!;\n}\n\nfunction mergeMergeTrees(\n left: MergeTree | undefined,\n right: MergeTree | undefined,\n): MergeTree {\n if (left === right || !right || mergeTreeIsEmpty(right)) return left!;\n if (!left || mergeTreeIsEmpty(left)) return right;\n\n const info = left.info && right.info ? {\n ...left.info,\n ...right.info,\n } : left.info || right.info;\n\n const needToMergeMaps = left.map.size && right.map.size;\n const map = needToMergeMaps ? new Map :\n left.map.size ? left.map : right.map;\n\n const merged = { info, map };\n\n if (needToMergeMaps) {\n const remainingRightKeys = new Set(right.map.keys());\n\n left.map.forEach((leftTree, key) => {\n merged.map.set(\n key,\n mergeMergeTrees(leftTree, right.map.get(key)),\n );\n remainingRightKeys.delete(key);\n });\n\n remainingRightKeys.forEach(key => {\n merged.map.set(\n key,\n mergeMergeTrees(\n right.map.get(key),\n left.map.get(key),\n ),\n );\n });\n }\n\n return merged;\n}\n\nfunction mergeTreeIsEmpty(tree: MergeTree | undefined): boolean {\n return !tree || !(tree.info || tree.map.size);\n}\n\nfunction maybeRecycleChildMergeTree(\n { map }: MergeTree,\n name: string | number,\n) {\n const childTree = map.get(name);\n if (childTree && mergeTreeIsEmpty(childTree)) {\n emptyMergeTreePool.push(childTree);\n map.delete(name);\n }\n}\n\nconst warnings = new Set<string>();\n\n// Note that this function is unused in production, and thus should be\n// pruned by any well-configured minifier.\nfunction warnAboutDataLoss(\n existingRef: Reference,\n incomingObj: StoreObject,\n storeFieldName: string,\n store: NormalizedCache,\n) {\n const getChild = (objOrRef: StoreObject | Reference): StoreObject | false => {\n const child = store.getFieldValue<StoreObject>(objOrRef, storeFieldName);\n return typeof child === \"object\" && child;\n };\n\n const existing = getChild(existingRef);\n if (!existing) return;\n\n const incoming = getChild(incomingObj);\n if (!incoming) return;\n\n // It's always safe to replace a reference, since it refers to data\n // safely stored elsewhere.\n if (isReference(existing)) return;\n\n // If the values are structurally equivalent, we do not need to worry\n // about incoming replacing existing.\n if (equal(existing, incoming)) return;\n\n // If we're replacing every key of the existing object, then the\n // existing data would be overwritten even if the objects were\n // normalized, so warning would not be helpful here.\n if (Object.keys(existing).every(\n key => store.getFieldValue(incoming, key) !== void 0)) {\n return;\n }\n\n const parentType =\n store.getFieldValue<string>(existingRef, \"__typename\") ||\n store.getFieldValue<string>(incomingObj, \"__typename\");\n const fieldName = fieldNameFromStoreName(storeFieldName);\n const typeDotName = `${parentType}.${fieldName}`;\n // Avoid warning more than once for the same type and field name.\n if (warnings.has(typeDotName)) return;\n warnings.add(typeDotName);\n\n const childTypenames: string[] = [];\n // Arrays do not have __typename fields, and always need a custom merge\n // function, even if their elements are normalized entities.\n if (!Array.isArray(existing) &&\n !Array.isArray(incoming)) {\n [existing, incoming].forEach(child => {\n const typename = store.getFieldValue(child, \"__typename\");\n if (typeof typename === \"string\" &&\n !childTypenames.includes(typename)) {\n childTypenames.push(typename);\n }\n });\n }\n\n invariant.warn(\n`Cache data may be lost when replacing the ${fieldName} field of a ${parentType} object.\n\nTo address this problem (which is not a bug in Apollo Client), ${\n childTypenames.length\n ? \"either ensure all objects of type \" +\n childTypenames.join(\" and \") + \" have an ID or a custom merge function, or \"\n : \"\"\n}define a custom merge function for the ${\n typeDotName\n} field, so InMemoryCache can safely merge these objects:\n\n existing: ${JSON.stringify(existing).slice(0, 1000)}\n incoming: ${JSON.stringify(incoming).slice(0, 1000)}\n\nFor more information about these options, please refer to the documentation:\n\n * Ensuring entity objects have IDs: https://go.apollo.dev/c/generating-unique-identifiers\n * Defining custom merge functions: https://go.apollo.dev/c/merging-non-normalized-objects\n`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"writeToStore.js","sourceRoot":"","sources":["../../../src/cache/inmemory/writeToStore.ts"],"names":[],"mappings":"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","sourcesContent":["import { SelectionSetNode, FieldNode, SelectionNode } from 'graphql';\nimport { invariant, InvariantError } from 'ts-invariant';\nimport { equal } from '@wry/equality';\n\nimport {\n createFragmentMap,\n FragmentMap,\n getFragmentFromSelection,\n getDefaultValues,\n getFragmentDefinitions,\n getOperationDefinition,\n getTypenameFromResult,\n makeReference,\n isField,\n resultKeyNameFromField,\n StoreValue,\n StoreObject,\n Reference,\n isReference,\n shouldInclude,\n cloneDeep,\n addTypenameToDocument,\n} from '../../utilities';\n\nimport { NormalizedCache, ReadMergeModifyContext, MergeTree } from './types';\nimport { makeProcessedFieldsMerger, fieldNameFromStoreName, storeValueIsStoreObject } from './helpers';\nimport { StoreReader } from './readFromStore';\nimport { InMemoryCache } from './inMemoryCache';\nimport { EntityStore } from './entityStore';\nimport { Cache } from '../../core';\nimport { canonicalStringify } from './object-canon';\n\nexport interface WriteContext extends ReadMergeModifyContext {\n readonly written: {\n [dataId: string]: SelectionSetNode[];\n };\n readonly fragmentMap?: FragmentMap;\n // General-purpose deep-merge function for use during writes.\n merge<T>(existing: T, incoming: T): T;\n // If true, merge functions will be called with undefined existing data.\n overwrite: boolean;\n incomingById: Map<string, {\n fields: StoreObject;\n mergeTree?: MergeTree;\n selections: Set<SelectionNode>;\n }>;\n clientOnly: boolean;\n};\n\ninterface ProcessSelectionSetOptions {\n dataId?: string,\n result: Record<string, any>;\n selectionSet: SelectionSetNode;\n context: WriteContext;\n mergeTree: MergeTree;\n}\n\nexport class StoreWriter {\n constructor(\n public readonly cache: InMemoryCache,\n private reader?: StoreReader,\n ) {}\n\n public writeToStore(store: NormalizedCache, {\n query,\n result,\n dataId,\n variables,\n overwrite,\n }: Cache.WriteOptions): Reference | undefined {\n const operationDefinition = getOperationDefinition(query)!;\n const merger = makeProcessedFieldsMerger();\n\n variables = {\n ...getDefaultValues(operationDefinition),\n ...variables!,\n };\n\n const context: WriteContext = {\n store,\n written: Object.create(null),\n merge<T>(existing: T, incoming: T) {\n return merger.merge(existing, incoming) as T;\n },\n variables,\n varString: canonicalStringify(variables),\n fragmentMap: createFragmentMap(getFragmentDefinitions(query)),\n overwrite: !!overwrite,\n incomingById: new Map,\n clientOnly: false,\n };\n\n const ref = this.processSelectionSet({\n result: result || Object.create(null),\n dataId,\n selectionSet: operationDefinition.selectionSet,\n mergeTree: { map: new Map },\n context,\n });\n\n if (!isReference(ref)) {\n throw new InvariantError(`Could not identify object ${JSON.stringify(result)}`);\n }\n\n // So far, the store has not been modified, so now it's time to process\n // context.incomingById and merge those incoming fields into context.store.\n context.incomingById.forEach(({ fields, mergeTree, selections }, dataId) => {\n const entityRef = makeReference(dataId);\n\n if (mergeTree && mergeTree.map.size) {\n const applied = this.applyMerges(mergeTree, entityRef, fields, context);\n if (isReference(applied)) {\n // Assume References returned by applyMerges have already been merged\n // into the store. See makeMergeObjectsFunction in policies.ts for an\n // example of how this can happen.\n return;\n }\n // Otherwise, applyMerges returned a StoreObject, whose fields we should\n // merge into the store (see store.merge statement below).\n fields = applied;\n }\n\n if (__DEV__ && !context.overwrite) {\n const hasSelectionSet = (storeFieldName: string) =>\n fieldsWithSelectionSets.has(fieldNameFromStoreName(storeFieldName));\n const fieldsWithSelectionSets = new Set<string>();\n selections.forEach(selection => {\n if (isField(selection) && selection.selectionSet) {\n fieldsWithSelectionSets.add(selection.name.value);\n }\n });\n\n const hasMergeFunction = (storeFieldName: string) => {\n const childTree = mergeTree && mergeTree.map.get(storeFieldName);\n return Boolean(childTree && childTree.info && childTree.info.merge);\n };\n\n Object.keys(fields).forEach(storeFieldName => {\n // If a merge function was defined for this field, trust that it\n // did the right thing about (not) clobbering data. If the field\n // has no selection set, it's a scalar field, so it doesn't need\n // a merge function (even if it's an object, like JSON data).\n if (hasSelectionSet(storeFieldName) &&\n !hasMergeFunction(storeFieldName)) {\n warnAboutDataLoss(\n entityRef,\n fields,\n storeFieldName,\n context.store,\n );\n }\n });\n }\n\n store.merge(dataId, fields);\n });\n\n // Any IDs written explicitly to the cache will be retained as\n // reachable root IDs for garbage collection purposes. Although this\n // logic includes root IDs like ROOT_QUERY and ROOT_MUTATION, their\n // retainment counts are effectively ignored because cache.gc() always\n // includes them in its root ID set.\n store.retain(ref.__ref);\n\n return ref;\n }\n\n private processSelectionSet({\n dataId,\n result,\n selectionSet,\n context,\n // This object allows processSelectionSet to report useful information\n // to its callers without explicitly returning that information.\n mergeTree,\n }: ProcessSelectionSetOptions): StoreObject | Reference {\n const { policies } = this.cache;\n\n // Identify the result object, even if dataId was already provided,\n // since we always need keyObject below.\n const [id, keyObject] = policies.identify(\n result, selectionSet, context.fragmentMap);\n\n // If dataId was not provided, fall back to the id just generated by\n // policies.identify.\n dataId = dataId || id;\n\n if (\"string\" === typeof dataId) {\n // Avoid processing the same entity object using the same selection\n // set more than once. We use an array instead of a Set since most\n // entity IDs will be written using only one selection set, so the\n // size of this array is likely to be very small, meaning indexOf is\n // likely to be faster than Set.prototype.has.\n const sets = context.written[dataId] || (context.written[dataId] = []);\n const ref = makeReference(dataId);\n if (sets.indexOf(selectionSet) >= 0) return ref;\n sets.push(selectionSet);\n\n // If we're about to write a result object into the store, but we\n // happen to know that the exact same (===) result object would be\n // returned if we were to reread the result with the same inputs,\n // then we can skip the rest of the processSelectionSet work for\n // this object, and immediately return a Reference to it.\n if (this.reader && this.reader.isFresh(\n result,\n ref,\n selectionSet,\n context,\n )) {\n return ref;\n }\n }\n\n // This variable will be repeatedly updated using context.merge to\n // accumulate all fields that need to be written into the store.\n let incomingFields: StoreObject = Object.create(null);\n\n // Write any key fields that were used during identification, even if\n // they were not mentioned in the original query.\n if (keyObject) {\n incomingFields = context.merge(incomingFields, keyObject);\n }\n\n // If typename was not passed in, infer it. Note that typename is\n // always passed in for tricky-to-infer cases such as \"Query\" for\n // ROOT_QUERY.\n const typename: string | undefined =\n (dataId && policies.rootTypenamesById[dataId]) ||\n getTypenameFromResult(result, selectionSet, context.fragmentMap) ||\n (dataId && context.store.get(dataId, \"__typename\") as string);\n\n if (\"string\" === typeof typename) {\n incomingFields.__typename = typename;\n }\n\n const selections = new Set(selectionSet.selections);\n\n selections.forEach(selection => {\n if (!shouldInclude(selection, context.variables)) return;\n\n if (isField(selection)) {\n const resultFieldKey = resultKeyNameFromField(selection);\n const value = result[resultFieldKey];\n\n const wasClientOnly = context.clientOnly;\n context.clientOnly = wasClientOnly || !!(\n selection.directives &&\n selection.directives.some(d => d.name.value === \"client\")\n );\n\n if (value !== void 0) {\n const storeFieldName = policies.getStoreFieldName({\n typename,\n fieldName: selection.name.value,\n field: selection,\n variables: context.variables,\n });\n\n const childTree = getChildMergeTree(mergeTree, storeFieldName);\n\n let incomingValue =\n this.processFieldValue(value, selection, context, childTree);\n\n // To determine if this field holds a child object with a merge\n // function defined in its type policy (see PR #7070), we need to\n // figure out the child object's __typename.\n let childTypename: string | undefined;\n\n // The field's value can be an object that has a __typename only if\n // the field has a selection set. Otherwise incomingValue is scalar.\n if (selection.selectionSet) {\n // We attempt to find the child __typename first in context.store,\n // but the child object may not exist in the store yet, likely\n // because it's being written for the first time, during this very\n // call to writeToStore. Note: if incomingValue is a non-normalized\n // StoreObject (not a Reference), getFieldValue will read from that\n // object's properties to find its __typename.\n childTypename = context.store.getFieldValue<string>(\n incomingValue as StoreObject | Reference,\n \"__typename\",\n );\n\n // If the child object is being written for the first time, but\n // incomingValue is a Reference, then the entity that Reference\n // identifies should have an entry in context.incomingById, which\n // likely contains a __typename field we can use. After all, how\n // could we know the object's ID if it had no __typename? If we\n // wrote data into context.store as each processSelectionSet call\n // finished processing an entity object, the child object would\n // already be in context.store, so we wouldn't need this extra\n // check, but holding all context.store.merge calls until after\n // we've finished all processSelectionSet work is cleaner and solves\n // other problems, such as issue #8370.\n if (!childTypename && isReference(incomingValue)) {\n const info = context.incomingById.get(incomingValue.__ref);\n childTypename = info && info.fields.__typename;\n }\n }\n\n const merge = policies.getMergeFunction(\n typename,\n selection.name.value,\n childTypename,\n );\n\n if (merge) {\n childTree.info = {\n // TODO Check compatibility against any existing\n // childTree.field?\n field: selection,\n typename,\n merge,\n };\n } else {\n maybeRecycleChildMergeTree(mergeTree, storeFieldName);\n }\n\n incomingFields = context.merge(incomingFields, {\n [storeFieldName]: incomingValue,\n });\n\n } else if (\n !context.clientOnly &&\n !addTypenameToDocument.added(selection)\n ) {\n invariant.error(`Missing field '${\n resultKeyNameFromField(selection)\n }' while writing result ${\n JSON.stringify(result, null, 2)\n }`.substring(0, 1000));\n }\n\n context.clientOnly = wasClientOnly;\n\n } else {\n // This is not a field, so it must be a fragment, either inline or named\n const fragment = getFragmentFromSelection(\n selection,\n context.fragmentMap,\n );\n\n if (fragment &&\n // By passing result and context.variables, we enable\n // policies.fragmentMatches to bend the rules when typename is\n // not a known subtype of the fragment type condition, but the\n // result object contains all the keys requested by the\n // fragment, which strongly suggests the fragment probably\n // matched. This fuzzy matching behavior must be enabled by\n // including a regular expression string (such as \".*\" or\n // \"Prefix.*\" or \".*Suffix\") in the possibleTypes array for\n // specific supertypes; otherwise, all matching remains exact.\n // Fuzzy matches are remembered by the Policies object and\n // later used when reading from the cache. Since there is no\n // incoming result object to check when reading, reading does\n // not involve the same fuzzy inference, so the StoreReader\n // class calls policies.fragmentMatches without passing result\n // or context.variables. The flexibility of fuzzy matching\n // allows existing clients to accommodate previously unknown\n // __typename strings produced by server/schema changes, which\n // would otherwise be breaking changes.\n policies.fragmentMatches(fragment, typename, result, context.variables)) {\n fragment.selectionSet.selections.forEach(selections.add, selections);\n }\n }\n });\n\n if (\"string\" === typeof dataId) {\n const previous = context.incomingById.get(dataId);\n if (previous) {\n previous.fields = context.merge(previous.fields, incomingFields);\n previous.mergeTree = mergeMergeTrees(previous.mergeTree, mergeTree);\n // Add all previous SelectionNode objects, rather than creating a new\n // Set, since the original unmerged selections Set is not going to be\n // needed again (only the merged Set).\n previous.selections.forEach(selections.add, selections);\n previous.selections = selections;\n } else {\n context.incomingById.set(dataId, {\n fields: incomingFields,\n // Save a reference to mergeTree only if it is not empty, because\n // empty MergeTrees may be recycled by maybeRecycleChildMergeTree and\n // reused for entirely different parts of the result tree.\n mergeTree: mergeTreeIsEmpty(mergeTree) ? void 0 : mergeTree,\n selections,\n });\n }\n return makeReference(dataId);\n }\n\n return incomingFields;\n }\n\n private processFieldValue(\n value: any,\n field: FieldNode,\n context: WriteContext,\n mergeTree: MergeTree,\n ): StoreValue {\n if (!field.selectionSet || value === null) {\n // In development, we need to clone scalar values so that they can be\n // safely frozen with maybeDeepFreeze in readFromStore.ts. In production,\n // it's cheaper to store the scalar values directly in the cache.\n return __DEV__ ? cloneDeep(value) : value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item, i) => {\n const value = this.processFieldValue(\n item, field, context, getChildMergeTree(mergeTree, i));\n maybeRecycleChildMergeTree(mergeTree, i);\n return value;\n });\n }\n\n return this.processSelectionSet({\n result: value,\n selectionSet: field.selectionSet,\n context,\n mergeTree,\n });\n }\n\n private applyMerges<T extends StoreValue>(\n mergeTree: MergeTree,\n existing: StoreValue,\n incoming: T,\n context: WriteContext,\n getStorageArgs?: Parameters<EntityStore[\"getStorage\"]>,\n ): T | Reference {\n if (mergeTree.map.size && !isReference(incoming)) {\n const e: StoreObject | Reference | undefined = (\n // Items in the same position in different arrays are not\n // necessarily related to each other, so when incoming is an array\n // we process its elements as if there was no existing data.\n !Array.isArray(incoming) &&\n // Likewise, existing must be either a Reference or a StoreObject\n // in order for its fields to be safe to merge with the fields of\n // the incoming object.\n (isReference(existing) || storeValueIsStoreObject(existing))\n ) ? existing : void 0;\n\n // This narrowing is implied by mergeTree.map.size > 0 and\n // !isReference(incoming), though TypeScript understandably cannot\n // hope to infer this type.\n const i = incoming as StoreObject | StoreValue[];\n\n // The options.storage objects provided to read and merge functions\n // are derived from the identity of the parent object plus a\n // sequence of storeFieldName strings/numbers identifying the nested\n // field name path of each field value to be merged.\n if (e && !getStorageArgs) {\n getStorageArgs = [isReference(e) ? e.__ref : e];\n }\n\n // It's possible that applying merge functions to this subtree will\n // not change the incoming data, so this variable tracks the fields\n // that did change, so we can create a new incoming object when (and\n // only when) at least one incoming field has changed. We use a Map\n // to preserve the type of numeric keys.\n let changedFields: Map<string | number, StoreValue> | undefined;\n\n const getValue = (\n from: typeof e | typeof i,\n name: string | number,\n ): StoreValue => {\n return Array.isArray(from)\n ? (typeof name === \"number\" ? from[name] : void 0)\n : context.store.getFieldValue(from, String(name))\n };\n\n mergeTree.map.forEach((childTree, storeFieldName) => {\n const eVal = getValue(e, storeFieldName);\n const iVal = getValue(i, storeFieldName);\n // If we have no incoming data, leave any existing data untouched.\n if (void 0 === iVal) return;\n if (getStorageArgs) {\n getStorageArgs.push(storeFieldName);\n }\n const aVal = this.applyMerges(\n childTree,\n eVal,\n iVal,\n context,\n getStorageArgs,\n );\n if (aVal !== iVal) {\n changedFields = changedFields || new Map;\n changedFields.set(storeFieldName, aVal);\n }\n if (getStorageArgs) {\n invariant(getStorageArgs.pop() === storeFieldName);\n }\n });\n\n if (changedFields) {\n // Shallow clone i so we can add changed fields to it.\n incoming = (Array.isArray(i) ? i.slice(0) : { ...i }) as T;\n changedFields.forEach((value, name) => {\n (incoming as any)[name] = value;\n });\n }\n }\n\n if (mergeTree.info) {\n return this.cache.policies.runMergeFunction(\n existing,\n incoming,\n mergeTree.info,\n context,\n getStorageArgs && context.store.getStorage(...getStorageArgs),\n );\n }\n\n return incoming;\n }\n}\n\nconst emptyMergeTreePool: MergeTree[] = [];\n\nfunction getChildMergeTree(\n { map }: MergeTree,\n name: string | number,\n): MergeTree {\n if (!map.has(name)) {\n map.set(name, emptyMergeTreePool.pop() || { map: new Map });\n }\n return map.get(name)!;\n}\n\nfunction mergeMergeTrees(\n left: MergeTree | undefined,\n right: MergeTree | undefined,\n): MergeTree {\n if (left === right || !right || mergeTreeIsEmpty(right)) return left!;\n if (!left || mergeTreeIsEmpty(left)) return right;\n\n const info = left.info && right.info ? {\n ...left.info,\n ...right.info,\n } : left.info || right.info;\n\n const needToMergeMaps = left.map.size && right.map.size;\n const map = needToMergeMaps ? new Map :\n left.map.size ? left.map : right.map;\n\n const merged = { info, map };\n\n if (needToMergeMaps) {\n const remainingRightKeys = new Set(right.map.keys());\n\n left.map.forEach((leftTree, key) => {\n merged.map.set(\n key,\n mergeMergeTrees(leftTree, right.map.get(key)),\n );\n remainingRightKeys.delete(key);\n });\n\n remainingRightKeys.forEach(key => {\n merged.map.set(\n key,\n mergeMergeTrees(\n right.map.get(key),\n left.map.get(key),\n ),\n );\n });\n }\n\n return merged;\n}\n\nfunction mergeTreeIsEmpty(tree: MergeTree | undefined): boolean {\n return !tree || !(tree.info || tree.map.size);\n}\n\nfunction maybeRecycleChildMergeTree(\n { map }: MergeTree,\n name: string | number,\n) {\n const childTree = map.get(name);\n if (childTree && mergeTreeIsEmpty(childTree)) {\n emptyMergeTreePool.push(childTree);\n map.delete(name);\n }\n}\n\nconst warnings = new Set<string>();\n\n// Note that this function is unused in production, and thus should be\n// pruned by any well-configured minifier.\nfunction warnAboutDataLoss(\n existingRef: Reference,\n incomingObj: StoreObject,\n storeFieldName: string,\n store: NormalizedCache,\n) {\n const getChild = (objOrRef: StoreObject | Reference): StoreObject | false => {\n const child = store.getFieldValue<StoreObject>(objOrRef, storeFieldName);\n return typeof child === \"object\" && child;\n };\n\n const existing = getChild(existingRef);\n if (!existing) return;\n\n const incoming = getChild(incomingObj);\n if (!incoming) return;\n\n // It's always safe to replace a reference, since it refers to data\n // safely stored elsewhere.\n if (isReference(existing)) return;\n\n // If the values are structurally equivalent, we do not need to worry\n // about incoming replacing existing.\n if (equal(existing, incoming)) return;\n\n // If we're replacing every key of the existing object, then the\n // existing data would be overwritten even if the objects were\n // normalized, so warning would not be helpful here.\n if (Object.keys(existing).every(\n key => store.getFieldValue(incoming, key) !== void 0)) {\n return;\n }\n\n const parentType =\n store.getFieldValue<string>(existingRef, \"__typename\") ||\n store.getFieldValue<string>(incomingObj, \"__typename\");\n const fieldName = fieldNameFromStoreName(storeFieldName);\n const typeDotName = `${parentType}.${fieldName}`;\n // Avoid warning more than once for the same type and field name.\n if (warnings.has(typeDotName)) return;\n warnings.add(typeDotName);\n\n const childTypenames: string[] = [];\n // Arrays do not have __typename fields, and always need a custom merge\n // function, even if their elements are normalized entities.\n if (!Array.isArray(existing) &&\n !Array.isArray(incoming)) {\n [existing, incoming].forEach(child => {\n const typename = store.getFieldValue(child, \"__typename\");\n if (typeof typename === \"string\" &&\n !childTypenames.includes(typename)) {\n childTypenames.push(typename);\n }\n });\n }\n\n invariant.warn(\n`Cache data may be lost when replacing the ${fieldName} field of a ${parentType} object.\n\nTo address this problem (which is not a bug in Apollo Client), ${\n childTypenames.length\n ? \"either ensure all objects of type \" +\n childTypenames.join(\" and \") + \" have an ID or a custom merge function, or \"\n : \"\"\n}define a custom merge function for the ${\n typeDotName\n} field, so InMemoryCache can safely merge these objects:\n\n existing: ${JSON.stringify(existing).slice(0, 1000)}\n incoming: ${JSON.stringify(incoming).slice(0, 1000)}\n\nFor more information about these options, please refer to the documentation:\n\n * Ensuring entity objects have IDs: https://go.apollo.dev/c/generating-unique-identifiers\n * Defining custom merge functions: https://go.apollo.dev/c/merging-non-normalized-objects\n`);\n}\n"]}
|
package/core/ApolloClient.js
CHANGED
|
@@ -30,7 +30,7 @@ var ApolloClient = (function () {
|
|
|
30
30
|
if (!cache) {
|
|
31
31
|
throw __DEV__ ? new InvariantError("To initialize Apollo Client, you must specify a 'cache' property " +
|
|
32
32
|
"in the options object. \n" +
|
|
33
|
-
"For more information, please visit: https://go.apollo.dev/c/docs") : new InvariantError(
|
|
33
|
+
"For more information, please visit: https://go.apollo.dev/c/docs") : new InvariantError(9);
|
|
34
34
|
}
|
|
35
35
|
this.link = link;
|
|
36
36
|
this.cache = cache;
|
|
@@ -126,7 +126,7 @@ var ApolloClient = (function () {
|
|
|
126
126
|
__DEV__ ? invariant(options.fetchPolicy !== 'cache-and-network', 'The cache-and-network fetchPolicy does not work with client.query, because ' +
|
|
127
127
|
'client.query can only return a single result. Please use client.watchQuery ' +
|
|
128
128
|
'to receive multiple results from the cache and the network, or consider ' +
|
|
129
|
-
'using a different fetchPolicy, such as cache-first or network-only.') : invariant(options.fetchPolicy !== 'cache-and-network',
|
|
129
|
+
'using a different fetchPolicy, such as cache-first or network-only.') : invariant(options.fetchPolicy !== 'cache-and-network', 10);
|
|
130
130
|
if (this.disableNetworkFetches && options.fetchPolicy === 'network-only') {
|
|
131
131
|
options = __assign(__assign({}, options), { fetchPolicy: 'cache-first' });
|
|
132
132
|
}
|
package/core/LocalState.js
CHANGED
|
@@ -172,7 +172,7 @@ var LocalState = (function () {
|
|
|
172
172
|
}
|
|
173
173
|
else {
|
|
174
174
|
fragment = fragmentMap[selection.name.value];
|
|
175
|
-
__DEV__ ? invariant(fragment, "No fragment named " + selection.name.value) : invariant(fragment,
|
|
175
|
+
__DEV__ ? invariant(fragment, "No fragment named " + selection.name.value) : invariant(fragment, 11);
|
|
176
176
|
}
|
|
177
177
|
if (fragment && fragment.typeCondition) {
|
|
178
178
|
typeCondition = fragment.typeCondition.name.value;
|
|
@@ -6,6 +6,7 @@ import { QueryManager } from './QueryManager';
|
|
|
6
6
|
import { ApolloQueryResult, OperationVariables } from './types';
|
|
7
7
|
import { WatchQueryOptions, FetchMoreQueryOptions, SubscribeToMoreOptions } from './watchQueryOptions';
|
|
8
8
|
import { QueryInfo } from './QueryInfo';
|
|
9
|
+
import { MissingFieldError } from '../cache';
|
|
9
10
|
export interface FetchMoreOptions<TData = any, TVariables = OperationVariables> {
|
|
10
11
|
updateQuery?: (previousQueryResult: TData, options: {
|
|
11
12
|
fetchMoreResult?: TData;
|
|
@@ -25,11 +26,10 @@ export declare class ObservableQuery<TData = any, TVariables = OperationVariable
|
|
|
25
26
|
private queryManager;
|
|
26
27
|
private observers;
|
|
27
28
|
private subscriptions;
|
|
28
|
-
private
|
|
29
|
-
private lastResultSnapshot;
|
|
30
|
-
private lastError;
|
|
29
|
+
private last?;
|
|
31
30
|
private queryInfo;
|
|
32
31
|
private concast?;
|
|
32
|
+
private observer?;
|
|
33
33
|
private pollingInfo?;
|
|
34
34
|
constructor({ queryManager, queryInfo, options, }: {
|
|
35
35
|
queryManager: QueryManager<any>;
|
|
@@ -39,8 +39,9 @@ export declare class ObservableQuery<TData = any, TVariables = OperationVariable
|
|
|
39
39
|
result(): Promise<ApolloQueryResult<TData>>;
|
|
40
40
|
getCurrentResult(saveAsLastResult?: boolean): ApolloQueryResult<TData>;
|
|
41
41
|
isDifferentFromLastResult(newResult: ApolloQueryResult<TData>): boolean;
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
private getLast;
|
|
43
|
+
getLastResult(variablesMustMatch?: boolean): ApolloQueryResult<TData> | undefined;
|
|
44
|
+
getLastError(variablesMustMatch?: boolean): ApolloError | undefined;
|
|
44
45
|
resetLastResults(): void;
|
|
45
46
|
resetQueryStoreErrors(): void;
|
|
46
47
|
refetch(variables?: Partial<TVariables>): Promise<ApolloQueryResult<TData>>;
|
|
@@ -56,9 +57,11 @@ export declare class ObservableQuery<TData = any, TVariables = OperationVariable
|
|
|
56
57
|
private updateLastResult;
|
|
57
58
|
reobserve(newOptions?: Partial<WatchQueryOptions<TVariables, TData>>, newNetworkStatus?: NetworkStatus): Promise<ApolloQueryResult<TData>>;
|
|
58
59
|
private observe;
|
|
59
|
-
private
|
|
60
|
+
private reportResult;
|
|
61
|
+
private reportError;
|
|
60
62
|
hasObservers(): boolean;
|
|
61
63
|
private tearDownQuery;
|
|
62
64
|
}
|
|
65
|
+
export declare function logMissingFieldErrors(missing: MissingFieldError[] | undefined): void;
|
|
63
66
|
export declare function applyNextFetchPolicy<TData, TVars>(options: Pick<WatchQueryOptions<TVars, TData>, "fetchPolicy" | "nextFetchPolicy">): void;
|
|
64
67
|
//# sourceMappingURL=ObservableQuery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservableQuery.d.ts","sourceRoot":"","sources":["../../src/core/ObservableQuery.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,aAAa,EAA4B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAKL,UAAU,EAMX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ObservableQuery.d.ts","sourceRoot":"","sources":["../../src/core/ObservableQuery.ts"],"names":[],"mappings":"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"}
|
package/core/ObservableQuery.js
CHANGED
|
@@ -3,7 +3,6 @@ import { invariant } from 'ts-invariant';
|
|
|
3
3
|
import { equal } from '@wry/equality';
|
|
4
4
|
import { NetworkStatus, isNetworkRequestInFlight } from "./networkStatus.js";
|
|
5
5
|
import { compact, cloneDeep, getOperationDefinition, Observable, iterateObserversSafely, isNonEmptyArray, fixObservableSubclass, } from "../utilities/index.js";
|
|
6
|
-
import { ApolloError } from "../errors/index.js";
|
|
7
6
|
var warnedAboutUpdateQuery = false;
|
|
8
7
|
var ObservableQuery = (function (_super) {
|
|
9
8
|
__extends(ObservableQuery, _super);
|
|
@@ -19,11 +18,12 @@ var ObservableQuery = (function (_super) {
|
|
|
19
18
|
catch (_a) { }
|
|
20
19
|
var first = !_this.observers.size;
|
|
21
20
|
_this.observers.add(observer);
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
var last = _this.last;
|
|
22
|
+
if (last && last.error) {
|
|
23
|
+
observer.error && observer.error(last.error);
|
|
24
24
|
}
|
|
25
|
-
else if (
|
|
26
|
-
observer.next && observer.next(
|
|
25
|
+
else if (last && last.result) {
|
|
26
|
+
observer.next && observer.next(last.result);
|
|
27
27
|
}
|
|
28
28
|
if (first) {
|
|
29
29
|
_this.reobserve().catch(function () { });
|
|
@@ -36,18 +36,6 @@ var ObservableQuery = (function (_super) {
|
|
|
36
36
|
}) || this;
|
|
37
37
|
_this.observers = new Set();
|
|
38
38
|
_this.subscriptions = new Set();
|
|
39
|
-
_this.observer = {
|
|
40
|
-
next: function (result) {
|
|
41
|
-
if (_this.lastError || _this.isDifferentFromLastResult(result)) {
|
|
42
|
-
_this.updateLastResult(result);
|
|
43
|
-
iterateObserversSafely(_this.observers, 'next', result);
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
error: function (error) {
|
|
47
|
-
_this.updateLastResult(__assign(__assign({}, _this.lastResult), { error: error, errors: error.graphQLErrors, networkStatus: NetworkStatus.error, loading: false }));
|
|
48
|
-
iterateObserversSafely(_this.observers, 'error', _this.lastError = error);
|
|
49
|
-
},
|
|
50
|
-
};
|
|
51
39
|
_this.isTornDown = false;
|
|
52
40
|
_this.options = options;
|
|
53
41
|
_this.queryId = queryInfo.queryId || queryManager.generateQueryId();
|
|
@@ -86,15 +74,20 @@ var ObservableQuery = (function (_super) {
|
|
|
86
74
|
};
|
|
87
75
|
ObservableQuery.prototype.getCurrentResult = function (saveAsLastResult) {
|
|
88
76
|
if (saveAsLastResult === void 0) { saveAsLastResult = true; }
|
|
89
|
-
var
|
|
77
|
+
var lastResult = this.getLastResult(true);
|
|
90
78
|
var networkStatus = this.queryInfo.networkStatus ||
|
|
91
79
|
(lastResult && lastResult.networkStatus) ||
|
|
92
80
|
NetworkStatus.ready;
|
|
93
81
|
var result = __assign(__assign({}, lastResult), { loading: isNetworkRequestInFlight(networkStatus), networkStatus: networkStatus });
|
|
94
82
|
if (!this.queryManager.transform(this.options.query).hasForcedResolvers) {
|
|
95
83
|
var diff = this.queryInfo.getDiff();
|
|
96
|
-
|
|
97
|
-
|
|
84
|
+
if (diff.complete || this.options.returnPartialData) {
|
|
85
|
+
result.data = diff.result;
|
|
86
|
+
}
|
|
87
|
+
if (equal(result.data, {})) {
|
|
88
|
+
result.data = void 0;
|
|
89
|
+
}
|
|
90
|
+
var _a = this.options.fetchPolicy, fetchPolicy = _a === void 0 ? "cache-first" : _a;
|
|
98
91
|
if (diff.complete) {
|
|
99
92
|
if (result.networkStatus === NetworkStatus.loading &&
|
|
100
93
|
(fetchPolicy === 'cache-first' ||
|
|
@@ -107,12 +100,13 @@ var ObservableQuery = (function (_super) {
|
|
|
107
100
|
else if (fetchPolicy !== "no-cache") {
|
|
108
101
|
result.partial = true;
|
|
109
102
|
}
|
|
110
|
-
if (
|
|
103
|
+
if (__DEV__ &&
|
|
104
|
+
!diff.complete &&
|
|
111
105
|
!this.options.partialRefetch &&
|
|
112
106
|
!result.loading &&
|
|
113
107
|
!result.data &&
|
|
114
108
|
!result.error) {
|
|
115
|
-
|
|
109
|
+
logMissingFieldErrors(diff.missing);
|
|
116
110
|
}
|
|
117
111
|
}
|
|
118
112
|
if (saveAsLastResult) {
|
|
@@ -121,18 +115,24 @@ var ObservableQuery = (function (_super) {
|
|
|
121
115
|
return result;
|
|
122
116
|
};
|
|
123
117
|
ObservableQuery.prototype.isDifferentFromLastResult = function (newResult) {
|
|
124
|
-
return !equal(this.
|
|
118
|
+
return !this.last || !equal(this.last.result, newResult);
|
|
125
119
|
};
|
|
126
|
-
ObservableQuery.prototype.
|
|
127
|
-
|
|
120
|
+
ObservableQuery.prototype.getLast = function (key, variablesMustMatch) {
|
|
121
|
+
var last = this.last;
|
|
122
|
+
if (last &&
|
|
123
|
+
last[key] &&
|
|
124
|
+
(!variablesMustMatch || equal(last.variables, this.variables))) {
|
|
125
|
+
return last[key];
|
|
126
|
+
}
|
|
128
127
|
};
|
|
129
|
-
ObservableQuery.prototype.
|
|
130
|
-
return this.
|
|
128
|
+
ObservableQuery.prototype.getLastResult = function (variablesMustMatch) {
|
|
129
|
+
return this.getLast("result", variablesMustMatch);
|
|
130
|
+
};
|
|
131
|
+
ObservableQuery.prototype.getLastError = function (variablesMustMatch) {
|
|
132
|
+
return this.getLast("error", variablesMustMatch);
|
|
131
133
|
};
|
|
132
134
|
ObservableQuery.prototype.resetLastResults = function () {
|
|
133
|
-
delete this.
|
|
134
|
-
delete this.lastResultSnapshot;
|
|
135
|
-
delete this.lastError;
|
|
135
|
+
delete this.last;
|
|
136
136
|
this.isTornDown = false;
|
|
137
137
|
};
|
|
138
138
|
ObservableQuery.prototype.resetQueryStoreErrors = function () {
|
|
@@ -245,12 +245,10 @@ var ObservableQuery = (function (_super) {
|
|
|
245
245
|
}, NetworkStatus.setVariables);
|
|
246
246
|
};
|
|
247
247
|
ObservableQuery.prototype.updateQuery = function (mapFn) {
|
|
248
|
-
var _a;
|
|
249
248
|
var queryManager = this.queryManager;
|
|
250
249
|
var result = queryManager.cache.diff({
|
|
251
250
|
query: this.options.query,
|
|
252
251
|
variables: this.variables,
|
|
253
|
-
previousResult: (_a = this.lastResult) === null || _a === void 0 ? void 0 : _a.data,
|
|
254
252
|
returnPartialData: true,
|
|
255
253
|
optimistic: false,
|
|
256
254
|
}).result;
|
|
@@ -295,7 +293,7 @@ var ObservableQuery = (function (_super) {
|
|
|
295
293
|
pollingInfo.interval === pollInterval) {
|
|
296
294
|
return;
|
|
297
295
|
}
|
|
298
|
-
__DEV__ ? invariant(pollInterval, 'Attempted to start a polling query without a polling interval.') : invariant(pollInterval,
|
|
296
|
+
__DEV__ ? invariant(pollInterval, 'Attempted to start a polling query without a polling interval.') : invariant(pollInterval, 12);
|
|
299
297
|
var info = pollingInfo || (this.pollingInfo = {});
|
|
300
298
|
info.interval = pollInterval;
|
|
301
299
|
var maybeFetch = function () {
|
|
@@ -320,18 +318,18 @@ var ObservableQuery = (function (_super) {
|
|
|
320
318
|
};
|
|
321
319
|
poll();
|
|
322
320
|
};
|
|
323
|
-
ObservableQuery.prototype.updateLastResult = function (newResult) {
|
|
324
|
-
|
|
325
|
-
this.
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
: cloneDeep(newResult);
|
|
321
|
+
ObservableQuery.prototype.updateLastResult = function (newResult, variables) {
|
|
322
|
+
if (variables === void 0) { variables = this.variables; }
|
|
323
|
+
this.last = __assign(__assign({}, this.last), { result: this.queryManager.assumeImmutableResults
|
|
324
|
+
? newResult
|
|
325
|
+
: cloneDeep(newResult), variables: variables });
|
|
329
326
|
if (!isNonEmptyArray(newResult.errors)) {
|
|
330
|
-
delete this.
|
|
327
|
+
delete this.last.error;
|
|
331
328
|
}
|
|
332
|
-
return
|
|
329
|
+
return this.last;
|
|
333
330
|
};
|
|
334
331
|
ObservableQuery.prototype.reobserve = function (newOptions, newNetworkStatus) {
|
|
332
|
+
var _this = this;
|
|
335
333
|
this.isTornDown = false;
|
|
336
334
|
var useDisposableConcast = newNetworkStatus === NetworkStatus.refetch ||
|
|
337
335
|
newNetworkStatus === NetworkStatus.fetchMore ||
|
|
@@ -352,18 +350,39 @@ var ObservableQuery = (function (_super) {
|
|
|
352
350
|
}
|
|
353
351
|
}
|
|
354
352
|
}
|
|
353
|
+
var variables = options.variables && __assign({}, options.variables);
|
|
355
354
|
var concast = this.fetch(options, newNetworkStatus);
|
|
355
|
+
var observer = {
|
|
356
|
+
next: function (result) {
|
|
357
|
+
_this.reportResult(result, variables);
|
|
358
|
+
},
|
|
359
|
+
error: function (error) {
|
|
360
|
+
_this.reportError(error, variables);
|
|
361
|
+
},
|
|
362
|
+
};
|
|
356
363
|
if (!useDisposableConcast) {
|
|
357
|
-
if (this.concast) {
|
|
364
|
+
if (this.concast && this.observer) {
|
|
358
365
|
this.concast.removeObserver(this.observer, true);
|
|
359
366
|
}
|
|
360
367
|
this.concast = concast;
|
|
368
|
+
this.observer = observer;
|
|
361
369
|
}
|
|
362
|
-
concast.addObserver(
|
|
370
|
+
concast.addObserver(observer);
|
|
363
371
|
return concast.promise;
|
|
364
372
|
};
|
|
365
373
|
ObservableQuery.prototype.observe = function () {
|
|
366
|
-
this.
|
|
374
|
+
this.reportResult(this.getCurrentResult(false), this.variables);
|
|
375
|
+
};
|
|
376
|
+
ObservableQuery.prototype.reportResult = function (result, variables) {
|
|
377
|
+
if (this.getLastError() || this.isDifferentFromLastResult(result)) {
|
|
378
|
+
this.updateLastResult(result, variables);
|
|
379
|
+
iterateObserversSafely(this.observers, 'next', result);
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
ObservableQuery.prototype.reportError = function (error, variables) {
|
|
383
|
+
var errorResult = __assign(__assign({}, this.getLastResult()), { error: error, errors: error.graphQLErrors, networkStatus: NetworkStatus.error, loading: false });
|
|
384
|
+
this.updateLastResult(errorResult, variables);
|
|
385
|
+
iterateObserversSafely(this.observers, 'error', this.last.error = error);
|
|
367
386
|
};
|
|
368
387
|
ObservableQuery.prototype.hasObservers = function () {
|
|
369
388
|
return this.observers.size > 0;
|
|
@@ -371,9 +390,10 @@ var ObservableQuery = (function (_super) {
|
|
|
371
390
|
ObservableQuery.prototype.tearDownQuery = function () {
|
|
372
391
|
if (this.isTornDown)
|
|
373
392
|
return;
|
|
374
|
-
if (this.concast) {
|
|
393
|
+
if (this.concast && this.observer) {
|
|
375
394
|
this.concast.removeObserver(this.observer);
|
|
376
395
|
delete this.concast;
|
|
396
|
+
delete this.observer;
|
|
377
397
|
}
|
|
378
398
|
this.stopPolling();
|
|
379
399
|
this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });
|
|
@@ -389,6 +409,11 @@ fixObservableSubclass(ObservableQuery);
|
|
|
389
409
|
function defaultSubscriptionObserverErrorCallback(error) {
|
|
390
410
|
__DEV__ && invariant.error('Unhandled error', error.message, error.stack);
|
|
391
411
|
}
|
|
412
|
+
export function logMissingFieldErrors(missing) {
|
|
413
|
+
if (__DEV__ && isNonEmptyArray(missing)) {
|
|
414
|
+
__DEV__ && invariant.debug("Missing cache result fields: " + missing.map(function (m) { return m.path.join('.'); }).join(', '), missing);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
392
417
|
export function applyNextFetchPolicy(options) {
|
|
393
418
|
var _a = options.fetchPolicy, fetchPolicy = _a === void 0 ? "cache-first" : _a, nextFetchPolicy = options.nextFetchPolicy;
|
|
394
419
|
if (nextFetchPolicy) {
|