@apollo/client 3.9.0-alpha.4 → 3.9.0-beta.0

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 (738) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/beige-geese-wink.md +5 -0
  3. package/.changeset/breezy-spiders-tap.md +38 -0
  4. package/.changeset/clean-items-smash.md +5 -0
  5. package/.changeset/cold-llamas-turn.md +8 -0
  6. package/.changeset/config.json +14 -0
  7. package/.changeset/dirty-kids-crash.md +5 -0
  8. package/.changeset/dirty-tigers-matter.md +13 -0
  9. package/.changeset/forty-cups-shop.md +5 -0
  10. package/.changeset/friendly-clouds-laugh.md +7 -0
  11. package/.changeset/hot-ducks-burn.md +5 -0
  12. package/.changeset/mighty-coats-check.md +47 -0
  13. package/.changeset/polite-avocados-warn.md +5 -0
  14. package/.changeset/pre.json +37 -0
  15. package/.changeset/quick-hats-marry.md +5 -0
  16. package/.changeset/rare-snakes-melt.md +24 -0
  17. package/.changeset/shaggy-ears-scream.md +5 -0
  18. package/.changeset/shaggy-sheep-pull.md +5 -0
  19. package/.changeset/sixty-boxes-rest.md +8 -0
  20. package/.changeset/sour-sheep-walk.md +7 -0
  21. package/.changeset/strong-terms-perform.md +46 -0
  22. package/.changeset/swift-zoos-collect.md +19 -0
  23. package/.changeset/thick-mice-collect.md +5 -0
  24. package/.changeset/thick-tips-cry.md +9 -0
  25. package/.changeset/thirty-ties-arrive.md +26 -0
  26. package/.changeset/tough-timers-begin.md +8 -0
  27. package/.changeset/unlucky-rats-decide.md +5 -0
  28. package/.changeset/violet-lions-draw.md +5 -0
  29. package/.changeset/wet-forks-rhyme.md +5 -0
  30. package/.changeset/wild-dolphins-jog.md +5 -0
  31. package/.changeset/yellow-flies-repeat.md +5 -0
  32. package/CHANGELOG.md +3649 -0
  33. package/apollo-client.cjs +775 -451
  34. package/apollo-client.cjs.map +1 -1
  35. package/apollo-client.min.cjs +1 -1
  36. package/cache/cache.cjs +210 -156
  37. package/cache/cache.cjs.map +1 -1
  38. package/cache/cache.cjs.native.js +210 -156
  39. package/cache/core/cache.d.ts +19 -0
  40. package/cache/core/cache.js +28 -7
  41. package/cache/core/cache.js.map +1 -1
  42. package/cache/core/types/Cache.d.ts +8 -1
  43. package/cache/core/types/Cache.js.map +1 -1
  44. package/cache/core/types/DataProxy.d.ts +104 -0
  45. package/cache/core/types/DataProxy.js.map +1 -1
  46. package/cache/core/types/common.d.ts +5 -1
  47. package/cache/core/types/common.js +4 -1
  48. package/cache/core/types/common.js.map +1 -1
  49. package/cache/inmemory/entityStore.d.ts +10 -1
  50. package/cache/inmemory/entityStore.js +190 -29
  51. package/cache/inmemory/entityStore.js.map +1 -1
  52. package/cache/inmemory/fixPolyfills.js +9 -0
  53. package/cache/inmemory/fixPolyfills.js.map +1 -1
  54. package/cache/inmemory/fixPolyfills.native.js +12 -0
  55. package/cache/inmemory/fixPolyfills.native.js.map +1 -1
  56. package/cache/inmemory/fragmentRegistry.d.ts +1 -0
  57. package/cache/inmemory/fragmentRegistry.js +39 -14
  58. package/cache/inmemory/fragmentRegistry.js.map +1 -1
  59. package/cache/inmemory/helpers.js +20 -11
  60. package/cache/inmemory/helpers.js.map +1 -1
  61. package/cache/inmemory/inMemoryCache.d.ts +9 -0
  62. package/cache/inmemory/inMemoryCache.js +172 -10
  63. package/cache/inmemory/inMemoryCache.js.map +1 -1
  64. package/cache/inmemory/key-extractor.js +72 -4
  65. package/cache/inmemory/key-extractor.js.map +1 -1
  66. package/cache/inmemory/object-canon.js +87 -3
  67. package/cache/inmemory/object-canon.js.map +1 -1
  68. package/cache/inmemory/policies.js +190 -43
  69. package/cache/inmemory/policies.js.map +1 -1
  70. package/cache/inmemory/reactiveVars.js +20 -2
  71. package/cache/inmemory/reactiveVars.js.map +1 -1
  72. package/cache/inmemory/readFromStore.d.ts +4 -0
  73. package/cache/inmemory/readFromStore.js +65 -12
  74. package/cache/inmemory/readFromStore.js.map +1 -1
  75. package/cache/inmemory/types.d.ts +46 -0
  76. package/cache/inmemory/types.js.map +1 -1
  77. package/cache/inmemory/writeToStore.js +152 -25
  78. package/cache/inmemory/writeToStore.js.map +1 -1
  79. package/config/jest/setup.js +2 -0
  80. package/config/jest/setup.js.map +1 -1
  81. package/core/ApolloClient.d.ts +273 -3
  82. package/core/ApolloClient.js +239 -7
  83. package/core/ApolloClient.js.map +1 -1
  84. package/core/LocalState.d.ts +4 -6
  85. package/core/LocalState.js +56 -18
  86. package/core/LocalState.js.map +1 -1
  87. package/core/ObservableQuery.d.ts +27 -0
  88. package/core/ObservableQuery.js +246 -31
  89. package/core/ObservableQuery.js.map +1 -1
  90. package/core/QueryInfo.d.ts +4 -3
  91. package/core/QueryInfo.js +122 -13
  92. package/core/QueryInfo.js.map +1 -1
  93. package/core/QueryManager.d.ts +9 -2
  94. package/core/QueryManager.js +259 -53
  95. package/core/QueryManager.js.map +1 -1
  96. package/core/core.cjs +222 -122
  97. package/core/core.cjs.map +1 -1
  98. package/core/core.cjs.native.js +222 -122
  99. package/core/equalByQuery.js +20 -1
  100. package/core/equalByQuery.js.map +1 -1
  101. package/core/index.d.ts +1 -1
  102. package/core/index.js +19 -0
  103. package/core/index.js.map +1 -1
  104. package/core/networkStatus.d.ts +39 -0
  105. package/core/networkStatus.js +39 -0
  106. package/core/networkStatus.js.map +1 -1
  107. package/core/types.d.ts +9 -0
  108. package/core/types.js.map +1 -1
  109. package/core/watchQueryOptions.d.ts +245 -2
  110. package/core/watchQueryOptions.js.map +1 -1
  111. package/dev/dev.cjs +10 -119
  112. package/dev/dev.cjs.map +1 -1
  113. package/dev/dev.cjs.native.js +10 -119
  114. package/dev/loadErrorMessageHandler.js.map +1 -1
  115. package/errors/errors.cjs +1 -1
  116. package/errors/errors.cjs.map +1 -1
  117. package/errors/errors.cjs.native.js +1 -1
  118. package/errors/index.js +14 -1
  119. package/errors/index.js.map +1 -1
  120. package/invariantErrorCodes.js +6 -8
  121. package/link/batch/batch.cjs +2 -2
  122. package/link/batch/batch.cjs.map +1 -1
  123. package/link/batch/batch.cjs.native.js +2 -2
  124. package/link/batch/batchLink.d.ts +21 -0
  125. package/link/batch/batchLink.js +2 -1
  126. package/link/batch/batchLink.js.map +1 -1
  127. package/link/batch/batching.js +24 -1
  128. package/link/batch/batching.js.map +1 -1
  129. package/link/batch-http/batch-http.cjs +3 -2
  130. package/link/batch-http/batch-http.cjs.map +1 -1
  131. package/link/batch-http/batch-http.cjs.native.js +3 -2
  132. package/link/batch-http/batchHttpLink.d.ts +4 -0
  133. package/link/batch-http/batchHttpLink.js +53 -2
  134. package/link/batch-http/batchHttpLink.js.map +1 -1
  135. package/link/context/context.cjs.map +1 -1
  136. package/link/context/index.js +1 -0
  137. package/link/context/index.js.map +1 -1
  138. package/link/core/ApolloLink.d.ts +15 -0
  139. package/link/core/ApolloLink.js +20 -9
  140. package/link/core/ApolloLink.js.map +1 -1
  141. package/link/core/core.cjs +13 -9
  142. package/link/core/core.cjs.map +1 -1
  143. package/link/core/core.cjs.native.js +13 -9
  144. package/link/error/error.cjs +1 -1
  145. package/link/error/error.cjs.map +1 -1
  146. package/link/error/error.cjs.native.js +1 -1
  147. package/link/error/index.d.ts +3 -0
  148. package/link/error/index.js +4 -1
  149. package/link/error/index.js.map +1 -1
  150. package/link/http/HttpLink.d.ts +0 -2
  151. package/link/http/HttpLink.js +1 -1
  152. package/link/http/HttpLink.js.map +1 -1
  153. package/link/http/checkFetcher.js.map +1 -1
  154. package/link/http/createHttpLink.js +23 -1
  155. package/link/http/createHttpLink.js.map +1 -1
  156. package/link/http/createSignalIfSupported.d.ts +5 -0
  157. package/link/http/createSignalIfSupported.js +5 -0
  158. package/link/http/createSignalIfSupported.js.map +1 -1
  159. package/link/http/http.cjs +14 -12
  160. package/link/http/http.cjs.map +1 -1
  161. package/link/http/http.cjs.native.js +14 -12
  162. package/link/http/index.js +2 -1
  163. package/link/http/index.js.map +1 -1
  164. package/link/http/iterators/async.d.ts +4 -0
  165. package/link/http/iterators/async.js +4 -0
  166. package/link/http/iterators/async.js.map +1 -1
  167. package/link/http/iterators/nodeStream.d.ts +4 -0
  168. package/link/http/iterators/nodeStream.js +4 -0
  169. package/link/http/iterators/nodeStream.js.map +1 -1
  170. package/link/http/iterators/promise.d.ts +4 -0
  171. package/link/http/iterators/promise.js +4 -0
  172. package/link/http/iterators/promise.js.map +1 -1
  173. package/link/http/iterators/reader.d.ts +4 -0
  174. package/link/http/iterators/reader.js +4 -0
  175. package/link/http/iterators/reader.js.map +1 -1
  176. package/link/http/parseAndCheckHttpResponse.js +51 -10
  177. package/link/http/parseAndCheckHttpResponse.js.map +1 -1
  178. package/link/http/responseIterator.d.ts +4 -0
  179. package/link/http/responseIterator.js +6 -0
  180. package/link/http/responseIterator.js.map +1 -1
  181. package/link/http/rewriteURIForGET.d.ts +1 -1
  182. package/link/http/rewriteURIForGET.js +10 -0
  183. package/link/http/rewriteURIForGET.js.map +1 -1
  184. package/link/http/selectHttpOptionsAndBody.d.ts +45 -0
  185. package/link/http/selectHttpOptionsAndBody.js +23 -0
  186. package/link/http/selectHttpOptionsAndBody.js.map +1 -1
  187. package/link/http/selectURI.js.map +1 -1
  188. package/link/http/serializeFetchParameter.js.map +1 -1
  189. package/link/persisted-queries/index.d.ts +11 -1
  190. package/link/persisted-queries/index.js +62 -7
  191. package/link/persisted-queries/index.js.map +1 -1
  192. package/link/persisted-queries/persisted-queries.cjs +30 -7
  193. package/link/persisted-queries/persisted-queries.cjs.map +1 -1
  194. package/link/persisted-queries/persisted-queries.cjs.native.js +30 -7
  195. package/link/remove-typename/remove-typename.cjs +30 -11
  196. package/link/remove-typename/remove-typename.cjs.map +1 -1
  197. package/link/remove-typename/remove-typename.cjs.native.js +30 -11
  198. package/link/remove-typename/removeTypenameFromVariables.d.ts +9 -1
  199. package/link/remove-typename/removeTypenameFromVariables.js +31 -12
  200. package/link/remove-typename/removeTypenameFromVariables.js.map +1 -1
  201. package/link/retry/delayFunction.d.ts +29 -0
  202. package/link/retry/delayFunction.js +6 -0
  203. package/link/retry/delayFunction.js.map +1 -1
  204. package/link/retry/retry.cjs +5 -5
  205. package/link/retry/retry.cjs.map +1 -1
  206. package/link/retry/retry.cjs.native.js +5 -5
  207. package/link/retry/retryFunction.d.ts +20 -0
  208. package/link/retry/retryLink.d.ts +6 -0
  209. package/link/retry/retryLink.js +31 -6
  210. package/link/retry/retryLink.js.map +1 -1
  211. package/link/schema/index.d.ts +13 -0
  212. package/link/schema/index.js +3 -3
  213. package/link/schema/index.js.map +1 -1
  214. package/link/schema/schema.cjs +3 -3
  215. package/link/schema/schema.cjs.map +1 -1
  216. package/link/schema/schema.cjs.native.js +3 -3
  217. package/link/subscriptions/index.js +35 -2
  218. package/link/subscriptions/index.js.map +1 -1
  219. package/link/subscriptions/subscriptions.cjs +3 -2
  220. package/link/subscriptions/subscriptions.cjs.map +1 -1
  221. package/link/subscriptions/subscriptions.cjs.native.js +3 -2
  222. package/link/utils/createOperation.js.map +1 -1
  223. package/link/utils/filterOperationVariables.js +4 -0
  224. package/link/utils/filterOperationVariables.js.map +1 -1
  225. package/link/utils/toPromise.js.map +1 -1
  226. package/link/utils/transformOperation.js +3 -2
  227. package/link/utils/transformOperation.js.map +1 -1
  228. package/link/utils/utils.cjs +2 -2
  229. package/link/utils/utils.cjs.map +1 -1
  230. package/link/utils/utils.cjs.native.js +2 -2
  231. package/link/utils/validateOperation.js.map +1 -1
  232. package/link/ws/index.d.ts +12 -0
  233. package/link/ws/index.js +1 -1
  234. package/link/ws/index.js.map +1 -1
  235. package/link/ws/ws.cjs +1 -1
  236. package/link/ws/ws.cjs.map +1 -1
  237. package/link/ws/ws.cjs.native.js +1 -1
  238. package/package.json +53 -41
  239. package/react/cache/QueryReference.d.ts +27 -13
  240. package/react/cache/QueryReference.js +122 -42
  241. package/react/cache/QueryReference.js.map +1 -1
  242. package/react/cache/SuspenseCache.d.ts +10 -0
  243. package/react/cache/SuspenseCache.js +1 -2
  244. package/react/cache/SuspenseCache.js.map +1 -1
  245. package/react/cache/getSuspenseCache.js.map +1 -1
  246. package/react/cache/types.d.ts +3 -0
  247. package/react/cache/types.js.map +1 -1
  248. package/react/context/ApolloContext.d.ts +5 -0
  249. package/react/context/ApolloContext.js +10 -3
  250. package/react/context/ApolloContext.js.map +1 -1
  251. package/react/context/context.cjs +1 -3
  252. package/react/context/context.cjs.map +1 -1
  253. package/react/context/context.cjs.native.js +1 -3
  254. package/react/hoc/graphql.js.map +1 -1
  255. package/react/hoc/hoc-utils.js +3 -1
  256. package/react/hoc/hoc-utils.js.map +1 -1
  257. package/react/hoc/hoc.cjs +9 -17
  258. package/react/hoc/hoc.cjs.map +1 -1
  259. package/react/hoc/hoc.cjs.native.js +9 -17
  260. package/react/hoc/mutation-hoc.js +9 -4
  261. package/react/hoc/mutation-hoc.js.map +1 -1
  262. package/react/hoc/query-hoc.js +10 -4
  263. package/react/hoc/query-hoc.js.map +1 -1
  264. package/react/hoc/subscription-hoc.js +10 -4
  265. package/react/hoc/subscription-hoc.js.map +1 -1
  266. package/react/hoc/withApollo.js +3 -4
  267. package/react/hoc/withApollo.js.map +1 -1
  268. package/react/hooks/hooks.cjs +230 -98
  269. package/react/hooks/hooks.cjs.map +1 -1
  270. package/react/hooks/hooks.cjs.native.js +230 -98
  271. package/react/hooks/index.d.ts +4 -0
  272. package/react/hooks/index.js +2 -0
  273. package/react/hooks/index.js.map +1 -1
  274. package/react/hooks/internal/__use.js +5 -0
  275. package/react/hooks/internal/__use.js.map +1 -1
  276. package/react/hooks/internal/index.d.ts +1 -0
  277. package/react/hooks/internal/index.js +2 -0
  278. package/react/hooks/internal/index.js.map +1 -1
  279. package/react/hooks/internal/useDeepMemo.js.map +1 -1
  280. package/react/hooks/internal/useIsomorphicLayoutEffect.js +6 -3
  281. package/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
  282. package/react/hooks/internal/useRenderGuard.d.ts +2 -0
  283. package/react/hooks/internal/useRenderGuard.js +17 -0
  284. package/react/hooks/internal/useRenderGuard.js.map +1 -0
  285. package/react/hooks/useBackgroundQuery.d.ts +12 -9
  286. package/react/hooks/useBackgroundQuery.js +14 -11
  287. package/react/hooks/useBackgroundQuery.js.map +1 -1
  288. package/react/hooks/useFragment.js +4 -3
  289. package/react/hooks/useFragment.js.map +1 -1
  290. package/react/hooks/useLazyQuery.js +13 -4
  291. package/react/hooks/useLazyQuery.js.map +1 -1
  292. package/react/hooks/useLoadableQuery.d.ts +30 -0
  293. package/react/hooks/useLoadableQuery.js +61 -0
  294. package/react/hooks/useLoadableQuery.js.map +1 -0
  295. package/react/hooks/useMutation.js +8 -3
  296. package/react/hooks/useMutation.js.map +1 -1
  297. package/react/hooks/useQuery.d.ts +11 -0
  298. package/react/hooks/useQuery.js +138 -6
  299. package/react/hooks/useQuery.js.map +1 -1
  300. package/react/hooks/useQueryRefHandlers.d.ts +35 -0
  301. package/react/hooks/useQueryRefHandlers.js +48 -0
  302. package/react/hooks/useQueryRefHandlers.js.map +1 -0
  303. package/react/hooks/useReactiveVar.js +5 -0
  304. package/react/hooks/useReactiveVar.js.map +1 -1
  305. package/react/hooks/useReadQuery.d.ts +19 -0
  306. package/react/hooks/useReadQuery.js +9 -9
  307. package/react/hooks/useReadQuery.js.map +1 -1
  308. package/react/hooks/useSubscription.js +5 -0
  309. package/react/hooks/useSubscription.js.map +1 -1
  310. package/react/hooks/useSuspenseQuery.js +22 -22
  311. package/react/hooks/useSuspenseQuery.js.map +1 -1
  312. package/react/hooks/useSyncExternalStore.js +53 -1
  313. package/react/hooks/useSyncExternalStore.js.map +1 -1
  314. package/react/index.d.ts +2 -0
  315. package/react/index.js +1 -0
  316. package/react/index.js.map +1 -1
  317. package/react/parser/index.d.ts +3 -0
  318. package/react/parser/index.js +16 -6
  319. package/react/parser/index.js.map +1 -1
  320. package/react/parser/parser.cjs +19 -5
  321. package/react/parser/parser.cjs.map +1 -1
  322. package/react/parser/parser.cjs.native.js +19 -5
  323. package/react/query-preloader/createQueryPreloader.d.ts +253 -0
  324. package/react/query-preloader/createQueryPreloader.js +29 -0
  325. package/react/query-preloader/createQueryPreloader.js.map +1 -0
  326. package/react/react.cjs +248 -1
  327. package/react/react.cjs.map +1 -1
  328. package/react/react.cjs.native.js +248 -1
  329. package/react/ssr/RenderPromises.js +21 -1
  330. package/react/ssr/RenderPromises.js.map +1 -1
  331. package/react/ssr/getDataFromTree.js +18 -3
  332. package/react/ssr/getDataFromTree.js.map +1 -1
  333. package/react/ssr/ssr.cjs +6 -4
  334. package/react/ssr/ssr.cjs.map +1 -1
  335. package/react/ssr/ssr.cjs.native.js +6 -4
  336. package/react/types/types.d.ts +129 -1
  337. package/react/types/types.js.map +1 -1
  338. package/testing/core/core.cjs +14 -11
  339. package/testing/core/core.cjs.map +1 -1
  340. package/testing/core/core.cjs.native.js +14 -11
  341. package/testing/core/itAsync.d.ts +1 -1
  342. package/testing/core/itAsync.js.map +1 -1
  343. package/testing/core/mocking/mockFetch.d.ts +2 -2
  344. package/testing/core/mocking/mockFetch.js +8 -4
  345. package/testing/core/mocking/mockFetch.js.map +1 -1
  346. package/testing/core/mocking/mockLink.d.ts +1 -1
  347. package/testing/core/mocking/mockLink.js +17 -7
  348. package/testing/core/mocking/mockLink.js.map +1 -1
  349. package/testing/core/mocking/mockQueryManager.js +2 -0
  350. package/testing/core/mocking/mockQueryManager.js.map +1 -1
  351. package/testing/core/mocking/mockSubscriptionLink.d.ts +1 -1
  352. package/testing/core/mocking/mockSubscriptionLink.js +1 -1
  353. package/testing/core/mocking/mockSubscriptionLink.js.map +1 -1
  354. package/testing/core/mocking/mockWatchQuery.js +1 -1
  355. package/testing/core/mocking/mockWatchQuery.js.map +1 -1
  356. package/testing/core/observableToPromise.d.ts +17 -3
  357. package/testing/core/observableToPromise.js +5 -0
  358. package/testing/core/observableToPromise.js.map +1 -1
  359. package/testing/core/subscribeAndCount.js +3 -0
  360. package/testing/core/subscribeAndCount.js.map +1 -1
  361. package/testing/core/wait.js +2 -2
  362. package/testing/core/wait.js.map +1 -1
  363. package/testing/core/withConsoleSpy.d.ts +3 -0
  364. package/testing/core/withConsoleSpy.js +7 -1
  365. package/testing/core/withConsoleSpy.js.map +1 -1
  366. package/testing/core/wrap.js +2 -0
  367. package/testing/core/wrap.js.map +1 -1
  368. package/testing/internal/ObservableStream.js +14 -14
  369. package/testing/internal/ObservableStream.js.map +1 -1
  370. package/testing/internal/disposables/disableActWarnings.d.ts +10 -0
  371. package/testing/internal/disposables/disableActWarnings.js +15 -0
  372. package/testing/internal/disposables/disableActWarnings.js.map +1 -0
  373. package/testing/internal/disposables/index.d.ts +1 -0
  374. package/testing/internal/disposables/index.js +1 -0
  375. package/testing/internal/disposables/index.js.map +1 -1
  376. package/testing/internal/disposables/spyOnConsole.d.ts +1 -0
  377. package/testing/internal/disposables/spyOnConsole.js +2 -0
  378. package/testing/internal/disposables/spyOnConsole.js.map +1 -1
  379. package/testing/internal/disposables/withCleanup.d.ts +1 -0
  380. package/testing/internal/disposables/withCleanup.js +3 -0
  381. package/testing/internal/disposables/withCleanup.js.map +1 -1
  382. package/testing/internal/index.d.ts +4 -0
  383. package/testing/internal/index.js +2 -0
  384. package/testing/internal/index.js.map +1 -1
  385. package/testing/internal/profile/Render.d.ts +32 -1
  386. package/testing/internal/profile/Render.js +14 -2
  387. package/testing/internal/profile/Render.js.map +1 -1
  388. package/testing/internal/profile/context.d.ts +10 -0
  389. package/testing/internal/profile/context.js +14 -0
  390. package/testing/internal/profile/context.js.map +1 -0
  391. package/testing/internal/profile/index.d.ts +2 -2
  392. package/testing/internal/profile/index.js +1 -1
  393. package/testing/internal/profile/index.js.map +1 -1
  394. package/testing/internal/profile/profile.d.ts +67 -13
  395. package/testing/internal/profile/profile.js +153 -79
  396. package/testing/internal/profile/profile.js.map +1 -1
  397. package/testing/internal/profile/traces.d.ts +4 -0
  398. package/testing/internal/profile/traces.js +9 -5
  399. package/testing/internal/profile/traces.js.map +1 -1
  400. package/testing/internal/renderHelpers.d.ts +12 -0
  401. package/testing/internal/renderHelpers.js +22 -0
  402. package/testing/internal/renderHelpers.js.map +1 -0
  403. package/testing/internal/scenarios/index.d.ts +41 -0
  404. package/testing/internal/scenarios/index.js +46 -0
  405. package/testing/internal/scenarios/index.js.map +1 -0
  406. package/testing/matchers/ProfiledComponent.js +29 -26
  407. package/testing/matchers/ProfiledComponent.js.map +1 -1
  408. package/testing/matchers/index.js +4 -0
  409. package/testing/matchers/index.js.map +1 -1
  410. package/testing/matchers/toBeDisposed.d.ts +3 -0
  411. package/testing/matchers/toBeDisposed.js +26 -0
  412. package/testing/matchers/toBeDisposed.js.map +1 -0
  413. package/testing/matchers/toBeGarbageCollected.d.ts +8 -0
  414. package/testing/matchers/toBeGarbageCollected.js +48 -0
  415. package/testing/matchers/toBeGarbageCollected.js.map +1 -0
  416. package/testing/matchers/toHaveSuspenseCacheEntryUsing.js.map +1 -1
  417. package/testing/matchers/toMatchDocument.js.map +1 -1
  418. package/testing/react/MockedProvider.d.ts +5 -1
  419. package/testing/react/MockedProvider.js +6 -2
  420. package/testing/react/MockedProvider.js.map +1 -1
  421. package/testing/testing.cjs +4 -2
  422. package/testing/testing.cjs.map +1 -1
  423. package/testing/testing.cjs.native.js +4 -2
  424. package/utilities/caching/caches.d.ts +34 -0
  425. package/utilities/caching/caches.js +64 -0
  426. package/utilities/caching/caches.js.map +1 -0
  427. package/utilities/caching/getMemoryInternals.d.ts +76 -0
  428. package/utilities/caching/getMemoryInternals.js +112 -0
  429. package/utilities/caching/getMemoryInternals.js.map +1 -0
  430. package/utilities/caching/index.d.ts +4 -0
  431. package/utilities/caching/index.js +3 -0
  432. package/utilities/caching/index.js.map +1 -0
  433. package/utilities/caching/sizes.d.ts +261 -0
  434. package/utilities/caching/sizes.js +27 -0
  435. package/utilities/caching/sizes.js.map +1 -0
  436. package/utilities/common/arrays.js +1 -0
  437. package/utilities/common/arrays.js.map +1 -1
  438. package/utilities/common/canUse.js +17 -2
  439. package/utilities/common/canUse.js.map +1 -1
  440. package/utilities/common/canonicalStringify.d.ts +17 -0
  441. package/utilities/common/canonicalStringify.js +49 -2
  442. package/utilities/common/canonicalStringify.js.map +1 -1
  443. package/utilities/common/cloneDeep.d.ts +3 -0
  444. package/utilities/common/cloneDeep.js +5 -0
  445. package/utilities/common/cloneDeep.js.map +1 -1
  446. package/utilities/common/compact.d.ts +4 -0
  447. package/utilities/common/compact.js +4 -0
  448. package/utilities/common/compact.js.map +1 -1
  449. package/utilities/common/errorHandling.js +1 -3
  450. package/utilities/common/errorHandling.js.map +1 -1
  451. package/utilities/common/incrementalResult.js +3 -0
  452. package/utilities/common/incrementalResult.js.map +1 -1
  453. package/utilities/common/makeUniqueId.js +2 -0
  454. package/utilities/common/makeUniqueId.js.map +1 -1
  455. package/utilities/common/maybeDeepFreeze.js +3 -0
  456. package/utilities/common/maybeDeepFreeze.js.map +1 -1
  457. package/utilities/common/mergeDeep.js +12 -1
  458. package/utilities/common/mergeDeep.js.map +1 -1
  459. package/utilities/common/mergeOptions.d.ts +1 -1
  460. package/utilities/common/mergeOptions.js.map +1 -1
  461. package/utilities/common/omitDeep.js.map +1 -1
  462. package/utilities/globals/global.js +7 -1
  463. package/utilities/globals/global.js.map +1 -1
  464. package/utilities/globals/globals.cjs +4 -5
  465. package/utilities/globals/globals.cjs.map +1 -1
  466. package/utilities/globals/globals.cjs.native.js +4 -5
  467. package/utilities/globals/index.d.ts +4 -0
  468. package/utilities/globals/index.js +7 -0
  469. package/utilities/globals/index.js.map +1 -1
  470. package/utilities/globals/invariantWrappers.d.ts +40 -0
  471. package/utilities/globals/invariantWrappers.js +11 -3
  472. package/utilities/globals/invariantWrappers.js.map +1 -1
  473. package/utilities/globals/maybe.js.map +1 -1
  474. package/utilities/graphql/DocumentTransform.d.ts +20 -6
  475. package/utilities/graphql/DocumentTransform.js +54 -29
  476. package/utilities/graphql/DocumentTransform.js.map +1 -1
  477. package/utilities/graphql/directives.js +3 -0
  478. package/utilities/graphql/directives.js.map +1 -1
  479. package/utilities/graphql/fragments.d.ts +25 -0
  480. package/utilities/graphql/fragments.js +36 -0
  481. package/utilities/graphql/fragments.js.map +1 -1
  482. package/utilities/graphql/getFromAST.d.ts +5 -0
  483. package/utilities/graphql/getFromAST.js +9 -0
  484. package/utilities/graphql/getFromAST.js.map +1 -1
  485. package/utilities/graphql/print.js +8 -5
  486. package/utilities/graphql/print.js.map +1 -1
  487. package/utilities/graphql/storeUtils.d.ts +14 -0
  488. package/utilities/graphql/storeUtils.js +8 -2
  489. package/utilities/graphql/storeUtils.js.map +1 -1
  490. package/utilities/graphql/transform.js +106 -7
  491. package/utilities/graphql/transform.js.map +1 -1
  492. package/utilities/index.d.ts +4 -0
  493. package/utilities/index.js +1 -0
  494. package/utilities/index.js.map +1 -1
  495. package/utilities/observables/Concast.d.ts +1 -1
  496. package/utilities/observables/Concast.js +85 -2
  497. package/utilities/observables/Concast.js.map +1 -1
  498. package/utilities/observables/Observable.js +6 -0
  499. package/utilities/observables/Observable.js.map +1 -1
  500. package/utilities/observables/asyncMap.js +12 -3
  501. package/utilities/observables/asyncMap.js.map +1 -1
  502. package/utilities/observables/iteration.js +3 -0
  503. package/utilities/observables/iteration.js.map +1 -1
  504. package/utilities/observables/subclassing.js +14 -0
  505. package/utilities/observables/subclassing.js.map +1 -1
  506. package/utilities/policies/pagination.js +47 -3
  507. package/utilities/policies/pagination.js.map +1 -1
  508. package/utilities/promises/decoration.js +1 -0
  509. package/utilities/promises/decoration.js.map +1 -1
  510. package/utilities/subscriptions/relay/index.js.map +1 -1
  511. package/utilities/subscriptions/relay/relay.cjs +9 -8
  512. package/utilities/subscriptions/relay/relay.cjs.map +1 -1
  513. package/utilities/subscriptions/relay/relay.cjs.native.js +9 -8
  514. package/utilities/subscriptions/urql/index.js.map +1 -1
  515. package/utilities/subscriptions/urql/urql.cjs +9 -8
  516. package/utilities/subscriptions/urql/urql.cjs.map +1 -1
  517. package/utilities/subscriptions/urql/urql.cjs.native.js +9 -8
  518. package/utilities/types/DeepOmit.js.map +1 -1
  519. package/utilities/types/DeepPartial.d.ts +1 -1
  520. package/utilities/types/DeepPartial.js +4 -0
  521. package/utilities/types/DeepPartial.js.map +1 -1
  522. package/utilities/types/IsStrictlyAny.js.map +1 -1
  523. package/utilities/types/OnlyRequiredProperties.d.ts +7 -0
  524. package/utilities/types/OnlyRequiredProperties.js +2 -0
  525. package/utilities/types/OnlyRequiredProperties.js.map +1 -0
  526. package/utilities/types/TODO.d.ts +3 -0
  527. package/utilities/types/TODO.js +2 -0
  528. package/utilities/types/TODO.js.map +1 -0
  529. package/utilities/utilities.cjs +114 -58
  530. package/utilities/utilities.cjs.map +1 -1
  531. package/utilities/utilities.cjs.native.js +114 -58
  532. package/version.js +1 -1
  533. package/cache/core/cache.d.ts.map +0 -1
  534. package/cache/core/types/Cache.d.ts.map +0 -1
  535. package/cache/core/types/DataProxy.d.ts.map +0 -1
  536. package/cache/core/types/common.d.ts.map +0 -1
  537. package/cache/index.d.ts.map +0 -1
  538. package/cache/inmemory/entityStore.d.ts.map +0 -1
  539. package/cache/inmemory/fixPolyfills.d.ts.map +0 -1
  540. package/cache/inmemory/fixPolyfills.native.d.ts.map +0 -1
  541. package/cache/inmemory/fragmentRegistry.d.ts.map +0 -1
  542. package/cache/inmemory/helpers.d.ts.map +0 -1
  543. package/cache/inmemory/inMemoryCache.d.ts.map +0 -1
  544. package/cache/inmemory/key-extractor.d.ts.map +0 -1
  545. package/cache/inmemory/object-canon.d.ts.map +0 -1
  546. package/cache/inmemory/policies.d.ts.map +0 -1
  547. package/cache/inmemory/reactiveVars.d.ts.map +0 -1
  548. package/cache/inmemory/readFromStore.d.ts.map +0 -1
  549. package/cache/inmemory/types.d.ts.map +0 -1
  550. package/cache/inmemory/writeToStore.d.ts.map +0 -1
  551. package/config/jest/setup.d.ts.map +0 -1
  552. package/core/ApolloClient.d.ts.map +0 -1
  553. package/core/LocalState.d.ts.map +0 -1
  554. package/core/ObservableQuery.d.ts.map +0 -1
  555. package/core/QueryInfo.d.ts.map +0 -1
  556. package/core/QueryManager.d.ts.map +0 -1
  557. package/core/equalByQuery.d.ts.map +0 -1
  558. package/core/index.d.ts.map +0 -1
  559. package/core/networkStatus.d.ts.map +0 -1
  560. package/core/types.d.ts.map +0 -1
  561. package/core/watchQueryOptions.d.ts.map +0 -1
  562. package/dev/index.d.ts.map +0 -1
  563. package/dev/loadDevMessages.d.ts.map +0 -1
  564. package/dev/loadErrorMessageHandler.d.ts.map +0 -1
  565. package/dev/loadErrorMessages.d.ts.map +0 -1
  566. package/errors/index.d.ts.map +0 -1
  567. package/index.d.ts.map +0 -1
  568. package/invariantErrorCodes.d.ts.map +0 -1
  569. package/link/batch/batchLink.d.ts.map +0 -1
  570. package/link/batch/batching.d.ts.map +0 -1
  571. package/link/batch/index.d.ts.map +0 -1
  572. package/link/batch-http/batchHttpLink.d.ts.map +0 -1
  573. package/link/batch-http/index.d.ts.map +0 -1
  574. package/link/context/index.d.ts.map +0 -1
  575. package/link/core/ApolloLink.d.ts.map +0 -1
  576. package/link/core/concat.d.ts.map +0 -1
  577. package/link/core/empty.d.ts.map +0 -1
  578. package/link/core/execute.d.ts.map +0 -1
  579. package/link/core/from.d.ts.map +0 -1
  580. package/link/core/index.d.ts.map +0 -1
  581. package/link/core/split.d.ts.map +0 -1
  582. package/link/core/types.d.ts.map +0 -1
  583. package/link/error/index.d.ts.map +0 -1
  584. package/link/http/HttpLink.d.ts.map +0 -1
  585. package/link/http/checkFetcher.d.ts.map +0 -1
  586. package/link/http/createHttpLink.d.ts.map +0 -1
  587. package/link/http/createSignalIfSupported.d.ts.map +0 -1
  588. package/link/http/index.d.ts.map +0 -1
  589. package/link/http/iterators/async.d.ts.map +0 -1
  590. package/link/http/iterators/nodeStream.d.ts.map +0 -1
  591. package/link/http/iterators/promise.d.ts.map +0 -1
  592. package/link/http/iterators/reader.d.ts.map +0 -1
  593. package/link/http/parseAndCheckHttpResponse.d.ts.map +0 -1
  594. package/link/http/responseIterator.d.ts.map +0 -1
  595. package/link/http/rewriteURIForGET.d.ts.map +0 -1
  596. package/link/http/selectHttpOptionsAndBody.d.ts.map +0 -1
  597. package/link/http/selectURI.d.ts.map +0 -1
  598. package/link/http/serializeFetchParameter.d.ts.map +0 -1
  599. package/link/persisted-queries/index.d.ts.map +0 -1
  600. package/link/remove-typename/index.d.ts.map +0 -1
  601. package/link/remove-typename/removeTypenameFromVariables.d.ts.map +0 -1
  602. package/link/retry/delayFunction.d.ts.map +0 -1
  603. package/link/retry/index.d.ts.map +0 -1
  604. package/link/retry/retryFunction.d.ts.map +0 -1
  605. package/link/retry/retryLink.d.ts.map +0 -1
  606. package/link/schema/index.d.ts.map +0 -1
  607. package/link/subscriptions/index.d.ts.map +0 -1
  608. package/link/utils/createOperation.d.ts.map +0 -1
  609. package/link/utils/filterOperationVariables.d.ts.map +0 -1
  610. package/link/utils/fromError.d.ts.map +0 -1
  611. package/link/utils/fromPromise.d.ts.map +0 -1
  612. package/link/utils/index.d.ts.map +0 -1
  613. package/link/utils/throwServerError.d.ts.map +0 -1
  614. package/link/utils/toPromise.d.ts.map +0 -1
  615. package/link/utils/transformOperation.d.ts.map +0 -1
  616. package/link/utils/validateOperation.d.ts.map +0 -1
  617. package/link/ws/index.d.ts.map +0 -1
  618. package/react/cache/QueryReference.d.ts.map +0 -1
  619. package/react/cache/SuspenseCache.d.ts.map +0 -1
  620. package/react/cache/getSuspenseCache.d.ts.map +0 -1
  621. package/react/cache/index.d.ts.map +0 -1
  622. package/react/cache/types.d.ts.map +0 -1
  623. package/react/components/Mutation.d.ts.map +0 -1
  624. package/react/components/Query.d.ts.map +0 -1
  625. package/react/components/Subscription.d.ts.map +0 -1
  626. package/react/components/index.d.ts.map +0 -1
  627. package/react/components/types.d.ts.map +0 -1
  628. package/react/context/ApolloConsumer.d.ts.map +0 -1
  629. package/react/context/ApolloContext.d.ts.map +0 -1
  630. package/react/context/ApolloProvider.d.ts.map +0 -1
  631. package/react/context/index.d.ts.map +0 -1
  632. package/react/hoc/graphql.d.ts.map +0 -1
  633. package/react/hoc/hoc-utils.d.ts.map +0 -1
  634. package/react/hoc/index.d.ts.map +0 -1
  635. package/react/hoc/mutation-hoc.d.ts.map +0 -1
  636. package/react/hoc/query-hoc.d.ts.map +0 -1
  637. package/react/hoc/subscription-hoc.d.ts.map +0 -1
  638. package/react/hoc/types.d.ts.map +0 -1
  639. package/react/hoc/withApollo.d.ts.map +0 -1
  640. package/react/hooks/constants.d.ts.map +0 -1
  641. package/react/hooks/index.d.ts.map +0 -1
  642. package/react/hooks/internal/__use.d.ts.map +0 -1
  643. package/react/hooks/internal/index.d.ts.map +0 -1
  644. package/react/hooks/internal/useDeepMemo.d.ts.map +0 -1
  645. package/react/hooks/internal/useIsomorphicLayoutEffect.d.ts.map +0 -1
  646. package/react/hooks/useApolloClient.d.ts.map +0 -1
  647. package/react/hooks/useBackgroundQuery.d.ts.map +0 -1
  648. package/react/hooks/useFragment.d.ts.map +0 -1
  649. package/react/hooks/useLazyQuery.d.ts.map +0 -1
  650. package/react/hooks/useMutation.d.ts.map +0 -1
  651. package/react/hooks/useQuery.d.ts.map +0 -1
  652. package/react/hooks/useReactiveVar.d.ts.map +0 -1
  653. package/react/hooks/useReadQuery.d.ts.map +0 -1
  654. package/react/hooks/useSubscription.d.ts.map +0 -1
  655. package/react/hooks/useSuspenseQuery.d.ts.map +0 -1
  656. package/react/hooks/useSyncExternalStore.d.ts.map +0 -1
  657. package/react/index.d.ts.map +0 -1
  658. package/react/parser/index.d.ts.map +0 -1
  659. package/react/ssr/RenderPromises.d.ts.map +0 -1
  660. package/react/ssr/getDataFromTree.d.ts.map +0 -1
  661. package/react/ssr/index.d.ts.map +0 -1
  662. package/react/ssr/renderToStringWithData.d.ts.map +0 -1
  663. package/react/types/types.d.ts.map +0 -1
  664. package/testing/core/index.d.ts.map +0 -1
  665. package/testing/core/itAsync.d.ts.map +0 -1
  666. package/testing/core/mocking/mockClient.d.ts.map +0 -1
  667. package/testing/core/mocking/mockFetch.d.ts.map +0 -1
  668. package/testing/core/mocking/mockLink.d.ts.map +0 -1
  669. package/testing/core/mocking/mockQueryManager.d.ts.map +0 -1
  670. package/testing/core/mocking/mockSubscriptionLink.d.ts.map +0 -1
  671. package/testing/core/mocking/mockWatchQuery.d.ts.map +0 -1
  672. package/testing/core/observableToPromise.d.ts.map +0 -1
  673. package/testing/core/subscribeAndCount.d.ts.map +0 -1
  674. package/testing/core/wait.d.ts.map +0 -1
  675. package/testing/core/withConsoleSpy.d.ts.map +0 -1
  676. package/testing/core/wrap.d.ts.map +0 -1
  677. package/testing/index.d.ts.map +0 -1
  678. package/testing/internal/ObservableStream.d.ts.map +0 -1
  679. package/testing/internal/disposables/index.d.ts.map +0 -1
  680. package/testing/internal/disposables/spyOnConsole.d.ts.map +0 -1
  681. package/testing/internal/disposables/withCleanup.d.ts.map +0 -1
  682. package/testing/internal/index.d.ts.map +0 -1
  683. package/testing/internal/profile/Render.d.ts.map +0 -1
  684. package/testing/internal/profile/index.d.ts.map +0 -1
  685. package/testing/internal/profile/profile.d.ts.map +0 -1
  686. package/testing/internal/profile/traces.d.ts.map +0 -1
  687. package/testing/matchers/ProfiledComponent.d.ts.map +0 -1
  688. package/testing/matchers/index.d.ts.map +0 -1
  689. package/testing/matchers/toHaveSuspenseCacheEntryUsing.d.ts.map +0 -1
  690. package/testing/matchers/toMatchDocument.d.ts.map +0 -1
  691. package/testing/react/MockedProvider.d.ts.map +0 -1
  692. package/utilities/common/arrays.d.ts.map +0 -1
  693. package/utilities/common/canUse.d.ts.map +0 -1
  694. package/utilities/common/canonicalStringify.d.ts.map +0 -1
  695. package/utilities/common/cloneDeep.d.ts.map +0 -1
  696. package/utilities/common/compact.d.ts.map +0 -1
  697. package/utilities/common/errorHandling.d.ts.map +0 -1
  698. package/utilities/common/filterInPlace.d.ts +0 -2
  699. package/utilities/common/filterInPlace.d.ts.map +0 -1
  700. package/utilities/common/filterInPlace.js +0 -11
  701. package/utilities/common/filterInPlace.js.map +0 -1
  702. package/utilities/common/incrementalResult.d.ts.map +0 -1
  703. package/utilities/common/makeUniqueId.d.ts.map +0 -1
  704. package/utilities/common/maybeDeepFreeze.d.ts.map +0 -1
  705. package/utilities/common/mergeDeep.d.ts.map +0 -1
  706. package/utilities/common/mergeOptions.d.ts.map +0 -1
  707. package/utilities/common/objects.d.ts.map +0 -1
  708. package/utilities/common/omitDeep.d.ts.map +0 -1
  709. package/utilities/common/stringifyForDisplay.d.ts.map +0 -1
  710. package/utilities/common/stripTypename.d.ts.map +0 -1
  711. package/utilities/globals/global.d.ts.map +0 -1
  712. package/utilities/globals/index.d.ts.map +0 -1
  713. package/utilities/globals/invariantWrappers.d.ts.map +0 -1
  714. package/utilities/globals/maybe.d.ts.map +0 -1
  715. package/utilities/graphql/DocumentTransform.d.ts.map +0 -1
  716. package/utilities/graphql/directives.d.ts.map +0 -1
  717. package/utilities/graphql/fragments.d.ts.map +0 -1
  718. package/utilities/graphql/getFromAST.d.ts.map +0 -1
  719. package/utilities/graphql/operations.d.ts.map +0 -1
  720. package/utilities/graphql/print.d.ts.map +0 -1
  721. package/utilities/graphql/storeUtils.d.ts.map +0 -1
  722. package/utilities/graphql/transform.d.ts.map +0 -1
  723. package/utilities/index.d.ts.map +0 -1
  724. package/utilities/observables/Concast.d.ts.map +0 -1
  725. package/utilities/observables/Observable.d.ts.map +0 -1
  726. package/utilities/observables/asyncMap.d.ts.map +0 -1
  727. package/utilities/observables/iteration.d.ts.map +0 -1
  728. package/utilities/observables/subclassing.d.ts.map +0 -1
  729. package/utilities/policies/pagination.d.ts.map +0 -1
  730. package/utilities/promises/decoration.d.ts.map +0 -1
  731. package/utilities/subscriptions/relay/index.d.ts.map +0 -1
  732. package/utilities/subscriptions/shared.d.ts.map +0 -1
  733. package/utilities/subscriptions/urql/index.d.ts.map +0 -1
  734. package/utilities/types/DeepOmit.d.ts.map +0 -1
  735. package/utilities/types/DeepPartial.d.ts.map +0 -1
  736. package/utilities/types/IsStrictlyAny.d.ts.map +0 -1
  737. package/utilities/types/Primitive.d.ts.map +0 -1
  738. package/version.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/utilities/graphql/transform.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"../globals/index.js\";\n\nimport type {\n DocumentNode,\n SelectionNode,\n SelectionSetNode,\n OperationDefinitionNode,\n FieldNode,\n DirectiveNode,\n FragmentDefinitionNode,\n ArgumentNode,\n FragmentSpreadNode,\n VariableDefinitionNode,\n ASTNode,\n ASTVisitor,\n InlineFragmentNode,\n} from \"graphql\";\nimport { visit, Kind } from \"graphql\";\n\nimport {\n checkDocument,\n getOperationDefinition,\n getFragmentDefinition,\n getFragmentDefinitions,\n getMainDefinition,\n} from \"./getFromAST.js\";\nimport { isField } from \"./storeUtils.js\";\nimport type { FragmentMap } from \"./fragments.js\";\nimport { createFragmentMap } from \"./fragments.js\";\nimport { isArray, isNonEmptyArray } from \"../common/arrays.js\";\n\nexport type RemoveNodeConfig<N> = {\n name?: string;\n test?: (node: N) => boolean;\n remove?: boolean;\n};\n\nexport type GetNodeConfig<N> = {\n name?: string;\n test?: (node: N) => boolean;\n};\n\nexport type RemoveDirectiveConfig = RemoveNodeConfig<DirectiveNode>;\nexport type GetDirectiveConfig = GetNodeConfig<DirectiveNode>;\nexport type RemoveArgumentsConfig = RemoveNodeConfig<ArgumentNode>;\nexport type GetFragmentSpreadConfig = GetNodeConfig<FragmentSpreadNode>;\nexport type RemoveFragmentSpreadConfig = RemoveNodeConfig<FragmentSpreadNode>;\nexport type RemoveFragmentDefinitionConfig =\n RemoveNodeConfig<FragmentDefinitionNode>;\nexport type RemoveVariableDefinitionConfig =\n RemoveNodeConfig<VariableDefinitionNode>;\n\nconst TYPENAME_FIELD: FieldNode = {\n kind: Kind.FIELD,\n name: {\n kind: Kind.NAME,\n value: \"__typename\",\n },\n};\n\nfunction isEmpty(\n op: OperationDefinitionNode | FragmentDefinitionNode,\n fragmentMap: FragmentMap\n): boolean {\n return (\n !op ||\n op.selectionSet.selections.every(\n (selection) =>\n selection.kind === Kind.FRAGMENT_SPREAD &&\n isEmpty(fragmentMap[selection.name.value], fragmentMap)\n )\n );\n}\n\nfunction nullIfDocIsEmpty(doc: DocumentNode) {\n return isEmpty(\n getOperationDefinition(doc) || getFragmentDefinition(doc),\n createFragmentMap(getFragmentDefinitions(doc))\n )\n ? null\n : doc;\n}\n\nfunction getDirectiveMatcher(\n configs: (RemoveDirectiveConfig | GetDirectiveConfig)[]\n) {\n const names = new Map<string, RemoveDirectiveConfig | GetDirectiveConfig>();\n\n const tests = new Map<\n (directive: DirectiveNode) => boolean,\n RemoveDirectiveConfig | GetDirectiveConfig\n >();\n\n configs.forEach((directive) => {\n if (directive) {\n if (directive.name) {\n names.set(directive.name, directive);\n } else if (directive.test) {\n tests.set(directive.test, directive);\n }\n }\n });\n\n return (directive: DirectiveNode) => {\n let config = names.get(directive.name.value);\n if (!config && tests.size) {\n tests.forEach((testConfig, test) => {\n if (test(directive)) {\n config = testConfig;\n }\n });\n }\n return config;\n };\n}\n\n// Helper interface and function used by removeDirectivesFromDocument to keep\n// track of variable references and fragments spreads found within a given\n// operation or fragment definition.\ninterface InternalInUseInfo {\n variables: Set<string>;\n fragmentSpreads: Set<string>;\n // Set to true when we deliberately remove a fragment definition, so we can\n // make sure also to remove dangling ...spreads that refer to it.\n removed?: boolean;\n // Populated by the populateTransitiveVars helper function below.\n transitiveVars?: Set<string>;\n}\nfunction makeInUseGetterFunction<TKey>(defaultKey: TKey) {\n const map = new Map<TKey, InternalInUseInfo>();\n\n return function inUseGetterFunction(\n key: TKey = defaultKey\n ): InternalInUseInfo {\n let inUse = map.get(key);\n if (!inUse) {\n map.set(\n key,\n (inUse = {\n // Variable and fragment spread names used directly within this\n // operation or fragment definition, as identified by key. These sets\n // will be populated during the first traversal of the document in\n // removeDirectivesFromDocument below.\n variables: new Set(),\n fragmentSpreads: new Set(),\n })\n );\n }\n return inUse;\n };\n}\n\nexport function removeDirectivesFromDocument(\n directives: RemoveDirectiveConfig[],\n doc: DocumentNode\n): DocumentNode | null {\n checkDocument(doc);\n\n // Passing empty strings to makeInUseGetterFunction means we handle anonymous\n // operations as if their names were \"\". Anonymous fragment definitions are\n // not supposed to be possible, but the same default naming strategy seems\n // appropriate for that case as well.\n const getInUseByOperationName = makeInUseGetterFunction<string>(\"\");\n const getInUseByFragmentName = makeInUseGetterFunction<string>(\"\");\n const getInUse = (\n ancestors: readonly (ASTNode | readonly ASTNode[])[]\n ): InternalInUseInfo | null => {\n for (\n let p = 0, ancestor: ASTNode | readonly ASTNode[];\n p < ancestors.length && (ancestor = ancestors[p]);\n ++p\n ) {\n if (isArray(ancestor)) continue;\n if (ancestor.kind === Kind.OPERATION_DEFINITION) {\n // If an operation is anonymous, we use the empty string as its key.\n return getInUseByOperationName(ancestor.name && ancestor.name.value);\n }\n if (ancestor.kind === Kind.FRAGMENT_DEFINITION) {\n return getInUseByFragmentName(ancestor.name.value);\n }\n }\n invariant.error(`Could not find operation or fragment`);\n return null;\n };\n\n let operationCount = 0;\n for (let i = doc.definitions.length - 1; i >= 0; --i) {\n if (doc.definitions[i].kind === Kind.OPERATION_DEFINITION) {\n ++operationCount;\n }\n }\n\n const directiveMatcher = getDirectiveMatcher(directives);\n const shouldRemoveField = (nodeDirectives: FieldNode[\"directives\"]) =>\n isNonEmptyArray(nodeDirectives) &&\n nodeDirectives\n .map(directiveMatcher)\n .some(\n (config: RemoveDirectiveConfig | undefined) => config && config.remove\n );\n\n const originalFragmentDefsByPath = new Map<string, FragmentDefinitionNode>();\n\n // Any time the first traversal of the document below makes a change like\n // removing a fragment (by returning null), this variable should be set to\n // true. Once it becomes true, it should never be set to false again. If this\n // variable remains false throughout the traversal, then we can return the\n // original doc immediately without any modifications.\n let firstVisitMadeChanges = false;\n\n const fieldOrInlineFragmentVisitor: ASTVisitor = {\n enter(node: FieldNode | InlineFragmentNode) {\n if (shouldRemoveField(node.directives)) {\n firstVisitMadeChanges = true;\n return null;\n }\n },\n };\n\n const docWithoutDirectiveSubtrees = visit(doc, {\n // These two AST node types share the same implementation, defined above.\n Field: fieldOrInlineFragmentVisitor,\n InlineFragment: fieldOrInlineFragmentVisitor,\n\n VariableDefinition: {\n enter() {\n // VariableDefinition nodes do not count as variables in use, though\n // they do contain Variable nodes that might be visited below. To avoid\n // counting variable declarations as usages, we skip visiting the\n // contents of this VariableDefinition node by returning false.\n return false;\n },\n },\n\n Variable: {\n enter(node, _key, _parent, _path, ancestors) {\n const inUse = getInUse(ancestors);\n if (inUse) {\n inUse.variables.add(node.name.value);\n }\n },\n },\n\n FragmentSpread: {\n enter(node, _key, _parent, _path, ancestors) {\n if (shouldRemoveField(node.directives)) {\n firstVisitMadeChanges = true;\n return null;\n }\n const inUse = getInUse(ancestors);\n if (inUse) {\n inUse.fragmentSpreads.add(node.name.value);\n }\n // We might like to remove this FragmentSpread by returning null here if\n // the corresponding FragmentDefinition node is also going to be removed\n // by the logic below, but we can't control the relative order of those\n // events, so we have to postpone the removal of dangling FragmentSpread\n // nodes until after the current visit of the document has finished.\n },\n },\n\n FragmentDefinition: {\n enter(node, _key, _parent, path) {\n originalFragmentDefsByPath.set(JSON.stringify(path), node);\n },\n leave(node, _key, _parent, path) {\n const originalNode = originalFragmentDefsByPath.get(\n JSON.stringify(path)\n );\n if (node === originalNode) {\n // If the FragmentNode received by this leave function is identical to\n // the one received by the corresponding enter function (above), then\n // the visitor must not have made any changes within this\n // FragmentDefinition node. This fragment definition may still be\n // removed if there are no ...spread references to it, but it won't be\n // removed just because it has only a __typename field.\n return node;\n }\n\n if (\n // This logic applies only if the document contains one or more\n // operations, since removing all fragments from a document containing\n // only fragments makes the document useless.\n operationCount > 0 &&\n node.selectionSet.selections.every(\n (selection) =>\n selection.kind === Kind.FIELD &&\n selection.name.value === \"__typename\"\n )\n ) {\n // This is a somewhat opinionated choice: if a FragmentDefinition ends\n // up having no fields other than __typename, we remove the whole\n // fragment definition, and later prune ...spread references to it.\n getInUseByFragmentName(node.name.value).removed = true;\n firstVisitMadeChanges = true;\n return null;\n }\n },\n },\n\n Directive: {\n leave(node) {\n // If a matching directive is found, remove the directive itself. Note\n // that this does not remove the target (field, argument, etc) of the\n // directive, but only the directive itself.\n if (directiveMatcher(node)) {\n firstVisitMadeChanges = true;\n return null;\n }\n },\n },\n });\n\n if (!firstVisitMadeChanges) {\n // If our first pass did not change anything about the document, then there\n // is no cleanup we need to do, and we can return the original doc.\n return doc;\n }\n\n // Utility for making sure inUse.transitiveVars is recursively populated.\n // Because this logic assumes inUse.fragmentSpreads has been completely\n // populated and inUse.removed has been set if appropriate,\n // populateTransitiveVars must be called after that information has been\n // collected by the first traversal of the document.\n const populateTransitiveVars = (inUse: InternalInUseInfo) => {\n if (!inUse.transitiveVars) {\n inUse.transitiveVars = new Set(inUse.variables);\n if (!inUse.removed) {\n inUse.fragmentSpreads.forEach((childFragmentName) => {\n populateTransitiveVars(\n getInUseByFragmentName(childFragmentName)\n ).transitiveVars!.forEach((varName) => {\n inUse.transitiveVars!.add(varName);\n });\n });\n }\n }\n return inUse;\n };\n\n // Since we've been keeping track of fragment spreads used by particular\n // operations and fragment definitions, we now need to compute the set of all\n // spreads used (transitively) by any operations in the document.\n const allFragmentNamesUsed = new Set<string>();\n docWithoutDirectiveSubtrees.definitions.forEach((def) => {\n if (def.kind === Kind.OPERATION_DEFINITION) {\n populateTransitiveVars(\n getInUseByOperationName(def.name && def.name.value)\n ).fragmentSpreads.forEach((childFragmentName) => {\n allFragmentNamesUsed.add(childFragmentName);\n });\n } else if (\n def.kind === Kind.FRAGMENT_DEFINITION &&\n // If there are no operations in the document, then all fragment\n // definitions count as usages of their own fragment names. This heuristic\n // prevents accidentally removing all fragment definitions from the\n // document just because it contains no operations that use the fragments.\n operationCount === 0 &&\n !getInUseByFragmentName(def.name.value).removed\n ) {\n allFragmentNamesUsed.add(def.name.value);\n }\n });\n // Now that we have added all fragment spreads used by operations to the\n // allFragmentNamesUsed set, we can complete the set by transitively adding\n // all fragment spreads used by those fragments, and so on.\n allFragmentNamesUsed.forEach((fragmentName) => {\n // Once all the childFragmentName strings added here have been seen already,\n // the top-level allFragmentNamesUsed.forEach loop will terminate.\n populateTransitiveVars(\n getInUseByFragmentName(fragmentName)\n ).fragmentSpreads.forEach((childFragmentName) => {\n allFragmentNamesUsed.add(childFragmentName);\n });\n });\n\n const fragmentWillBeRemoved = (fragmentName: string) =>\n !!(\n // A fragment definition will be removed if there are no spreads that refer\n // to it, or the fragment was explicitly removed because it had no fields\n // other than __typename.\n (\n !allFragmentNamesUsed.has(fragmentName) ||\n getInUseByFragmentName(fragmentName).removed\n )\n );\n\n const enterVisitor: ASTVisitor = {\n enter(node: FragmentSpreadNode | FragmentDefinitionNode) {\n if (fragmentWillBeRemoved(node.name.value)) {\n return null;\n }\n },\n };\n\n return nullIfDocIsEmpty(\n visit(docWithoutDirectiveSubtrees, {\n // If the fragment is going to be removed, then leaving any dangling\n // FragmentSpread nodes with the same name would be a mistake.\n FragmentSpread: enterVisitor,\n\n // This is where the fragment definition is actually removed.\n FragmentDefinition: enterVisitor,\n\n OperationDefinition: {\n leave(node) {\n // Upon leaving each operation in the depth-first AST traversal, prune\n // any variables that are declared by the operation but unused within.\n if (node.variableDefinitions) {\n const usedVariableNames = populateTransitiveVars(\n // If an operation is anonymous, we use the empty string as its key.\n getInUseByOperationName(node.name && node.name.value)\n ).transitiveVars!;\n\n // According to the GraphQL spec, all variables declared by an\n // operation must either be used by that operation or used by some\n // fragment included transitively into that operation:\n // https://spec.graphql.org/draft/#sec-All-Variables-Used\n //\n // To stay on the right side of this validation rule, if/when we\n // remove the last $var references from an operation or its fragments,\n // we must also remove the corresponding $var declaration from the\n // enclosing operation. This pruning applies only to operations and\n // not fragment definitions, at the moment. Fragments may be able to\n // declare variables eventually, but today they can only consume them.\n if (usedVariableNames.size < node.variableDefinitions.length) {\n return {\n ...node,\n variableDefinitions: node.variableDefinitions.filter((varDef) =>\n usedVariableNames.has(varDef.variable.name.value)\n ),\n };\n }\n }\n },\n },\n })\n );\n}\n\nexport const addTypenameToDocument = Object.assign(\n function <TNode extends ASTNode>(doc: TNode): TNode {\n return visit(doc, {\n SelectionSet: {\n enter(node, _key, parent) {\n // Don't add __typename to OperationDefinitions.\n if (\n parent &&\n (parent as OperationDefinitionNode).kind ===\n Kind.OPERATION_DEFINITION\n ) {\n return;\n }\n\n // No changes if no selections.\n const { selections } = node;\n if (!selections) {\n return;\n }\n\n // If selections already have a __typename, or are part of an\n // introspection query, do nothing.\n const skip = selections.some((selection) => {\n return (\n isField(selection) &&\n (selection.name.value === \"__typename\" ||\n selection.name.value.lastIndexOf(\"__\", 0) === 0)\n );\n });\n if (skip) {\n return;\n }\n\n // If this SelectionSet is @export-ed as an input variable, it should\n // not have a __typename field (see issue #4691).\n const field = parent as FieldNode;\n if (\n isField(field) &&\n field.directives &&\n field.directives.some((d) => d.name.value === \"export\")\n ) {\n return;\n }\n\n // Create and return a new SelectionSet with a __typename Field.\n return {\n ...node,\n selections: [...selections, TYPENAME_FIELD],\n };\n },\n },\n });\n },\n {\n added(field: FieldNode): boolean {\n return field === TYPENAME_FIELD;\n },\n }\n);\n\nconst connectionRemoveConfig = {\n test: (directive: DirectiveNode) => {\n const willRemove = directive.name.value === \"connection\";\n if (willRemove) {\n if (\n !directive.arguments ||\n !directive.arguments.some((arg) => arg.name.value === \"key\")\n ) {\n invariant.warn(\n \"Removing an @connection directive even though it does not have a key. \" +\n \"You may want to use the key parameter to specify a store key.\"\n );\n }\n }\n\n return willRemove;\n },\n};\n\nexport function removeConnectionDirectiveFromDocument(doc: DocumentNode) {\n return removeDirectivesFromDocument(\n [connectionRemoveConfig],\n checkDocument(doc)\n );\n}\n\nfunction hasDirectivesInSelectionSet(\n directives: GetDirectiveConfig[],\n selectionSet: SelectionSetNode | undefined,\n nestedCheck = true\n): boolean {\n return (\n !!selectionSet &&\n selectionSet.selections &&\n selectionSet.selections.some((selection) =>\n hasDirectivesInSelection(directives, selection, nestedCheck)\n )\n );\n}\n\nfunction hasDirectivesInSelection(\n directives: GetDirectiveConfig[],\n selection: SelectionNode,\n nestedCheck = true\n): boolean {\n if (!isField(selection)) {\n return true;\n }\n\n if (!selection.directives) {\n return false;\n }\n\n return (\n selection.directives.some(getDirectiveMatcher(directives)) ||\n (nestedCheck &&\n hasDirectivesInSelectionSet(\n directives,\n selection.selectionSet,\n nestedCheck\n ))\n );\n}\n\nfunction getArgumentMatcher(config: RemoveArgumentsConfig[]) {\n return function argumentMatcher(argument: ArgumentNode) {\n return config.some(\n (aConfig: RemoveArgumentsConfig) =>\n argument.value &&\n argument.value.kind === Kind.VARIABLE &&\n argument.value.name &&\n (aConfig.name === argument.value.name.value ||\n (aConfig.test && aConfig.test(argument)))\n );\n };\n}\n\nexport function removeArgumentsFromDocument(\n config: RemoveArgumentsConfig[],\n doc: DocumentNode\n): DocumentNode | null {\n const argMatcher = getArgumentMatcher(config);\n\n return nullIfDocIsEmpty(\n visit(doc, {\n OperationDefinition: {\n enter(node) {\n return {\n ...node,\n // Remove matching top level variables definitions.\n variableDefinitions: node.variableDefinitions\n ? node.variableDefinitions.filter(\n (varDef) =>\n !config.some(\n (arg) => arg.name === varDef.variable.name.value\n )\n )\n : [],\n };\n },\n },\n\n Field: {\n enter(node) {\n // If `remove` is set to true for an argument, and an argument match\n // is found for a field, remove the field as well.\n const shouldRemoveField = config.some(\n (argConfig) => argConfig.remove\n );\n\n if (shouldRemoveField) {\n let argMatchCount = 0;\n if (node.arguments) {\n node.arguments.forEach((arg) => {\n if (argMatcher(arg)) {\n argMatchCount += 1;\n }\n });\n }\n\n if (argMatchCount === 1) {\n return null;\n }\n }\n },\n },\n\n Argument: {\n enter(node) {\n // Remove all matching arguments.\n if (argMatcher(node)) {\n return null;\n }\n },\n },\n })\n );\n}\n\nexport function removeFragmentSpreadFromDocument(\n config: RemoveFragmentSpreadConfig[],\n doc: DocumentNode\n): DocumentNode | null {\n function enter(\n node: FragmentSpreadNode | FragmentDefinitionNode\n ): null | void {\n if (config.some((def) => def.name === node.name.value)) {\n return null;\n }\n }\n\n return nullIfDocIsEmpty(\n visit(doc, {\n FragmentSpread: { enter },\n FragmentDefinition: { enter },\n })\n );\n}\n\n// If the incoming document is a query, return it as is. Otherwise, build a\n// new document containing a query operation based on the selection set\n// of the previous main operation.\nexport function buildQueryFromSelectionSet(\n document: DocumentNode\n): DocumentNode {\n const definition = getMainDefinition(document);\n const definitionOperation = (<OperationDefinitionNode>definition).operation;\n\n if (definitionOperation === \"query\") {\n // Already a query, so return the existing document.\n return document;\n }\n\n // Build a new query using the selection set of the main operation.\n const modifiedDoc = visit(document, {\n OperationDefinition: {\n enter(node) {\n return {\n ...node,\n operation: \"query\",\n };\n },\n },\n });\n return modifiedDoc;\n}\n\n// Remove fields / selection sets that include an @client directive.\nexport function removeClientSetsFromDocument(\n document: DocumentNode\n): DocumentNode | null {\n checkDocument(document);\n\n let modifiedDoc = removeDirectivesFromDocument(\n [\n {\n test: (directive: DirectiveNode) => directive.name.value === \"client\",\n remove: true,\n },\n ],\n document\n );\n\n return modifiedDoc;\n}\n"]}
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/utilities/graphql/transform.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAiBhD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA6B/D,IAAM,cAAc,GAAc;IAChC,IAAI,EAAE,IAAI,CAAC,KAAK;IAChB,IAAI,EAAE;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,YAAY;KACpB;CACF,CAAC;AAEF,SAAS,OAAO,CACd,EAAoD,EACpD,WAAwB;IAExB,OAAO,CACL,CAAC,EAAE;QACH,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAC9B,UAAC,SAAS;YACR,OAAA,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe;gBACvC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;QADvD,CACuD,CAC1D,CACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAiB;IACzC,OAAO,CACH,OAAO,CACL,sBAAsB,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,GAAG,CAAC,EACzD,iBAAiB,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAC/C,CACF,CAAC,CAAC;QACD,IAAI;QACN,CAAC,CAAC,GAAG,CAAC;AACV,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAuD;IAEvD,IAAM,KAAK,GAAG,IAAI,GAAG,EAAsD,CAAC;IAE5E,IAAM,KAAK,GAAG,IAAI,GAAG,EAGlB,CAAC;IAEJ,OAAO,CAAC,OAAO,CAAC,UAAC,SAAS;QACxB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,UAAC,SAAwB;QAC9B,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,UAAC,UAAU,EAAE,IAAI;gBAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpB,MAAM,GAAG,UAAU,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAcD,SAAS,uBAAuB,CAAO,UAAgB;IACrD,IAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE/C,OAAO,SAAS,mBAAmB,CACjC,GAAsB;QAAtB,oBAAA,EAAA,gBAAsB;QAEtB,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,GAAG,CACL,GAAG,EACH,CAAC,KAAK,GAAG;gBACP,+DAA+D;gBAC/D,qEAAqE;gBACrE,kEAAkE;gBAClE,sCAAsC;gBACtC,SAAS,EAAE,IAAI,GAAG,EAAE;gBACpB,eAAe,EAAE,IAAI,GAAG,EAAE;aAC3B,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,UAAmC,EACnC,GAAiB;IAEjB,aAAa,CAAC,GAAG,CAAC,CAAC;IAEnB,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,qCAAqC;IACrC,IAAM,uBAAuB,GAAG,uBAAuB,CAAS,EAAE,CAAC,CAAC;IACpE,IAAM,sBAAsB,GAAG,uBAAuB,CAAS,EAAE,CAAC,CAAC;IACnE,IAAM,QAAQ,GAAG,UACf,SAAoD;QAEpD,KACE,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,SAA8B,EACjD,CAAC,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EACjD,EAAE,CAAC,EACH,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAChD,oEAAoE;gBACpE,OAAO,uBAAuB,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC/C,OAAO,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,SAAS,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1D,EAAE,cAAc,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzD,IAAM,iBAAiB,GAAG,UAAC,cAAuC;QAChE,OAAA,eAAe,CAAC,cAAc,CAAC;YAC/B,cAAc;iBACX,GAAG,CAAC,gBAAgB,CAAC;iBACrB,IAAI,CACH,UAAC,MAAyC,IAAK,OAAA,MAAM,IAAI,MAAM,CAAC,MAAM,EAAvB,CAAuB,CACvE;IALH,CAKG,CAAC;IAEN,IAAM,0BAA0B,GAAG,IAAI,GAAG,EAAkC,CAAC;IAE7E,yEAAyE;IACzE,0EAA0E;IAC1E,6EAA6E;IAC7E,0EAA0E;IAC1E,sDAAsD;IACtD,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAElC,IAAM,4BAA4B,GAE9B;QACF,KAAK,YAAC,IAAI;YACR,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,qBAAqB,GAAG,IAAI,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;IAEF,IAAM,2BAA2B,GAAG,KAAK,CAAC,GAAG,EAAE;QAC7C,yEAAyE;QACzE,KAAK,EAAE,4BAA4B;QACnC,cAAc,EAAE,4BAA4B;QAE5C,kBAAkB,EAAE;YAClB,KAAK;gBACH,oEAAoE;gBACpE,uEAAuE;gBACvE,iEAAiE;gBACjE,+DAA+D;gBAC/D,OAAO,KAAK,CAAC;YACf,CAAC;SACF;QAED,QAAQ,EAAE;YACR,KAAK,YAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;gBACzC,IAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAClC,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;SACF;QAED,cAAc,EAAE;YACd,KAAK,YAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;gBACzC,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBACvC,qBAAqB,GAAG,IAAI,CAAC;oBAC7B,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAClC,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7C,CAAC;gBACD,wEAAwE;gBACxE,wEAAwE;gBACxE,uEAAuE;gBACvE,wEAAwE;gBACxE,oEAAoE;YACtE,CAAC;SACF;QAED,kBAAkB,EAAE;YAClB,KAAK,YAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;gBAC7B,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC;YACD,KAAK,YAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;gBAC7B,IAAM,YAAY,GAAG,0BAA0B,CAAC,GAAG,CACjD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACrB,CAAC;gBACF,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC1B,sEAAsE;oBACtE,qEAAqE;oBACrE,yDAAyD;oBACzD,iEAAiE;oBACjE,sEAAsE;oBACtE,uDAAuD;oBACvD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED;gBACE,+DAA+D;gBAC/D,sEAAsE;gBACtE,6CAA6C;gBAC7C,cAAc,GAAG,CAAC;oBAClB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAChC,UAAC,SAAS;wBACR,OAAA,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK;4BAC7B,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY;oBADrC,CACqC,CACxC,EACD,CAAC;oBACD,sEAAsE;oBACtE,iEAAiE;oBACjE,mEAAmE;oBACnE,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;oBACvD,qBAAqB,GAAG,IAAI,CAAC;oBAC7B,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;SACF;QAED,SAAS,EAAE;YACT,KAAK,YAAC,IAAI;gBACR,sEAAsE;gBACtE,qEAAqE;gBACrE,4CAA4C;gBAC5C,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,qBAAqB,GAAG,IAAI,CAAC;oBAC7B,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,2EAA2E;QAC3E,mEAAmE;QACnE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,2DAA2D;IAC3D,wEAAwE;IACxE,oDAAoD;IACpD,IAAM,sBAAsB,GAAG,UAAC,KAAwB;QACtD,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAC1B,KAAK,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,UAAC,iBAAiB;oBAC9C,sBAAsB,CACpB,sBAAsB,CAAC,iBAAiB,CAAC,CAC1C,CAAC,cAAe,CAAC,OAAO,CAAC,UAAC,OAAO;wBAChC,KAAK,CAAC,cAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACrC,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,wEAAwE;IACxE,6EAA6E;IAC7E,iEAAiE;IACjE,IAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/C,2BAA2B,CAAC,WAAW,CAAC,OAAO,CAAC,UAAC,GAAG;QAClD,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC3C,sBAAsB,CACpB,uBAAuB,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CACpD,CAAC,eAAe,CAAC,OAAO,CAAC,UAAC,iBAAiB;gBAC1C,oBAAoB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IACL,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB;YACrC,gEAAgE;YAChE,0EAA0E;YAC1E,mEAAmE;YACnE,0EAA0E;YAC1E,cAAc,KAAK,CAAC;YACpB,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAC/C,CAAC;YACD,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,wEAAwE;IACxE,2EAA2E;IAC3E,2DAA2D;IAC3D,oBAAoB,CAAC,OAAO,CAAC,UAAC,YAAY;QACxC,4EAA4E;QAC5E,kEAAkE;QAClE,sBAAsB,CACpB,sBAAsB,CAAC,YAAY,CAAC,CACrC,CAAC,eAAe,CAAC,OAAO,CAAC,UAAC,iBAAiB;YAC1C,oBAAoB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAM,qBAAqB,GAAG,UAAC,YAAoB;QACjD,OAAA,CAAC,CAAC;QACA,2EAA2E;QAC3E,yEAAyE;QACzE,yBAAyB;QACzB,CACE,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC;YACvC,sBAAsB,CAAC,YAAY,CAAC,CAAC,OAAO,CAC7C,CACF;IARD,CAQC,CAAC;IAEJ,IAAM,YAAY,GAEd;QACF,KAAK,YAAC,IAAI;YACR,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,gBAAgB,CACrB,KAAK,CAAC,2BAA2B,EAAE;QACjC,oEAAoE;QACpE,8DAA8D;QAC9D,cAAc,EAAE,YAAY;QAE5B,6DAA6D;QAC7D,kBAAkB,EAAE,YAAY;QAEhC,mBAAmB,EAAE;YACnB,KAAK,YAAC,IAAI;gBACR,sEAAsE;gBACtE,sEAAsE;gBACtE,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC7B,IAAM,mBAAiB,GAAG,sBAAsB;oBAC9C,oEAAoE;oBACpE,uBAAuB,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CACtD,CAAC,cAAe,CAAC;oBAElB,8DAA8D;oBAC9D,kEAAkE;oBAClE,sDAAsD;oBACtD,yDAAyD;oBACzD,EAAE;oBACF,gEAAgE;oBAChE,sEAAsE;oBACtE,kEAAkE;oBAClE,mEAAmE;oBACnE,oEAAoE;oBACpE,sEAAsE;oBACtE,IAAI,mBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;wBAC7D,6BACK,IAAI,KACP,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAC,MAAM;gCAC1D,OAAA,mBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;4BAAjD,CAAiD,CAClD,IACD;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,IAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAChD,UAAiC,GAAU;IACzC,OAAO,KAAK,CAAC,GAAG,EAAE;QAChB,YAAY,EAAE;YACZ,KAAK,YAAC,IAAI,EAAE,IAAI,EAAE,MAAM;gBACtB,gDAAgD;gBAChD,IACE,MAAM;oBACL,MAAkC,CAAC,IAAI;wBACtC,IAAI,CAAC,oBAAoB,EAC3B,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,+BAA+B;gBACvB,IAAA,UAAU,GAAK,IAAI,WAAT,CAAU;gBAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO;gBACT,CAAC;gBAED,6DAA6D;gBAC7D,mCAAmC;gBACnC,IAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,UAAC,SAAS;oBACrC,OAAO,CACL,OAAO,CAAC,SAAS,CAAC;wBAClB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY;4BACpC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CACnD,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO;gBACT,CAAC;gBAED,qEAAqE;gBACrE,iDAAiD;gBACjD,IAAM,KAAK,GAAG,MAAmB,CAAC;gBAClC,IACE,OAAO,CAAC,KAAK,CAAC;oBACd,KAAK,CAAC,UAAU;oBAChB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAzB,CAAyB,CAAC,EACvD,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,gEAAgE;gBAChE,6BACK,IAAI,KACP,UAAU,kCAAM,UAAU,UAAE,cAAc,aAC1C;YACJ,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC,EACD;IACE,KAAK,YAAC,KAAgB;QACpB,OAAO,KAAK,KAAK,cAAc,CAAC;IAClC,CAAC;CACF,CACF,CAAC;AAEF,IAAM,sBAAsB,GAAG;IAC7B,IAAI,EAAE,UAAC,SAAwB;QAC7B,IAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC;QACzD,IAAI,UAAU,EAAE,CAAC;YACf,IACE,CAAC,SAAS,CAAC,SAAS;gBACpB,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,EAAxB,CAAwB,CAAC,EAC5D,CAAC;gBACD,SAAS,CAAC,IAAI,CACZ,wEAAwE;oBACtE,+DAA+D,CAClE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,qCAAqC,CAAC,GAAiB;IACrE,OAAO,4BAA4B,CACjC,CAAC,sBAAsB,CAAC,EACxB,aAAa,CAAC,GAAG,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,UAAgC,EAChC,YAA0C,EAC1C,WAAkB;IAAlB,4BAAA,EAAA,kBAAkB;IAElB,OAAO,CACL,CAAC,CAAC,YAAY;QACd,YAAY,CAAC,UAAU;QACvB,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,SAAS;YACrC,OAAA,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC;QAA5D,CAA4D,CAC7D,CACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,UAAgC,EAChC,SAAwB,EACxB,WAAkB;IAAlB,4BAAA,EAAA,kBAAkB;IAElB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CACL,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC,WAAW;YACV,2BAA2B,CACzB,UAAU,EACV,SAAS,CAAC,YAAY,EACtB,WAAW,CACZ,CAAC,CACL,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA+B;IACzD,OAAO,SAAS,eAAe,CAAC,QAAsB;QACpD,OAAO,MAAM,CAAC,IAAI,CAChB,UAAC,OAA8B;YAC7B,OAAA,QAAQ,CAAC,KAAK;gBACd,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ;gBACrC,QAAQ,CAAC,KAAK,CAAC,IAAI;gBACnB,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;oBACzC,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAJ3C,CAI2C,CAC9C,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,MAA+B,EAC/B,GAAiB;IAEjB,IAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE9C,OAAO,gBAAgB,CACrB,KAAK,CAAC,GAAG,EAAE;QACT,mBAAmB,EAAE;YACnB,KAAK,YAAC,IAAI;gBACR,6BACK,IAAI;oBACP,mDAAmD;oBACnD,mBAAmB,EACjB,IAAI,CAAC,mBAAmB,CAAC,CAAC;wBACxB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAC7B,UAAC,MAAM;4BACL,OAAA,CAAC,MAAM,CAAC,IAAI,CACV,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAvC,CAAuC,CACjD;wBAFD,CAEC,CACJ;wBACH,CAAC,CAAC,EAAE,IACN;YACJ,CAAC;SACF;QAED,KAAK,EAAE;YACL,KAAK,YAAC,IAAI;gBACR,oEAAoE;gBACpE,kDAAkD;gBAClD,IAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CACnC,UAAC,SAAS,IAAK,OAAA,SAAS,CAAC,MAAM,EAAhB,CAAgB,CAChC,CAAC;gBAEF,IAAI,iBAAiB,EAAE,CAAC;oBACtB,IAAI,eAAa,GAAG,CAAC,CAAC;oBACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACnB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAC,GAAG;4BACzB,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gCACpB,eAAa,IAAI,CAAC,CAAC;4BACrB,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,eAAa,KAAK,CAAC,EAAE,CAAC;wBACxB,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;SACF;QAED,QAAQ,EAAE;YACR,KAAK,YAAC,IAAI;gBACR,iCAAiC;gBACjC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,MAAoC,EACpC,GAAiB;IAEjB,SAAS,KAAK,CACZ,IAAiD;QAEjD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAA5B,CAA4B,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CACrB,KAAK,CAAC,GAAG,EAAE;QACT,cAAc,EAAE,EAAE,KAAK,OAAA,EAAE;QACzB,kBAAkB,EAAE,EAAE,KAAK,OAAA,EAAE;KAC9B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,uEAAuE;AACvE,kCAAkC;AAClC,MAAM,UAAU,0BAA0B,CACxC,QAAsB;IAEtB,IAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAM,mBAAmB,GAA6B,UAAW,CAAC,SAAS,CAAC;IAE5E,IAAI,mBAAmB,KAAK,OAAO,EAAE,CAAC;QACpC,oDAAoD;QACpD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,mEAAmE;IACnE,IAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE;QAClC,mBAAmB,EAAE;YACnB,KAAK,YAAC,IAAI;gBACR,6BACK,IAAI,KACP,SAAS,EAAE,OAAO,IAClB;YACJ,CAAC;SACF;KACF,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,4BAA4B,CAC1C,QAAsB;IAEtB,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExB,IAAI,WAAW,GAAG,4BAA4B,CAC5C;QACE;YACE,IAAI,EAAE,UAAC,SAAwB,IAAK,OAAA,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAjC,CAAiC;YACrE,MAAM,EAAE,IAAI;SACb;KACF,EACD,QAAQ,CACT,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { invariant } from \"../globals/index.js\";\n\nimport type {\n DocumentNode,\n SelectionNode,\n SelectionSetNode,\n OperationDefinitionNode,\n FieldNode,\n DirectiveNode,\n FragmentDefinitionNode,\n ArgumentNode,\n FragmentSpreadNode,\n VariableDefinitionNode,\n ASTNode,\n ASTVisitFn,\n InlineFragmentNode,\n} from \"graphql\";\nimport { visit, Kind } from \"graphql\";\n\nimport {\n checkDocument,\n getOperationDefinition,\n getFragmentDefinition,\n getFragmentDefinitions,\n getMainDefinition,\n} from \"./getFromAST.js\";\nimport { isField } from \"./storeUtils.js\";\nimport type { FragmentMap } from \"./fragments.js\";\nimport { createFragmentMap } from \"./fragments.js\";\nimport { isArray, isNonEmptyArray } from \"../common/arrays.js\";\n\n// https://github.com/graphql/graphql-js/blob/8d7c8fccf5a9846a50785de04abda58a7eb13fc0/src/language/visitor.ts#L20-L23\ninterface EnterLeaveVisitor<TVisitedNode extends ASTNode> {\n readonly enter?: ASTVisitFn<TVisitedNode>;\n readonly leave?: ASTVisitFn<TVisitedNode>;\n}\n\nexport type RemoveNodeConfig<N> = {\n name?: string;\n test?: (node: N) => boolean;\n remove?: boolean;\n};\n\nexport type GetNodeConfig<N> = {\n name?: string;\n test?: (node: N) => boolean;\n};\n\nexport type RemoveDirectiveConfig = RemoveNodeConfig<DirectiveNode>;\nexport type GetDirectiveConfig = GetNodeConfig<DirectiveNode>;\nexport type RemoveArgumentsConfig = RemoveNodeConfig<ArgumentNode>;\nexport type GetFragmentSpreadConfig = GetNodeConfig<FragmentSpreadNode>;\nexport type RemoveFragmentSpreadConfig = RemoveNodeConfig<FragmentSpreadNode>;\nexport type RemoveFragmentDefinitionConfig =\n RemoveNodeConfig<FragmentDefinitionNode>;\nexport type RemoveVariableDefinitionConfig =\n RemoveNodeConfig<VariableDefinitionNode>;\n\nconst TYPENAME_FIELD: FieldNode = {\n kind: Kind.FIELD,\n name: {\n kind: Kind.NAME,\n value: \"__typename\",\n },\n};\n\nfunction isEmpty(\n op: OperationDefinitionNode | FragmentDefinitionNode,\n fragmentMap: FragmentMap\n): boolean {\n return (\n !op ||\n op.selectionSet.selections.every(\n (selection) =>\n selection.kind === Kind.FRAGMENT_SPREAD &&\n isEmpty(fragmentMap[selection.name.value], fragmentMap)\n )\n );\n}\n\nfunction nullIfDocIsEmpty(doc: DocumentNode) {\n return (\n isEmpty(\n getOperationDefinition(doc) || getFragmentDefinition(doc),\n createFragmentMap(getFragmentDefinitions(doc))\n )\n ) ?\n null\n : doc;\n}\n\nfunction getDirectiveMatcher(\n configs: (RemoveDirectiveConfig | GetDirectiveConfig)[]\n) {\n const names = new Map<string, RemoveDirectiveConfig | GetDirectiveConfig>();\n\n const tests = new Map<\n (directive: DirectiveNode) => boolean,\n RemoveDirectiveConfig | GetDirectiveConfig\n >();\n\n configs.forEach((directive) => {\n if (directive) {\n if (directive.name) {\n names.set(directive.name, directive);\n } else if (directive.test) {\n tests.set(directive.test, directive);\n }\n }\n });\n\n return (directive: DirectiveNode) => {\n let config = names.get(directive.name.value);\n if (!config && tests.size) {\n tests.forEach((testConfig, test) => {\n if (test(directive)) {\n config = testConfig;\n }\n });\n }\n return config;\n };\n}\n\n// Helper interface and function used by removeDirectivesFromDocument to keep\n// track of variable references and fragments spreads found within a given\n// operation or fragment definition.\ninterface InternalInUseInfo {\n variables: Set<string>;\n fragmentSpreads: Set<string>;\n // Set to true when we deliberately remove a fragment definition, so we can\n // make sure also to remove dangling ...spreads that refer to it.\n removed?: boolean;\n // Populated by the populateTransitiveVars helper function below.\n transitiveVars?: Set<string>;\n}\nfunction makeInUseGetterFunction<TKey>(defaultKey: TKey) {\n const map = new Map<TKey, InternalInUseInfo>();\n\n return function inUseGetterFunction(\n key: TKey = defaultKey\n ): InternalInUseInfo {\n let inUse = map.get(key);\n if (!inUse) {\n map.set(\n key,\n (inUse = {\n // Variable and fragment spread names used directly within this\n // operation or fragment definition, as identified by key. These sets\n // will be populated during the first traversal of the document in\n // removeDirectivesFromDocument below.\n variables: new Set(),\n fragmentSpreads: new Set(),\n })\n );\n }\n return inUse;\n };\n}\n\nexport function removeDirectivesFromDocument(\n directives: RemoveDirectiveConfig[],\n doc: DocumentNode\n): DocumentNode | null {\n checkDocument(doc);\n\n // Passing empty strings to makeInUseGetterFunction means we handle anonymous\n // operations as if their names were \"\". Anonymous fragment definitions are\n // not supposed to be possible, but the same default naming strategy seems\n // appropriate for that case as well.\n const getInUseByOperationName = makeInUseGetterFunction<string>(\"\");\n const getInUseByFragmentName = makeInUseGetterFunction<string>(\"\");\n const getInUse = (\n ancestors: readonly (ASTNode | readonly ASTNode[])[]\n ): InternalInUseInfo | null => {\n for (\n let p = 0, ancestor: ASTNode | readonly ASTNode[];\n p < ancestors.length && (ancestor = ancestors[p]);\n ++p\n ) {\n if (isArray(ancestor)) continue;\n if (ancestor.kind === Kind.OPERATION_DEFINITION) {\n // If an operation is anonymous, we use the empty string as its key.\n return getInUseByOperationName(ancestor.name && ancestor.name.value);\n }\n if (ancestor.kind === Kind.FRAGMENT_DEFINITION) {\n return getInUseByFragmentName(ancestor.name.value);\n }\n }\n invariant.error(`Could not find operation or fragment`);\n return null;\n };\n\n let operationCount = 0;\n for (let i = doc.definitions.length - 1; i >= 0; --i) {\n if (doc.definitions[i].kind === Kind.OPERATION_DEFINITION) {\n ++operationCount;\n }\n }\n\n const directiveMatcher = getDirectiveMatcher(directives);\n const shouldRemoveField = (nodeDirectives: FieldNode[\"directives\"]) =>\n isNonEmptyArray(nodeDirectives) &&\n nodeDirectives\n .map(directiveMatcher)\n .some(\n (config: RemoveDirectiveConfig | undefined) => config && config.remove\n );\n\n const originalFragmentDefsByPath = new Map<string, FragmentDefinitionNode>();\n\n // Any time the first traversal of the document below makes a change like\n // removing a fragment (by returning null), this variable should be set to\n // true. Once it becomes true, it should never be set to false again. If this\n // variable remains false throughout the traversal, then we can return the\n // original doc immediately without any modifications.\n let firstVisitMadeChanges = false;\n\n const fieldOrInlineFragmentVisitor: EnterLeaveVisitor<\n FieldNode | InlineFragmentNode\n > = {\n enter(node) {\n if (shouldRemoveField(node.directives)) {\n firstVisitMadeChanges = true;\n return null;\n }\n },\n };\n\n const docWithoutDirectiveSubtrees = visit(doc, {\n // These two AST node types share the same implementation, defined above.\n Field: fieldOrInlineFragmentVisitor,\n InlineFragment: fieldOrInlineFragmentVisitor,\n\n VariableDefinition: {\n enter() {\n // VariableDefinition nodes do not count as variables in use, though\n // they do contain Variable nodes that might be visited below. To avoid\n // counting variable declarations as usages, we skip visiting the\n // contents of this VariableDefinition node by returning false.\n return false;\n },\n },\n\n Variable: {\n enter(node, _key, _parent, _path, ancestors) {\n const inUse = getInUse(ancestors);\n if (inUse) {\n inUse.variables.add(node.name.value);\n }\n },\n },\n\n FragmentSpread: {\n enter(node, _key, _parent, _path, ancestors) {\n if (shouldRemoveField(node.directives)) {\n firstVisitMadeChanges = true;\n return null;\n }\n const inUse = getInUse(ancestors);\n if (inUse) {\n inUse.fragmentSpreads.add(node.name.value);\n }\n // We might like to remove this FragmentSpread by returning null here if\n // the corresponding FragmentDefinition node is also going to be removed\n // by the logic below, but we can't control the relative order of those\n // events, so we have to postpone the removal of dangling FragmentSpread\n // nodes until after the current visit of the document has finished.\n },\n },\n\n FragmentDefinition: {\n enter(node, _key, _parent, path) {\n originalFragmentDefsByPath.set(JSON.stringify(path), node);\n },\n leave(node, _key, _parent, path) {\n const originalNode = originalFragmentDefsByPath.get(\n JSON.stringify(path)\n );\n if (node === originalNode) {\n // If the FragmentNode received by this leave function is identical to\n // the one received by the corresponding enter function (above), then\n // the visitor must not have made any changes within this\n // FragmentDefinition node. This fragment definition may still be\n // removed if there are no ...spread references to it, but it won't be\n // removed just because it has only a __typename field.\n return node;\n }\n\n if (\n // This logic applies only if the document contains one or more\n // operations, since removing all fragments from a document containing\n // only fragments makes the document useless.\n operationCount > 0 &&\n node.selectionSet.selections.every(\n (selection) =>\n selection.kind === Kind.FIELD &&\n selection.name.value === \"__typename\"\n )\n ) {\n // This is a somewhat opinionated choice: if a FragmentDefinition ends\n // up having no fields other than __typename, we remove the whole\n // fragment definition, and later prune ...spread references to it.\n getInUseByFragmentName(node.name.value).removed = true;\n firstVisitMadeChanges = true;\n return null;\n }\n },\n },\n\n Directive: {\n leave(node) {\n // If a matching directive is found, remove the directive itself. Note\n // that this does not remove the target (field, argument, etc) of the\n // directive, but only the directive itself.\n if (directiveMatcher(node)) {\n firstVisitMadeChanges = true;\n return null;\n }\n },\n },\n });\n\n if (!firstVisitMadeChanges) {\n // If our first pass did not change anything about the document, then there\n // is no cleanup we need to do, and we can return the original doc.\n return doc;\n }\n\n // Utility for making sure inUse.transitiveVars is recursively populated.\n // Because this logic assumes inUse.fragmentSpreads has been completely\n // populated and inUse.removed has been set if appropriate,\n // populateTransitiveVars must be called after that information has been\n // collected by the first traversal of the document.\n const populateTransitiveVars = (inUse: InternalInUseInfo) => {\n if (!inUse.transitiveVars) {\n inUse.transitiveVars = new Set(inUse.variables);\n if (!inUse.removed) {\n inUse.fragmentSpreads.forEach((childFragmentName) => {\n populateTransitiveVars(\n getInUseByFragmentName(childFragmentName)\n ).transitiveVars!.forEach((varName) => {\n inUse.transitiveVars!.add(varName);\n });\n });\n }\n }\n return inUse;\n };\n\n // Since we've been keeping track of fragment spreads used by particular\n // operations and fragment definitions, we now need to compute the set of all\n // spreads used (transitively) by any operations in the document.\n const allFragmentNamesUsed = new Set<string>();\n docWithoutDirectiveSubtrees.definitions.forEach((def) => {\n if (def.kind === Kind.OPERATION_DEFINITION) {\n populateTransitiveVars(\n getInUseByOperationName(def.name && def.name.value)\n ).fragmentSpreads.forEach((childFragmentName) => {\n allFragmentNamesUsed.add(childFragmentName);\n });\n } else if (\n def.kind === Kind.FRAGMENT_DEFINITION &&\n // If there are no operations in the document, then all fragment\n // definitions count as usages of their own fragment names. This heuristic\n // prevents accidentally removing all fragment definitions from the\n // document just because it contains no operations that use the fragments.\n operationCount === 0 &&\n !getInUseByFragmentName(def.name.value).removed\n ) {\n allFragmentNamesUsed.add(def.name.value);\n }\n });\n // Now that we have added all fragment spreads used by operations to the\n // allFragmentNamesUsed set, we can complete the set by transitively adding\n // all fragment spreads used by those fragments, and so on.\n allFragmentNamesUsed.forEach((fragmentName) => {\n // Once all the childFragmentName strings added here have been seen already,\n // the top-level allFragmentNamesUsed.forEach loop will terminate.\n populateTransitiveVars(\n getInUseByFragmentName(fragmentName)\n ).fragmentSpreads.forEach((childFragmentName) => {\n allFragmentNamesUsed.add(childFragmentName);\n });\n });\n\n const fragmentWillBeRemoved = (fragmentName: string) =>\n !!(\n // A fragment definition will be removed if there are no spreads that refer\n // to it, or the fragment was explicitly removed because it had no fields\n // other than __typename.\n (\n !allFragmentNamesUsed.has(fragmentName) ||\n getInUseByFragmentName(fragmentName).removed\n )\n );\n\n const enterVisitor: EnterLeaveVisitor<\n FragmentSpreadNode | FragmentDefinitionNode\n > = {\n enter(node) {\n if (fragmentWillBeRemoved(node.name.value)) {\n return null;\n }\n },\n };\n\n return nullIfDocIsEmpty(\n visit(docWithoutDirectiveSubtrees, {\n // If the fragment is going to be removed, then leaving any dangling\n // FragmentSpread nodes with the same name would be a mistake.\n FragmentSpread: enterVisitor,\n\n // This is where the fragment definition is actually removed.\n FragmentDefinition: enterVisitor,\n\n OperationDefinition: {\n leave(node) {\n // Upon leaving each operation in the depth-first AST traversal, prune\n // any variables that are declared by the operation but unused within.\n if (node.variableDefinitions) {\n const usedVariableNames = populateTransitiveVars(\n // If an operation is anonymous, we use the empty string as its key.\n getInUseByOperationName(node.name && node.name.value)\n ).transitiveVars!;\n\n // According to the GraphQL spec, all variables declared by an\n // operation must either be used by that operation or used by some\n // fragment included transitively into that operation:\n // https://spec.graphql.org/draft/#sec-All-Variables-Used\n //\n // To stay on the right side of this validation rule, if/when we\n // remove the last $var references from an operation or its fragments,\n // we must also remove the corresponding $var declaration from the\n // enclosing operation. This pruning applies only to operations and\n // not fragment definitions, at the moment. Fragments may be able to\n // declare variables eventually, but today they can only consume them.\n if (usedVariableNames.size < node.variableDefinitions.length) {\n return {\n ...node,\n variableDefinitions: node.variableDefinitions.filter((varDef) =>\n usedVariableNames.has(varDef.variable.name.value)\n ),\n };\n }\n }\n },\n },\n })\n );\n}\n\nexport const addTypenameToDocument = Object.assign(\n function <TNode extends ASTNode>(doc: TNode): TNode {\n return visit(doc, {\n SelectionSet: {\n enter(node, _key, parent) {\n // Don't add __typename to OperationDefinitions.\n if (\n parent &&\n (parent as OperationDefinitionNode).kind ===\n Kind.OPERATION_DEFINITION\n ) {\n return;\n }\n\n // No changes if no selections.\n const { selections } = node;\n if (!selections) {\n return;\n }\n\n // If selections already have a __typename, or are part of an\n // introspection query, do nothing.\n const skip = selections.some((selection) => {\n return (\n isField(selection) &&\n (selection.name.value === \"__typename\" ||\n selection.name.value.lastIndexOf(\"__\", 0) === 0)\n );\n });\n if (skip) {\n return;\n }\n\n // If this SelectionSet is @export-ed as an input variable, it should\n // not have a __typename field (see issue #4691).\n const field = parent as FieldNode;\n if (\n isField(field) &&\n field.directives &&\n field.directives.some((d) => d.name.value === \"export\")\n ) {\n return;\n }\n\n // Create and return a new SelectionSet with a __typename Field.\n return {\n ...node,\n selections: [...selections, TYPENAME_FIELD],\n };\n },\n },\n });\n },\n {\n added(field: FieldNode): boolean {\n return field === TYPENAME_FIELD;\n },\n }\n);\n\nconst connectionRemoveConfig = {\n test: (directive: DirectiveNode) => {\n const willRemove = directive.name.value === \"connection\";\n if (willRemove) {\n if (\n !directive.arguments ||\n !directive.arguments.some((arg) => arg.name.value === \"key\")\n ) {\n invariant.warn(\n \"Removing an @connection directive even though it does not have a key. \" +\n \"You may want to use the key parameter to specify a store key.\"\n );\n }\n }\n\n return willRemove;\n },\n};\n\nexport function removeConnectionDirectiveFromDocument(doc: DocumentNode) {\n return removeDirectivesFromDocument(\n [connectionRemoveConfig],\n checkDocument(doc)\n );\n}\n\nfunction hasDirectivesInSelectionSet(\n directives: GetDirectiveConfig[],\n selectionSet: SelectionSetNode | undefined,\n nestedCheck = true\n): boolean {\n return (\n !!selectionSet &&\n selectionSet.selections &&\n selectionSet.selections.some((selection) =>\n hasDirectivesInSelection(directives, selection, nestedCheck)\n )\n );\n}\n\nfunction hasDirectivesInSelection(\n directives: GetDirectiveConfig[],\n selection: SelectionNode,\n nestedCheck = true\n): boolean {\n if (!isField(selection)) {\n return true;\n }\n\n if (!selection.directives) {\n return false;\n }\n\n return (\n selection.directives.some(getDirectiveMatcher(directives)) ||\n (nestedCheck &&\n hasDirectivesInSelectionSet(\n directives,\n selection.selectionSet,\n nestedCheck\n ))\n );\n}\n\nfunction getArgumentMatcher(config: RemoveArgumentsConfig[]) {\n return function argumentMatcher(argument: ArgumentNode) {\n return config.some(\n (aConfig: RemoveArgumentsConfig) =>\n argument.value &&\n argument.value.kind === Kind.VARIABLE &&\n argument.value.name &&\n (aConfig.name === argument.value.name.value ||\n (aConfig.test && aConfig.test(argument)))\n );\n };\n}\n\nexport function removeArgumentsFromDocument(\n config: RemoveArgumentsConfig[],\n doc: DocumentNode\n): DocumentNode | null {\n const argMatcher = getArgumentMatcher(config);\n\n return nullIfDocIsEmpty(\n visit(doc, {\n OperationDefinition: {\n enter(node) {\n return {\n ...node,\n // Remove matching top level variables definitions.\n variableDefinitions:\n node.variableDefinitions ?\n node.variableDefinitions.filter(\n (varDef) =>\n !config.some(\n (arg) => arg.name === varDef.variable.name.value\n )\n )\n : [],\n };\n },\n },\n\n Field: {\n enter(node) {\n // If `remove` is set to true for an argument, and an argument match\n // is found for a field, remove the field as well.\n const shouldRemoveField = config.some(\n (argConfig) => argConfig.remove\n );\n\n if (shouldRemoveField) {\n let argMatchCount = 0;\n if (node.arguments) {\n node.arguments.forEach((arg) => {\n if (argMatcher(arg)) {\n argMatchCount += 1;\n }\n });\n }\n\n if (argMatchCount === 1) {\n return null;\n }\n }\n },\n },\n\n Argument: {\n enter(node) {\n // Remove all matching arguments.\n if (argMatcher(node)) {\n return null;\n }\n },\n },\n })\n );\n}\n\nexport function removeFragmentSpreadFromDocument(\n config: RemoveFragmentSpreadConfig[],\n doc: DocumentNode\n): DocumentNode | null {\n function enter(\n node: FragmentSpreadNode | FragmentDefinitionNode\n ): null | void {\n if (config.some((def) => def.name === node.name.value)) {\n return null;\n }\n }\n\n return nullIfDocIsEmpty(\n visit(doc, {\n FragmentSpread: { enter },\n FragmentDefinition: { enter },\n })\n );\n}\n\n// If the incoming document is a query, return it as is. Otherwise, build a\n// new document containing a query operation based on the selection set\n// of the previous main operation.\nexport function buildQueryFromSelectionSet(\n document: DocumentNode\n): DocumentNode {\n const definition = getMainDefinition(document);\n const definitionOperation = (<OperationDefinitionNode>definition).operation;\n\n if (definitionOperation === \"query\") {\n // Already a query, so return the existing document.\n return document;\n }\n\n // Build a new query using the selection set of the main operation.\n const modifiedDoc = visit(document, {\n OperationDefinition: {\n enter(node) {\n return {\n ...node,\n operation: \"query\",\n };\n },\n },\n });\n return modifiedDoc;\n}\n\n// Remove fields / selection sets that include an @client directive.\nexport function removeClientSetsFromDocument(\n document: DocumentNode\n): DocumentNode | null {\n checkDocument(document);\n\n let modifiedDoc = removeDirectivesFromDocument(\n [\n {\n test: (directive: DirectiveNode) => directive.name.value === \"client\",\n remove: true,\n },\n ],\n document\n );\n\n return modifiedDoc;\n}\n"]}
@@ -15,6 +15,7 @@ export { isMutationOperation, isQueryOperation, isSubscriptionOperation, } from
15
15
  export { concatPagination, offsetLimitPagination, relayStylePagination, } from "./policies/pagination.js";
