@osdk/client 2.5.0-beta.1 → 2.5.0-beta.2

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 (293) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/build/browser/Client.js +1 -1
  3. package/build/browser/Client.js.map +1 -1
  4. package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
  5. package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
  6. package/build/browser/intellisense.test.js +14 -4
  7. package/build/browser/intellisense.test.js.map +1 -1
  8. package/build/browser/object/Cache.js +1 -1
  9. package/build/browser/object/Cache.js.map +1 -1
  10. package/build/browser/object/SimpleCache.js +1 -1
  11. package/build/browser/object/SimpleCache.js.map +1 -1
  12. package/build/browser/object/convertWireToOsdkObjects.js +4 -0
  13. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  14. package/build/browser/object/fetchPage.js +8 -4
  15. package/build/browser/object/fetchPage.js.map +1 -1
  16. package/build/browser/object/geotimeseriesreference.test.js +0 -2
  17. package/build/browser/object/geotimeseriesreference.test.js.map +1 -1
  18. package/build/browser/objectSet/createObjectSet.js +3 -1
  19. package/build/browser/objectSet/createObjectSet.js.map +1 -1
  20. package/build/browser/observable/LinkPayload.js +2 -0
  21. package/build/browser/observable/LinkPayload.js.map +1 -0
  22. package/build/browser/observable/ObjectPayload.js.map +1 -1
  23. package/build/browser/observable/ObservableClient/ObserveLink.js +17 -0
  24. package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -0
  25. package/build/browser/observable/ObservableClient/common.js +2 -0
  26. package/build/browser/observable/ObservableClient/common.js.map +1 -0
  27. package/build/browser/observable/ObservableClient.js +20 -0
  28. package/build/browser/observable/ObservableClient.js.map +1 -1
  29. package/build/browser/observable/Unsubscribable.js +2 -0
  30. package/build/browser/observable/Unsubscribable.js.map +1 -0
  31. package/build/browser/observable/internal/AbstractHelper.js +50 -0
  32. package/build/browser/observable/internal/AbstractHelper.js.map +1 -0
  33. package/build/browser/observable/internal/BaseCollectionQuery.js +2 -0
  34. package/build/browser/observable/internal/BaseCollectionQuery.js.map +1 -0
  35. package/build/browser/observable/internal/BulkObjectLoader.js +3 -3
  36. package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
  37. package/build/browser/observable/internal/CacheKeys.js +17 -2
  38. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  39. package/build/browser/observable/internal/Changes.js +6 -0
  40. package/build/browser/observable/internal/Changes.js.map +1 -1
  41. package/build/browser/observable/internal/KnownCacheKey.js +2 -0
  42. package/build/browser/observable/internal/KnownCacheKey.js.map +1 -0
  43. package/build/browser/observable/internal/Layer.js.map +1 -1
  44. package/build/browser/observable/internal/ListCacheKey.js +2 -0
  45. package/build/browser/observable/internal/ListCacheKey.js.map +1 -0
  46. package/build/browser/observable/internal/ListQuery.js +399 -161
  47. package/build/browser/observable/internal/ListQuery.js.map +1 -1
  48. package/build/browser/observable/internal/ObjectQuery.js +27 -2
  49. package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
  50. package/build/browser/observable/internal/ObservableClientImpl.js +42 -2
  51. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  52. package/build/browser/observable/internal/OptimisticJob.js +12 -3
  53. package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
  54. package/build/browser/observable/internal/Query.js +17 -3
  55. package/build/browser/observable/internal/Query.js.map +1 -1
  56. package/build/browser/observable/internal/QuerySubscription.js +41 -0
  57. package/build/browser/observable/internal/QuerySubscription.js.map +1 -0
  58. package/build/browser/observable/internal/Store.invalidation.test.js +481 -0
  59. package/build/browser/observable/internal/Store.invalidation.test.js.map +1 -0
  60. package/build/browser/observable/internal/Store.js +38 -91
  61. package/build/browser/observable/internal/Store.js.map +1 -1
  62. package/build/browser/observable/internal/Store.test.js +318 -63
  63. package/build/browser/observable/internal/Store.test.js.map +1 -1
  64. package/build/browser/observable/internal/UnsubscribableWrapper.js +30 -0
  65. package/build/browser/observable/internal/UnsubscribableWrapper.js.map +1 -0
  66. package/build/browser/observable/internal/createCollectionConnectable.js +50 -0
  67. package/build/browser/observable/internal/createCollectionConnectable.js.map +1 -0
  68. package/build/browser/observable/internal/createCollectionConnectable.test.js +599 -0
  69. package/build/browser/observable/internal/createCollectionConnectable.test.js.map +1 -0
  70. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +216 -0
  71. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
  72. package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
  73. package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
  74. package/build/browser/observable/internal/isObjectInstance.js +23 -0
  75. package/build/browser/observable/internal/isObjectInstance.js.map +1 -0
  76. package/build/browser/observable/internal/links/LinksHelper.js +37 -0
  77. package/build/browser/observable/internal/links/LinksHelper.js.map +1 -0
  78. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +2 -0
  79. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
  80. package/build/browser/observable/internal/links/SpecificLinkQuery.js +185 -0
  81. package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -0
  82. package/build/browser/observable/internal/list/ListsHelper.js +49 -0
  83. package/build/browser/observable/internal/list/ListsHelper.js.map +1 -0
  84. package/build/browser/observable/internal/object/ObjectsHelper.js +34 -0
  85. package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -0
  86. package/build/browser/observable/internal/removeDuplicates.js +36 -0
  87. package/build/browser/observable/internal/removeDuplicates.js.map +1 -0
  88. package/build/browser/observable/internal/sorting/SortingStrategy.js +78 -0
  89. package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -0
  90. package/build/browser/observable/internal/testUtils/invalidateList.js +23 -0
  91. package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -0
  92. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
  93. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
  94. package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
  95. package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
  96. package/build/browser/observable/internal/testUtils.js +70 -7
  97. package/build/browser/observable/internal/testUtils.js.map +1 -1
  98. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  99. package/build/browser/util/UserAgent.js +2 -2
  100. package/build/browser/util/streamutils.js +1 -1
  101. package/build/browser/util/streamutils.js.map +1 -1
  102. package/build/cjs/{chunk-URDXPIRU.cjs → chunk-N5DMNYGH.cjs} +58 -54
  103. package/build/cjs/chunk-N5DMNYGH.cjs.map +1 -0
  104. package/build/cjs/{chunk-BJYCRD5Y.cjs → chunk-NWD33DSJ.cjs} +23 -19
  105. package/build/cjs/chunk-NWD33DSJ.cjs.map +1 -0
  106. package/build/cjs/index.cjs +7 -7
  107. package/build/cjs/public/internal.cjs +8 -8
  108. package/build/cjs/public/unstable-do-not-use.cjs +779 -268
  109. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  110. package/build/cjs/public/unstable-do-not-use.d.cts +161 -12
  111. package/build/esm/Client.js +1 -1
  112. package/build/esm/Client.js.map +1 -1
  113. package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
  114. package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
  115. package/build/esm/intellisense.test.js +14 -4
  116. package/build/esm/intellisense.test.js.map +1 -1
  117. package/build/esm/object/Cache.js +1 -1
  118. package/build/esm/object/Cache.js.map +1 -1
  119. package/build/esm/object/SimpleCache.js +1 -1
  120. package/build/esm/object/SimpleCache.js.map +1 -1
  121. package/build/esm/object/convertWireToOsdkObjects.js +4 -0
  122. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  123. package/build/esm/object/fetchPage.js +8 -4
  124. package/build/esm/object/fetchPage.js.map +1 -1
  125. package/build/esm/object/geotimeseriesreference.test.js +0 -2
  126. package/build/esm/object/geotimeseriesreference.test.js.map +1 -1
  127. package/build/esm/objectSet/createObjectSet.js +3 -1
  128. package/build/esm/objectSet/createObjectSet.js.map +1 -1
  129. package/build/esm/observable/LinkPayload.js +2 -0
  130. package/build/esm/observable/LinkPayload.js.map +1 -0
  131. package/build/esm/observable/ObjectPayload.js.map +1 -1
  132. package/build/esm/observable/ObservableClient/ObserveLink.js +17 -0
  133. package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -0
  134. package/build/esm/observable/ObservableClient/common.js +2 -0
  135. package/build/esm/observable/ObservableClient/common.js.map +1 -0
  136. package/build/esm/observable/ObservableClient.js +20 -0
  137. package/build/esm/observable/ObservableClient.js.map +1 -1
  138. package/build/esm/observable/Unsubscribable.js +2 -0
  139. package/build/esm/observable/Unsubscribable.js.map +1 -0
  140. package/build/esm/observable/internal/AbstractHelper.js +50 -0
  141. package/build/esm/observable/internal/AbstractHelper.js.map +1 -0
  142. package/build/esm/observable/internal/BaseCollectionQuery.js +2 -0
  143. package/build/esm/observable/internal/BaseCollectionQuery.js.map +1 -0
  144. package/build/esm/observable/internal/BulkObjectLoader.js +3 -3
  145. package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
  146. package/build/esm/observable/internal/CacheKeys.js +17 -2
  147. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  148. package/build/esm/observable/internal/Changes.js +6 -0
  149. package/build/esm/observable/internal/Changes.js.map +1 -1
  150. package/build/esm/observable/internal/KnownCacheKey.js +2 -0
  151. package/build/esm/observable/internal/KnownCacheKey.js.map +1 -0
  152. package/build/esm/observable/internal/Layer.js.map +1 -1
  153. package/build/esm/observable/internal/ListCacheKey.js +2 -0
  154. package/build/esm/observable/internal/ListCacheKey.js.map +1 -0
  155. package/build/esm/observable/internal/ListQuery.js +399 -161
  156. package/build/esm/observable/internal/ListQuery.js.map +1 -1
  157. package/build/esm/observable/internal/ObjectQuery.js +27 -2
  158. package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
  159. package/build/esm/observable/internal/ObservableClientImpl.js +42 -2
  160. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  161. package/build/esm/observable/internal/OptimisticJob.js +12 -3
  162. package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
  163. package/build/esm/observable/internal/Query.js +17 -3
  164. package/build/esm/observable/internal/Query.js.map +1 -1
  165. package/build/esm/observable/internal/QuerySubscription.js +41 -0
  166. package/build/esm/observable/internal/QuerySubscription.js.map +1 -0
  167. package/build/esm/observable/internal/Store.invalidation.test.js +481 -0
  168. package/build/esm/observable/internal/Store.invalidation.test.js.map +1 -0
  169. package/build/esm/observable/internal/Store.js +38 -91
  170. package/build/esm/observable/internal/Store.js.map +1 -1
  171. package/build/esm/observable/internal/Store.test.js +318 -63
  172. package/build/esm/observable/internal/Store.test.js.map +1 -1
  173. package/build/esm/observable/internal/UnsubscribableWrapper.js +30 -0
  174. package/build/esm/observable/internal/UnsubscribableWrapper.js.map +1 -0
  175. package/build/esm/observable/internal/createCollectionConnectable.js +50 -0
  176. package/build/esm/observable/internal/createCollectionConnectable.js.map +1 -0
  177. package/build/esm/observable/internal/createCollectionConnectable.test.js +599 -0
  178. package/build/esm/observable/internal/createCollectionConnectable.test.js.map +1 -0
  179. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +216 -0
  180. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
  181. package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
  182. package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
  183. package/build/esm/observable/internal/isObjectInstance.js +23 -0
  184. package/build/esm/observable/internal/isObjectInstance.js.map +1 -0
  185. package/build/esm/observable/internal/links/LinksHelper.js +37 -0
  186. package/build/esm/observable/internal/links/LinksHelper.js.map +1 -0
  187. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +2 -0
  188. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
  189. package/build/esm/observable/internal/links/SpecificLinkQuery.js +185 -0
  190. package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -0
  191. package/build/esm/observable/internal/list/ListsHelper.js +49 -0
  192. package/build/esm/observable/internal/list/ListsHelper.js.map +1 -0
  193. package/build/esm/observable/internal/object/ObjectsHelper.js +34 -0
  194. package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -0
  195. package/build/esm/observable/internal/removeDuplicates.js +36 -0
  196. package/build/esm/observable/internal/removeDuplicates.js.map +1 -0
  197. package/build/esm/observable/internal/sorting/SortingStrategy.js +78 -0
  198. package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -0
  199. package/build/esm/observable/internal/testUtils/invalidateList.js +23 -0
  200. package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -0
  201. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
  202. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
  203. package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
  204. package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
  205. package/build/esm/observable/internal/testUtils.js +70 -7
  206. package/build/esm/observable/internal/testUtils.js.map +1 -1
  207. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  208. package/build/esm/util/UserAgent.js +2 -2
  209. package/build/esm/util/streamutils.js +1 -1
  210. package/build/esm/util/streamutils.js.map +1 -1
  211. package/build/types/Client.d.ts +1 -1
  212. package/build/types/object/fetchPage.d.ts.map +1 -1
  213. package/build/types/observable/LinkPayload.d.ts +9 -0
  214. package/build/types/observable/LinkPayload.d.ts.map +1 -0
  215. package/build/types/observable/ObjectPayload.d.ts +4 -0
  216. package/build/types/observable/ObjectPayload.d.ts.map +1 -1
  217. package/build/types/observable/ObservableClient/ObserveLink.d.ts +32 -0
  218. package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -0
  219. package/build/types/observable/ObservableClient/common.d.ts +67 -0
  220. package/build/types/observable/ObservableClient/common.d.ts.map +1 -0
  221. package/build/types/observable/ObservableClient.d.ts +82 -15
  222. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  223. package/build/types/observable/Unsubscribable.d.ts +3 -0
  224. package/build/types/observable/Unsubscribable.d.ts.map +1 -0
  225. package/build/types/observable/internal/AbstractHelper.d.ts +15 -0
  226. package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -0
  227. package/build/types/observable/internal/BaseCollectionQuery.d.ts +64 -0
  228. package/build/types/observable/internal/BaseCollectionQuery.d.ts.map +1 -0
  229. package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
  230. package/build/types/observable/internal/CacheKeys.d.ts +10 -4
  231. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  232. package/build/types/observable/internal/Changes.d.ts +7 -4
  233. package/build/types/observable/internal/Changes.d.ts.map +1 -1
  234. package/build/types/observable/internal/KnownCacheKey.d.ts +4 -0
  235. package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -0
  236. package/build/types/observable/internal/Layer.d.ts +7 -7
  237. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  238. package/build/types/observable/internal/ListCacheKey.d.ts +7 -0
  239. package/build/types/observable/internal/ListCacheKey.d.ts.map +1 -0
  240. package/build/types/observable/internal/ListQuery.d.ts +160 -21
  241. package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
  242. package/build/types/observable/internal/ObjectQuery.d.ts +3 -1
  243. package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
  244. package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
  245. package/build/types/observable/internal/Query.d.ts +6 -5
  246. package/build/types/observable/internal/Query.d.ts.map +1 -1
  247. package/build/types/observable/internal/QuerySubscription.d.ts +1 -0
  248. package/build/types/observable/internal/QuerySubscription.d.ts.map +1 -0
  249. package/build/types/observable/internal/Store.d.ts +34 -31
  250. package/build/types/observable/internal/Store.d.ts.map +1 -1
  251. package/build/types/observable/internal/Store.invalidation.test.d.ts +1 -0
  252. package/build/types/observable/internal/Store.invalidation.test.d.ts.map +1 -0
  253. package/build/types/observable/internal/Store.test.d.ts +4 -1
  254. package/build/types/observable/internal/Store.test.d.ts.map +1 -1
  255. package/build/types/observable/internal/UnsubscribableWrapper.d.ts +1 -0
  256. package/build/types/observable/internal/UnsubscribableWrapper.d.ts.map +1 -0
  257. package/build/types/observable/internal/createCollectionConnectable.d.ts +38 -0
  258. package/build/types/observable/internal/createCollectionConnectable.d.ts.map +1 -0
  259. package/build/types/observable/internal/createCollectionConnectable.test.d.ts +1 -0
  260. package/build/types/observable/internal/createCollectionConnectable.test.d.ts.map +1 -0
  261. package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts +9 -0
  262. package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts.map +1 -0
  263. package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts +1 -0
  264. package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts.map +1 -0
  265. package/build/types/observable/internal/isObjectInstance.d.ts +5 -0
  266. package/build/types/observable/internal/isObjectInstance.d.ts.map +1 -0
  267. package/build/types/observable/internal/links/LinksHelper.d.ts +29 -0
  268. package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -0
  269. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +17 -0
  270. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -0
  271. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +45 -0
  272. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -0
  273. package/build/types/observable/internal/list/ListsHelper.d.ts +17 -0
  274. package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -0
  275. package/build/types/observable/internal/object/ObjectsHelper.d.ts +11 -0
  276. package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -0
  277. package/build/types/observable/internal/removeDuplicates.d.ts +11 -0
  278. package/build/types/observable/internal/removeDuplicates.d.ts.map +1 -0
  279. package/build/types/observable/internal/sorting/SortingStrategy.d.ts +41 -0
  280. package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -0
  281. package/build/types/observable/internal/testUtils/invalidateList.d.ts +9 -0
  282. package/build/types/observable/internal/testUtils/invalidateList.d.ts.map +1 -0
  283. package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts +46 -0
  284. package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts.map +1 -0
  285. package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts +26 -0
  286. package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts.map +1 -0
  287. package/build/types/observable/internal/testUtils.d.ts +25 -3
  288. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  289. package/build/types/public/unstable-do-not-use.d.ts +4 -2
  290. package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
  291. package/package.json +10 -10
  292. package/build/cjs/chunk-BJYCRD5Y.cjs.map +0 -1
  293. package/build/cjs/chunk-URDXPIRU.cjs.map +0 -1
