@apollo/client 3.4.8 → 3.4.12

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.
Files changed (240) hide show
  1. package/README.md +2 -2
  2. package/apollo-client.cjs.js +92 -107
  3. package/apollo-client.cjs.js.map +1 -1
  4. package/apollo-client.cjs.min.js +1 -0
  5. package/cache/cache.cjs.js +20 -22
  6. package/cache/cache.cjs.js.map +1 -1
  7. package/cache/index.d.ts +1 -0
  8. package/cache/index.d.ts.map +1 -1
  9. package/cache/index.js +1 -3
  10. package/cache/index.js.map +1 -1
  11. package/cache/inmemory/entityStore.js +2 -2
  12. package/cache/inmemory/entityStore.js.map +1 -1
  13. package/cache/inmemory/object-canon.d.ts +1 -0
  14. package/cache/inmemory/object-canon.d.ts.map +1 -1
  15. package/cache/inmemory/object-canon.js +1 -0
  16. package/cache/inmemory/object-canon.js.map +1 -1
  17. package/cache/inmemory/policies.d.ts.map +1 -1
  18. package/cache/inmemory/policies.js +4 -4
  19. package/cache/inmemory/policies.js.map +1 -1
  20. package/cache/inmemory/readFromStore.d.ts.map +1 -1
  21. package/cache/inmemory/readFromStore.js +4 -4
  22. package/cache/inmemory/readFromStore.js.map +1 -1
  23. package/cache/inmemory/writeToStore.d.ts.map +1 -1
  24. package/cache/inmemory/writeToStore.js +2 -2
  25. package/cache/inmemory/writeToStore.js.map +1 -1
  26. package/core/ApolloClient.d.ts.map +1 -1
  27. package/core/ApolloClient.js +3 -3
  28. package/core/ApolloClient.js.map +1 -1
  29. package/core/LocalState.d.ts.map +1 -1
  30. package/core/LocalState.js +2 -2
  31. package/core/LocalState.js.map +1 -1
  32. package/core/ObservableQuery.d.ts.map +1 -1
  33. package/core/ObservableQuery.js +19 -6
  34. package/core/ObservableQuery.js.map +1 -1
  35. package/core/QueryManager.d.ts.map +1 -1
  36. package/core/QueryManager.js +10 -10
  37. package/core/QueryManager.js.map +1 -1
  38. package/core/core.cjs.js +49 -35
  39. package/core/core.cjs.js.map +1 -1
  40. package/core/index.js +1 -1
  41. package/core/index.js.map +1 -1
  42. package/errors/errors.cjs.js +1 -2
  43. package/errors/errors.cjs.js.map +1 -1
  44. package/errors/index.d.ts +1 -0
  45. package/errors/index.d.ts.map +1 -1
  46. package/errors/index.js +1 -3
  47. package/errors/index.js.map +1 -1
  48. package/invariantErrorCodes.js +56 -81
  49. package/link/core/ApolloLink.js +2 -2
  50. package/link/core/ApolloLink.js.map +1 -1
  51. package/link/core/core.cjs.js +4 -6
  52. package/link/core/core.cjs.js.map +1 -1
  53. package/link/core/index.d.ts +1 -0
  54. package/link/core/index.d.ts.map +1 -1
  55. package/link/core/index.js +1 -3
  56. package/link/core/index.js.map +1 -1
  57. package/link/http/checkFetcher.js +2 -2
  58. package/link/http/checkFetcher.js.map +1 -1
  59. package/link/http/createHttpLink.d.ts +1 -0
  60. package/link/http/createHttpLink.d.ts.map +1 -1
  61. package/link/http/createHttpLink.js +1 -0
  62. package/link/http/createHttpLink.js.map +1 -1
  63. package/link/http/http.cjs.js +3 -3
  64. package/link/http/http.cjs.js.map +1 -1
  65. package/link/http/index.d.ts +1 -0
  66. package/link/http/index.d.ts.map +1 -1
  67. package/link/http/index.js +1 -0
  68. package/link/http/index.js.map +1 -1
  69. package/link/http/serializeFetchParameter.d.ts +1 -1
  70. package/link/http/serializeFetchParameter.d.ts.map +1 -1
  71. package/link/http/serializeFetchParameter.js +2 -2
  72. package/link/http/serializeFetchParameter.js.map +1 -1
  73. package/link/persisted-queries/index.d.ts +1 -1
  74. package/link/persisted-queries/index.d.ts.map +1 -1
  75. package/link/persisted-queries/index.js +4 -4
  76. package/link/persisted-queries/index.js.map +1 -1
  77. package/link/persisted-queries/persisted-queries.cjs.js +8 -5
  78. package/link/persisted-queries/persisted-queries.cjs.js.map +1 -1
  79. package/link/utils/index.d.ts +1 -0
  80. package/link/utils/index.d.ts.map +1 -1
  81. package/link/utils/index.js +1 -0
  82. package/link/utils/index.js.map +1 -1
  83. package/link/utils/toPromise.d.ts.map +1 -1
  84. package/link/utils/toPromise.js +1 -1
  85. package/link/utils/toPromise.js.map +1 -1
  86. package/link/utils/utils.cjs.js +3 -3
  87. package/link/utils/utils.cjs.js.map +1 -1
  88. package/link/utils/validateOperation.d.ts.map +1 -1
  89. package/link/utils/validateOperation.js +2 -2
  90. package/link/utils/validateOperation.js.map +1 -1
  91. package/package.json +11 -11
  92. package/react/context/ApolloConsumer.d.ts.map +1 -1
  93. package/react/context/ApolloConsumer.js +2 -2
  94. package/react/context/ApolloConsumer.js.map +1 -1
  95. package/react/context/ApolloContext.d.ts +2 -1
  96. package/react/context/ApolloContext.d.ts.map +1 -1
  97. package/react/context/ApolloContext.js +11 -5
  98. package/react/context/ApolloContext.js.map +1 -1
  99. package/react/context/ApolloProvider.d.ts.map +1 -1
  100. package/react/context/ApolloProvider.js +2 -2
  101. package/react/context/ApolloProvider.js.map +1 -1
  102. package/react/context/context.cjs.js +15 -9
  103. package/react/context/context.cjs.js.map +1 -1
  104. package/react/context/index.d.ts +1 -0
  105. package/react/context/index.d.ts.map +1 -1
  106. package/react/context/index.js +1 -0
  107. package/react/context/index.js.map +1 -1
  108. package/react/data/OperationData.d.ts.map +1 -1
  109. package/react/data/OperationData.js +3 -3
  110. package/react/data/OperationData.js.map +1 -1
  111. package/react/data/QueryData.d.ts.map +1 -1
  112. package/react/data/QueryData.js +1 -3
  113. package/react/data/QueryData.js.map +1 -1
  114. package/react/data/data.cjs.js +6 -8
  115. package/react/data/data.cjs.js.map +1 -1
  116. package/react/data/index.d.ts +1 -0
  117. package/react/data/index.d.ts.map +1 -1
  118. package/react/data/index.js +1 -0
  119. package/react/data/index.js.map +1 -1
  120. package/react/hoc/hoc-utils.d.ts.map +1 -1
  121. package/react/hoc/hoc-utils.js +2 -2
  122. package/react/hoc/hoc-utils.js.map +1 -1
  123. package/react/hoc/hoc.cjs.js +5 -5
  124. package/react/hoc/hoc.cjs.js.map +1 -1
  125. package/react/hoc/index.d.ts +1 -0
  126. package/react/hoc/index.d.ts.map +1 -1
  127. package/react/hoc/index.js +1 -0
  128. package/react/hoc/index.js.map +1 -1
  129. package/react/hoc/withApollo.d.ts.map +1 -1
  130. package/react/hoc/withApollo.js +2 -2
  131. package/react/hoc/withApollo.js.map +1 -1
  132. package/react/hooks/hooks.cjs.js +3 -3
  133. package/react/hooks/hooks.cjs.js.map +1 -1
  134. package/react/hooks/index.d.ts +1 -0
  135. package/react/hooks/index.d.ts.map +1 -1
  136. package/react/hooks/index.js +1 -0
  137. package/react/hooks/index.js.map +1 -1
  138. package/react/hooks/useApolloClient.d.ts.map +1 -1
  139. package/react/hooks/useApolloClient.js +2 -2
  140. package/react/hooks/useApolloClient.js.map +1 -1
  141. package/react/hooks/useSubscription.d.ts +1 -0
  142. package/react/hooks/useSubscription.d.ts.map +1 -1
  143. package/react/hooks/useSubscription.js +1 -0
  144. package/react/hooks/useSubscription.js.map +1 -1
  145. package/react/hooks/utils/useAfterFastRefresh.d.ts +1 -0
  146. package/react/hooks/utils/useAfterFastRefresh.d.ts.map +1 -1
  147. package/react/hooks/utils/useAfterFastRefresh.js +1 -0
  148. package/react/hooks/utils/useAfterFastRefresh.js.map +1 -1
  149. package/react/hooks/utils/useBaseQuery.d.ts +1 -0
  150. package/react/hooks/utils/useBaseQuery.d.ts.map +1 -1
  151. package/react/hooks/utils/useBaseQuery.js +1 -0
  152. package/react/hooks/utils/useBaseQuery.js.map +1 -1
  153. package/react/index.d.ts +1 -0
  154. package/react/index.d.ts.map +1 -1
  155. package/react/index.js +1 -3
  156. package/react/index.js.map +1 -1
  157. package/react/parser/index.d.ts.map +1 -1
  158. package/react/parser/index.js +5 -5
  159. package/react/parser/index.js.map +1 -1
  160. package/react/parser/parser.cjs.js +10 -10
  161. package/react/parser/parser.cjs.js.map +1 -1
  162. package/react/react.cjs.js +2 -3
  163. package/react/react.cjs.js.map +1 -1
  164. package/testing/index.d.ts +1 -0
  165. package/testing/index.d.ts.map +1 -1
  166. package/testing/index.js +1 -3
  167. package/testing/index.js.map +1 -1
  168. package/testing/testing.cjs.js +3 -5
  169. package/testing/testing.cjs.js.map +1 -1
  170. package/utilities/common/canUse.d.ts +1 -0
  171. package/utilities/common/canUse.d.ts.map +1 -1
  172. package/utilities/common/canUse.js +2 -0
  173. package/utilities/common/canUse.js.map +1 -1
  174. package/utilities/common/mergeDeep.js +1 -1
  175. package/utilities/common/mergeDeep.js.map +1 -1
  176. package/utilities/globals/DEV.js +2 -2
  177. package/utilities/globals/DEV.js.map +1 -1
  178. package/utilities/{common → globals}/global.d.ts +0 -0
  179. package/utilities/globals/global.d.ts.map +1 -0
  180. package/utilities/{common → globals}/global.js +0 -0
  181. package/utilities/globals/global.js.map +1 -0
  182. package/utilities/globals/globals.cjs.js +57 -0
  183. package/utilities/globals/globals.cjs.js.map +1 -0
  184. package/utilities/globals/index.d.ts +5 -2
  185. package/utilities/globals/index.d.ts.map +1 -1
  186. package/utilities/globals/index.js +8 -1
  187. package/utilities/globals/index.js.map +1 -1
  188. package/utilities/{common → globals}/maybe.d.ts +0 -0
  189. package/utilities/globals/maybe.d.ts.map +1 -0
  190. package/utilities/{common → globals}/maybe.js +0 -0
  191. package/utilities/globals/maybe.js.map +1 -0
  192. package/utilities/globals/package.json +7 -0
  193. package/utilities/graphql/directives.d.ts.map +1 -1
  194. package/utilities/graphql/directives.js +5 -5
  195. package/utilities/graphql/directives.js.map +1 -1
  196. package/utilities/graphql/fragments.d.ts.map +1 -1
  197. package/utilities/graphql/fragments.js +5 -5
  198. package/utilities/graphql/fragments.js.map +1 -1
  199. package/utilities/graphql/getFromAST.d.ts.map +1 -1
  200. package/utilities/graphql/getFromAST.js +9 -9
  201. package/utilities/graphql/getFromAST.js.map +1 -1
  202. package/utilities/graphql/storeUtils.d.ts.map +1 -1
  203. package/utilities/graphql/storeUtils.js +2 -2
  204. package/utilities/graphql/storeUtils.js.map +1 -1
  205. package/utilities/graphql/transform.d.ts.map +1 -1
  206. package/utilities/graphql/transform.js +2 -2
  207. package/utilities/graphql/transform.js.map +1 -1
  208. package/utilities/index.d.ts +1 -3
  209. package/utilities/index.d.ts.map +1 -1
  210. package/utilities/index.js +1 -5
  211. package/utilities/index.js.map +1 -1
  212. package/utilities/observables/Concast.js +1 -1
  213. package/utilities/observables/Concast.js.map +1 -1
  214. package/utilities/observables/subclassing.d.ts.map +1 -1
  215. package/utilities/observables/subclassing.js +2 -1
  216. package/utilities/observables/subclassing.js.map +1 -1
  217. package/utilities/package.json +1 -3
  218. package/utilities/policies/pagination.d.ts +1 -1
  219. package/utilities/policies/pagination.d.ts.map +1 -1
  220. package/utilities/policies/pagination.js +9 -4
  221. package/utilities/policies/pagination.js.map +1 -1
  222. package/utilities/testing/mocking/mockFetch.js +1 -1
  223. package/utilities/testing/mocking/mockFetch.js.map +1 -1
  224. package/utilities/testing/mocking/mockLink.d.ts.map +1 -1
  225. package/utilities/testing/mocking/mockLink.js +2 -2
  226. package/utilities/testing/mocking/mockLink.js.map +1 -1
  227. package/utilities/testing/mocking/mockWatchQuery.js +1 -1
  228. package/utilities/testing/mocking/mockWatchQuery.js.map +1 -1
  229. package/utilities/testing/observableToPromise.js +1 -1
  230. package/utilities/testing/observableToPromise.js.map +1 -1
  231. package/utilities/utilities.cjs.js +42 -74
  232. package/utilities/utilities.cjs.js.map +1 -1
  233. package/version.js +1 -1
  234. package/apollo-core.cjs.js +0 -5768
  235. package/apollo-core.cjs.js.map +0 -1
  236. package/apollo-core.cjs.min.js +0 -1
  237. package/utilities/common/global.d.ts.map +0 -1
  238. package/utilities/common/global.js.map +0 -1
  239. package/utilities/common/maybe.d.ts.map +0 -1
  240. package/utilities/common/maybe.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Concast.js","sourceRoot":"","sources":["../../../src/utilities/observables/Concast.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable, Observer, ObservableSubscription, Subscriber } from \"./Observable\";\nimport { iterateObserversSafely } from \"./iteration\";\nimport { fixObservableSubclass } from \"./subclassing\";\n\ntype MaybeAsync<T> = T | PromiseLike<T>;\n\nfunction isPromiseLike<T>(value: MaybeAsync<T>): value is PromiseLike<T> {\n return value && typeof (value as any).then === \"function\";\n}\n\n// Any individual Source<T> can be an Observable<T> or a promise for one.\ntype Source<T> = MaybeAsync<Observable<T>>;\n\nexport type ConcastSourcesIterable<T> = Iterable<Source<T>>;\n\n// A Concast<T> observable concatenates the given sources into a single\n// non-overlapping sequence of Ts, automatically unwrapping any promises,\n// and broadcasts the T elements of that sequence to any number of\n// subscribers, all without creating a bunch of intermediary Observable\n// wrapper objects.\n//\n// Even though any number of observers can subscribe to the Concast, each\n// source observable is guaranteed to receive at most one subscribe call,\n// and the results are multicast to all observers.\n//\n// In addition to broadcasting every next/error message to this.observers,\n// the Concast stores the most recent message using this.latest, so any\n// new observers can immediately receive the latest message, even if it\n// was originally delivered in the past. This behavior means we can assume\n// every active observer in this.observers has received the same most\n// recent message.\n//\n// With the exception of this.latest replay, a Concast is a \"hot\"\n// observable in the sense that it does not replay past results from the\n// beginning of time for each new observer.\n//\n// Could we have used some existing RxJS class instead? Concast<T> is\n// similar to a BehaviorSubject<T>, because it is multicast and redelivers\n// the latest next/error message to new subscribers. Unlike Subject<T>,\n// Concast<T> does not expose an Observer<T> interface (this.handlers is\n// intentionally private), since Concast<T> gets its inputs from the\n// concatenated sources. If we ever switch to RxJS, there may be some\n// value in reusing their code, but for now we use zen-observable, which\n// does not contain any Subject implementations.\nexport class Concast<T> extends Observable<T> {\n // Active observers receiving broadcast messages. Thanks to this.latest,\n // we can assume all observers in this Set have received the same most\n // recent message, though possibly at different times in the past.\n private observers = new Set<Observer<T>>();\n\n // This property starts off undefined to indicate the initial\n // subscription has not yet begun, then points to each source\n // subscription in turn, and finally becomes null after the sources have\n // been exhausted. After that, it stays null.\n private sub?: ObservableSubscription | null;\n\n // Not only can the individual elements of the iterable be promises, but\n // also the iterable itself can be wrapped in a promise.\n constructor(sources: MaybeAsync<ConcastSourcesIterable<T>> | Subscriber<T>) {\n super(observer => {\n this.addObserver(observer);\n return () => this.removeObserver(observer);\n });\n\n // Suppress rejection warnings for this.promise, since it's perfectly\n // acceptable to pay no attention to this.promise if you're consuming\n // the results through the normal observable API.\n this.promise.catch(_ => {});\n\n // If someone accidentally tries to create a Concast using a subscriber\n // function, recover by creating an Observable from that subscriber and\n // using it as the source.\n if (typeof sources === \"function\") {\n sources = [new Observable(sources)];\n }\n\n if (isPromiseLike(sources)) {\n sources.then(\n iterable => this.start(iterable),\n this.handlers.error,\n );\n } else {\n this.start(sources);\n }\n }\n\n // A consumable array of source observables, incrementally consumed\n // each time this.handlers.complete is called.\n private sources: Source<T>[];\n\n private start(sources: ConcastSourcesIterable<T>) {\n if (this.sub !== void 0) return;\n\n // In practice, sources is most often simply an Array of observables.\n // TODO Consider using sources[Symbol.iterator]() to take advantage\n // of the laziness of non-Array iterables.\n this.sources = Array.from(sources);\n\n // Calling this.handlers.complete() kicks off consumption of the first\n // source observable. It's tempting to do this step lazily in\n // addObserver, but this.promise can be accessed without calling\n // addObserver, so consumption needs to begin eagerly.\n this.handlers.complete();\n }\n\n private deliverLastMessage(observer: Observer<T>) {\n if (this.latest) {\n const nextOrError = this.latest[0];\n const method = observer[nextOrError];\n if (method) {\n method.call(observer, this.latest[1]);\n }\n // If the subscription is already closed, and the last message was\n // a 'next' message, simulate delivery of the final 'complete'\n // message again.\n if (this.sub === null &&\n nextOrError === \"next\" &&\n observer.complete) {\n observer.complete();\n }\n }\n }\n\n // Note: cleanup observers do not count towards this total.\n private addCount = 0;\n\n public addObserver(observer: Observer<T>) {\n if (!this.observers.has(observer)) {\n // Immediately deliver the most recent message, so we can always\n // be sure all observers have the latest information.\n this.deliverLastMessage(observer);\n this.observers.add(observer);\n ++this.addCount;\n }\n }\n\n public removeObserver(\n observer: Observer<T>,\n quietly?: boolean,\n ) {\n if (this.observers.delete(observer) &&\n --this.addCount < 1 &&\n !quietly) {\n // In case there are still any cleanup observers in this.observers,\n // and no error or completion has been broadcast yet, make sure\n // those observers receive an error that terminates them.\n this.handlers.error(new Error(\"Observable cancelled prematurely\"));\n }\n }\n\n // Any Concast object can be trivially converted to a Promise, without\n // having to create a new wrapper Observable. This promise provides an\n // easy way to observe the final state of the Concast.\n private resolve: (result?: T | PromiseLike<T>) => void;\n private reject: (reason: any) => void;\n public readonly promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n // Name and argument of the most recently invoked observer method, used\n // to deliver latest results immediately to new observers.\n private latest?: [\"next\" | \"error\", any];\n\n // Bound handler functions that can be reused for every internal\n // subscription.\n private handlers = {\n next: (result: T) => {\n if (this.sub !== null) {\n this.latest = [\"next\", result];\n iterateObserversSafely(this.observers, \"next\", result);\n }\n },\n\n error: (error: any) => {\n const { sub } = this;\n if (sub !== null) {\n // Delay unsubscribing from the underlying subscription slightly,\n // so that immediately subscribing another observer can keep the\n // subscription active.\n if (sub) Promise.resolve().then(() => sub.unsubscribe());\n this.sub = null;\n this.latest = [\"error\", error];\n this.reject(error);\n iterateObserversSafely(this.observers, \"error\", error);\n }\n },\n\n complete: () => {\n if (this.sub !== null) {\n const value = this.sources.shift();\n if (!value) {\n this.sub = null;\n if (this.latest &&\n this.latest[0] === \"next\") {\n this.resolve(this.latest[1]);\n } else {\n this.resolve();\n }\n // We do not store this.latest = [\"complete\"], because doing so\n // discards useful information about the previous next (or\n // error) message. Instead, if new observers subscribe after\n // this Concast has completed, they will receive the final\n // 'next' message (unless there was an error) immediately\n // followed by a 'complete' message (see addObserver).\n iterateObserversSafely(this.observers, \"complete\");\n } else if (isPromiseLike(value)) {\n value.then(obs => this.sub = obs.subscribe(this.handlers));\n } else {\n this.sub = value.subscribe(this.handlers);\n }\n }\n },\n };\n\n public cleanup(callback: () => any) {\n let called = false;\n const once = () => {\n if (!called) {\n called = true;\n // Removing a cleanup observer should not unsubscribe from the\n // underlying Observable, so the only removeObserver behavior we\n // need here is to delete observer from this.observers.\n this.observers.delete(observer);\n callback();\n }\n }\n const observer = {\n next: once,\n error: once,\n complete: once,\n };\n const count = this.addCount;\n this.addObserver(observer);\n // Normally addObserver increments this.addCount, but we can \"hide\"\n // cleanup observers by restoring this.addCount to its previous value\n // after adding any cleanup observer.\n this.addCount = count;\n }\n\n // A public way to abort observation and broadcast.\n public cancel = (reason: any) => {\n this.reject(reason);\n this.sources = [];\n this.handlers.complete();\n }\n}\n\n// Necessary because the Concast constructor has a different signature\n// than the Observable constructor.\nfixObservableSubclass(Concast);\n"]}