16
16
  export type { Observer, ObservableSubscription, } from "./observables/Observable.js";
17
17
  export { Observable } from "./observables/Observable.js";
18
+ export type { PromiseWithState } from "./promises/decoration.js";
18
19
  export { isStatefulPromise, createFulfilledPromise, createRejectedPromise, wrapPromiseWithState, } from "./promises/decoration.js";
19
20
  export * from "./common/mergeDeep.js";
20
21
  export * from "./common/cloneDeep.js";
@@ -38,4 +39,7 @@ export { stripTypename } from "./common/stripTypename.js";
38
39
  export * from "./types/IsStrictlyAny.js";
39
40
  export type { DeepOmit } from "./types/DeepOmit.js";
40
41
  export type { DeepPartial } from "./types/DeepPartial.js";
42
+ export type { OnlyRequiredProperties } from "./types/OnlyRequiredProperties.js";
43
+ export { AutoCleanedStrongCache, AutoCleanedWeakCache, cacheSizes, defaultCacheSizes, } from "./caching/index.js";
44
+ export type { CacheSizes } from "./caching/index.js";
41
45
  //# sourceMappingURL=index.d.ts.map
@@ -30,4 +30,5 @@ export { canonicalStringify } from "./common/canonicalStringify.js";
30
30
  export { omitDeep } from "./common/omitDeep.js";