@@ -0,0 +1,599 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { BehaviorSubject } from "rxjs";
18
+ import { beforeEach, describe, expect, it, vi } from "vitest";
19
+ import { createCollectionConnectable as actualCreateCollectionConnectable } from "./createCollectionConnectable.js";
20
+ import { createClientMockHelper, mockObserver, waitForCall } from "./testUtils.js";
21
+
22
+ // Test payload type for our collection
23
+
24
+ // Mock object instances for testing
25
+ const mockEmployee1 = {
26
+ $apiName: "Employee",
27
+ $primaryKey: 1,
28
+ $objectType: "Employee",
29
+ $title: "Employee 1",
30
+ employeeId: 1,
31
+ fullName: "John Doe"
32
+ };
33
+ const mockEmployee2 = {
34
+ $apiName: "Employee",
35
+ $primaryKey: 2,
36
+ $objectType: "Employee",
37
+ $title: "Employee 2",
38
+ employeeId: 2,
39
+ fullName: "Jane Smith"
40
+ };
41
+ const mockEmployee3 = {
42
+ $apiName: "Employee",
43
+ $primaryKey: 3,
44
+ $objectType: "Employee",
45
+ $title: "Employee 3",
46
+ employeeId: 3,
47
+ fullName: "Bob Johnson"
48
+ };
49
+ describe("createCollectionConnectable", () => {
50
+ let mockStore;
51
+ let createPayload;
52
+ let mockListCacheKey;
53
+ beforeEach(() => {
54
+ const {
55
+ client
56
+ } = createClientMockHelper();
57
+
58
+ // Mock the store with minimal required methods
59
+ mockStore = {
60
+ getSubject: vi.fn()
61
+ };
62
+
63
+ // Mock cache key for list
64
+ mockListCacheKey = {
65
+ type: "list",
66
+ otherKeys: ["Employee", {}, {}]
67
+ };
68
+
69
+ // Create payload function that mimics real usage
70
+ createPayload = vi.fn(params => ({
71
+ data: params.resolvedData,
72
+ status: params.status,
73
+ isOptimistic: params.isOptimistic,
74
+ lastUpdated: params.lastUpdated,
75
+ count: params.resolvedData.length
76
+ }));
77
+ });
78
+ describe("basic functionality", () => {
79
+ it("should create a connectable observable with resolved data", async () => {
80
+ // Mock object cache keys
81
+ const objectKey1 = {
82
+ type: "object",
83
+ otherKeys: ["Employee", 1]
84
+ };
85
+ const objectKey2 = {
86
+ type: "object",
87
+ otherKeys: ["Employee", 2]
88
+ };
89
+
90
+ // Create subject payload with mock data
91
+ const subjectPayload = {
92
+ cacheKey: mockListCacheKey,
93
+ value: {
94
+ data: [objectKey1, objectKey2]
95
+ },
96
+ status: "loaded",
97
+ lastUpdated: Date.now(),
98
+ isOptimistic: false
99
+ };
100
+ const subject = new BehaviorSubject(subjectPayload);
101
+
102
+ // Mock store.getSubject to return object observables
103
+ vi.mocked(mockStore.getSubject).mockImplementation(cacheKey => {
104
+ if (cacheKey === objectKey1) {
105
+ return new BehaviorSubject({
106
+ cacheKey: objectKey1,
107
+ value: mockEmployee1,
108
+ status: "loaded",
109
+ lastUpdated: Date.now(),
110
+ isOptimistic: false
111
+ });
112
+ }
113
+ if (cacheKey === objectKey2) {
114
+ return new BehaviorSubject({
115
+ cacheKey: objectKey2,
116
+ value: mockEmployee2,
117
+ status: "loaded",
118
+ lastUpdated: Date.now(),
119
+ isOptimistic: false
120
+ });
121
+ }
122
+ return new BehaviorSubject(undefined);
123
+ });
124
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
125
+
126
+ // Connect and subscribe
127
+ const subscription = connectable.connect();
128
+ const observer = mockObserver();
129
+ connectable.subscribe(observer);
130
+
131
+ // Wait for the observable to emit
132
+ await waitForCall(observer);
133
+
134
+ // Verify the result
135
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
136
+ data: [mockEmployee1, mockEmployee2],
137
+ status: "loaded",
138
+ isOptimistic: false,
139
+ count: 2
140
+ }));
141
+ subscription.unsubscribe();
142
+ });
143
+ it("should handle empty data correctly", async () => {
144
+ const subjectPayload = {
145
+ cacheKey: mockListCacheKey,
146
+ value: {
147
+ data: []
148
+ },
149
+ status: "loaded",
150
+ lastUpdated: Date.now(),
151
+ isOptimistic: false
152
+ };
153
+ const subject = new BehaviorSubject(subjectPayload);
154
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
155
+ const subscription = connectable.connect();
156
+ const observer = mockObserver();
157
+ connectable.subscribe(observer);
158
+ await waitForCall(observer);
159
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
160
+ data: [],
161
+ status: "loaded",
162
+ isOptimistic: false,
163
+ count: 0
164
+ }));
165
+ subscription.unsubscribe();
166
+ });
167
+ it("should handle null/undefined data", async () => {
168
+ const subjectPayload = {
169
+ cacheKey: mockListCacheKey,
170
+ value: {
171
+ data: null
172
+ },
173
+ status: "loaded",
174
+ lastUpdated: Date.now(),
175
+ isOptimistic: false
176
+ };
177
+ const subject = new BehaviorSubject(subjectPayload);
178
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
179
+ const subscription = connectable.connect();
180
+ const observer = mockObserver();
181
+ connectable.subscribe(observer);
182
+ await waitForCall(observer);
183
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
184
+ data: [],
185
+ status: "loaded",
186
+ isOptimistic: false,
187
+ count: 0
188
+ }));
189
+ subscription.unsubscribe();
190
+ });
191
+ });
192
+ describe("optimistic updates", () => {
193
+ it("should propagate optimistic flag correctly", async () => {
194
+ const objectKey1 = {
195
+ type: "object",
196
+ otherKeys: ["Employee", 1]
197
+ };
198
+ const subjectPayload = {
199
+ cacheKey: mockListCacheKey,
200
+ value: {
201
+ data: [objectKey1]
202
+ },
203
+ status: "loading",
204
+ lastUpdated: Date.now(),
205
+ isOptimistic: true // This is an optimistic update
206
+ };
207
+ const subject = new BehaviorSubject(subjectPayload);
208
+ vi.mocked(mockStore.getSubject).mockReturnValue(new BehaviorSubject({
209
+ cacheKey: objectKey1,
210
+ value: mockEmployee1,
211
+ status: "loaded",
212
+ lastUpdated: Date.now(),
213
+ isOptimistic: false
214
+ }));
215
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
216
+ const subscription = connectable.connect();
217
+ const observer = mockObserver();
218
+ connectable.subscribe(observer);
219
+ await waitForCall(observer);
220
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
221
+ data: [mockEmployee1],
222
+ status: "loading",
223
+ isOptimistic: true,
224
+ // Should preserve optimistic flag
225
+ count: 1
226
+ }));
227
+ subscription.unsubscribe();
228
+ });
229
+ });
230
+ describe("status transitions", () => {
231
+ it("should handle different status values", async () => {
232
+ const objectKey1 = {
233
+ type: "object",
234
+ otherKeys: ["Employee", 1]
235
+ };
236
+ const basePayload = {
237
+ cacheKey: mockListCacheKey,
238
+ value: {
239
+ data: [objectKey1]
240
+ },
241
+ status: "init",
242
+ lastUpdated: Date.now(),
243
+ isOptimistic: false
244
+ };
245
+ const subject = new BehaviorSubject(basePayload);
246
+ vi.mocked(mockStore.getSubject).mockReturnValue(new BehaviorSubject({
247
+ cacheKey: objectKey1,
248
+ value: mockEmployee1,
249
+ status: "loaded",
250
+ lastUpdated: Date.now(),
251
+ isOptimistic: false
252
+ }));
253
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
254
+ const subscription = connectable.connect();
255
+ const observer = mockObserver();
256
+ connectable.subscribe(observer);
257
+
258
+ // Wait for initial emission
259
+ await waitForCall(observer);
260
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
261
+ data: [mockEmployee1],
262
+ status: "init",
263
+ isOptimistic: false,
264
+ count: 1
265
+ }));
266
+ observer.next.mockClear();
267
+
268
+ // Test transition to loading
269
+ subject.next({
270
+ ...basePayload,
271
+ status: "loading",
272
+ lastUpdated: Date.now()
273
+ });
274
+ await waitForCall(observer);
275
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
276
+ data: [mockEmployee1],
277
+ status: "loading",
278
+ isOptimistic: false,
279
+ count: 1
280
+ }));
281
+ subscription.unsubscribe();
282
+ });
283
+ });
284
+ describe("multiple objects", () => {
285
+ it("should handle multiple objects in collection", async () => {
286
+ const objectKey1 = {
287
+ type: "object",
288
+ otherKeys: ["Employee", 1]
289
+ };
290
+ const objectKey2 = {
291
+ type: "object",
292
+ otherKeys: ["Employee", 2]
293
+ };
294
+ const objectKey3 = {
295
+ type: "object",
296
+ otherKeys: ["Employee", 3]
297
+ };
298
+ const subjectPayload = {
299
+ cacheKey: mockListCacheKey,
300
+ value: {
301
+ data: [objectKey1, objectKey2, objectKey3]
302
+ },
303
+ status: "loaded",
304
+ lastUpdated: Date.now(),
305
+ isOptimistic: false
306
+ };
307
+ const subject = new BehaviorSubject(subjectPayload);
308
+
309
+ // Mock store.getSubject for all three objects
310
+ vi.mocked(mockStore.getSubject).mockImplementation(cacheKey => {
311
+ if (cacheKey === objectKey1) {
312
+ return new BehaviorSubject({
313
+ cacheKey: objectKey1,
314
+ value: mockEmployee1,
315
+ status: "loaded",
316
+ lastUpdated: Date.now(),
317
+ isOptimistic: false
318
+ });
319
+ }
320
+ if (cacheKey === objectKey2) {
321
+ return new BehaviorSubject({
322
+ cacheKey: objectKey2,
323
+ value: mockEmployee2,
324
+ status: "loaded",
325
+ lastUpdated: Date.now(),
326
+ isOptimistic: false
327
+ });
328
+ }
329
+ if (cacheKey === objectKey3) {
330
+ return new BehaviorSubject({
331
+ cacheKey: objectKey3,
332
+ value: mockEmployee3,
333
+ status: "loaded",
334
+ lastUpdated: Date.now(),
335
+ isOptimistic: false
336
+ });
337
+ }
338
+ return new BehaviorSubject(undefined);
339
+ });
340
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
341
+ const subscription = connectable.connect();
342
+ const observer = mockObserver();
343
+ connectable.subscribe(observer);
344
+ await waitForCall(observer);
345
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
346
+ data: [mockEmployee1, mockEmployee2, mockEmployee3],
347
+ status: "loaded",
348
+ isOptimistic: false,
349
+ count: 3
350
+ }));
351
+ subscription.unsubscribe();
352
+ });
353
+ it("should handle objects being added/removed from collection", async () => {
354
+ const objectKey1 = {
355
+ type: "object",
356
+ otherKeys: ["Employee", 1]
357
+ };
358
+ const objectKey2 = {
359
+ type: "object",
360
+ otherKeys: ["Employee", 2]
361
+ };
362
+
363
+ // Start with one object
364
+ const initialPayload = {
365
+ cacheKey: mockListCacheKey,
366
+ value: {
367
+ data: [objectKey1]
368
+ },
369
+ status: "loaded",
370
+ lastUpdated: Date.now(),
371
+ isOptimistic: false
372
+ };
373
+ const subject = new BehaviorSubject(initialPayload);
374
+ vi.mocked(mockStore.getSubject).mockImplementation(cacheKey => {
375
+ if (cacheKey === objectKey1) {
376
+ return new BehaviorSubject({
377
+ cacheKey: objectKey1,
378
+ value: mockEmployee1,
379
+ status: "loaded",
380
+ lastUpdated: Date.now(),
381
+ isOptimistic: false
382
+ });
383
+ }
384
+ if (cacheKey === objectKey2) {
385
+ return new BehaviorSubject({
386
+ cacheKey: objectKey2,
387
+ value: mockEmployee2,
388
+ status: "loaded",
389
+ lastUpdated: Date.now(),
390
+ isOptimistic: false
391
+ });
392
+ }
393
+ return new BehaviorSubject(undefined);
394
+ });
395
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
396
+ const subscription = connectable.connect();
397
+ const observer = mockObserver();
398
+ connectable.subscribe(observer);
399
+
400
+ // First check - single object
401
+ await waitForCall(observer);
402
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
403
+ data: [mockEmployee1],
404
+ count: 1
405
+ }));
406
+ observer.next.mockClear();
407
+
408
+ // Add second object
409
+ subject.next({
410
+ ...initialPayload,
411
+ value: {
412
+ data: [objectKey1, objectKey2]
413
+ },
414
+ lastUpdated: Date.now()
415
+ });
416
+
417
+ // Second check - two objects
418
+ await waitForCall(observer);
419
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
420
+ data: [mockEmployee1, mockEmployee2],
421
+ count: 2
422
+ }));
423
+ subscription.unsubscribe();
424
+ });
425
+ });
426
+ describe("subscription behavior", () => {
427
+ it("should support multiple subscribers", async () => {
428
+ const objectKey1 = {
429
+ type: "object",
430
+ otherKeys: ["Employee", 1]
431
+ };
432
+ const subjectPayload = {
433
+ cacheKey: mockListCacheKey,
434
+ value: {
435
+ data: [objectKey1]
436
+ },
437
+ status: "loaded",
438
+ lastUpdated: Date.now(),
439
+ isOptimistic: false
440
+ };
441
+ const subject = new BehaviorSubject(subjectPayload);
442
+ vi.mocked(mockStore.getSubject).mockReturnValue(new BehaviorSubject({
443
+ cacheKey: objectKey1,
444
+ value: mockEmployee1,
445
+ status: "loaded",
446
+ lastUpdated: Date.now(),
447
+ isOptimistic: false
448
+ }));
449
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
450
+ const subscription = connectable.connect();
451
+ const observer1 = mockObserver();
452
+ const observer2 = mockObserver();
453
+ connectable.subscribe(observer1);
454
+ connectable.subscribe(observer2);
455
+ await waitForCall(observer1);
456
+ await waitForCall(observer2);
457
+
458
+ // Both observers should receive the data
459
+ expect(observer1.next).toHaveBeenCalledWith(expect.objectContaining({
460
+ data: [mockEmployee1],
461
+ count: 1
462
+ }));
463
+ expect(observer2.next).toHaveBeenCalledWith(expect.objectContaining({
464
+ data: [mockEmployee1],
465
+ count: 1
466
+ }));
467
+ subscription.unsubscribe();
468
+ });
469
+ it("should use ReplaySubject behavior (last value replayed)", async () => {
470
+ const objectKey1 = {
471
+ type: "object",
472
+ otherKeys: ["Employee", 1]
473
+ };
474
+ const subjectPayload = {
475
+ cacheKey: mockListCacheKey,
476
+ value: {
477
+ data: [objectKey1]
478
+ },
479
+ status: "loaded",
480
+ lastUpdated: Date.now(),
481
+ isOptimistic: false
482
+ };
483
+ const subject = new BehaviorSubject(subjectPayload);
484
+ vi.mocked(mockStore.getSubject).mockReturnValue(new BehaviorSubject({
485
+ cacheKey: objectKey1,
486
+ value: mockEmployee1,
487
+ status: "loaded",
488
+ lastUpdated: Date.now(),
489
+ isOptimistic: false
490
+ }));
491
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
492
+ const subscription = connectable.connect();
493
+ const observer1 = mockObserver();
494
+
495
+ // Subscribe first observer
496
+ connectable.subscribe(observer1);
497
+ await waitForCall(observer1);
498
+ expect(observer1.next).toHaveBeenCalledTimes(1);
499
+ observer1.next.mockClear();
500
+
501
+ // Subscribe second observer after first has already received data
502
+ const observer2 = mockObserver();
503
+ connectable.subscribe(observer2);
504
+ await waitForCall(observer2);
505
+
506
+ // Second observer should immediately receive the last value (ReplaySubject behavior)
507
+ expect(observer2.next).toHaveBeenCalledWith(expect.objectContaining({
508
+ data: [mockEmployee1],
509
+ count: 1
510
+ }));
511
+
512
+ // First observer should not receive additional calls
513
+ expect(observer1.next).not.toHaveBeenCalled();
514
+ subscription.unsubscribe();
515
+ });
516
+ });
517
+ describe("error handling", () => {
518
+ it("should handle store.getSubject returning undefined object entry", async () => {
519
+ const objectKey1 = {
520
+ type: "object",
521
+ otherKeys: ["Employee", 1]
522
+ };
523
+ const subjectPayload = {
524
+ cacheKey: mockListCacheKey,
525
+ value: {
526
+ data: [objectKey1]
527
+ },
528
+ status: "loaded",
529
+ lastUpdated: Date.now(),
530
+ isOptimistic: false
531
+ };
532
+ const subject = new BehaviorSubject(subjectPayload);
533
+
534
+ // Mock store.getSubject to return undefined entry - this creates an object with undefined value
535
+ vi.mocked(mockStore.getSubject).mockReturnValue(new BehaviorSubject({
536
+ cacheKey: objectKey1,
537
+ value: undefined,
538
+ // This is the key - undefined value
539
+ status: "loaded",
540
+ lastUpdated: Date.now(),
541
+ isOptimistic: false
542
+ }));
543
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, createPayload);
544
+ const subscription = connectable.connect();
545
+ const observer = mockObserver();
546
+ connectable.subscribe(observer);
547
+ await waitForCall(observer);
548
+
549
+ // Should handle undefined object entry gracefully by filtering it out
550
+ expect(observer.next).toHaveBeenCalledWith(expect.objectContaining({
551
+ data: [undefined],
552
+ // The function maps the undefined value from the store
553
+ status: "loaded",
554
+ count: 1
555
+ }));
556
+ subscription.unsubscribe();
557
+ });
558
+ it("should handle createPayload function throwing errors", async () => {
559
+ const objectKey1 = {
560
+ type: "object",
561
+ otherKeys: ["Employee", 1]
562
+ };
563
+ const subjectPayload = {
564
+ cacheKey: mockListCacheKey,
565
+ value: {
566
+ data: [objectKey1]
567
+ },
568
+ status: "loaded",
569
+ lastUpdated: Date.now(),
570
+ isOptimistic: false
571
+ };
572
+ const subject = new BehaviorSubject(subjectPayload);
573
+ vi.mocked(mockStore.getSubject).mockReturnValue(new BehaviorSubject({
574
+ cacheKey: objectKey1,
575
+ value: mockEmployee1,
576
+ status: "loaded",
577
+ lastUpdated: Date.now(),
578
+ isOptimistic: false
579
+ }));
580
+
581
+ // Mock createPayload to throw an error
582
+ const errorThrowingCreatePayload = vi.fn(() => {
583
+ throw new Error("Test error in createPayload");
584
+ });
585
+ const connectable = actualCreateCollectionConnectable(subject, mockStore, errorThrowingCreatePayload);
586
+ const subscription = connectable.connect();
587
+ const observer = mockObserver();
588
+ connectable.subscribe(observer);
589
+ await waitForCall(observer.error);
590
+
591
+ // Should call the error handler
592
+ expect(observer.error).toHaveBeenCalledWith(expect.objectContaining({
593
+ message: "Test error in createPayload"
594
+ }));
595
+ subscription.unsubscribe();
596
+ });
597
+ });
598
+ });
599
+ //# sourceMappingURL=createCollectionConnectable.test.js.map