1
+ {"version":3,"file":"Concast.js","sourceRoot":"","sources":["../../../src/utilities/observables/Concast.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable, Observer, ObservableSubscription, Subscriber } from \"./Observable\";\nimport { iterateObserversSafely } from \"./iteration\";\nimport { fixObservableSubclass } from \"./subclassing\";\n\ntype MaybeAsync<T> = T | PromiseLike<T>;\n\nfunction isPromiseLike<T>(value: MaybeAsync<T>): value is PromiseLike<T> {\n return value && typeof (value as any).then === \"function\";\n}\n\n// Any individual Source<T> can be an Observable<T> or a promise for one.\ntype Source<T> = MaybeAsync<Observable<T>>;\n\nexport type ConcastSourcesIterable<T> = Iterable<Source<T>>;\n\n// A Concast<T> observable concatenates the given sources into a single\n// non-overlapping sequence of Ts, automatically unwrapping any promises,\n// and broadcasts the T elements of that sequence to any number of\n// subscribers, all without creating a bunch of intermediary Observable\n// wrapper objects.\n//\n// Even though any number of observers can subscribe to the Concast, each\n// source observable is guaranteed to receive at most one subscribe call,\n// and the results are multicast to all observers.\n//\n// In addition to broadcasting every next/error message to this.observers,\n// the Concast stores the most recent message using this.latest, so any\n// new observers can immediately receive the latest message, even if it\n// was originally delivered in the past. This behavior means we can assume\n// every active observer in this.observers has received the same most\n// recent message.\n//\n// With the exception of this.latest replay, a Concast is a \"hot\"\n// observable in the sense that it does not replay past results from the\n// beginning of time for each new observer.\n//\n// Could we have used some existing RxJS class instead? Concast<T> is\n// similar to a BehaviorSubject<T>, because it is multicast and redelivers\n// the latest next/error message to new subscribers. Unlike Subject<T>,\n// Concast<T> does not expose an Observer<T> interface (this.handlers is\n// intentionally private), since Concast<T> gets its inputs from the\n// concatenated sources. If we ever switch to RxJS, there may be some\n// value in reusing their code, but for now we use zen-observable, which\n// does not contain any Subject implementations.\nexport class Concast<T> extends Observable<T> {\n // Active observers receiving broadcast messages. Thanks to this.latest,\n // we can assume all observers in this Set have received the same most\n // recent message, though possibly at different times in the past.\n private observers = new Set<Observer<T>>();\n\n // This property starts off undefined to indicate the initial\n // subscription has not yet begun, then points to each source\n // subscription in turn, and finally becomes null after the sources have\n // been exhausted. After that, it stays null.\n private sub?: ObservableSubscription | null;\n\n // Not only can the individual elements of the iterable be promises, but\n // also the iterable itself can be wrapped in a promise.\n constructor(sources: MaybeAsync<ConcastSourcesIterable<T>> | Subscriber<T>) {\n super(observer => {\n this.addObserver(observer);\n return () => this.removeObserver(observer);\n });\n\n // Suppress rejection warnings for this.promise, since it's perfectly\n // acceptable to pay no attention to this.promise if you're consuming\n // the results through the normal observable API.\n this.promise.catch(_ => {});\n\n // If someone accidentally tries to create a Concast using a subscriber\n // function, recover by creating an Observable from that subscriber and\n // using it as the source.\n if (typeof sources === \"function\") {\n sources = [new Observable(sources)];\n }\n\n if (isPromiseLike(sources)) {\n sources.then(\n iterable => this.start(iterable),\n this.handlers.error,\n );\n } else {\n this.start(sources);\n }\n }\n\n // A consumable array of source observables, incrementally consumed\n // each time this.handlers.complete is called.\n private sources: Source<T>[];\n\n private start(sources: ConcastSourcesIterable<T>) {\n if (this.sub !== void 0) return;\n\n // In practice, sources is most often simply an Array of observables.\n // TODO Consider using sources[Symbol.iterator]() to take advantage\n // of the laziness of non-Array iterables.\n this.sources = Array.from(sources);\n\n // Calling this.handlers.complete() kicks off consumption of the first\n // source observable. It's tempting to do this step lazily in\n // addObserver, but this.promise can be accessed without calling\n // addObserver, so consumption needs to begin eagerly.\n this.handlers.complete();\n }\n\n private deliverLastMessage(observer: Observer<T>) {\n if (this.latest) {\n const nextOrError = this.latest[0];\n const method = observer[nextOrError];\n if (method) {\n method.call(observer, this.latest[1]);\n }\n // If the subscription is already closed, and the last message was\n // a 'next' message, simulate delivery of the final 'complete'\n // message again.\n if (this.sub === null &&\n nextOrError === \"next\" &&\n observer.complete) {\n observer.complete();\n }\n }\n }\n\n // Note: cleanup observers do not count towards this total.\n private addCount = 0;\n\n public addObserver(observer: Observer<T>) {\n if (!this.observers.has(observer)) {\n // Immediately deliver the most recent message, so we can always\n // be sure all observers have the latest information.\n this.deliverLastMessage(observer);\n this.observers.add(observer);\n ++this.addCount;\n }\n }\n\n public removeObserver(\n observer: Observer<T>,\n quietly?: boolean,\n ) {\n if (this.observers.delete(observer) &&\n --this.addCount < 1 &&\n !quietly) {\n // In case there are still any cleanup observers in this.observers,\n // and no error or completion has been broadcast yet, make sure\n // those observers receive an error that terminates them.\n this.handlers.error(new Error(\"Observable cancelled prematurely\"));\n }\n }\n\n // Any Concast object can be trivially converted to a Promise, without\n // having to create a new wrapper Observable. This promise provides an\n // easy way to observe the final state of the Concast.\n private resolve: (result?: T | PromiseLike<T>) => void;\n private reject: (reason: any) => void;\n public readonly promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n // Name and argument of the most recently invoked observer method, used\n // to deliver latest results immediately to new observers.\n private latest?: [\"next\" | \"error\", any];\n\n // Bound handler functions that can be reused for every internal\n // subscription.\n private handlers = {\n next: (result: T) => {\n if (this.sub !== null) {\n this.latest = [\"next\", result];\n iterateObserversSafely(this.observers, \"next\", result);\n }\n },\n\n error: (error: any) => {\n const { sub } = this;\n if (sub !== null) {\n // Delay unsubscribing from the underlying subscription slightly,\n // so that immediately subscribing another observer can keep the\n // subscription active.\n if (sub) setTimeout(() => sub.unsubscribe());\n this.sub = null;\n this.latest = [\"error\", error];\n this.reject(error);\n iterateObserversSafely(this.observers, \"error\", error);\n }\n },\n\n complete: () => {\n if (this.sub !== null) {\n const value = this.sources.shift();\n if (!value) {\n this.sub = null;\n if (this.latest &&\n this.latest[0] === \"next\") {\n this.resolve(this.latest[1]);\n } else {\n this.resolve();\n }\n // We do not store this.latest = [\"complete\"], because doing so\n // discards useful information about the previous next (or\n // error) message. Instead, if new observers subscribe after\n // this Concast has completed, they will receive the final\n // 'next' message (unless there was an error) immediately\n // followed by a 'complete' message (see addObserver).\n iterateObserversSafely(this.observers, \"complete\");\n } else if (isPromiseLike(value)) {\n value.then(obs => this.sub = obs.subscribe(this.handlers));\n } else {\n this.sub = value.subscribe(this.handlers);\n }\n }\n },\n };\n\n public cleanup(callback: () => any) {\n let called = false;\n const once = () => {\n if (!called) {\n called = true;\n // Removing a cleanup observer should not unsubscribe from the\n // underlying Observable, so the only removeObserver behavior we\n // need here is to delete observer from this.observers.\n this.observers.delete(observer);\n callback();\n }\n }\n const observer = {\n next: once,\n error: once,\n complete: once,\n };\n const count = this.addCount;\n this.addObserver(observer);\n // Normally addObserver increments this.addCount, but we can \"hide\"\n // cleanup observers by restoring this.addCount to its previous value\n // after adding any cleanup observer.\n this.addCount = count;\n }\n\n // A public way to abort observation and broadcast.\n public cancel = (reason: any) => {\n this.reject(reason);\n this.sources = [];\n this.handlers.complete();\n }\n}\n\n// Necessary because the Concast constructor has a different signature\n// than the Observable constructor.\nfixObservableSubclass(Concast);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"subclassing.d.ts","sourceRoot":"","sources":["../../../src/utilities/observables/subclassing.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU1C,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,CAAC,GAAG,CAAC,EACjD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAehB"}
1
+ {"version":3,"file":"subclassing.d.ts","sourceRoot":"","sources":["../../../src/utilities/observables/subclassing.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,CAAC,GAAG,CAAC,EACjD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAehB"}
@@ -1,9 +1,10 @@
1
1
  import { Observable } from "./Observable.js";
2
+ import { canUseSymbol } from "..";
2
3
  export function fixObservableSubclass(subclass) {
3
4
  function set(key) {
4
5
  Object.defineProperty(subclass, key, { value: Observable });
5
6
  }
6
- if (typeof Symbol === "function" && Symbol.species) {
7
+ if (canUseSymbol && Symbol.species) {
7
8
  set(Symbol.species);
8
9
  }
9
10
  set("@@species");
@@ -1 +1 @@
1
- {"version":3,"file":"subclassing.js","sourceRoot":"","sources":["../../../src/utilities/observables/subclassing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU1C,MAAM,UAAU,qBAAqB,CAEnC,QAAW;IACX,SAAS,GAAG,CAAC,GAAoB;QAI/B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE;QAClD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KACrB;IAID,GAAG,CAAC,WAAW,CAAC,CAAC;IACjB,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { Observable } from \"./Observable\";\n\n// Generic implementations of Observable.prototype methods like map and\n// filter need to know how to create a new Observable from an Observable\n// subclass (like Concast or ObservableQuery). Those methods assume\n// (perhaps unwisely?) that they can call the subtype's constructor with a\n// Subscriber function, even though the subclass constructor might expect\n// different parameters. Defining this static Symbol.species property on\n// the subclass is a hint to generic Observable code to use the default\n// constructor instead of trying to do `new Subclass(observer => ...)`.\nexport function fixObservableSubclass<\n S extends new (...args: any[]) => Observable<any>,\n>(subclass: S): S {\n function set(key: symbol | string) {\n // Object.defineProperty is necessary because the Symbol.species\n // property is a getter by default in modern JS environments, so we\n // can't assign to it with a normal assignment expression.\n Object.defineProperty(subclass, key, { value: Observable });\n }\n if (typeof Symbol === \"function\" && Symbol.species) {\n set(Symbol.species);\n }\n // The \"@@species\" string is used as a fake Symbol.species value in some\n // polyfill systems (including the SymbolSpecies variable used by\n // zen-observable), so we should set it as well, to be safe.\n set(\"@@species\");\n return subclass;\n}\n"]}
1
+ {"version":3,"file":"subclassing.js","sourceRoot":"","sources":["../../../src/utilities/observables/subclassing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAUlC,MAAM,UAAU,qBAAqB,CAEnC,QAAW;IACX,SAAS,GAAG,CAAC,GAAoB;QAI/B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,YAAY,IAAI,MAAM,CAAC,OAAO,EAAE;QAClC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KACrB;IAID,GAAG,CAAC,WAAW,CAAC,CAAC;IACjB,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { Observable } from \"./Observable\";\nimport { canUseSymbol } from \"..\";\n\n// Generic implementations of Observable.prototype methods like map and\n// filter need to know how to create a new Observable from an Observable\n// subclass (like Concast or ObservableQuery). Those methods assume\n// (perhaps unwisely?) that they can call the subtype's constructor with a\n// Subscriber function, even though the subclass constructor might expect\n// different parameters. Defining this static Symbol.species property on\n// the subclass is a hint to generic Observable code to use the default\n// constructor instead of trying to do `new Subclass(observer => ...)`.\nexport function fixObservableSubclass<\n S extends new (...args: any[]) => Observable<any>,\n>(subclass: S): S {\n function set(key: symbol | string) {\n // Object.defineProperty is necessary because the Symbol.species\n // property is a getter by default in modern JS environments, so we\n // can't assign to it with a normal assignment expression.\n Object.defineProperty(subclass, key, { value: Observable });\n }\n if (canUseSymbol && Symbol.species) {\n set(Symbol.species);\n }\n // The \"@@species\" string is used as a fake Symbol.species value in some\n // polyfill systems (including the SymbolSpecies variable used by\n // zen-observable), so we should set it as well, to be safe.\n set(\"@@species\");\n return subclass;\n}\n"]}
@@ -3,7 +3,5 @@
3
3
  "main": "utilities.cjs.js",
4
4
  "module": "index.js",
5
5
  "types": "index.d.ts",
6
- "sideEffects": [
7
- "./globals/**"
8
- ]
6
+ "sideEffects": false
9
7
  }
@@ -22,7 +22,7 @@ export declare type TIncomingRelay<TNode> = {
22
22
  edges?: TRelayEdge<TNode>[];
23
23
  pageInfo?: TRelayPageInfo;
24
24
  };
25
- export declare type RelayFieldPolicy<TNode> = FieldPolicy<TExistingRelay<TNode>, TIncomingRelay<TNode>, TIncomingRelay<TNode>>;
25
+ export declare type RelayFieldPolicy<TNode> = FieldPolicy<TExistingRelay<TNode> | null, TIncomingRelay<TNode> | null, TIncomingRelay<TNode> | null>;
26
26
  export declare function relayStylePagination<TNode = Reference>(keyArgs?: KeyArgs): RelayFieldPolicy<TNode>;
27
27
  export {};
28
28
  //# sourceMappingURL=pagination.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/utilities/policies/pagination.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGrD,aAAK,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AAI3C,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,SAAS,EAC5C,OAAO,GAAE,OAAe,GACvB,WAAW,CAAC,CAAC,EAAE,CAAC,CAUlB;AAMD,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,SAAS,EACjD,OAAO,GAAE,OAAe,GACvB,WAAW,CAAC,CAAC,EAAE,CAAC,CAqBlB;AASD,oBAAY,UAAU,CAAC,KAAK,IAAI;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC;CACb,GAAG,CAAC,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtC,oBAAY,cAAc,GAAG;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oBAAY,cAAc,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC3C,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC,CAAC;AAEH,oBAAY,cAAc,CAAC,KAAK,IAAI;IAClC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,oBAAY,gBAAgB,CAAC,KAAK,IAAI,WAAW,CAC/C,cAAc,CAAC,KAAK,CAAC,EACrB,cAAc,CAAC,KAAK,CAAC,EACrB,cAAc,CAAC,KAAK,CAAC,CACtB,CAAC;AAKF,wBAAgB,oBAAoB,CAAC,KAAK,GAAG,SAAS,EACpD,OAAO,GAAE,OAAe,GACvB,gBAAgB,CAAC,KAAK,CAAC,CAmKzB"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/utilities/policies/pagination.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGrD,aAAK,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AAI3C,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,SAAS,EAC5C,OAAO,GAAE,OAAe,GACvB,WAAW,CAAC,CAAC,EAAE,CAAC,CAUlB;AAMD,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,SAAS,EACjD,OAAO,GAAE,OAAe,GACvB,WAAW,CAAC,CAAC,EAAE,CAAC,CAqBlB;AASD,oBAAY,UAAU,CAAC,KAAK,IAAI;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC;CACb,GAAG,CAAC,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEtC,oBAAY,cAAc,GAAG;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oBAAY,cAAc,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC3C,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC,CAAC;AAEH,oBAAY,cAAc,CAAC,KAAK,IAAI;IAClC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,oBAAY,gBAAgB,CAAC,KAAK,IAAI,WAAW,CAC/C,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAC5B,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAC5B,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,CAC7B,CAAC;AAKF,wBAAgB,oBAAoB,CAAC,KAAK,GAAG,SAAS,EACpD,OAAO,GAAE,OAAe,GACvB,gBAAgB,CAAC,KAAK,CAAC,CA2KzB"}
@@ -6,7 +6,7 @@ export function concatPagination(keyArgs) {
6
6
  return {
7
7
  keyArgs: keyArgs,
8
8
  merge: function (existing, incoming) {
9
- return existing ? __spreadArray(__spreadArray([], existing), incoming) : incoming;
9
+ return existing ? __spreadArray(__spreadArray([], existing, true), incoming, true) : incoming;
10
10
  },
11
11
  };
12
12
  }
@@ -37,7 +37,7 @@ export function relayStylePagination(keyArgs) {
37
37
  read: function (existing, _a) {
38
38
  var canRead = _a.canRead, readField = _a.readField;
39
39
  if (!existing)
40
- return;
40
+ return existing;
41
41
  var edges = [];
42
42
  var firstEdgeCursor = "";
43
43
  var lastEdgeCursor = "";
@@ -54,8 +54,13 @@ export function relayStylePagination(keyArgs) {
54
54
  return __assign(__assign({}, getExtras(existing)), { edges: edges, pageInfo: __assign(__assign({}, existing.pageInfo), { startCursor: startCursor || firstEdgeCursor, endCursor: endCursor || lastEdgeCursor }) });
55
55
  },
56
56
  merge: function (existing, incoming, _a) {
57
- if (existing === void 0) { existing = makeEmptyData(); }
58
57
  var args = _a.args, isReference = _a.isReference, readField = _a.readField;
58
+ if (!existing) {
59
+ existing = makeEmptyData();
60
+ }
61
+ if (!incoming) {
62
+ return existing;
63
+ }
59
64
  var incomingEdges = incoming.edges ? incoming.edges.map(function (edge) {
60
65
  if (isReference(edge = __assign({}, edge))) {
61
66
  edge.cursor = readField("cursor", edge);
@@ -106,7 +111,7 @@ export function relayStylePagination(keyArgs) {
106
111
  else if (incoming.edges) {
107
112
  prefix = [];
108
113
  }
109
- var edges = __spreadArray(__spreadArray(__spreadArray([], prefix), incomingEdges), suffix);
114
+ var edges = __spreadArray(__spreadArray(__spreadArray([], prefix, true), incomingEdges, true), suffix, true);
110
115
  var pageInfo = __assign(__assign({}, incoming.pageInfo), existing.pageInfo);
111
116
  if (incoming.pageInfo) {
112
117
  var _b = incoming.pageInfo, hasPreviousPage = _b.hasPreviousPage, hasNextPage = _b.hasNextPage, startCursor = _b.startCursor, endCursor = _b.endCursor, extras = __rest_1(_b, ["hasPreviousPage", "hasNextPage", "startCursor", "endCursor"]);
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/utilities/policies/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { __rest } from \"tslib\";\n\nimport { FieldPolicy, Reference } from '../../cache';\nimport { mergeDeep } from '../common/mergeDeep';\n\ntype KeyArgs = FieldPolicy<any>[\"keyArgs\"];\n\n// A very basic pagination field policy that always concatenates new\n// results onto the existing array, without examining options.args.\nexport function concatPagination<T = Reference>(\n keyArgs: KeyArgs = false,\n): FieldPolicy<T[]> {\n return {\n keyArgs,\n merge(existing, incoming) {\n return existing ? [\n ...existing,\n ...incoming,\n ] : incoming;\n },\n };\n}\n\n// A basic field policy that uses options.args.{offset,limit} to splice\n// the incoming data into the existing array. If your arguments are called\n// something different (like args.{start,count}), feel free to copy/paste\n// this implementation and make the appropriate changes.\nexport function offsetLimitPagination<T = Reference>(\n keyArgs: KeyArgs = false,\n): FieldPolicy<T[]> {\n return {\n keyArgs,\n merge(existing, incoming, { args }) {\n const merged = existing ? existing.slice(0) : [];\n if (args) {\n // Assume an offset of 0 if args.offset omitted.\n const { offset = 0 } = args;\n for (let i = 0; i < incoming.length; ++i) {\n merged[offset + i] = incoming[i];\n }\n } else {\n // It's unusual (probably a mistake) for a paginated field not\n // to receive any arguments, so you might prefer to throw an\n // exception here, instead of recovering by appending incoming\n // onto the existing array.\n merged.push.apply(merged, incoming);\n }\n return merged;\n },\n };\n}\n\n// Whether TRelayEdge<TNode> is a normalized Reference or a non-normalized\n// object, it needs a .cursor property where the relayStylePagination\n// merge function can store cursor strings taken from pageInfo. Storing an\n// extra reference.cursor property should be safe, and is easier than\n// attempting to update the cursor field of the normalized StoreObject\n// that the reference refers to, or managing edge wrapper objects\n// (something I attempted in #7023, but abandoned because of #7088).\nexport type TRelayEdge<TNode> = {\n cursor?: string;\n node: TNode;\n} | (Reference & { cursor?: string });\n\nexport type TRelayPageInfo = {\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n startCursor: string;\n endCursor: string;\n};\n\nexport type TExistingRelay<TNode> = Readonly<{\n edges: TRelayEdge<TNode>[];\n pageInfo: TRelayPageInfo;\n}>;\n\nexport type TIncomingRelay<TNode> = {\n edges?: TRelayEdge<TNode>[];\n pageInfo?: TRelayPageInfo;\n};\n\nexport type RelayFieldPolicy<TNode> = FieldPolicy<\n TExistingRelay<TNode>,\n TIncomingRelay<TNode>,\n TIncomingRelay<TNode>\n>;\n\n// As proof of the flexibility of field policies, this function generates\n// one that handles Relay-style pagination, without Apollo Client knowing\n// anything about connections, edges, cursors, or pageInfo objects.\nexport function relayStylePagination<TNode = Reference>(\n keyArgs: KeyArgs = false,\n): RelayFieldPolicy<TNode> {\n return {\n keyArgs,\n\n read(existing, { canRead, readField }) {\n if (!existing) return;\n\n const edges: TRelayEdge<TNode>[] = [];\n let firstEdgeCursor = \"\";\n let lastEdgeCursor = \"\";\n existing.edges.forEach(edge => {\n // Edges themselves could be Reference objects, so it's important\n // to use readField to access the edge.edge.node property.\n if (canRead(readField(\"node\", edge))) {\n edges.push(edge);\n if (edge.cursor) {\n firstEdgeCursor = firstEdgeCursor || edge.cursor || \"\";\n lastEdgeCursor = edge.cursor || lastEdgeCursor;\n }\n }\n });\n\n const {\n startCursor,\n endCursor,\n } = existing.pageInfo || {};\n\n return {\n // Some implementations return additional Connection fields, such\n // as existing.totalCount. These fields are saved by the merge\n // function, so the read function should also preserve them.\n ...getExtras(existing),\n edges,\n pageInfo: {\n ...existing.pageInfo,\n // If existing.pageInfo.{start,end}Cursor are undefined or \"\", default\n // to firstEdgeCursor and/or lastEdgeCursor.\n startCursor: startCursor || firstEdgeCursor,\n endCursor: endCursor || lastEdgeCursor,\n },\n };\n },\n\n merge(existing = makeEmptyData(), incoming, { args, isReference, readField }) {\n const incomingEdges = incoming.edges ? incoming.edges.map(edge => {\n if (isReference(edge = { ...edge })) {\n // In case edge is a Reference, we read out its cursor field and\n // store it as an extra property of the Reference object.\n edge.cursor = readField<string>(\"cursor\", edge);\n }\n return edge;\n }) : [];\n\n if (incoming.pageInfo) {\n const { pageInfo } = incoming;\n const { startCursor, endCursor } = pageInfo;\n const firstEdge = incomingEdges[0];\n const lastEdge = incomingEdges[incomingEdges.length - 1];\n // In case we did not request the cursor field for edges in this\n // query, we can still infer cursors from pageInfo.\n if (firstEdge && startCursor) {\n firstEdge.cursor = startCursor;\n }\n if (lastEdge && endCursor) {\n lastEdge.cursor = endCursor;\n }\n // Cursors can also come from edges, so we default\n // pageInfo.{start,end}Cursor to {first,last}Edge.cursor.\n const firstCursor = firstEdge && firstEdge.cursor;\n if (firstCursor && !startCursor) {\n incoming = mergeDeep(incoming, {\n pageInfo: {\n startCursor: firstCursor,\n },\n });\n }\n const lastCursor = lastEdge && lastEdge.cursor;\n if (lastCursor && !endCursor) {\n incoming = mergeDeep(incoming, {\n pageInfo: {\n endCursor: lastCursor,\n },\n });\n }\n }\n\n let prefix = existing.edges;\n let suffix: typeof prefix = [];\n\n if (args && args.after) {\n // This comparison does not need to use readField(\"cursor\", edge),\n // because we stored the cursor field of any Reference edges as an\n // extra property of the Reference object.\n const index = prefix.findIndex(edge => edge.cursor === args.after);\n if (index >= 0) {\n prefix = prefix.slice(0, index + 1);\n // suffix = []; // already true\n }\n } else if (args && args.before) {\n const index = prefix.findIndex(edge => edge.cursor === args.before);\n suffix = index < 0 ? prefix : prefix.slice(index);\n prefix = [];\n } else if (incoming.edges) {\n // If we have neither args.after nor args.before, the incoming\n // edges cannot be spliced into the existing edges, so they must\n // replace the existing edges. See #6592 for a motivating example.\n prefix = [];\n }\n\n const edges = [\n ...prefix,\n ...incomingEdges,\n ...suffix,\n ];\n\n const pageInfo: TRelayPageInfo = {\n // The ordering of these two ...spreads may be surprising, but it\n // makes sense because we want to combine PageInfo properties with a\n // preference for existing values, *unless* the existing values are\n // overridden by the logic below, which is permitted only when the\n // incoming page falls at the beginning or end of the data.\n ...incoming.pageInfo,\n ...existing.pageInfo,\n };\n\n if (incoming.pageInfo) {\n const {\n hasPreviousPage, hasNextPage,\n startCursor, endCursor,\n ...extras\n } = incoming.pageInfo;\n\n // If incoming.pageInfo had any extra non-standard properties,\n // assume they should take precedence over any existing properties\n // of the same name, regardless of where this page falls with\n // respect to the existing data.\n Object.assign(pageInfo, extras);\n\n // Keep existing.pageInfo.has{Previous,Next}Page unless the\n // placement of the incoming edges means incoming.hasPreviousPage\n // or incoming.hasNextPage should become the new values for those\n // properties in existing.pageInfo. Note that these updates are\n // only permitted when the beginning or end of the incoming page\n // coincides with the beginning or end of the existing data, as\n // determined using prefix.length and suffix.length.\n if (!prefix.length) {\n if (void 0 !== hasPreviousPage) pageInfo.hasPreviousPage = hasPreviousPage;\n if (void 0 !== startCursor) pageInfo.startCursor = startCursor;\n }\n if (!suffix.length) {\n if (void 0 !== hasNextPage) pageInfo.hasNextPage = hasNextPage;\n if (void 0 !== endCursor) pageInfo.endCursor = endCursor;\n }\n }\n\n return {\n ...getExtras(existing),\n ...getExtras(incoming),\n edges,\n pageInfo,\n };\n },\n };\n}\n\n// Returns any unrecognized properties of the given object.\nconst getExtras = (obj: Record<string, any>) => __rest(obj, notExtras);\nconst notExtras = [\"edges\", \"pageInfo\"];\n\nfunction makeEmptyData(): TExistingRelay<any> {\n return {\n edges: [],\n pageInfo: {\n hasPreviousPage: false,\n hasNextPage: true,\n startCursor: \"\",\n endCursor: \"\",\n },\n };\n}\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/utilities/policies/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { __rest } from \"tslib\";\n\nimport { FieldPolicy, Reference } from '../../cache';\nimport { mergeDeep } from '../common/mergeDeep';\n\ntype KeyArgs = FieldPolicy<any>[\"keyArgs\"];\n\n// A very basic pagination field policy that always concatenates new\n// results onto the existing array, without examining options.args.\nexport function concatPagination<T = Reference>(\n keyArgs: KeyArgs = false,\n): FieldPolicy<T[]> {\n return {\n keyArgs,\n merge(existing, incoming) {\n return existing ? [\n ...existing,\n ...incoming,\n ] : incoming;\n },\n };\n}\n\n// A basic field policy that uses options.args.{offset,limit} to splice\n// the incoming data into the existing array. If your arguments are called\n// something different (like args.{start,count}), feel free to copy/paste\n// this implementation and make the appropriate changes.\nexport function offsetLimitPagination<T = Reference>(\n keyArgs: KeyArgs = false,\n): FieldPolicy<T[]> {\n return {\n keyArgs,\n merge(existing, incoming, { args }) {\n const merged = existing ? existing.slice(0) : [];\n if (args) {\n // Assume an offset of 0 if args.offset omitted.\n const { offset = 0 } = args;\n for (let i = 0; i < incoming.length; ++i) {\n merged[offset + i] = incoming[i];\n }\n } else {\n // It's unusual (probably a mistake) for a paginated field not\n // to receive any arguments, so you might prefer to throw an\n // exception here, instead of recovering by appending incoming\n // onto the existing array.\n merged.push.apply(merged, incoming);\n }\n return merged;\n },\n };\n}\n\n// Whether TRelayEdge<TNode> is a normalized Reference or a non-normalized\n// object, it needs a .cursor property where the relayStylePagination\n// merge function can store cursor strings taken from pageInfo. Storing an\n// extra reference.cursor property should be safe, and is easier than\n// attempting to update the cursor field of the normalized StoreObject\n// that the reference refers to, or managing edge wrapper objects\n// (something I attempted in #7023, but abandoned because of #7088).\nexport type TRelayEdge<TNode> = {\n cursor?: string;\n node: TNode;\n} | (Reference & { cursor?: string });\n\nexport type TRelayPageInfo = {\n hasPreviousPage: boolean;\n hasNextPage: boolean;\n startCursor: string;\n endCursor: string;\n};\n\nexport type TExistingRelay<TNode> = Readonly<{\n edges: TRelayEdge<TNode>[];\n pageInfo: TRelayPageInfo;\n}>;\n\nexport type TIncomingRelay<TNode> = {\n edges?: TRelayEdge<TNode>[];\n pageInfo?: TRelayPageInfo;\n};\n\nexport type RelayFieldPolicy<TNode> = FieldPolicy<\n TExistingRelay<TNode> | null,\n TIncomingRelay<TNode> | null,\n TIncomingRelay<TNode> | null\n>;\n\n// As proof of the flexibility of field policies, this function generates\n// one that handles Relay-style pagination, without Apollo Client knowing\n// anything about connections, edges, cursors, or pageInfo objects.\nexport function relayStylePagination<TNode = Reference>(\n keyArgs: KeyArgs = false,\n): RelayFieldPolicy<TNode> {\n return {\n keyArgs,\n\n read(existing, { canRead, readField }) {\n if (!existing) return existing;\n\n const edges: TRelayEdge<TNode>[] = [];\n let firstEdgeCursor = \"\";\n let lastEdgeCursor = \"\";\n existing.edges.forEach(edge => {\n // Edges themselves could be Reference objects, so it's important\n // to use readField to access the edge.edge.node property.\n if (canRead(readField(\"node\", edge))) {\n edges.push(edge);\n if (edge.cursor) {\n firstEdgeCursor = firstEdgeCursor || edge.cursor || \"\";\n lastEdgeCursor = edge.cursor || lastEdgeCursor;\n }\n }\n });\n\n const {\n startCursor,\n endCursor,\n } = existing.pageInfo || {};\n\n return {\n // Some implementations return additional Connection fields, such\n // as existing.totalCount. These fields are saved by the merge\n // function, so the read function should also preserve them.\n ...getExtras(existing),\n edges,\n pageInfo: {\n ...existing.pageInfo,\n // If existing.pageInfo.{start,end}Cursor are undefined or \"\", default\n // to firstEdgeCursor and/or lastEdgeCursor.\n startCursor: startCursor || firstEdgeCursor,\n endCursor: endCursor || lastEdgeCursor,\n },\n };\n },\n\n merge(existing, incoming, { args, isReference, readField }) {\n if (!existing) {\n existing = makeEmptyData();\n }\n\n if (!incoming) {\n return existing;\n }\n\n const incomingEdges = incoming.edges ? incoming.edges.map(edge => {\n if (isReference(edge = { ...edge })) {\n // In case edge is a Reference, we read out its cursor field and\n // store it as an extra property of the Reference object.\n edge.cursor = readField<string>(\"cursor\", edge);\n }\n return edge;\n }) : [];\n\n if (incoming.pageInfo) {\n const { pageInfo } = incoming;\n const { startCursor, endCursor } = pageInfo;\n const firstEdge = incomingEdges[0];\n const lastEdge = incomingEdges[incomingEdges.length - 1];\n // In case we did not request the cursor field for edges in this\n // query, we can still infer cursors from pageInfo.\n if (firstEdge && startCursor) {\n firstEdge.cursor = startCursor;\n }\n if (lastEdge && endCursor) {\n lastEdge.cursor = endCursor;\n }\n // Cursors can also come from edges, so we default\n // pageInfo.{start,end}Cursor to {first,last}Edge.cursor.\n const firstCursor = firstEdge && firstEdge.cursor;\n if (firstCursor && !startCursor) {\n incoming = mergeDeep(incoming, {\n pageInfo: {\n startCursor: firstCursor,\n },\n });\n }\n const lastCursor = lastEdge && lastEdge.cursor;\n if (lastCursor && !endCursor) {\n incoming = mergeDeep(incoming, {\n pageInfo: {\n endCursor: lastCursor,\n },\n });\n }\n }\n\n let prefix = existing.edges;\n let suffix: typeof prefix = [];\n\n if (args && args.after) {\n // This comparison does not need to use readField(\"cursor\", edge),\n // because we stored the cursor field of any Reference edges as an\n // extra property of the Reference object.\n const index = prefix.findIndex(edge => edge.cursor === args.after);\n if (index >= 0) {\n prefix = prefix.slice(0, index + 1);\n // suffix = []; // already true\n }\n } else if (args && args.before) {\n const index = prefix.findIndex(edge => edge.cursor === args.before);\n suffix = index < 0 ? prefix : prefix.slice(index);\n prefix = [];\n } else if (incoming.edges) {\n // If we have neither args.after nor args.before, the incoming\n // edges cannot be spliced into the existing edges, so they must\n // replace the existing edges. See #6592 for a motivating example.\n prefix = [];\n }\n\n const edges = [\n ...prefix,\n ...incomingEdges,\n ...suffix,\n ];\n\n const pageInfo: TRelayPageInfo = {\n // The ordering of these two ...spreads may be surprising, but it\n // makes sense because we want to combine PageInfo properties with a\n // preference for existing values, *unless* the existing values are\n // overridden by the logic below, which is permitted only when the\n // incoming page falls at the beginning or end of the data.\n ...incoming.pageInfo,\n ...existing.pageInfo,\n };\n\n if (incoming.pageInfo) {\n const {\n hasPreviousPage, hasNextPage,\n startCursor, endCursor,\n ...extras\n } = incoming.pageInfo;\n\n // If incoming.pageInfo had any extra non-standard properties,\n // assume they should take precedence over any existing properties\n // of the same name, regardless of where this page falls with\n // respect to the existing data.\n Object.assign(pageInfo, extras);\n\n // Keep existing.pageInfo.has{Previous,Next}Page unless the\n // placement of the incoming edges means incoming.hasPreviousPage\n // or incoming.hasNextPage should become the new values for those\n // properties in existing.pageInfo. Note that these updates are\n // only permitted when the beginning or end of the incoming page\n // coincides with the beginning or end of the existing data, as\n // determined using prefix.length and suffix.length.\n if (!prefix.length) {\n if (void 0 !== hasPreviousPage) pageInfo.hasPreviousPage = hasPreviousPage;\n if (void 0 !== startCursor) pageInfo.startCursor = startCursor;\n }\n if (!suffix.length) {\n if (void 0 !== hasNextPage) pageInfo.hasNextPage = hasNextPage;\n if (void 0 !== endCursor) pageInfo.endCursor = endCursor;\n }\n }\n\n return {\n ...getExtras(existing),\n ...getExtras(incoming),\n edges,\n pageInfo,\n };\n },\n };\n}\n\n// Returns any unrecognized properties of the given object.\nconst getExtras = (obj: Record<string, any>) => __rest(obj, notExtras);\nconst notExtras = [\"edges\", \"pageInfo\"];\n\nfunction makeEmptyData(): TExistingRelay<any> {\n return {\n edges: [],\n pageInfo: {\n hasPreviousPage: false,\n hasNextPage: true,\n startCursor: \"\",\n endCursor: \"\",\n },\n };\n}\n"]}
@@ -78,6 +78,6 @@ export function createMockFetch() {
78
78
  for (var _i = 0; _i < arguments.length; _i++) {
79
79
  mockedResponses[_i] = arguments[_i];
80
80
  }
81
- return new (MockFetch.bind.apply(MockFetch, __spreadArray([void 0], mockedResponses)))().getFetch();
81
+ return new (MockFetch.bind.apply(MockFetch, __spreadArray([void 0], mockedResponses, false)))().getFetch();
82
82
  }
83
83
  //# sourceMappingURL=mockFetch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mockFetch.js","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockFetch.ts"],"names":[],"mappings":"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","sourcesContent":["import 'whatwg-fetch';\n\n// This is an implementation of a mocked window.fetch implementation similar in\n// structure to the MockedNetworkInterface.\n\nexport interface MockedIResponse {\n ok: boolean;\n status: number;\n statusText?: string;\n json(): Promise<Object>;\n}\n\nexport interface MockedFetchResponse {\n url: string;\n opts: RequestInit;\n result: MockedIResponse;\n delay?: number;\n}\n\nexport function createMockedIResponse(\n result: Object,\n options?: any,\n): MockedIResponse {\n const status = (options && options.status) || 200;\n const statusText = (options && options.statusText) || undefined;\n\n return {\n ok: status === 200,\n status,\n statusText,\n json() {\n return Promise.resolve<Object>(result);\n },\n };\n}\n\nexport class MockFetch {\n private mockedResponsesByKey: { [key: string]: MockedFetchResponse[] };\n\n constructor(...mockedResponses: MockedFetchResponse[]) {\n this.mockedResponsesByKey = {};\n\n mockedResponses.forEach(mockedResponse => {\n this.addMockedResponse(mockedResponse);\n });\n }\n\n public addMockedResponse(mockedResponse: MockedFetchResponse) {\n const key = this.fetchParamsToKey(mockedResponse.url, mockedResponse.opts);\n let mockedResponses = this.mockedResponsesByKey[key];\n\n if (!mockedResponses) {\n mockedResponses = [];\n this.mockedResponsesByKey[key] = mockedResponses;\n }\n\n mockedResponses.push(mockedResponse);\n }\n\n public fetch(url: string, opts: RequestInit) {\n const key = this.fetchParamsToKey(url, opts);\n const responses = this.mockedResponsesByKey[key];\n if (!responses || responses.length === 0) {\n throw new Error(\n `No more mocked fetch responses for the params ${url} and ${opts}`,\n );\n }\n\n const { result, delay } = responses.shift()!;\n\n if (!result) {\n throw new Error(`Mocked fetch response should contain a result.`);\n }\n\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(result);\n }, delay ? delay : 0);\n });\n }\n\n public fetchParamsToKey(url: string, opts: RequestInit): string {\n return JSON.stringify({\n url,\n opts: sortByKey(opts),\n });\n }\n\n // Returns a \"fetch\" function equivalent that mocks the given responses.\n // The function by returned by this should be tacked onto the global scope\n // inorder to test functions that use \"fetch\".\n public getFetch() {\n return this.fetch.bind(this);\n }\n}\n\nfunction sortByKey(obj: any): Object {\n return Object.keys(obj)\n .sort()\n .reduce(\n (ret: any, key: string): Object =>\n Object.assign(\n {\n [key]:\n Object.prototype.toString.call(obj[key]).slice(8, -1) === 'Object'\n ? sortByKey(obj[key])\n : obj[key],\n },\n ret,\n ),\n {},\n );\n}\n\nexport function createMockFetch(...mockedResponses: MockedFetchResponse[]) {\n return new MockFetch(...mockedResponses).getFetch();\n}\n"]}
1
+ {"version":3,"file":"mockFetch.js","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockFetch.ts"],"names":[],"mappings":"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","sourcesContent":["import 'whatwg-fetch';\n\n// This is an implementation of a mocked window.fetch implementation similar in\n// structure to the MockedNetworkInterface.\n\nexport interface MockedIResponse {\n ok: boolean;\n status: number;\n statusText?: string;\n json(): Promise<Object>;\n}\n\nexport interface MockedFetchResponse {\n url: string;\n opts: RequestInit;\n result: MockedIResponse;\n delay?: number;\n}\n\nexport function createMockedIResponse(\n result: Object,\n options?: any,\n): MockedIResponse {\n const status = (options && options.status) || 200;\n const statusText = (options && options.statusText) || undefined;\n\n return {\n ok: status === 200,\n status,\n statusText,\n json() {\n return Promise.resolve<Object>(result);\n },\n };\n}\n\nexport class MockFetch {\n private mockedResponsesByKey: { [key: string]: MockedFetchResponse[] };\n\n constructor(...mockedResponses: MockedFetchResponse[]) {\n this.mockedResponsesByKey = {};\n\n mockedResponses.forEach(mockedResponse => {\n this.addMockedResponse(mockedResponse);\n });\n }\n\n public addMockedResponse(mockedResponse: MockedFetchResponse) {\n const key = this.fetchParamsToKey(mockedResponse.url, mockedResponse.opts);\n let mockedResponses = this.mockedResponsesByKey[key];\n\n if (!mockedResponses) {\n mockedResponses = [];\n this.mockedResponsesByKey[key] = mockedResponses;\n }\n\n mockedResponses.push(mockedResponse);\n }\n\n public fetch(url: string, opts: RequestInit) {\n const key = this.fetchParamsToKey(url, opts);\n const responses = this.mockedResponsesByKey[key];\n if (!responses || responses.length === 0) {\n throw new Error(\n `No more mocked fetch responses for the params ${url} and ${opts}`,\n );\n }\n\n const { result, delay } = responses.shift()!;\n\n if (!result) {\n throw new Error(`Mocked fetch response should contain a result.`);\n }\n\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(result);\n }, delay ? delay : 0);\n });\n }\n\n public fetchParamsToKey(url: string, opts: RequestInit): string {\n return JSON.stringify({\n url,\n opts: sortByKey(opts),\n });\n }\n\n // Returns a \"fetch\" function equivalent that mocks the given responses.\n // The function by returned by this should be tacked onto the global scope\n // inorder to test functions that use \"fetch\".\n public getFetch() {\n return this.fetch.bind(this);\n }\n}\n\nfunction sortByKey(obj: any): Object {\n return Object.keys(obj)\n .sort()\n .reduce(\n (ret: any, key: string): Object =>\n Object.assign(\n {\n [key]:\n Object.prototype.toString.call(obj[key]).slice(8, -1) === 'Object'\n ? sortByKey(obj[key])\n : obj[key],\n },\n ret,\n ),\n {},\n );\n}\n\nexport function createMockFetch(...mockedResponses: MockedFetchResponse[]) {\n return new MockFetch(...mockedResponses).getFetch();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mockLink.d.ts","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockLink.ts"],"names":[],"mappings":";AAIA,OAAO,EACL,UAAU,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,UAAU,EAMX,MAAM,oBAAoB,CAAC;AAE5B,oBAAY,cAAc,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAExC,MAAM,WAAW,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACzD,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;CACvC;AAUD,qBAAa,QAAS,SAAQ,UAAU;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,OAAO,CAAQ;IACnC,OAAO,CAAC,oBAAoB,CAA2C;gBAGrE,eAAe,EAAE,aAAa,CAAC,cAAc,CAAC,EAC9C,WAAW,GAAE,OAAc;IAWtB,iBAAiB,CAAC,cAAc,EAAE,cAAc;IAgBhD,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI;IAoFpE,OAAO,CAAC,uBAAuB;CAehC;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAKD,wBAAgB,cAAc,CAC5B,GAAG,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,GAC7B,cAAc,CAYhB"}
1
+ {"version":3,"file":"mockLink.d.ts","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockLink.ts"],"names":[],"mappings":";AAKA,OAAO,EACL,UAAU,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,UAAU,EAMX,MAAM,oBAAoB,CAAC;AAE5B,oBAAY,cAAc,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAExC,MAAM,WAAW,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACzD,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;CACvC;AAUD,qBAAa,QAAS,SAAQ,UAAU;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,OAAO,CAAQ;IACnC,OAAO,CAAC,oBAAoB,CAA2C;gBAGrE,eAAe,EAAE,aAAa,CAAC,cAAc,CAAC,EAC9C,WAAW,GAAE,OAAc;IAWtB,iBAAiB,CAAC,cAAc,EAAE,cAAc;IAgBhD,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI;IAoFpE,OAAO,CAAC,uBAAuB;CAehC;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAKD,wBAAgB,cAAc,CAC5B,GAAG,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,GAC7B,cAAc,CAYhB"}
@@ -1,7 +1,7 @@
1
1
  import { __extends } from "tslib";
2
+ import { invariant } from "../../globals/index.js";
2
3
  import { print } from 'graphql';
3
4
  import { equal } from '@wry/equality';
4
- import { invariant } from 'ts-invariant';
5
5
  import { ApolloLink, } from "../../../link/core/index.js";
6
6
  import { Observable, addTypenameToDocument, removeClientSetsFromDocument, removeConnectionDirectiveFromDocument, cloneDeep, stringifyForDisplay, } from "../../index.js";
7
7
  function requestToKey(request, addTypename) {
@@ -102,7 +102,7 @@ var MockLink = (function (_super) {
102
102
  MockLink.prototype.normalizeMockedResponse = function (mockedResponse) {
103
103
  var newMockedResponse = cloneDeep(mockedResponse);
104
104
  var queryWithoutConnection = removeConnectionDirectiveFromDocument(newMockedResponse.request.query);
105
- __DEV__ ? invariant(queryWithoutConnection, "query is required") : invariant(queryWithoutConnection, 60);
105
+ __DEV__ ? invariant(queryWithoutConnection, "query is required") : invariant(queryWithoutConnection, 55);
106
106
  newMockedResponse.request.query = queryWithoutConnection;
107
107
  var query = removeClientSetsFromDocument(newMockedResponse.request.query);
108
108
  if (query) {
@@ -1 +1 @@
1
- {"version":3,"file":"mockLink.js","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockLink.ts"],"names":[],"mappings":"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","sourcesContent":["import { print } from 'graphql';\nimport { equal } from '@wry/equality';\nimport { invariant } from 'ts-invariant';\n\nimport {\n ApolloLink,\n Operation,\n GraphQLRequest,\n FetchResult,\n} from '../../../link/core';\n\nimport {\n Observable,\n addTypenameToDocument,\n removeClientSetsFromDocument,\n removeConnectionDirectiveFromDocument,\n cloneDeep,\n stringifyForDisplay,\n} from '../../../utilities';\n\nexport type ResultFunction<T> = () => T;\n\nexport interface MockedResponse<TData = Record<string, any>> {\n request: GraphQLRequest;\n result?: FetchResult<TData> | ResultFunction<FetchResult<TData>>;\n error?: Error;\n delay?: number;\n newData?: ResultFunction<FetchResult>;\n}\n\nfunction requestToKey(request: GraphQLRequest, addTypename: Boolean): string {\n const queryString =\n request.query &&\n print(addTypename ? addTypenameToDocument(request.query) : request.query);\n const requestKey = { query: queryString };\n return JSON.stringify(requestKey);\n}\n\nexport class MockLink extends ApolloLink {\n public operation: Operation;\n public addTypename: Boolean = true;\n private mockedResponsesByKey: { [key: string]: MockedResponse[] } = {};\n\n constructor(\n mockedResponses: ReadonlyArray<MockedResponse>,\n addTypename: Boolean = true\n ) {\n super();\n this.addTypename = addTypename;\n if (mockedResponses) {\n mockedResponses.forEach(mockedResponse => {\n this.addMockedResponse(mockedResponse);\n });\n }\n }\n\n public addMockedResponse(mockedResponse: MockedResponse) {\n const normalizedMockedResponse = this.normalizeMockedResponse(\n mockedResponse\n );\n const key = requestToKey(\n normalizedMockedResponse.request,\n this.addTypename\n );\n let mockedResponses = this.mockedResponsesByKey[key];\n if (!mockedResponses) {\n mockedResponses = [];\n this.mockedResponsesByKey[key] = mockedResponses;\n }\n mockedResponses.push(normalizedMockedResponse);\n }\n\n public request(operation: Operation): Observable<FetchResult> | null {\n this.operation = operation;\n const key = requestToKey(operation, this.addTypename);\n const unmatchedVars: Array<Record<string, any>> = [];\n const requestVariables = operation.variables || {};\n const mockedResponses = this.mockedResponsesByKey[key];\n const responseIndex = mockedResponses ? mockedResponses.findIndex((res, index) => {\n const mockedResponseVars = res.request.variables || {};\n if (equal(requestVariables, mockedResponseVars)) {\n return true;\n }\n unmatchedVars.push(mockedResponseVars);\n return false;\n }) : -1;\n\n const response = responseIndex >= 0\n ? mockedResponses[responseIndex]\n : void 0;\n\n let configError: Error;\n\n if (!response) {\n configError = new Error(\n`No more mocked responses for the query: ${print(operation.query)}\nExpected variables: ${stringifyForDisplay(operation.variables)}\n${unmatchedVars.length > 0 ? `\nFailed to match ${unmatchedVars.length} mock${\n unmatchedVars.length === 1 ? \"\" : \"s\"\n} for this query, which had the following variables:\n${unmatchedVars.map(d => ` ${stringifyForDisplay(d)}`).join('\\n')}\n` : \"\"}`);\n } else {\n mockedResponses.splice(responseIndex, 1);\n\n const { newData } = response;\n if (newData) {\n response.result = newData();\n mockedResponses.push(response);\n }\n\n if (!response.result && !response.error) {\n configError = new Error(\n `Mocked response should contain either result or error: ${key}`\n );\n }\n }\n\n return new Observable(observer => {\n const timer = setTimeout(() => {\n if (configError) {\n try {\n // The onError function can return false to indicate that\n // configError need not be passed to observer.error. For\n // example, the default implementation of onError calls\n // observer.error(configError) and then returns false to\n // prevent this extra (harmless) observer.error call.\n if (this.onError(configError, observer) !== false) {\n throw configError;\n }\n } catch (error) {\n observer.error(error);\n }\n } else if (response) {\n if (response.error) {\n observer.error(response.error);\n } else {\n if (response.result) {\n observer.next(\n typeof response.result === 'function'\n ? (response.result as ResultFunction<FetchResult>)()\n : response.result\n );\n }\n observer.complete();\n }\n }\n }, response && response.delay || 0);\n\n return () => {\n clearTimeout(timer);\n };\n });\n }\n\n private normalizeMockedResponse(\n mockedResponse: MockedResponse\n ): MockedResponse {\n const newMockedResponse = cloneDeep(mockedResponse);\n const queryWithoutConnection = removeConnectionDirectiveFromDocument(\n newMockedResponse.request.query\n );\n invariant(queryWithoutConnection, \"query is required\");\n newMockedResponse.request.query = queryWithoutConnection!;\n const query = removeClientSetsFromDocument(newMockedResponse.request.query);\n if (query) {\n newMockedResponse.request.query = query;\n }\n return newMockedResponse;\n }\n}\n\nexport interface MockApolloLink extends ApolloLink {\n operation?: Operation;\n}\n\n// Pass in multiple mocked responses, so that you can test flows that end up\n// making multiple queries to the server.\n// NOTE: The last arg can optionally be an `addTypename` arg.\nexport function mockSingleLink(\n ...mockedResponses: Array<any>\n): MockApolloLink {\n // To pull off the potential typename. If this isn't a boolean, we'll just\n // set it true later.\n let maybeTypename = mockedResponses[mockedResponses.length - 1];\n let mocks = mockedResponses.slice(0, mockedResponses.length - 1);\n\n if (typeof maybeTypename !== 'boolean') {\n mocks = mockedResponses;\n maybeTypename = true;\n }\n\n return new MockLink(mocks, maybeTypename);\n}\n"]}
1
+ {"version":3,"file":"mockLink.js","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockLink.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from '../../globals';\n\nimport { print } from 'graphql';\nimport { equal } from '@wry/equality';\n\nimport {\n ApolloLink,\n Operation,\n GraphQLRequest,\n FetchResult,\n} from '../../../link/core';\n\nimport {\n Observable,\n addTypenameToDocument,\n removeClientSetsFromDocument,\n removeConnectionDirectiveFromDocument,\n cloneDeep,\n stringifyForDisplay,\n} from '../../../utilities';\n\nexport type ResultFunction<T> = () => T;\n\nexport interface MockedResponse<TData = Record<string, any>> {\n request: GraphQLRequest;\n result?: FetchResult<TData> | ResultFunction<FetchResult<TData>>;\n error?: Error;\n delay?: number;\n newData?: ResultFunction<FetchResult>;\n}\n\nfunction requestToKey(request: GraphQLRequest, addTypename: Boolean): string {\n const queryString =\n request.query &&\n print(addTypename ? addTypenameToDocument(request.query) : request.query);\n const requestKey = { query: queryString };\n return JSON.stringify(requestKey);\n}\n\nexport class MockLink extends ApolloLink {\n public operation: Operation;\n public addTypename: Boolean = true;\n private mockedResponsesByKey: { [key: string]: MockedResponse[] } = {};\n\n constructor(\n mockedResponses: ReadonlyArray<MockedResponse>,\n addTypename: Boolean = true\n ) {\n super();\n this.addTypename = addTypename;\n if (mockedResponses) {\n mockedResponses.forEach(mockedResponse => {\n this.addMockedResponse(mockedResponse);\n });\n }\n }\n\n public addMockedResponse(mockedResponse: MockedResponse) {\n const normalizedMockedResponse = this.normalizeMockedResponse(\n mockedResponse\n );\n const key = requestToKey(\n normalizedMockedResponse.request,\n this.addTypename\n );\n let mockedResponses = this.mockedResponsesByKey[key];\n if (!mockedResponses) {\n mockedResponses = [];\n this.mockedResponsesByKey[key] = mockedResponses;\n }\n mockedResponses.push(normalizedMockedResponse);\n }\n\n public request(operation: Operation): Observable<FetchResult> | null {\n this.operation = operation;\n const key = requestToKey(operation, this.addTypename);\n const unmatchedVars: Array<Record<string, any>> = [];\n const requestVariables = operation.variables || {};\n const mockedResponses = this.mockedResponsesByKey[key];\n const responseIndex = mockedResponses ? mockedResponses.findIndex((res, index) => {\n const mockedResponseVars = res.request.variables || {};\n if (equal(requestVariables, mockedResponseVars)) {\n return true;\n }\n unmatchedVars.push(mockedResponseVars);\n return false;\n }) : -1;\n\n const response = responseIndex >= 0\n ? mockedResponses[responseIndex]\n : void 0;\n\n let configError: Error;\n\n if (!response) {\n configError = new Error(\n`No more mocked responses for the query: ${print(operation.query)}\nExpected variables: ${stringifyForDisplay(operation.variables)}\n${unmatchedVars.length > 0 ? `\nFailed to match ${unmatchedVars.length} mock${\n unmatchedVars.length === 1 ? \"\" : \"s\"\n} for this query, which had the following variables:\n${unmatchedVars.map(d => ` ${stringifyForDisplay(d)}`).join('\\n')}\n` : \"\"}`);\n } else {\n mockedResponses.splice(responseIndex, 1);\n\n const { newData } = response;\n if (newData) {\n response.result = newData();\n mockedResponses.push(response);\n }\n\n if (!response.result && !response.error) {\n configError = new Error(\n `Mocked response should contain either result or error: ${key}`\n );\n }\n }\n\n return new Observable(observer => {\n const timer = setTimeout(() => {\n if (configError) {\n try {\n // The onError function can return false to indicate that\n // configError need not be passed to observer.error. For\n // example, the default implementation of onError calls\n // observer.error(configError) and then returns false to\n // prevent this extra (harmless) observer.error call.\n if (this.onError(configError, observer) !== false) {\n throw configError;\n }\n } catch (error) {\n observer.error(error);\n }\n } else if (response) {\n if (response.error) {\n observer.error(response.error);\n } else {\n if (response.result) {\n observer.next(\n typeof response.result === 'function'\n ? (response.result as ResultFunction<FetchResult>)()\n : response.result\n );\n }\n observer.complete();\n }\n }\n }, response && response.delay || 0);\n\n return () => {\n clearTimeout(timer);\n };\n });\n }\n\n private normalizeMockedResponse(\n mockedResponse: MockedResponse\n ): MockedResponse {\n const newMockedResponse = cloneDeep(mockedResponse);\n const queryWithoutConnection = removeConnectionDirectiveFromDocument(\n newMockedResponse.request.query\n );\n invariant(queryWithoutConnection, \"query is required\");\n newMockedResponse.request.query = queryWithoutConnection!;\n const query = removeClientSetsFromDocument(newMockedResponse.request.query);\n if (query) {\n newMockedResponse.request.query = query;\n }\n return newMockedResponse;\n }\n}\n\nexport interface MockApolloLink extends ApolloLink {\n operation?: Operation;\n}\n\n// Pass in multiple mocked responses, so that you can test flows that end up\n// making multiple queries to the server.\n// NOTE: The last arg can optionally be an `addTypename` arg.\nexport function mockSingleLink(\n ...mockedResponses: Array<any>\n): MockApolloLink {\n // To pull off the potential typename. If this isn't a boolean, we'll just\n // set it true later.\n let maybeTypename = mockedResponses[mockedResponses.length - 1];\n let mocks = mockedResponses.slice(0, mockedResponses.length - 1);\n\n if (typeof maybeTypename !== 'boolean') {\n mocks = mockedResponses;\n maybeTypename = true;\n }\n\n return new MockLink(mocks, maybeTypename);\n}\n"]}
@@ -5,7 +5,7 @@ export default (function (reject) {
5
5
  for (var _i = 1; _i < arguments.length; _i++) {
6
6
  mockedResponses[_i - 1] = arguments[_i];
7
7
  }
8
- var queryManager = mockQueryManager.apply(void 0, __spreadArray([reject], mockedResponses));
8
+ var queryManager = mockQueryManager.apply(void 0, __spreadArray([reject], mockedResponses, false));
9
9
  var firstRequest = mockedResponses[0].request;
10
10
  return queryManager.watchQuery({
11
11
  query: firstRequest.query,
@@ -1 +1 @@
1
- {"version":3,"file":"mockWatchQuery.js","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockWatchQuery.ts"],"names":[],"mappings":";AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAGlD,gBAAe,UACb,MAA4B;IAC5B,yBAAoC;SAApC,UAAoC,EAApC,qBAAoC,EAApC,IAAoC;QAApC,wCAAoC;;IAEpC,IAAM,YAAY,GAAG,gBAAgB,8BAAC,MAAM,GAAK,eAAe,EAAC,CAAC;IAClE,IAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,OAAO,YAAY,CAAC,UAAU,CAAC;QAC7B,KAAK,EAAE,YAAY,CAAC,KAAM;QAC1B,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,2BAA2B,EAAE,KAAK;KACnC,CAAC,CAAC;AACL,CAAC,EAAC","sourcesContent":["import { MockedResponse } from './mockLink';\nimport mockQueryManager from './mockQueryManager';\nimport { ObservableQuery } from '../../../core/ObservableQuery';\n\nexport default (\n reject: (reason: any) => any,\n ...mockedResponses: MockedResponse[]\n): ObservableQuery<any> => {\n const queryManager = mockQueryManager(reject, ...mockedResponses);\n const firstRequest = mockedResponses[0].request;\n return queryManager.watchQuery({\n query: firstRequest.query!,\n variables: firstRequest.variables,\n notifyOnNetworkStatusChange: false // XXX might not always be the right option. Set for legacy reasons.\n });\n};\n"]}
1
+ {"version":3,"file":"mockWatchQuery.js","sourceRoot":"","sources":["../../../../src/utilities/testing/mocking/mockWatchQuery.ts"],"names":[],"mappings":";AACA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAGlD,gBAAe,UACb,MAA4B;IAC5B,yBAAoC;SAApC,UAAoC,EAApC,qBAAoC,EAApC,IAAoC;QAApC,wCAAoC;;IAEpC,IAAM,YAAY,GAAG,gBAAgB,8BAAC,MAAM,GAAK,eAAe,SAAC,CAAC;IAClE,IAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,OAAO,YAAY,CAAC,UAAU,CAAC;QAC7B,KAAK,EAAE,YAAY,CAAC,KAAM;QAC1B,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,2BAA2B,EAAE,KAAK;KACnC,CAAC,CAAC;AACL,CAAC,EAAC","sourcesContent":["import { MockedResponse } from './mockLink';\nimport mockQueryManager from './mockQueryManager';\nimport { ObservableQuery } from '../../../core/ObservableQuery';\n\nexport default (\n reject: (reason: any) => any,\n ...mockedResponses: MockedResponse[]\n): ObservableQuery<any> => {\n const queryManager = mockQueryManager(reject, ...mockedResponses);\n const firstRequest = mockedResponses[0].request;\n return queryManager.watchQuery({\n query: firstRequest.query!,\n variables: firstRequest.variables,\n notifyOnNetworkStatusChange: false // XXX might not always be the right option. Set for legacy reasons.\n });\n};\n"]}
@@ -60,6 +60,6 @@ export default function (options) {
60
60
  for (var _i = 1; _i < arguments.length; _i++) {
61
61
  cbs[_i - 1] = arguments[_i];
62
62
  }
63
- return observableToPromiseAndSubscription.apply(void 0, __spreadArray([options], cbs)).promise;
63
+ return observableToPromiseAndSubscription.apply(void 0, __spreadArray([options], cbs, false)).promise;
64
64
  }
65
65
  //# sourceMappingURL=observableToPromise.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observableToPromise.js","sourceRoot":"","sources":["../../../src/utilities/testing/observableToPromise.ts"],"names":[],"mappings":";AA0BA,MAAM,UAAU,kCAAkC,CAChD,EAA6E;QAA3E,UAAU,gBAAA,EAAE,qBAAoB,EAApB,aAAa,mBAAG,IAAI,KAAA,EAAE,YAAS,EAAT,IAAI,mBAAG,CAAC,CAAC,KAAA,EAAE,sBAAmB,EAAnB,cAAc,mBAAG,EAAE,KAAA;IAClE,aAAwB;SAAxB,UAAwB,EAAxB,qBAAwB,EAAxB,IAAwB;QAAxB,4BAAwB;;IAExB,IAAI,YAAY,GAA2B,IAAa,CAAC;IACzD,IAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,UAAC,OAAO,EAAE,MAAM;QACjD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAM,OAAO,GAAU,EAAE,CAAC;QAE1B,IAAM,YAAY,GAAG;YACnB,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO;aACR;YAED,IAAM,IAAI,GAAG;gBACX,YAAY,CAAC,WAAW,EAAE,CAAC;gBAE3B,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC;YAEF,IAAI,OAAO,KAAK,GAAG,CAAC,MAAM,IAAI,UAAU,KAAK,cAAc,CAAC,MAAM,EAAE;gBAClE,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE;oBACf,IAAI,EAAE,CAAC;iBACR;qBAAM;oBACL,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBACxB;aACF;QACH,CAAC,CAAC;QAEF,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAE9B,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC;YAClC,IAAI,EAAJ,UAAK,MAA8B;gBACjC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACjB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC1B,IAAI,EAAE;wBAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;oBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,+CAA6C,GAAG,CAAC,MAAM,WAAQ,CAAC,CAAC,CAAC;gBACrF,CAAC,CAAC,CAAC,IAAI,CACL,UAAA,GAAG;oBACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,YAAY,EAAE,CAAC;gBACjB,CAAC,EACD,MAAM,CACP,CAAC;YACJ,CAAC;YACD,KAAK,EAAL,UAAM,KAAY;gBAChB,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACjB,IAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC7C,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;oBACnC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC,IAAI,CACL,YAAY,EACZ,MAAM,CACP,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,SAAA;QACP,YAAY,cAAA;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,WACZ,OAAgB;IAChB,aAAwB;SAAxB,UAAwB,EAAxB,qBAAwB,EAAxB,IAAwB;QAAxB,4BAAwB;;IAExB,OAAO,kCAAkC,8BAAC,OAAO,GAAK,GAAG,GAAE,OAAO,CAAC;AACrE,CAAC","sourcesContent":["import { ObservableQuery } from '../../core/ObservableQuery';\nimport { ApolloQueryResult } from '../../core/types';\nimport { ObservableSubscription } from '../../utilities/observables/Observable';\n\n/**\n *\n * @param observable the observable query to subscribe to\n * @param shouldResolve should we resolve after seeing all our callbacks [default: true]\n * (use this if you are racing the promise against another)\n * @param wait how long to wait after seeing desired callbacks before resolving\n * [default: -1 => don't wait]\n * @param errorCallbacks an expected set of errors\n */\nexport type Options = {\n observable: ObservableQuery<any>;\n shouldResolve?: boolean;\n wait?: number;\n errorCallbacks?: ((error: Error) => any)[];\n};\n\nexport type ResultCallback = ((result: ApolloQueryResult<any>) => any);\n\n// Take an observable and N callbacks, and observe the observable,\n// ensuring it is called exactly N times, resolving once it has done so.\n// Optionally takes a timeout, which it will wait X ms after the Nth callback\n// to ensure it is not called again.\nexport function observableToPromiseAndSubscription(\n { observable, shouldResolve = true, wait = -1, errorCallbacks = [] }: Options,\n ...cbs: ResultCallback[]\n): { promise: Promise<any[]>; subscription: ObservableSubscription } {\n let subscription: ObservableSubscription = null as never;\n const promise = new Promise<any[]>((resolve, reject) => {\n let errorIndex = 0;\n let cbIndex = 0;\n const results: any[] = [];\n\n const tryToResolve = () => {\n if (!shouldResolve) {\n return;\n }\n\n const done = () => {\n subscription.unsubscribe();\n // XXX: we could pass a few other things out here?\n resolve(results);\n };\n\n if (cbIndex === cbs.length && errorIndex === errorCallbacks.length) {\n if (wait === -1) {\n done();\n } else {\n setTimeout(done, wait);\n }\n }\n };\n\n let queue = Promise.resolve();\n\n subscription = observable.subscribe({\n next(result: ApolloQueryResult<any>) {\n queue = queue.then(() => {\n const cb = cbs[cbIndex++];\n if (cb) return cb(result);\n reject(new Error(`Observable 'next' method called more than ${cbs.length} times`));\n }).then(\n res => {\n results.push(res);\n tryToResolve();\n },\n reject,\n );\n },\n error(error: Error) {\n queue = queue.then(() => {\n const errorCb = errorCallbacks[errorIndex++];\n if (errorCb) return errorCb(error);\n reject(error);\n }).then(\n tryToResolve,\n reject,\n );\n },\n });\n });\n\n return {\n promise,\n subscription,\n };\n}\n\nexport default function(\n options: Options,\n ...cbs: ResultCallback[]\n): Promise<any[]> {\n return observableToPromiseAndSubscription(options, ...cbs).promise;\n}\n"]}
1
+ {"version":3,"file":"observableToPromise.js","sourceRoot":"","sources":["../../../src/utilities/testing/observableToPromise.ts"],"names":[],"mappings":";AA0BA,MAAM,UAAU,kCAAkC,CAChD,EAA6E;QAA3E,UAAU,gBAAA,EAAE,qBAAoB,EAApB,aAAa,mBAAG,IAAI,KAAA,EAAE,YAAS,EAAT,IAAI,mBAAG,CAAC,CAAC,KAAA,EAAE,sBAAmB,EAAnB,cAAc,mBAAG,EAAE,KAAA;IAClE,aAAwB;SAAxB,UAAwB,EAAxB,qBAAwB,EAAxB,IAAwB;QAAxB,4BAAwB;;IAExB,IAAI,YAAY,GAA2B,IAAa,CAAC;IACzD,IAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,UAAC,OAAO,EAAE,MAAM;QACjD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAM,OAAO,GAAU,EAAE,CAAC;QAE1B,IAAM,YAAY,GAAG;YACnB,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO;aACR;YAED,IAAM,IAAI,GAAG;gBACX,YAAY,CAAC,WAAW,EAAE,CAAC;gBAE3B,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC;YAEF,IAAI,OAAO,KAAK,GAAG,CAAC,MAAM,IAAI,UAAU,KAAK,cAAc,CAAC,MAAM,EAAE;gBAClE,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE;oBACf,IAAI,EAAE,CAAC;iBACR;qBAAM;oBACL,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBACxB;aACF;QACH,CAAC,CAAC;QAEF,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAE9B,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC;YAClC,IAAI,EAAJ,UAAK,MAA8B;gBACjC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACjB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC1B,IAAI,EAAE;wBAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;oBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,+CAA6C,GAAG,CAAC,MAAM,WAAQ,CAAC,CAAC,CAAC;gBACrF,CAAC,CAAC,CAAC,IAAI,CACL,UAAA,GAAG;oBACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,YAAY,EAAE,CAAC;gBACjB,CAAC,EACD,MAAM,CACP,CAAC;YACJ,CAAC;YACD,KAAK,EAAL,UAAM,KAAY;gBAChB,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACjB,IAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC7C,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;oBACnC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC,IAAI,CACL,YAAY,EACZ,MAAM,CACP,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,SAAA;QACP,YAAY,cAAA;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,WACZ,OAAgB;IAChB,aAAwB;SAAxB,UAAwB,EAAxB,qBAAwB,EAAxB,IAAwB;QAAxB,4BAAwB;;IAExB,OAAO,kCAAkC,8BAAC,OAAO,GAAK,GAAG,UAAE,OAAO,CAAC;AACrE,CAAC","sourcesContent":["import { ObservableQuery } from '../../core/ObservableQuery';\nimport { ApolloQueryResult } from '../../core/types';\nimport { ObservableSubscription } from '../../utilities/observables/Observable';\n\n/**\n *\n * @param observable the observable query to subscribe to\n * @param shouldResolve should we resolve after seeing all our callbacks [default: true]\n * (use this if you are racing the promise against another)\n * @param wait how long to wait after seeing desired callbacks before resolving\n * [default: -1 => don't wait]\n * @param errorCallbacks an expected set of errors\n */\nexport type Options = {\n observable: ObservableQuery<any>;\n shouldResolve?: boolean;\n wait?: number;\n errorCallbacks?: ((error: Error) => any)[];\n};\n\nexport type ResultCallback = ((result: ApolloQueryResult<any>) => any);\n\n// Take an observable and N callbacks, and observe the observable,\n// ensuring it is called exactly N times, resolving once it has done so.\n// Optionally takes a timeout, which it will wait X ms after the Nth callback\n// to ensure it is not called again.\nexport function observableToPromiseAndSubscription(\n { observable, shouldResolve = true, wait = -1, errorCallbacks = [] }: Options,\n ...cbs: ResultCallback[]\n): { promise: Promise<any[]>; subscription: ObservableSubscription } {\n let subscription: ObservableSubscription = null as never;\n const promise = new Promise<any[]>((resolve, reject) => {\n let errorIndex = 0;\n let cbIndex = 0;\n const results: any[] = [];\n\n const tryToResolve = () => {\n if (!shouldResolve) {\n return;\n }\n\n const done = () => {\n subscription.unsubscribe();\n // XXX: we could pass a few other things out here?\n resolve(results);\n };\n\n if (cbIndex === cbs.length && errorIndex === errorCallbacks.length) {\n if (wait === -1) {\n done();\n } else {\n setTimeout(done, wait);\n }\n }\n };\n\n let queue = Promise.resolve();\n\n subscription = observable.subscribe({\n next(result: ApolloQueryResult<any>) {\n queue = queue.then(() => {\n const cb = cbs[cbIndex++];\n if (cb) return cb(result);\n reject(new Error(`Observable 'next' method called more than ${cbs.length} times`));\n }).then(\n res => {\n results.push(res);\n tryToResolve();\n },\n reject,\n );\n },\n error(error: Error) {\n queue = queue.then(() => {\n const errorCb = errorCallbacks[errorIndex++];\n if (errorCb) return errorCb(error);\n reject(error);\n }).then(\n tryToResolve,\n reject,\n );\n },\n });\n });\n\n return {\n promise,\n subscription,\n };\n}\n\nexport default function(\n options: Options,\n ...cbs: ResultCallback[]\n): Promise<any[]> {\n return observableToPromiseAndSubscription(options, ...cbs).promise;\n}\n"]}