31
31
  export { stripTypename } from "./common/stripTypename.js";
32
32
  export * from "./types/IsStrictlyAny.js";
33
+ export { AutoCleanedStrongCache, AutoCleanedWeakCache, cacheSizes, } from "./caching/index.js";
33
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAMhD,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAU3C,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAajC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,4BAA4B,EAC5B,qCAAqC,EACrC,2BAA2B,EAC3B,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAElC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,cAAc,0BAA0B,CAAC","sourcesContent":["export { DEV, maybe } from \"./globals/index.js\";\n\nexport type {\n DirectiveInfo,\n InclusionDirectives,\n} from \"./graphql/directives.js\";\nexport {\n shouldInclude,\n hasDirectives,\n hasAnyDirectives,\n hasAllDirectives,\n hasClientExports,\n getDirectiveNames,\n getInclusionDirectives,\n} from \"./graphql/directives.js\";\n\nexport type { DocumentTransformCacheKey } from \"./graphql/DocumentTransform.js\";\nexport { DocumentTransform } from \"./graphql/DocumentTransform.js\";\n\nexport type { FragmentMap, FragmentMapFunction } from \"./graphql/fragments.js\";\nexport {\n createFragmentMap,\n getFragmentQueryDocument,\n getFragmentFromSelection,\n} from \"./graphql/fragments.js\";\n\nexport {\n checkDocument,\n getOperationDefinition,\n getOperationName,\n getFragmentDefinitions,\n getQueryDefinition,\n getFragmentDefinition,\n getMainDefinition,\n getDefaultValues,\n} from \"./graphql/getFromAST.js\";\n\nexport { print } from \"./graphql/print.js\";\n\nexport type {\n StoreObject,\n AsStoreObject,\n Reference,\n StoreValue,\n Directives,\n VariableValue,\n} from \"./graphql/storeUtils.js\";\nexport {\n makeReference,\n isDocumentNode,\n isReference,\n isField,\n isInlineFragment,\n valueToObjectRepresentation,\n storeKeyNameFromField,\n argumentsObjectFromField,\n resultKeyNameFromField,\n getStoreKeyName,\n getTypenameFromResult,\n} from \"./graphql/storeUtils.js\";\n\nexport type {\n RemoveNodeConfig,\n GetNodeConfig,\n RemoveDirectiveConfig,\n GetDirectiveConfig,\n RemoveArgumentsConfig,\n GetFragmentSpreadConfig,\n RemoveFragmentSpreadConfig,\n RemoveFragmentDefinitionConfig,\n RemoveVariableDefinitionConfig,\n} from \"./graphql/transform.js\";\nexport {\n addTypenameToDocument,\n buildQueryFromSelectionSet,\n removeDirectivesFromDocument,\n removeConnectionDirectiveFromDocument,\n removeArgumentsFromDocument,\n removeFragmentSpreadFromDocument,\n removeClientSetsFromDocument,\n} from \"./graphql/transform.js\";\n\nexport {\n isMutationOperation,\n isQueryOperation,\n isSubscriptionOperation,\n} from \"./graphql/operations.js\";\n\nexport {\n concatPagination,\n offsetLimitPagination,\n relayStylePagination,\n} from \"./policies/pagination.js\";\n\nexport type {\n Observer,\n ObservableSubscription,\n} from \"./observables/Observable.js\";\nexport { Observable } from \"./observables/Observable.js\";\n\nexport {\n isStatefulPromise,\n createFulfilledPromise,\n createRejectedPromise,\n wrapPromiseWithState,\n} from \"./promises/decoration.js\";\n\nexport * from \"./common/mergeDeep.js\";\nexport * from \"./common/cloneDeep.js\";\nexport * from \"./common/maybeDeepFreeze.js\";\nexport * from \"./observables/iteration.js\";\nexport * from \"./observables/asyncMap.js\";\nexport * from \"./observables/Concast.js\";\nexport * from \"./observables/subclassing.js\";\nexport * from \"./common/arrays.js\";\nexport * from \"./common/objects.js\";\nexport * from \"./common/errorHandling.js\";\nexport * from \"./common/canUse.js\";\nexport * from \"./common/compact.js\";\nexport * from \"./common/makeUniqueId.js\";\nexport * from \"./common/stringifyForDisplay.js\";\nexport * from \"./common/mergeOptions.js\";\nexport * from \"./common/incrementalResult.js\";\n\nexport { canonicalStringify } from \"./common/canonicalStringify.js\";\nexport { omitDeep } from \"./common/omitDeep.js\";\nexport { stripTypename } from \"./common/stripTypename.js\";\n\nexport * from \"./types/IsStrictlyAny.js\";\nexport type { DeepOmit } from \"./types/DeepOmit.js\";\nexport type { DeepPartial } from \"./types/DeepPartial.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAMhD,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAU3C,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAajC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,4BAA4B,EAC5B,qCAAqC,EACrC,2BAA2B,EAC3B,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAElC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,cAAc,0BAA0B,CAAC;AAKzC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,UAAU,GAEX,MAAM,oBAAoB,CAAC","sourcesContent":["export { DEV, maybe } from \"./globals/index.js\";\n\nexport type {\n DirectiveInfo,\n InclusionDirectives,\n} from \"./graphql/directives.js\";\nexport {\n shouldInclude,\n hasDirectives,\n hasAnyDirectives,\n hasAllDirectives,\n hasClientExports,\n getDirectiveNames,\n getInclusionDirectives,\n} from \"./graphql/directives.js\";\n\nexport type { DocumentTransformCacheKey } from \"./graphql/DocumentTransform.js\";\nexport { DocumentTransform } from \"./graphql/DocumentTransform.js\";\n\nexport type { FragmentMap, FragmentMapFunction } from \"./graphql/fragments.js\";\nexport {\n createFragmentMap,\n getFragmentQueryDocument,\n getFragmentFromSelection,\n} from \"./graphql/fragments.js\";\n\nexport {\n checkDocument,\n getOperationDefinition,\n getOperationName,\n getFragmentDefinitions,\n getQueryDefinition,\n getFragmentDefinition,\n getMainDefinition,\n getDefaultValues,\n} from \"./graphql/getFromAST.js\";\n\nexport { print } from \"./graphql/print.js\";\n\nexport type {\n StoreObject,\n AsStoreObject,\n Reference,\n StoreValue,\n Directives,\n VariableValue,\n} from \"./graphql/storeUtils.js\";\nexport {\n makeReference,\n isDocumentNode,\n isReference,\n isField,\n isInlineFragment,\n valueToObjectRepresentation,\n storeKeyNameFromField,\n argumentsObjectFromField,\n resultKeyNameFromField,\n getStoreKeyName,\n getTypenameFromResult,\n} from \"./graphql/storeUtils.js\";\n\nexport type {\n RemoveNodeConfig,\n GetNodeConfig,\n RemoveDirectiveConfig,\n GetDirectiveConfig,\n RemoveArgumentsConfig,\n GetFragmentSpreadConfig,\n RemoveFragmentSpreadConfig,\n RemoveFragmentDefinitionConfig,\n RemoveVariableDefinitionConfig,\n} from \"./graphql/transform.js\";\nexport {\n addTypenameToDocument,\n buildQueryFromSelectionSet,\n removeDirectivesFromDocument,\n removeConnectionDirectiveFromDocument,\n removeArgumentsFromDocument,\n removeFragmentSpreadFromDocument,\n removeClientSetsFromDocument,\n} from \"./graphql/transform.js\";\n\nexport {\n isMutationOperation,\n isQueryOperation,\n isSubscriptionOperation,\n} from \"./graphql/operations.js\";\n\nexport {\n concatPagination,\n offsetLimitPagination,\n relayStylePagination,\n} from \"./policies/pagination.js\";\n\nexport type {\n Observer,\n ObservableSubscription,\n} from \"./observables/Observable.js\";\nexport { Observable } from \"./observables/Observable.js\";\n\nexport type { PromiseWithState } from \"./promises/decoration.js\";\nexport {\n isStatefulPromise,\n createFulfilledPromise,\n createRejectedPromise,\n wrapPromiseWithState,\n} from \"./promises/decoration.js\";\n\nexport * from \"./common/mergeDeep.js\";\nexport * from \"./common/cloneDeep.js\";\nexport * from \"./common/maybeDeepFreeze.js\";\nexport * from \"./observables/iteration.js\";\nexport * from \"./observables/asyncMap.js\";\nexport * from \"./observables/Concast.js\";\nexport * from \"./observables/subclassing.js\";\nexport * from \"./common/arrays.js\";\nexport * from \"./common/objects.js\";\nexport * from \"./common/errorHandling.js\";\nexport * from \"./common/canUse.js\";\nexport * from \"./common/compact.js\";\nexport * from \"./common/makeUniqueId.js\";\nexport * from \"./common/stringifyForDisplay.js\";\nexport * from \"./common/mergeOptions.js\";\nexport * from \"./common/incrementalResult.js\";\n\nexport { canonicalStringify } from \"./common/canonicalStringify.js\";\nexport { omitDeep } from \"./common/omitDeep.js\";\nexport { stripTypename } from \"./common/stripTypename.js\";\n\nexport * from \"./types/IsStrictlyAny.js\";\nexport type { DeepOmit } from \"./types/DeepOmit.js\";\nexport type { DeepPartial } from \"./types/DeepPartial.js\";\nexport type { OnlyRequiredProperties } from \"./types/OnlyRequiredProperties.js\";\n\nexport {\n AutoCleanedStrongCache,\n AutoCleanedWeakCache,\n cacheSizes,\n defaultCacheSizes,\n} from \"./caching/index.js\";\nexport type { CacheSizes } from \"./caching/index.js\";\n"]}
@@ -15,7 +15,7 @@ export declare class Concast<T> extends Observable<T> {
15
15
  removeObserver(observer: Observer<T>): void;
16
16
  private resolve;
17
17
  private reject;
18
- readonly promise: Promise<T>;
18
+ readonly promise: Promise<T | undefined>;
19
19
  private latest?;
20
20
  private handlers;
21
21
  private nextResultListeners;
@@ -5,18 +5,54 @@ import { fixObservableSubclass } from "./subclassing.js";
5
5
  function isPromiseLike(value) {
6
6
  return value && typeof value.then === "function";
7
7
  }
8
- var Concast = (function (_super) {
8
+ // A Concast<T> observable concatenates the given sources into a single
9
+ // non-overlapping sequence of Ts, automatically unwrapping any promises,
10
+ // and broadcasts the T elements of that sequence to any number of
11
+ // subscribers, all without creating a bunch of intermediary Observable
12
+ // wrapper objects.
13
+ //
14
+ // Even though any number of observers can subscribe to the Concast, each
15
+ // source observable is guaranteed to receive at most one subscribe call,
16
+ // and the results are multicast to all observers.
17
+ //
18
+ // In addition to broadcasting every next/error message to this.observers,
19
+ // the Concast stores the most recent message using this.latest, so any
20
+ // new observers can immediately receive the latest message, even if it
21
+ // was originally delivered in the past. This behavior means we can assume
22
+ // every active observer in this.observers has received the same most
23
+ // recent message.
24
+ //
25
+ // With the exception of this.latest replay, a Concast is a "hot"
26
+ // observable in the sense that it does not replay past results from the
27
+ // beginning of time for each new observer.
28
+ //
29
+ // Could we have used some existing RxJS class instead? Concast<T> is
30
+ // similar to a BehaviorSubject<T>, because it is multicast and redelivers
31
+ // the latest next/error message to new subscribers. Unlike Subject<T>,
32
+ // Concast<T> does not expose an Observer<T> interface (this.handlers is
33
+ // intentionally private), since Concast<T> gets its inputs from the
34
+ // concatenated sources. If we ever switch to RxJS, there may be some
35
+ // value in reusing their code, but for now we use zen-observable, which
36
+ // does not contain any Subject implementations.
37
+ var Concast = /** @class */ (function (_super) {
9
38
  __extends(Concast, _super);
39
+ // Not only can the individual elements of the iterable be promises, but
40
+ // also the iterable itself can be wrapped in a promise.
10
41
  function Concast(sources) {
11
42
  var _this = _super.call(this, function (observer) {
12
43
  _this.addObserver(observer);
13
44
  return function () { return _this.removeObserver(observer); };
14
45
  }) || this;
46
+ // Active observers receiving broadcast messages. Thanks to this.latest,
47
+ // we can assume all observers in this Set have received the same most
48
+ // recent message, though possibly at different times in the past.
15
49
  _this.observers = new Set();
16
50
  _this.promise = new Promise(function (resolve, reject) {
17
51
  _this.resolve = resolve;
18
52
  _this.reject = reject;
19
53
  });
54
+ // Bound handler functions that can be reused for every internal
55
+ // subscription.
20
56
  _this.handlers = {
21
57
  next: function (result) {
22
58
  if (_this.sub !== null) {
@@ -28,6 +64,9 @@ var Concast = (function (_super) {
28
64
  error: function (error) {
29
65
  var sub = _this.sub;
30
66
  if (sub !== null) {
67
+ // Delay unsubscribing from the underlying subscription slightly,
68
+ // so that immediately subscribing another observer can keep the
69
+ // subscription active.
31
70
  if (sub)
32
71
  setTimeout(function () { return sub.unsubscribe(); });
33
72
  _this.sub = null;
@@ -40,6 +79,11 @@ var Concast = (function (_super) {
40
79
  complete: function () {
41
80
  var _a = _this, sub = _a.sub, _b = _a.sources, sources = _b === void 0 ? [] : _b;
42
81
  if (sub !== null) {
82
+ // If complete is called before concast.start, this.sources may be
83
+ // undefined, so we use a default value of [] for sources. That works
84
+ // here because it falls into the if (!value) {...} block, which
85
+ // appropriately terminates the Concast, even if this.sources might
86
+ // eventually have been initialized to a non-empty array.
43
87
  var value = sources.shift();
44
88
  if (!value) {
45
89
  if (sub)
@@ -52,10 +96,16 @@ var Concast = (function (_super) {
52
96
  _this.resolve();
53
97
  }
54
98
  _this.notify("complete");
99
+ // We do not store this.latest = ["complete"], because doing so
100
+ // discards useful information about the previous next (or
101
+ // error) message. Instead, if new observers subscribe after
102
+ // this Concast has completed, they will receive the final
103
+ // 'next' message (unless there was an error) immediately
104
+ // followed by a 'complete' message (see addObserver).
55
105
  iterateObserversSafely(_this.observers, "complete");
56
106
  }
57
107
  else if (isPromiseLike(value)) {
58
- value.then(function (obs) { return (_this.sub = obs.subscribe(_this.handlers)); });
108
+ value.then(function (obs) { return (_this.sub = obs.subscribe(_this.handlers)); }, _this.handlers.error);
59
109
  }
60
110
  else {
61
111
  _this.sub = value.subscribe(_this.handlers);
@@ -64,12 +114,19 @@ var Concast = (function (_super) {
64
114
  },
65
115
  };
66
116
  _this.nextResultListeners = new Set();
117
+ // A public way to abort observation and broadcast.
67
118
  _this.cancel = function (reason) {
68
119
  _this.reject(reason);
69
120
  _this.sources = [];
70
121
  _this.handlers.complete();
71
122
  };
123
+ // Suppress rejection warnings for this.promise, since it's perfectly
124
+ // acceptable to pay no attention to this.promise if you're consuming
125
+ // the results through the normal observable API.
72
126
  _this.promise.catch(function (_) { });
127
+ // If someone accidentally tries to create a Concast using a subscriber
128
+ // function, recover by creating an Observable from that subscriber and
129
+ // using it as the source.
73
130
  if (typeof sources === "function") {
74
131
  sources = [new Observable(sources)];
75
132
  }
@@ -84,7 +141,14 @@ var Concast = (function (_super) {
84
141
  Concast.prototype.start = function (sources) {
85
142
  if (this.sub !== void 0)
86
143
  return;
144
+ // In practice, sources is most often simply an Array of observables.
145
+ // TODO Consider using sources[Symbol.iterator]() to take advantage
146
+ // of the laziness of non-Array iterables.
87
147
  this.sources = Array.from(sources);
148
+ // Calling this.handlers.complete() kicks off consumption of the first
149
+ // source observable. It's tempting to do this step lazily in
150
+ // addObserver, but this.promise can be accessed without calling
151
+ // addObserver, so consumption needs to begin eagerly.
88
152
  this.handlers.complete();
89
153
  };
90
154
  Concast.prototype.deliverLastMessage = function (observer) {
@@ -94,6 +158,9 @@ var Concast = (function (_super) {
94
158
  if (method) {
95
159
  method.call(observer, this.latest[1]);
96
160
  }
161
+ // If the subscription is already closed, and the last message was
162
+ // a 'next' message, simulate delivery of the final 'complete'
163
+ // message again.
97
164
  if (this.sub === null && nextOrError === "next" && observer.complete) {
98
165
  observer.complete();
99
166
  }
@@ -101,22 +168,36 @@ var Concast = (function (_super) {
101
168
  };
102
169
  Concast.prototype.addObserver = function (observer) {
103
170
  if (!this.observers.has(observer)) {
171
+ // Immediately deliver the most recent message, so we can always
172
+ // be sure all observers have the latest information.
104
173
  this.deliverLastMessage(observer);
105
174
  this.observers.add(observer);
106
175
  }
107
176
  };
108
177
  Concast.prototype.removeObserver = function (observer) {
109
178
  if (this.observers.delete(observer) && this.observers.size < 1) {
179
+ // In case there are still any listeners in this.nextResultListeners, and
180
+ // no error or completion has been broadcast yet, make sure those
181
+ // observers have a chance to run and then remove themselves from
182
+ // this.observers.
110
183
  this.handlers.complete();
111
184
  }
112
185
  };
113
186
  Concast.prototype.notify = function (method, arg) {
114
187
  var nextResultListeners = this.nextResultListeners;
115
188
  if (nextResultListeners.size) {
189
+ // Replacing this.nextResultListeners first ensures it does not grow while
190
+ // we are iterating over it, potentially leading to infinite loops.
116
191
  this.nextResultListeners = new Set();
117
192
  nextResultListeners.forEach(function (listener) { return listener(method, arg); });
118
193
  }
119
194
  };
195
+ // We need a way to run callbacks just *before* the next result (or error or
196
+ // completion) is delivered by this Concast, so we can be sure any code that
197
+ // runs as a result of delivering that result/error observes the effects of
198
+ // running the callback(s). It was tempting to reuse the Observer type instead
199
+ // of introducing NextResultListener, but that messes with the sizing and
200
+ // maintenance of this.observers, and ends up being more code overall.
120
201
  Concast.prototype.beforeNext = function (callback) {
121
202
  var called = false;
122
203
  this.nextResultListeners.add(function (method, arg) {
@@ -129,5 +210,7 @@ var Concast = (function (_super) {
129
210
  return Concast;
130
211
  }(Observable));
131
212
  export { Concast };
213
+ // Necessary because the Concast constructor has a different signature
214
+ // than the Observable constructor.
132
215
  fixObservableSubclass(Concast);
133
216
  //# sourceMappingURL=Concast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Concast.js","sourceRoot":"","sources":["../../../src/utilities/observables/Concast.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Observer,\n ObservableSubscription,\n Subscriber,\n} from \"./Observable.js\";\nimport { Observable } from \"./Observable.js\";\nimport { iterateObserversSafely } from \"./iteration.js\";\nimport { fixObservableSubclass } from \"./subclassing.js\";\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>>;\nexport type ConcastSourcesArray<T> = Array<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((iterable) => this.start(iterable), this.handlers.error);\n } else {\n this.start(sources);\n }\n }\n\n // A consumable array of source observables, incrementally consumed each time\n // this.handlers.complete is called. This private field is not initialized\n // until the concast.start method is called, which can happen asynchronously\n // if a Promise is passed to the Concast constructor, so undefined is a\n // possible value for this.sources before concast.start is called.\n private sources: Source<T>[] | undefined;\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 && nextOrError === \"next\" && observer.complete) {\n observer.complete();\n }\n }\n }\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 }\n }\n\n public removeObserver(observer: Observer<T>) {\n if (this.observers.delete(observer) && this.observers.size < 1) {\n // In case there are still any listeners in this.nextResultListeners, and\n // no error or completion has been broadcast yet, make sure those\n // observers have a chance to run and then remove themselves from\n // this.observers.\n this.handlers.complete();\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\", T] | [\"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 this.notify(\"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 this.notify(\"error\", error);\n iterateObserversSafely(this.observers, \"error\", error);\n }\n },\n\n complete: () => {\n const { sub, sources = [] } = this;\n if (sub !== null) {\n // If complete is called before concast.start, this.sources may be\n // undefined, so we use a default value of [] for sources. That works\n // here because it falls into the if (!value) {...} block, which\n // appropriately terminates the Concast, even if this.sources might\n // eventually have been initialized to a non-empty array.\n const value = sources.shift();\n if (!value) {\n if (sub) setTimeout(() => sub.unsubscribe());\n this.sub = null;\n if (this.latest && this.latest[0] === \"next\") {\n this.resolve(this.latest[1]);\n } else {\n this.resolve();\n }\n this.notify(\"complete\");\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 private nextResultListeners = new Set<NextResultListener>();\n\n private notify(\n method: Parameters<NextResultListener>[0],\n arg?: Parameters<NextResultListener>[1]\n ) {\n const { nextResultListeners } = this;\n if (nextResultListeners.size) {\n // Replacing this.nextResultListeners first ensures it does not grow while\n // we are iterating over it, potentially leading to infinite loops.\n this.nextResultListeners = new Set();\n nextResultListeners.forEach((listener) => listener(method, arg));\n }\n }\n\n // We need a way to run callbacks just *before* the next result (or error or\n // completion) is delivered by this Concast, so we can be sure any code that\n // runs as a result of delivering that result/error observes the effects of\n // running the callback(s). It was tempting to reuse the Observer type instead\n // of introducing NextResultListener, but that messes with the sizing and\n // maintenance of this.observers, and ends up being more code overall.\n beforeNext(callback: NextResultListener) {\n let called = false;\n this.nextResultListeners.add((method, arg) => {\n if (!called) {\n called = true;\n callback(method, arg);\n }\n });\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\ntype NextResultListener = (\n method: \"next\" | \"error\" | \"complete\",\n arg?: any\n) => any;\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":";AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAIzD,SAAS,aAAa,CAAI,KAAoB;IAC5C,OAAO,KAAK,IAAI,OAAQ,KAAa,CAAC,IAAI,KAAK,UAAU,CAAC;AAC5D,CAAC;AAQD,uEAAuE;AACvE,yEAAyE;AACzE,kEAAkE;AAClE,uEAAuE;AACvE,mBAAmB;AACnB,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,kDAAkD;AAClD,EAAE;AACF,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,0EAA0E;AAC1E,qEAAqE;AACrE,kBAAkB;AAClB,EAAE;AACF,iEAAiE;AACjE,wEAAwE;AACxE,2CAA2C;AAC3C,EAAE;AACF,qEAAqE;AACrE,0EAA0E;AAC1E,uEAAuE;AACvE,wEAAwE;AACxE,oEAAoE;AACpE,qEAAqE;AACrE,wEAAwE;AACxE,gDAAgD;AAChD;IAAgC,2BAAa;IAY3C,wEAAwE;IACxE,wDAAwD;IACxD,iBAAY,OAA8D;QACxE,YAAA,MAAK,YAAC,UAAC,QAAQ;YACb,KAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO,cAAM,OAAA,KAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAA7B,CAA6B,CAAC;QAC7C,CAAC,CAAC,SAAC;QAjBL,wEAAwE;QACxE,sEAAsE;QACtE,kEAAkE;QAC1D,eAAS,GAAG,IAAI,GAAG,EAAe,CAAC;QAiG3B,aAAO,GAAG,IAAI,OAAO,CAAgB,UAAC,OAAO,EAAE,MAAM;YACnE,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,KAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC,CAAC,CAAC;QAMH,gEAAgE;QAChE,gBAAgB;QACR,cAAQ,GAAG;YACjB,IAAI,EAAE,UAAC,MAAS;gBACd,IAAI,KAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;oBACtB,KAAI,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC/B,KAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC5B,sBAAsB,CAAC,KAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,KAAK,EAAE,UAAC,KAAU;gBACR,IAAA,GAAG,GAAK,KAAI,IAAT,CAAU;gBACrB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBACjB,iEAAiE;oBACjE,gEAAgE;oBAChE,uBAAuB;oBACvB,IAAI,GAAG;wBAAE,UAAU,CAAC,cAAM,OAAA,GAAG,CAAC,WAAW,EAAE,EAAjB,CAAiB,CAAC,CAAC;oBAC7C,KAAI,CAAC,GAAG,GAAG,IAAI,CAAC;oBAChB,KAAI,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC/B,KAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACnB,KAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC5B,sBAAsB,CAAC,KAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,QAAQ,EAAE;gBACF,IAAA,KAAwB,KAAI,EAA1B,GAAG,SAAA,EAAE,eAAY,EAAZ,OAAO,mBAAG,EAAE,KAAS,CAAC;gBACnC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBACjB,kEAAkE;oBAClE,qEAAqE;oBACrE,gEAAgE;oBAChE,mEAAmE;oBACnE,yDAAyD;oBACzD,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,IAAI,GAAG;4BAAE,UAAU,CAAC,cAAM,OAAA,GAAG,CAAC,WAAW,EAAE,EAAjB,CAAiB,CAAC,CAAC;wBAC7C,KAAI,CAAC,GAAG,GAAG,IAAI,CAAC;wBAChB,IAAI,KAAI,CAAC,MAAM,IAAI,KAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;4BAC7C,KAAI,CAAC,OAAO,CAAC,KAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/B,CAAC;6BAAM,CAAC;4BACN,KAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,CAAC;wBACD,KAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBACxB,+DAA+D;wBAC/D,0DAA0D;wBAC1D,4DAA4D;wBAC5D,0DAA0D;wBAC1D,yDAAyD;wBACzD,sDAAsD;wBACtD,sBAAsB,CAAC,KAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;oBACrD,CAAC;yBAAM,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;wBAChC,KAAK,CAAC,IAAI,CACR,UAAC,GAAG,IAAK,OAAA,CAAC,KAAI,CAAC,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,KAAI,CAAC,QAAQ,CAAC,CAAC,EAAzC,CAAyC,EAClD,KAAI,CAAC,QAAQ,CAAC,KAAK,CACpB,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,KAAI,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,KAAI,CAAC,QAAQ,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;QAEM,yBAAmB,GAAG,IAAI,GAAG,EAAsB,CAAC;QA+B5D,mDAAmD;QAC5C,YAAM,GAAG,UAAC,MAAW;YAC1B,KAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpB,KAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,KAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC;QA7LA,qEAAqE;QACrE,qEAAqE;QACrE,iDAAiD;QACjD,KAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAC,CAAC,IAAM,CAAC,CAAC,CAAC;QAE9B,uEAAuE;QACvE,uEAAuE;QACvE,0BAA0B;QAC1B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,UAAC,QAAQ,IAAK,OAAA,KAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAApB,CAAoB,EAAE,KAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,KAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;;IACH,CAAC;IASO,uBAAK,GAAb,UAAc,OAAkC;QAC9C,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC;YAAE,OAAO;QAEhC,qEAAqE;QACrE,mEAAmE;QACnE,0CAA0C;QAC1C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnC,sEAAsE;QACtE,6DAA6D;QAC7D,gEAAgE;QAChE,sDAAsD;QACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEO,oCAAkB,GAA1B,UAA2B,QAAqB;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,IAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,kEAAkE;YAClE,8DAA8D;YAC9D,iBAAiB;YACjB,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,WAAW,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACrE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAEM,6BAAW,GAAlB,UAAmB,QAAqB;QACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,gEAAgE;YAChE,qDAAqD;YACrD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,gCAAc,GAArB,UAAsB,QAAqB;QACzC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC/D,yEAAyE;YACzE,iEAAiE;YACjE,iEAAiE;YACjE,kBAAkB;YAClB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAiFO,wBAAM,GAAd,UACE,MAAyC,EACzC,GAAuC;QAE/B,IAAA,mBAAmB,GAAK,IAAI,oBAAT,CAAU;QACrC,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC;YAC7B,0EAA0E;YAC1E,mEAAmE;YACnE,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;YACrC,mBAAmB,CAAC,OAAO,CAAC,UAAC,QAAQ,IAAK,OAAA,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAArB,CAAqB,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,4EAA4E;IAC5E,2EAA2E;IAC3E,8EAA8E;IAC9E,yEAAyE;IACzE,sEAAsE;IACtE,4BAAU,GAAV,UAAW,QAA4B;QACrC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAC,MAAM,EAAE,GAAG;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,CAAC;gBACd,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAQH,cAAC;AAAD,CAAC,AAlND,CAAgC,UAAU,GAkNzC;;AAOD,sEAAsE;AACtE,mCAAmC;AACnC,qBAAqB,CAAC,OAAO,CAAC,CAAC","sourcesContent":["import type {\n Observer,\n ObservableSubscription,\n Subscriber,\n} from \"./Observable.js\";\nimport { Observable } from \"./Observable.js\";\nimport { iterateObserversSafely } from \"./iteration.js\";\nimport { fixObservableSubclass } from \"./subclassing.js\";\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>>;\nexport type ConcastSourcesArray<T> = Array<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((iterable) => this.start(iterable), this.handlers.error);\n } else {\n this.start(sources);\n }\n }\n\n // A consumable array of source observables, incrementally consumed each time\n // this.handlers.complete is called. This private field is not initialized\n // until the concast.start method is called, which can happen asynchronously\n // if a Promise is passed to the Concast constructor, so undefined is a\n // possible value for this.sources before concast.start is called.\n private sources: Source<T>[] | undefined;\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 && nextOrError === \"next\" && observer.complete) {\n observer.complete();\n }\n }\n }\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 }\n }\n\n public removeObserver(observer: Observer<T>) {\n if (this.observers.delete(observer) && this.observers.size < 1) {\n // In case there are still any listeners in this.nextResultListeners, and\n // no error or completion has been broadcast yet, make sure those\n // observers have a chance to run and then remove themselves from\n // this.observers.\n this.handlers.complete();\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 | undefined>((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\", T] | [\"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 this.notify(\"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 this.notify(\"error\", error);\n iterateObserversSafely(this.observers, \"error\", error);\n }\n },\n\n complete: () => {\n const { sub, sources = [] } = this;\n if (sub !== null) {\n // If complete is called before concast.start, this.sources may be\n // undefined, so we use a default value of [] for sources. That works\n // here because it falls into the if (!value) {...} block, which\n // appropriately terminates the Concast, even if this.sources might\n // eventually have been initialized to a non-empty array.\n const value = sources.shift();\n if (!value) {\n if (sub) setTimeout(() => sub.unsubscribe());\n this.sub = null;\n if (this.latest && this.latest[0] === \"next\") {\n this.resolve(this.latest[1]);\n } else {\n this.resolve();\n }\n this.notify(\"complete\");\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(\n (obs) => (this.sub = obs.subscribe(this.handlers)),\n this.handlers.error\n );\n } else {\n this.sub = value.subscribe(this.handlers);\n }\n }\n },\n };\n\n private nextResultListeners = new Set<NextResultListener>();\n\n private notify(\n method: Parameters<NextResultListener>[0],\n arg?: Parameters<NextResultListener>[1]\n ) {\n const { nextResultListeners } = this;\n if (nextResultListeners.size) {\n // Replacing this.nextResultListeners first ensures it does not grow while\n // we are iterating over it, potentially leading to infinite loops.\n this.nextResultListeners = new Set();\n nextResultListeners.forEach((listener) => listener(method, arg));\n }\n }\n\n // We need a way to run callbacks just *before* the next result (or error or\n // completion) is delivered by this Concast, so we can be sure any code that\n // runs as a result of delivering that result/error observes the effects of\n // running the callback(s). It was tempting to reuse the Observer type instead\n // of introducing NextResultListener, but that messes with the sizing and\n // maintenance of this.observers, and ends up being more code overall.\n beforeNext(callback: NextResultListener) {\n let called = false;\n this.nextResultListeners.add((method, arg) => {\n if (!called) {\n called = true;\n callback(method, arg);\n }\n });\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\ntype NextResultListener = (\n method: \"next\" | \"error\" | \"complete\",\n arg?: any\n) => any;\n\n// Necessary because the Concast constructor has a different signature\n// than the Observable constructor.\nfixObservableSubclass(Concast);\n"]}
@@ -1,8 +1,14 @@
1
1
  import { Observable } from "zen-observable-ts";
2
+ // This simplified polyfill attempts to follow the ECMAScript Observable
3
+ // proposal (https://github.com/zenparsing/es-observable)
2
4
  import "symbol-observable";
5
+ // The zen-observable package defines Observable.prototype[Symbol.observable]
6
+ // when Symbol is supported, but RxJS interop depends on also setting this fake
7
+ // '@@observable' string as a polyfill for Symbol.observable.
3
8
  var prototype = Observable.prototype;
4
9
  var fakeObsSymbol = "@@observable";
5
10
  if (!prototype[fakeObsSymbol]) {
11
+ // @ts-expect-error
6
12
  prototype[fakeObsSymbol] = function () {
7
13
  return this;
8
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../../src/utilities/observables/Observable.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,mBAAmB,CAAC;AAOnB,IAAA,SAAS,GAAK,UAAU,UAAf,CAAgB;AACjC,IAAM,aAAa,GAAG,cAAwC,CAAC;AAC/D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;IAC7B,SAAS,CAAC,aAAa,CAAC,GAAG;QACzB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;CACH;AAED,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import type {\n Observer,\n Subscription as ObservableSubscription,\n Subscriber,\n} from \"zen-observable-ts\";\nimport { Observable } from \"zen-observable-ts\";\n\n// This simplified polyfill attempts to follow the ECMAScript Observable\n// proposal (https://github.com/zenparsing/es-observable)\nimport \"symbol-observable\";\n\nexport type { Observer, ObservableSubscription, Subscriber };\n\n// The zen-observable package defines Observable.prototype[Symbol.observable]\n// when Symbol is supported, but RxJS interop depends on also setting this fake\n// '@@observable' string as a polyfill for Symbol.observable.\nconst { prototype } = Observable;\nconst fakeObsSymbol = \"@@observable\" as keyof typeof prototype;\nif (!prototype[fakeObsSymbol]) {\n prototype[fakeObsSymbol] = function () {\n return this;\n };\n}\n\nexport { Observable };\n"]}
1
+ {"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../../src/utilities/observables/Observable.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,wEAAwE;AACxE,yDAAyD;AACzD,OAAO,mBAAmB,CAAC;AAI3B,6EAA6E;AAC7E,+EAA+E;AAC/E,6DAA6D;AACrD,IAAA,SAAS,GAAK,UAAU,UAAf,CAAgB;AACjC,IAAM,aAAa,GAAG,cAAwC,CAAC;AAC/D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;IAC9B,mBAAmB;IACnB,SAAS,CAAC,aAAa,CAAC,GAAG;QACzB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import type {\n Observer,\n Subscription as ObservableSubscription,\n Subscriber,\n} from \"zen-observable-ts\";\nimport { Observable } from \"zen-observable-ts\";\n\n// This simplified polyfill attempts to follow the ECMAScript Observable\n// proposal (https://github.com/zenparsing/es-observable)\nimport \"symbol-observable\";\n\nexport type { Observer, ObservableSubscription, Subscriber };\n\n// The zen-observable package defines Observable.prototype[Symbol.observable]\n// when Symbol is supported, but RxJS interop depends on also setting this fake\n// '@@observable' string as a polyfill for Symbol.observable.\nconst { prototype } = Observable;\nconst fakeObsSymbol = \"@@observable\" as keyof typeof prototype;\nif (!prototype[fakeObsSymbol]) {\n // @ts-expect-error\n prototype[fakeObsSymbol] = function () {\n return this;\n };\n}\n\nexport { Observable };\n"]}
@@ -1,7 +1,12 @@
1
1
  import { Observable } from "./Observable.js";
2
+ // Like Observable.prototype.map, except that the mapping function can
3
+ // optionally return a Promise (or be async).
2
4
  export function asyncMap(observable, mapFn, catchFn) {
3
5
  return new Observable(function (observer) {
4
6
  var promiseQueue = {
7
+ // Normally we would initialize promiseQueue to Promise.resolve(), but
8
+ // in this case, for backwards compatibility, we need to be careful to
9
+ // invoke the first callback synchronously.
5
10
  then: function (callback) {
6
11
  return new Promise(function (resolve) { return resolve(callback()); });
7
12
  },
@@ -10,8 +15,10 @@ export function asyncMap(observable, mapFn, catchFn) {
10
15
  return function (arg) {
11
16
  if (examiner) {
12
17
  var both = function () {
13
- return observer.closed
14
- ? 0
18
+ // If the observer is closed, we don't want to continue calling the
19
+ // mapping function - it's result will be swallowed anyways.
20
+ return observer.closed ?
21
+ /* will be swallowed */ 0
15
22
  : examiner(arg);
16
23
  };
17
24
  promiseQueue = promiseQueue.then(both, both).then(function (result) { return observer.next(result); }, function (error) { return observer.error(error); });
@@ -25,7 +32,9 @@ export function asyncMap(observable, mapFn, catchFn) {
25
32
  next: makeCallback(mapFn, "next"),
26
33
  error: makeCallback(catchFn, "error"),
27
34
  complete: function () {
28
- promiseQueue.then(function () { return observer.complete(); });
35
+ // no need to reassign `promiseQueue`, after `observer.complete`,
36
+ // the observer will be closed and short-circuit everything anyways
37
+ /*promiseQueue = */ promiseQueue.then(function () { return observer.complete(); });
29
38
  },
30
39
  };
31
40
  var sub = observable.subscribe(handler);
@@ -1 +1 @@
1
- {"version":3,"file":"asyncMap.js","sourceRoot":"","sources":["../../../src/utilities/observables/asyncMap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,MAAM,UAAU,QAAQ,CACtB,UAAyB,EACzB,KAAuC,EACvC,OAA4C;IAE5C,OAAO,IAAI,UAAU,CAAI,UAAC,QAAQ;QAChC,IAAI,YAAY,GAAG;YAIjB,IAAI,YAAC,QAAmB;gBACtB,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAnB,CAAmB,CAAC,CAAC;YACvD,CAAC;SACe,CAAC;QAEnB,SAAS,YAAY,CACnB,QAAuC,EACvC,GAAqB;YAErB,OAAO,UAAC,GAAG;gBACT,IAAI,QAAQ,EAAE;oBACZ,IAAM,IAAI,GAAG;wBAGX,OAAA,QAAQ,CAAC,MAAM;4BACb,CAAC,CAA0B,CAAS;4BACpC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAFjB,CAEiB,CAAC;oBAEpB,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAC/C,UAAC,MAAM,IAAK,OAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAArB,CAAqB,EACjC,UAAC,KAAK,IAAK,OAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAArB,CAAqB,CACjC,CAAC;iBACH;qBAAM;oBACL,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;iBACpB;YACH,CAAC,CAAC;QACJ,CAAC;QAED,IAAM,OAAO,GAAgB;YAC3B,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;YACjC,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;YACrC,QAAQ;gBAGc,YAAY,CAAC,IAAI,CAAC,cAAM,OAAA,QAAQ,CAAC,QAAQ,EAAE,EAAnB,CAAmB,CAAC,CAAC;YACnE,CAAC;SACF,CAAC;QAEF,IAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,cAAM,OAAA,GAAG,CAAC,WAAW,EAAE,EAAjB,CAAiB,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Observer } from \"./Observable.js\";\nimport { Observable } from \"./Observable.js\";\n\n// Like Observable.prototype.map, except that the mapping function can\n// optionally return a Promise (or be async).\nexport function asyncMap<V, R>(\n observable: Observable<V>,\n mapFn: (value: V) => R | PromiseLike<R>,\n catchFn?: (error: any) => R | PromiseLike<R>\n): Observable<R> {\n return new Observable<R>((observer) => {\n let promiseQueue = {\n // Normally we would initialize promiseQueue to Promise.resolve(), but\n // in this case, for backwards compatibility, we need to be careful to\n // invoke the first callback synchronously.\n then(callback: () => any) {\n return new Promise((resolve) => resolve(callback()));\n },\n } as Promise<void>;\n\n function makeCallback(\n examiner: typeof mapFn | typeof catchFn,\n key: \"next\" | \"error\"\n ): (arg: any) => void {\n return (arg) => {\n if (examiner) {\n const both = () =>\n // If the observer is closed, we don't want to continue calling the\n // mapping function - it's result will be swallowed anyways.\n observer.closed\n ? /* will be swallowed */ (0 as any)\n : examiner(arg);\n\n promiseQueue = promiseQueue.then(both, both).then(\n (result) => observer.next(result),\n (error) => observer.error(error)\n );\n } else {\n observer[key](arg);\n }\n };\n }\n\n const handler: Observer<V> = {\n next: makeCallback(mapFn, \"next\"),\n error: makeCallback(catchFn, \"error\"),\n complete() {\n // no need to reassign `promiseQueue`, after `observer.complete`,\n // the observer will be closed and short-circuit everything anyways\n /*promiseQueue = */ promiseQueue.then(() => observer.complete());\n },\n };\n\n const sub = observable.subscribe(handler);\n return () => sub.unsubscribe();\n });\n}\n"]}
1
+ {"version":3,"file":"asyncMap.js","sourceRoot":"","sources":["../../../src/utilities/observables/asyncMap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,sEAAsE;AACtE,6CAA6C;AAC7C,MAAM,UAAU,QAAQ,CACtB,UAAyB,EACzB,KAAuC,EACvC,OAA4C;IAE5C,OAAO,IAAI,UAAU,CAAI,UAAC,QAAQ;QAChC,IAAI,YAAY,GAAG;YACjB,sEAAsE;YACtE,sEAAsE;YACtE,2CAA2C;YAC3C,IAAI,YAAC,QAAmB;gBACtB,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAnB,CAAmB,CAAC,CAAC;YACvD,CAAC;SACe,CAAC;QAEnB,SAAS,YAAY,CACnB,QAAuC,EACvC,GAAqB;YAErB,OAAO,UAAC,GAAG;gBACT,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAM,IAAI,GAAG;wBACX,mEAAmE;wBACnE,4DAA4D;wBAC5D,OAAA,QAAQ,CAAC,MAAM,CAAC,CAAC;4BACf,uBAAuB,CAAE,CAAS;4BACpC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAFf,CAEe,CAAC;oBAElB,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAC/C,UAAC,MAAM,IAAK,OAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAArB,CAAqB,EACjC,UAAC,KAAK,IAAK,OAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAArB,CAAqB,CACjC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QAED,IAAM,OAAO,GAAgB;YAC3B,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;YACjC,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;YACrC,QAAQ;gBACN,iEAAiE;gBACjE,mEAAmE;gBACnE,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,cAAM,OAAA,QAAQ,CAAC,QAAQ,EAAE,EAAnB,CAAmB,CAAC,CAAC;YACnE,CAAC;SACF,CAAC;QAEF,IAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,cAAM,OAAA,GAAG,CAAC,WAAW,EAAE,EAAjB,CAAiB,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Observer } from \"./Observable.js\";\nimport { Observable } from \"./Observable.js\";\n\n// Like Observable.prototype.map, except that the mapping function can\n// optionally return a Promise (or be async).\nexport function asyncMap<V, R>(\n observable: Observable<V>,\n mapFn: (value: V) => R | PromiseLike<R>,\n catchFn?: (error: any) => R | PromiseLike<R>\n): Observable<R> {\n return new Observable<R>((observer) => {\n let promiseQueue = {\n // Normally we would initialize promiseQueue to Promise.resolve(), but\n // in this case, for backwards compatibility, we need to be careful to\n // invoke the first callback synchronously.\n then(callback: () => any) {\n return new Promise((resolve) => resolve(callback()));\n },\n } as Promise<void>;\n\n function makeCallback(\n examiner: typeof mapFn | typeof catchFn,\n key: \"next\" | \"error\"\n ): (arg: any) => void {\n return (arg) => {\n if (examiner) {\n const both = () =>\n // If the observer is closed, we don't want to continue calling the\n // mapping function - it's result will be swallowed anyways.\n observer.closed ?\n /* will be swallowed */ (0 as any)\n : examiner(arg);\n\n promiseQueue = promiseQueue.then(both, both).then(\n (result) => observer.next(result),\n (error) => observer.error(error)\n );\n } else {\n observer[key](arg);\n }\n };\n }\n\n const handler: Observer<V> = {\n next: makeCallback(mapFn, \"next\"),\n error: makeCallback(catchFn, \"error\"),\n complete() {\n // no need to reassign `promiseQueue`, after `observer.complete`,\n // the observer will be closed and short-circuit everything anyways\n /*promiseQueue = */ promiseQueue.then(() => observer.complete());\n },\n };\n\n const sub = observable.subscribe(handler);\n return () => sub.unsubscribe();\n });\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  export function iterateObserversSafely(observers, method, argument) {
2
+ // In case observers is modified during iteration, we need to commit to the
3
+ // original elements, which also provides an opportunity to filter them down
4
+ // to just the observers with the given method.
2
5
  var observersWithMethod = [];
3
6
  observers.forEach(function (obs) { return obs[method] && observersWithMethod.push(obs); });
4
7
  observersWithMethod.forEach(function (obs) { return obs[method](argument); });