@osdk/client 2.4.2 → 2.5.0-beta.10

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 (521) hide show
  1. package/CHANGELOG.md +106 -93
  2. package/build/browser/Client.js +1 -1
  3. package/build/browser/Client.js.map +1 -1
  4. package/build/browser/MinimalClientContext.js.map +1 -1
  5. package/build/browser/actions/applyAction.js +4 -0
  6. package/build/browser/actions/applyAction.js.map +1 -1
  7. package/build/browser/createClient.js +6 -2
  8. package/build/browser/createClient.js.map +1 -1
  9. package/build/browser/createMinimalClient.js +2 -1
  10. package/build/browser/createMinimalClient.js.map +1 -1
  11. package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +17 -0
  12. package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
  13. package/build/browser/fetchMetadata.test.js +11 -0
  14. package/build/browser/fetchMetadata.test.js.map +1 -1
  15. package/build/browser/index.js +3 -1
  16. package/build/browser/index.js.map +1 -1
  17. package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
  18. package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
  19. package/build/browser/intellisense.test.js +14 -4
  20. package/build/browser/intellisense.test.js.map +1 -1
  21. package/build/browser/object/Cache.js +1 -1
  22. package/build/browser/object/Cache.js.map +1 -1
  23. package/build/browser/object/Cache.test.js +1 -1
  24. package/build/browser/object/Cache.test.js.map +1 -1
  25. package/build/browser/object/SimpleCache.js +1 -1
  26. package/build/browser/object/SimpleCache.js.map +1 -1
  27. package/build/browser/object/aggregate.js +2 -0
  28. package/build/browser/object/aggregate.js.map +1 -1
  29. package/build/browser/object/aggregate.test.js +30 -0
  30. package/build/browser/object/aggregate.test.js.map +1 -1
  31. package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
  32. package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
  33. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
  34. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  35. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
  36. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  37. package/build/browser/object/convertWireToOsdkObjects.js +4 -0
  38. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  39. package/build/browser/object/convertWireToOsdkObjects.test.js +14 -0
  40. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  41. package/build/browser/object/fetchPage.js +96 -21
  42. package/build/browser/object/fetchPage.js.map +1 -1
  43. package/build/browser/object/fetchPage.test.js +35 -1
  44. package/build/browser/object/fetchPage.test.js.map +1 -1
  45. package/build/browser/object/geotimeseriesreference.test.js +0 -2
  46. package/build/browser/object/geotimeseriesreference.test.js.map +1 -1
  47. package/build/browser/object/mediaUpload.js +3 -0
  48. package/build/browser/object/mediaUpload.js.map +1 -1
  49. package/build/browser/objectSet/ObjectSet.test.js +6 -0
  50. package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
  51. package/build/browser/objectSet/ObjectSetListenerWebsocket.js +31 -9
  52. package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  53. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
  54. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  55. package/build/browser/objectSet/createObjectSet.js +3 -1
  56. package/build/browser/objectSet/createObjectSet.js.map +1 -1
  57. package/build/browser/observable/LinkPayload.js +2 -0
  58. package/build/browser/observable/LinkPayload.js.map +1 -0
  59. package/build/browser/observable/ObjectPayload.js.map +1 -1
  60. package/build/browser/observable/ObservableClient/ObserveLink.js +17 -0
  61. package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -0
  62. package/build/browser/observable/ObservableClient/common.js +2 -0
  63. package/build/browser/observable/ObservableClient/common.js.map +1 -0
  64. package/build/browser/observable/ObservableClient.js +20 -0
  65. package/build/browser/observable/ObservableClient.js.map +1 -1
  66. package/build/browser/observable/Unsubscribable.js +2 -0
  67. package/build/browser/observable/Unsubscribable.js.map +1 -0
  68. package/build/browser/observable/internal/AbstractHelper.js +54 -0
  69. package/build/browser/observable/internal/AbstractHelper.js.map +1 -0
  70. package/build/browser/observable/internal/BatchContext.js +2 -0
  71. package/build/browser/observable/internal/BatchContext.js.map +1 -0
  72. package/build/browser/observable/internal/BulkObjectLoader.js +3 -3
  73. package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
  74. package/build/browser/observable/internal/CacheKeys.js +65 -25
  75. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  76. package/build/browser/observable/internal/Changes.js +6 -0
  77. package/build/browser/observable/internal/Changes.js.map +1 -1
  78. package/build/browser/observable/internal/KnownCacheKey.js +2 -0
  79. package/build/browser/observable/internal/KnownCacheKey.js.map +1 -0
  80. package/build/browser/observable/internal/Layer.js +0 -8
  81. package/build/browser/observable/internal/Layer.js.map +1 -1
  82. package/build/browser/observable/internal/Layers.js +151 -0
  83. package/build/browser/observable/internal/Layers.js.map +1 -0
  84. package/build/browser/observable/internal/ObservableClientImpl.js +54 -3
  85. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  86. package/build/browser/observable/internal/OrderByCanonicalizer.js +1 -37
  87. package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -1
  88. package/build/browser/observable/internal/Queries.js +40 -0
  89. package/build/browser/observable/internal/Queries.js.map +1 -0
  90. package/build/browser/observable/internal/Query.js +45 -4
  91. package/build/browser/observable/internal/Query.js.map +1 -1
  92. package/build/browser/observable/internal/QuerySubscription.js +48 -0
  93. package/build/browser/observable/internal/QuerySubscription.js.map +1 -0
  94. package/build/browser/observable/internal/Store.invalidation.test.js +646 -0
  95. package/build/browser/observable/internal/Store.invalidation.test.js.map +1 -0
  96. package/build/browser/observable/internal/Store.js +87 -308
  97. package/build/browser/observable/internal/Store.js.map +1 -1
  98. package/build/browser/observable/internal/Store.test.js +330 -73
  99. package/build/browser/observable/internal/Store.test.js.map +1 -1
  100. package/build/browser/observable/internal/SubjectPayload.js +2 -0
  101. package/build/browser/observable/internal/SubjectPayload.js.map +1 -0
  102. package/build/browser/observable/internal/Subjects.js +55 -0
  103. package/build/browser/observable/internal/Subjects.js.map +1 -0
  104. package/build/browser/observable/internal/UnsubscribableWrapper.js +30 -0
  105. package/build/browser/observable/internal/UnsubscribableWrapper.js.map +1 -0
  106. package/build/browser/observable/internal/WeakRefTrie.js +61 -0
  107. package/build/browser/observable/internal/WeakRefTrie.js.map +1 -0
  108. package/build/browser/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
  109. package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -0
  110. package/build/{esm/observable/internal → browser/observable/internal/actions}/OptimisticJob.js +15 -6
  111. package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -0
  112. package/build/browser/observable/internal/base-list/BaseCollectionQuery.js +2 -0
  113. package/build/browser/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
  114. package/build/browser/observable/internal/base-list/BaseListQuery.js +411 -0
  115. package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -0
  116. package/build/browser/observable/internal/base-list/createCollectionConnectable.js +50 -0
  117. package/build/browser/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
  118. package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js +597 -0
  119. package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
  120. package/build/browser/observable/internal/base-list/removeDuplicates.js +36 -0
  121. package/build/browser/observable/internal/base-list/removeDuplicates.js.map +1 -0
  122. package/build/browser/observable/internal/createInitEntry.js +25 -0
  123. package/build/browser/observable/internal/createInitEntry.js.map +1 -0
  124. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +216 -0
  125. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
  126. package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
  127. package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
  128. package/build/browser/observable/internal/isObjectInstance.js +23 -0
  129. package/build/browser/observable/internal/isObjectInstance.js.map +1 -0
  130. package/build/browser/observable/internal/links/LinksHelper.js +37 -0
  131. package/build/browser/observable/internal/links/LinksHelper.js.map +1 -0
  132. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +2 -0
  133. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
  134. package/build/browser/observable/internal/links/SpecificLinkQuery.js +185 -0
  135. package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -0
  136. package/build/browser/observable/internal/list/InterfaceListQuery.js +83 -0
  137. package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -0
  138. package/build/browser/observable/internal/list/ListCacheKey.js +2 -0
  139. package/build/browser/observable/internal/list/ListCacheKey.js.map +1 -0
  140. package/build/browser/observable/internal/list/ListQuery.js +372 -0
  141. package/build/browser/observable/internal/list/ListQuery.js.map +1 -0
  142. package/build/browser/observable/internal/list/ListQueryOptions.js +2 -0
  143. package/build/browser/observable/internal/list/ListQueryOptions.js.map +1 -0
  144. package/build/browser/observable/internal/list/ListsHelper.js +51 -0
  145. package/build/browser/observable/internal/list/ListsHelper.js.map +1 -0
  146. package/build/browser/observable/internal/list/ObjectListQuery.js +48 -0
  147. package/build/browser/observable/internal/list/ObjectListQuery.js.map +1 -0
  148. package/build/browser/observable/internal/object/ObjectCacheKey.js +2 -0
  149. package/build/browser/observable/internal/object/ObjectCacheKey.js.map +1 -0
  150. package/build/browser/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +27 -18
  151. package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -0
  152. package/build/browser/observable/internal/object/ObjectsHelper.js +48 -0
  153. package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -0
  154. package/build/browser/observable/internal/sorting/SortingStrategy.js +78 -0
  155. package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -0
  156. package/build/browser/observable/internal/testUtils/invalidateList.js +23 -0
  157. package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -0
  158. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
  159. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
  160. package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
  161. package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
  162. package/build/browser/observable/internal/testUtils.js +72 -10
  163. package/build/browser/observable/internal/testUtils.js.map +1 -1
  164. package/build/browser/ontology/loadActionMetadata.js +3 -1
  165. package/build/browser/ontology/loadActionMetadata.js.map +1 -1
  166. package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
  167. package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
  168. package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
  169. package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
  170. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  171. package/build/browser/util/UserAgent.js +2 -2
  172. package/build/browser/util/UserAgent.js.map +1 -1
  173. package/build/browser/util/exponentialBackoff.js +51 -0
  174. package/build/browser/util/exponentialBackoff.js.map +1 -0
  175. package/build/browser/util/exponentialBackoff.test.js +81 -0
  176. package/build/browser/util/exponentialBackoff.test.js.map +1 -0
  177. package/build/browser/util/extractObjectOrInterfaceType.js +9 -1
  178. package/build/browser/util/extractObjectOrInterfaceType.js.map +1 -1
  179. package/build/browser/util/extractObjectOrInterfaceType.test.js +2 -2
  180. package/build/browser/util/extractObjectOrInterfaceType.test.js.map +1 -1
  181. package/build/browser/util/streamutils.js +1 -1
  182. package/build/browser/util/streamutils.js.map +1 -1
  183. package/build/browser/util/toDataValue.js +15 -1
  184. package/build/browser/util/toDataValue.js.map +1 -1
  185. package/build/browser/util/toDataValue.test.js +42 -2
  186. package/build/browser/util/toDataValue.test.js.map +1 -1
  187. package/build/cjs/{chunk-633AI7EA.cjs → chunk-GVGP7T5P.cjs} +407 -257
  188. package/build/cjs/chunk-GVGP7T5P.cjs.map +1 -0
  189. package/build/cjs/{chunk-26WFEZQO.cjs → chunk-YADG7KA6.cjs} +136 -84
  190. package/build/cjs/chunk-YADG7KA6.cjs.map +1 -0
  191. package/build/cjs/{createClient-BJo8T7Js.d.cts → createClient-mOlFts15.d.cts} +1 -0
  192. package/build/cjs/index.cjs +11 -7
  193. package/build/cjs/index.d.cts +2 -2
  194. package/build/cjs/public/internal.cjs +8 -8
  195. package/build/cjs/public/unstable-do-not-use.cjs +1502 -851
  196. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  197. package/build/cjs/public/unstable-do-not-use.d.cts +183 -13
  198. package/build/esm/Client.js +1 -1
  199. package/build/esm/Client.js.map +1 -1
  200. package/build/esm/MinimalClientContext.js.map +1 -1
  201. package/build/esm/actions/applyAction.js +4 -0
  202. package/build/esm/actions/applyAction.js.map +1 -1
  203. package/build/esm/createClient.js +6 -2
  204. package/build/esm/createClient.js.map +1 -1
  205. package/build/esm/createMinimalClient.js +2 -1
  206. package/build/esm/createMinimalClient.js.map +1 -1
  207. package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +17 -0
  208. package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
  209. package/build/esm/fetchMetadata.test.js +11 -0
  210. package/build/esm/fetchMetadata.test.js.map +1 -1
  211. package/build/esm/index.js +3 -1
  212. package/build/esm/index.js.map +1 -1
  213. package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
  214. package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
  215. package/build/esm/intellisense.test.js +14 -4
  216. package/build/esm/intellisense.test.js.map +1 -1
  217. package/build/esm/object/Cache.js +1 -1
  218. package/build/esm/object/Cache.js.map +1 -1
  219. package/build/esm/object/Cache.test.js +1 -1
  220. package/build/esm/object/Cache.test.js.map +1 -1
  221. package/build/esm/object/SimpleCache.js +1 -1
  222. package/build/esm/object/SimpleCache.js.map +1 -1
  223. package/build/esm/object/aggregate.js +2 -0
  224. package/build/esm/object/aggregate.js.map +1 -1
  225. package/build/esm/object/aggregate.test.js +30 -0
  226. package/build/esm/object/aggregate.test.js.map +1 -1
  227. package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
  228. package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
  229. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
  230. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  231. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
  232. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  233. package/build/esm/object/convertWireToOsdkObjects.js +4 -0
  234. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  235. package/build/esm/object/convertWireToOsdkObjects.test.js +14 -0
  236. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  237. package/build/esm/object/fetchPage.js +96 -21
  238. package/build/esm/object/fetchPage.js.map +1 -1
  239. package/build/esm/object/fetchPage.test.js +35 -1
  240. package/build/esm/object/fetchPage.test.js.map +1 -1
  241. package/build/esm/object/geotimeseriesreference.test.js +0 -2
  242. package/build/esm/object/geotimeseriesreference.test.js.map +1 -1
  243. package/build/esm/object/mediaUpload.js +3 -0
  244. package/build/esm/object/mediaUpload.js.map +1 -1
  245. package/build/esm/objectSet/ObjectSet.test.js +6 -0
  246. package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
  247. package/build/esm/objectSet/ObjectSetListenerWebsocket.js +31 -9
  248. package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  249. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
  250. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  251. package/build/esm/objectSet/createObjectSet.js +3 -1
  252. package/build/esm/objectSet/createObjectSet.js.map +1 -1
  253. package/build/esm/observable/LinkPayload.js +2 -0
  254. package/build/esm/observable/LinkPayload.js.map +1 -0
  255. package/build/esm/observable/ObjectPayload.js.map +1 -1
  256. package/build/esm/observable/ObservableClient/ObserveLink.js +17 -0
  257. package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -0
  258. package/build/esm/observable/ObservableClient/common.js +2 -0
  259. package/build/esm/observable/ObservableClient/common.js.map +1 -0
  260. package/build/esm/observable/ObservableClient.js +20 -0
  261. package/build/esm/observable/ObservableClient.js.map +1 -1
  262. package/build/esm/observable/Unsubscribable.js +2 -0
  263. package/build/esm/observable/Unsubscribable.js.map +1 -0
  264. package/build/esm/observable/internal/AbstractHelper.js +54 -0
  265. package/build/esm/observable/internal/AbstractHelper.js.map +1 -0
  266. package/build/esm/observable/internal/BatchContext.js +2 -0
  267. package/build/esm/observable/internal/BatchContext.js.map +1 -0
  268. package/build/esm/observable/internal/BulkObjectLoader.js +3 -3
  269. package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
  270. package/build/esm/observable/internal/CacheKeys.js +65 -25
  271. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  272. package/build/esm/observable/internal/Changes.js +6 -0
  273. package/build/esm/observable/internal/Changes.js.map +1 -1
  274. package/build/esm/observable/internal/KnownCacheKey.js +2 -0
  275. package/build/esm/observable/internal/KnownCacheKey.js.map +1 -0
  276. package/build/esm/observable/internal/Layer.js +0 -8
  277. package/build/esm/observable/internal/Layer.js.map +1 -1
  278. package/build/esm/observable/internal/Layers.js +151 -0
  279. package/build/esm/observable/internal/Layers.js.map +1 -0
  280. package/build/esm/observable/internal/ObservableClientImpl.js +54 -3
  281. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  282. package/build/esm/observable/internal/OrderByCanonicalizer.js +1 -37
  283. package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -1
  284. package/build/esm/observable/internal/Queries.js +40 -0
  285. package/build/esm/observable/internal/Queries.js.map +1 -0
  286. package/build/esm/observable/internal/Query.js +45 -4
  287. package/build/esm/observable/internal/Query.js.map +1 -1
  288. package/build/esm/observable/internal/QuerySubscription.js +48 -0
  289. package/build/esm/observable/internal/QuerySubscription.js.map +1 -0
  290. package/build/esm/observable/internal/Store.invalidation.test.js +646 -0
  291. package/build/esm/observable/internal/Store.invalidation.test.js.map +1 -0
  292. package/build/esm/observable/internal/Store.js +87 -308
  293. package/build/esm/observable/internal/Store.js.map +1 -1
  294. package/build/esm/observable/internal/Store.test.js +330 -73
  295. package/build/esm/observable/internal/Store.test.js.map +1 -1
  296. package/build/esm/observable/internal/SubjectPayload.js +2 -0
  297. package/build/esm/observable/internal/SubjectPayload.js.map +1 -0
  298. package/build/esm/observable/internal/Subjects.js +55 -0
  299. package/build/esm/observable/internal/Subjects.js.map +1 -0
  300. package/build/esm/observable/internal/UnsubscribableWrapper.js +30 -0
  301. package/build/esm/observable/internal/UnsubscribableWrapper.js.map +1 -0
  302. package/build/esm/observable/internal/WeakRefTrie.js +61 -0
  303. package/build/esm/observable/internal/WeakRefTrie.js.map +1 -0
  304. package/build/esm/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
  305. package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -0
  306. package/build/{browser/observable/internal → esm/observable/internal/actions}/OptimisticJob.js +15 -6
  307. package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -0
  308. package/build/esm/observable/internal/base-list/BaseCollectionQuery.js +2 -0
  309. package/build/esm/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
  310. package/build/esm/observable/internal/base-list/BaseListQuery.js +411 -0
  311. package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -0
  312. package/build/esm/observable/internal/base-list/createCollectionConnectable.js +50 -0
  313. package/build/esm/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
  314. package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js +597 -0
  315. package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
  316. package/build/esm/observable/internal/base-list/removeDuplicates.js +36 -0
  317. package/build/esm/observable/internal/base-list/removeDuplicates.js.map +1 -0
  318. package/build/esm/observable/internal/createInitEntry.js +25 -0
  319. package/build/esm/observable/internal/createInitEntry.js.map +1 -0
  320. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +216 -0
  321. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
  322. package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
  323. package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
  324. package/build/esm/observable/internal/isObjectInstance.js +23 -0
  325. package/build/esm/observable/internal/isObjectInstance.js.map +1 -0
  326. package/build/esm/observable/internal/links/LinksHelper.js +37 -0
  327. package/build/esm/observable/internal/links/LinksHelper.js.map +1 -0
  328. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +2 -0
  329. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
  330. package/build/esm/observable/internal/links/SpecificLinkQuery.js +185 -0
  331. package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -0
  332. package/build/esm/observable/internal/list/InterfaceListQuery.js +83 -0
  333. package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -0
  334. package/build/esm/observable/internal/list/ListCacheKey.js +2 -0
  335. package/build/esm/observable/internal/list/ListCacheKey.js.map +1 -0
  336. package/build/esm/observable/internal/list/ListQuery.js +372 -0
  337. package/build/esm/observable/internal/list/ListQuery.js.map +1 -0
  338. package/build/esm/observable/internal/list/ListQueryOptions.js +2 -0
  339. package/build/esm/observable/internal/list/ListQueryOptions.js.map +1 -0
  340. package/build/esm/observable/internal/list/ListsHelper.js +51 -0
  341. package/build/esm/observable/internal/list/ListsHelper.js.map +1 -0
  342. package/build/esm/observable/internal/list/ObjectListQuery.js +48 -0
  343. package/build/esm/observable/internal/list/ObjectListQuery.js.map +1 -0
  344. package/build/esm/observable/internal/object/ObjectCacheKey.js +2 -0
  345. package/build/esm/observable/internal/object/ObjectCacheKey.js.map +1 -0
  346. package/build/esm/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +27 -18
  347. package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -0
  348. package/build/esm/observable/internal/object/ObjectsHelper.js +48 -0
  349. package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -0
  350. package/build/esm/observable/internal/sorting/SortingStrategy.js +78 -0
  351. package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -0
  352. package/build/esm/observable/internal/testUtils/invalidateList.js +23 -0
  353. package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -0
  354. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
  355. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
  356. package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
  357. package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
  358. package/build/esm/observable/internal/testUtils.js +72 -10
  359. package/build/esm/observable/internal/testUtils.js.map +1 -1
  360. package/build/esm/ontology/loadActionMetadata.js +3 -1
  361. package/build/esm/ontology/loadActionMetadata.js.map +1 -1
  362. package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
  363. package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
  364. package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
  365. package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
  366. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  367. package/build/esm/util/UserAgent.js +2 -2
  368. package/build/esm/util/UserAgent.js.map +1 -1
  369. package/build/esm/util/exponentialBackoff.js +51 -0
  370. package/build/esm/util/exponentialBackoff.js.map +1 -0
  371. package/build/esm/util/exponentialBackoff.test.js +81 -0
  372. package/build/esm/util/exponentialBackoff.test.js.map +1 -0
  373. package/build/esm/util/extractObjectOrInterfaceType.js +9 -1
  374. package/build/esm/util/extractObjectOrInterfaceType.js.map +1 -1
  375. package/build/esm/util/extractObjectOrInterfaceType.test.js +2 -2
  376. package/build/esm/util/extractObjectOrInterfaceType.test.js.map +1 -1
  377. package/build/esm/util/streamutils.js +1 -1
  378. package/build/esm/util/streamutils.js.map +1 -1
  379. package/build/esm/util/toDataValue.js +15 -1
  380. package/build/esm/util/toDataValue.js.map +1 -1
  381. package/build/esm/util/toDataValue.test.js +42 -2
  382. package/build/esm/util/toDataValue.test.js.map +1 -1
  383. package/build/types/Client.d.ts +1 -1
  384. package/build/types/MinimalClientContext.d.ts +1 -0
  385. package/build/types/MinimalClientContext.d.ts.map +1 -1
  386. package/build/types/actions/applyAction.d.ts.map +1 -1
  387. package/build/types/createClient.d.ts +1 -0
  388. package/build/types/createClient.d.ts.map +1 -1
  389. package/build/types/index.d.ts +1 -1
  390. package/build/types/index.d.ts.map +1 -1
  391. package/build/types/object/fetchPage.d.ts.map +1 -1
  392. package/build/types/object/mediaUpload.d.ts +2 -1
  393. package/build/types/object/mediaUpload.d.ts.map +1 -1
  394. package/build/types/observable/LinkPayload.d.ts +9 -0
  395. package/build/types/observable/LinkPayload.d.ts.map +1 -0
  396. package/build/types/observable/ObjectPayload.d.ts +4 -0
  397. package/build/types/observable/ObjectPayload.d.ts.map +1 -1
  398. package/build/types/observable/ObservableClient/ObserveLink.d.ts +32 -0
  399. package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -0
  400. package/build/types/observable/ObservableClient/common.d.ts +67 -0
  401. package/build/types/observable/ObservableClient/common.d.ts.map +1 -0
  402. package/build/types/observable/ObservableClient.d.ts +103 -15
  403. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  404. package/build/types/observable/Unsubscribable.d.ts +3 -0
  405. package/build/types/observable/Unsubscribable.d.ts.map +1 -0
  406. package/build/types/observable/internal/AbstractHelper.d.ts +17 -0
  407. package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -0
  408. package/build/types/observable/internal/BatchContext.d.ts +11 -0
  409. package/build/types/observable/internal/BatchContext.d.ts.map +1 -0
  410. package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
  411. package/build/types/observable/internal/CacheKeys.d.ts +12 -6
  412. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  413. package/build/types/observable/internal/Changes.d.ts +8 -5
  414. package/build/types/observable/internal/Changes.d.ts.map +1 -1
  415. package/build/types/observable/internal/KnownCacheKey.d.ts +4 -0
  416. package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -0
  417. package/build/types/observable/internal/Layer.d.ts +6 -7
  418. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  419. package/build/types/observable/internal/Layers.d.ts +26 -0
  420. package/build/types/observable/internal/Layers.d.ts.map +1 -0
  421. package/build/types/observable/internal/OrderByCanonicalizer.d.ts +0 -7
  422. package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -1
  423. package/build/types/observable/internal/Queries.d.ts +9 -0
  424. package/build/types/observable/internal/Queries.d.ts.map +1 -0
  425. package/build/types/observable/internal/Query.d.ts +23 -6
  426. package/build/types/observable/internal/Query.d.ts.map +1 -1
  427. package/build/types/observable/internal/QuerySubscription.d.ts +1 -0
  428. package/build/types/observable/internal/QuerySubscription.d.ts.map +1 -0
  429. package/build/types/observable/internal/Store.d.ts +41 -51
  430. package/build/types/observable/internal/Store.d.ts.map +1 -1
  431. package/build/types/observable/internal/Store.invalidation.test.d.ts +1 -0
  432. package/build/types/observable/internal/Store.invalidation.test.d.ts.map +1 -0
  433. package/build/types/observable/internal/Store.test.d.ts +4 -1
  434. package/build/types/observable/internal/Store.test.d.ts.map +1 -1
  435. package/build/types/observable/internal/SubjectPayload.d.ts +5 -0
  436. package/build/types/observable/internal/SubjectPayload.d.ts.map +1 -0
  437. package/build/types/observable/internal/Subjects.d.ts +16 -0
  438. package/build/types/observable/internal/Subjects.d.ts.map +1 -0
  439. package/build/types/observable/internal/UnsubscribableWrapper.d.ts +1 -0
  440. package/build/types/observable/internal/UnsubscribableWrapper.d.ts.map +1 -0
  441. package/build/types/observable/internal/WeakRefTrie.d.ts +13 -0
  442. package/build/types/observable/internal/WeakRefTrie.d.ts.map +1 -0
  443. package/build/types/observable/internal/{ActionApplication.d.ts → actions/ActionApplication.d.ts} +2 -2
  444. package/build/types/observable/internal/{ActionApplication.d.ts.map → actions/ActionApplication.d.ts.map} +1 -1
  445. package/build/types/observable/internal/{OptimisticJob.d.ts → actions/OptimisticJob.d.ts} +4 -4
  446. package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -0
  447. package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts +64 -0
  448. package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts.map +1 -0
  449. package/build/types/observable/internal/base-list/BaseListQuery.d.ts +145 -0
  450. package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -0
  451. package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts +39 -0
  452. package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts.map +1 -0
  453. package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts +1 -0
  454. package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts.map +1 -0
  455. package/build/types/observable/internal/base-list/removeDuplicates.d.ts +11 -0
  456. package/build/types/observable/internal/base-list/removeDuplicates.d.ts.map +1 -0
  457. package/build/types/observable/internal/createInitEntry.d.ts +3 -0
  458. package/build/types/observable/internal/createInitEntry.d.ts.map +1 -0
  459. package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts +9 -0
  460. package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts.map +1 -0
  461. package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts +1 -0
  462. package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts.map +1 -0
  463. package/build/types/observable/internal/isObjectInstance.d.ts +5 -0
  464. package/build/types/observable/internal/isObjectInstance.d.ts.map +1 -0
  465. package/build/types/observable/internal/links/LinksHelper.d.ts +31 -0
  466. package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -0
  467. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +17 -0
  468. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -0
  469. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +47 -0
  470. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -0
  471. package/build/types/observable/internal/list/InterfaceListQuery.d.ts +18 -0
  472. package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -0
  473. package/build/types/observable/internal/list/ListCacheKey.d.ts +7 -0
  474. package/build/types/observable/internal/list/ListCacheKey.d.ts.map +1 -0
  475. package/build/types/observable/internal/list/ListQuery.d.ts +106 -0
  476. package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -0
  477. package/build/types/observable/internal/list/ListQueryOptions.d.ts +4 -0
  478. package/build/types/observable/internal/list/ListQueryOptions.d.ts.map +1 -0
  479. package/build/types/observable/internal/list/ListsHelper.d.ts +19 -0
  480. package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -0
  481. package/build/types/observable/internal/list/ObjectListQuery.d.ts +18 -0
  482. package/build/types/observable/internal/list/ObjectListQuery.d.ts.map +1 -0
  483. package/build/types/observable/internal/object/ObjectCacheKey.d.ts +5 -0
  484. package/build/types/observable/internal/object/ObjectCacheKey.d.ts.map +1 -0
  485. package/build/types/observable/internal/{ObjectQuery.d.ts → object/ObjectQuery.d.ts} +11 -9
  486. package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -0
  487. package/build/types/observable/internal/object/ObjectsHelper.d.ts +11 -0
  488. package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -0
  489. package/build/types/observable/internal/sorting/SortingStrategy.d.ts +41 -0
  490. package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -0
  491. package/build/types/observable/internal/testUtils/invalidateList.d.ts +9 -0
  492. package/build/types/observable/internal/testUtils/invalidateList.d.ts.map +1 -0
  493. package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts +46 -0
  494. package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts.map +1 -0
  495. package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts +26 -0
  496. package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts.map +1 -0
  497. package/build/types/observable/internal/testUtils.d.ts +26 -4
  498. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  499. package/build/types/public/unstable-do-not-use.d.ts +4 -2
  500. package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
  501. package/build/types/util/exponentialBackoff.d.ts +14 -0
  502. package/build/types/util/exponentialBackoff.d.ts.map +1 -0
  503. package/build/types/util/exponentialBackoff.test.d.ts +1 -0
  504. package/build/types/util/exponentialBackoff.test.d.ts.map +1 -0
  505. package/package.json +27 -27
  506. package/build/browser/observable/internal/ActionApplication.js.map +0 -1
  507. package/build/browser/observable/internal/ListQuery.js +0 -618
  508. package/build/browser/observable/internal/ListQuery.js.map +0 -1
  509. package/build/browser/observable/internal/ObjectQuery.js.map +0 -1
  510. package/build/browser/observable/internal/OptimisticJob.js.map +0 -1
  511. package/build/cjs/chunk-26WFEZQO.cjs.map +0 -1
  512. package/build/cjs/chunk-633AI7EA.cjs.map +0 -1
  513. package/build/esm/observable/internal/ActionApplication.js.map +0 -1
  514. package/build/esm/observable/internal/ListQuery.js +0 -618
  515. package/build/esm/observable/internal/ListQuery.js.map +0 -1
  516. package/build/esm/observable/internal/ObjectQuery.js.map +0 -1
  517. package/build/esm/observable/internal/OptimisticJob.js.map +0 -1
  518. package/build/types/observable/internal/ListQuery.d.ts +0 -88
  519. package/build/types/observable/internal/ListQuery.d.ts.map +0 -1
  520. package/build/types/observable/internal/ObjectQuery.d.ts.map +0 -1
  521. package/build/types/observable/internal/OptimisticJob.d.ts.map +0 -1
@@ -16,10 +16,10 @@
16
16
 
17
17
  import deepEqual from "fast-deep-equal";
18
18
  import { BehaviorSubject, connectable, map } from "rxjs";
19
- import { additionalContext } from "../../Client.js";
20
- import { getBulkObjectLoader } from "./BulkObjectLoader.js";
21
- import { Query } from "./Query.js";
22
- import { tombstone } from "./tombstone.js";
19
+ import { additionalContext } from "../../../Client.js";
20
+ import { getBulkObjectLoader } from "../BulkObjectLoader.js";
21
+ import { Query } from "../Query.js";
22
+ import { tombstone } from "../tombstone.js";
23
23
  export class ObjectQuery extends Query {
24
24
  #apiName;
25
25
  #pk;
@@ -53,6 +53,11 @@ export class ObjectQuery extends Query {
53
53
  methodName: "_fetchAndStore"
54
54
  }).debug("calling _fetchAndStore");
55
55
  }
56
+
57
+ // TODO: In the future, implement tracking of network requests to ensure
58
+ // we're not making unnecessary network calls. This would need dedicated
59
+ // tests separate from subscription notification tests.
60
+
56
61
  const obj = await getBulkObjectLoader(this.store.client).fetch(this.#apiName, this.#pk);
57
62
  this.store.batch({}, batch => {
58
63
  this.writeToStore(obj, "loaded", batch);
@@ -61,10 +66,20 @@ export class ObjectQuery extends Query {
61
66
  writeToStore(data, status, batch) {
62
67
  const entry = batch.read(this.cacheKey);
63
68
  if (entry && deepEqual(data, entry.value)) {
69
+ // Check if both data AND status are the same
70
+ if (entry.status === status) {
71
+ if (process.env.NODE_ENV !== "production") {
72
+ this.logger?.child({
73
+ methodName: "writeToStore"
74
+ }).debug(`Object was deep equal and status unchanged (${status}), skipping update`);
75
+ }
76
+ // Return the existing entry without writing to avoid unnecessary notifications
77
+ return entry;
78
+ }
64
79
  if (process.env.NODE_ENV !== "production") {
65
80
  this.logger?.child({
66
81
  methodName: "writeToStore"
67
- }).debug(`Object was deep equal, just setting status`);
82
+ }).debug(`Object was deep equal, just setting status (old status: ${entry.status}, new status: ${status})`);
68
83
  }
69
84
  // must do a "full write" here so that the lastUpdated is updated but we
70
85
  // don't want to retrigger anyone's memoization on the value!
@@ -109,18 +124,12 @@ export class ObjectQuery extends Query {
109
124
  batch.changes.deleteObject(this.cacheKey);
110
125
  return ret;
111
126
  }
112
- }
113
-
114
- /**
115
- * Internal helper method for writing objects to the store and returning their
116
- * object keys
117
- * @internal
118
- */
119
- export function storeOsdkInstances(store, values, batch) {
120
- // update the cache for any object that has changed
121
- // and save the mapped values to return
122
- return values.map(v => {
123
- return store.getObjectQuery(v.$apiName, v.$primaryKey).writeToStore(v, "loaded", batch).cacheKey;
124
- });
127
+ invalidateObjectType = (objectType, changes) => {
128
+ if (this.#apiName === objectType) {
129
+ changes?.modified.add(this.cacheKey);
130
+ return this.revalidate(true);
131
+ }
132
+ return Promise.resolve();
133
+ };
125
134
  }
126
135
  //# sourceMappingURL=ObjectQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectQuery.js","names":["deepEqual","BehaviorSubject","connectable","map","additionalContext","getBulkObjectLoader","Query","tombstone","ObjectQuery","apiName","pk","constructor","store","subject","type","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","x","JSON","stringify","join","undefined","_createConnectable","pipe","status","object","value","lastUpdated","isOptimistic","connector","_fetchAndStore","methodName","debug","obj","fetch","batch","writeToStore","data","entry","read","write","ret","changes","registerObject","deleteFromStore","delete","deleteObject","invalidateObjectType","objectType","modified","add","revalidate","Promise","resolve"],"sources":["ObjectQuery.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, PrimaryKeyType } from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { Connectable, Observable, Subject } from \"rxjs\";\nimport { BehaviorSubject, connectable, map } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../../ObservableClient/common.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport { getBulkObjectLoader } from \"../BulkObjectLoader.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Entry } from \"../Layer.js\";\nimport { Query } from \"../Query.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport type { ObjectCacheKey } from \"./ObjectCacheKey.js\";\n\nexport class ObjectQuery extends Query<\n ObjectCacheKey,\n ObjectPayload,\n CommonObserveOptions\n> {\n #apiName: string;\n #pk: string | number | boolean;\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<ObjectCacheKey>>,\n type: string,\n pk: PrimaryKeyType<ObjectTypeDefinition>,\n cacheKey: ObjectCacheKey,\n opts: CommonObserveOptions,\n ) {\n super(\n store,\n subject,\n opts,\n cacheKey,\n process.env.NODE_ENV !== \"production\"\n ? (\n store.client[additionalContext].logger?.child({}, {\n msgPrefix: `ObjectQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n this.#apiName = type;\n this.#pk = pk;\n }\n\n protected _createConnectable(\n subject: Observable<SubjectPayload<ObjectCacheKey>>,\n ): Connectable<ObjectPayload> {\n return connectable<ObjectPayload>(\n subject.pipe(\n map((x) => {\n return {\n status: x.status,\n object: x.value,\n lastUpdated: x.lastUpdated,\n isOptimistic: x.isOptimistic,\n };\n }),\n ),\n {\n connector: () =>\n new BehaviorSubject<ObjectPayload>({\n status: \"init\",\n object: undefined,\n lastUpdated: 0,\n isOptimistic: false,\n }),\n },\n );\n }\n\n async _fetchAndStore(): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"_fetchAndStore\" }).debug(\n \"calling _fetchAndStore\",\n );\n }\n\n // TODO: In the future, implement tracking of network requests to ensure\n // we're not making unnecessary network calls. This would need dedicated\n // tests separate from subscription notification tests.\n\n const obj = await getBulkObjectLoader(this.store.client)\n .fetch(this.#apiName, this.#pk);\n\n this.store.batch({}, (batch) => {\n this.writeToStore(obj, \"loaded\", batch);\n });\n }\n\n writeToStore(\n data: ObjectHolder,\n status: Status,\n batch: BatchContext,\n ): Entry<ObjectCacheKey> {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(data, entry.value)) {\n // Check if both data AND status are the same\n if (entry.status === status) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Object was deep equal and status unchanged (${status}), skipping update`,\n );\n }\n // Return the existing entry without writing to avoid unnecessary notifications\n return entry;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Object was deep equal, just setting status (old status: ${entry.status}, new status: ${status})`,\n );\n }\n // must do a \"full write\" here so that the lastUpdated is updated but we\n // don't want to retrigger anyone's memoization on the value!\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n JSON.stringify({ status }),\n data,\n );\n }\n const ret = batch.write(this.cacheKey, data, status);\n batch.changes.registerObject(this.cacheKey, data, /* isNew */ !entry);\n\n return ret;\n }\n\n deleteFromStore(\n status: Status,\n batch: BatchContext,\n ): Entry<ObjectCacheKey> | undefined {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(tombstone, entry.value)) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n `Object was deep equal, just setting status`,\n );\n }\n // must do a \"full write\" here so that the lastUpdated is updated but we\n // don't want to retrigger anyone's memoization on the value!\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n JSON.stringify({ status }),\n );\n }\n\n // if there is no entry then there is nothing to do\n if (!entry || !entry.value) {\n return;\n }\n\n const ret = batch.delete(this.cacheKey, status);\n batch.changes.deleteObject(this.cacheKey);\n\n return ret;\n }\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.#apiName === objectType) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,48 @@
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 { AbstractHelper } from "../AbstractHelper.js";
18
+ import { ObjectQuery } from "./ObjectQuery.js";
19
+ export class ObjectsHelper extends AbstractHelper {
20
+ observe(options, subFn) {
21
+ return super.observe(options, subFn);
22
+ }
23
+ getQuery(options) {
24
+ const apiName = typeof options.apiName === "string" ? options.apiName : options.apiName.apiName;
25
+ const {
26
+ pk
27
+ } = options;
28
+ const objectCacheKey = this.cacheKeys.get("object", apiName, pk);
29
+ return this.store.queries.get(objectCacheKey, () => new ObjectQuery(this.store, this.store.subjects.get(objectCacheKey), apiName, pk, objectCacheKey, {
30
+ dedupeInterval: 0
31
+ }));
32
+ }
33
+
34
+ /**
35
+ * Internal helper method for writing objects to the store and returning their
36
+ * object keys
37
+ * @internal
38
+ */
39
+ storeOsdkInstances(values, batch) {
40
+ // update the cache for any object that has changed
41
+ // and save the mapped values to return
42
+ return values.map(v => this.getQuery({
43
+ apiName: v.$apiName,
44
+ pk: v.$primaryKey
45
+ }).writeToStore(v, "loaded", batch).cacheKey);
46
+ }
47
+ }
48
+ //# sourceMappingURL=ObjectsHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectsHelper.js","names":["AbstractHelper","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","apiName","pk","objectCacheKey","cacheKeys","get","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","map","v","$apiName","$primaryKey","writeToStore","cacheKey"],"sources":["ObjectsHelper.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n} from \"@osdk/api\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport { type ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\n\nexport class ObjectsHelper extends AbstractHelper<\n ObjectQuery,\n ObserveObjectOptions<any>\n> {\n observe<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): QuerySubscription<ObjectQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n ): ObjectQuery {\n const apiName = typeof options.apiName === \"string\"\n ? options.apiName\n : options.apiName.apiName;\n const { pk } = options;\n\n const objectCacheKey = this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n\n return this.store.queries.get(objectCacheKey, () =>\n new ObjectQuery(\n this.store,\n this.store.subjects.get(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n /**\n * Internal helper method for writing objects to the store and returning their\n * object keys\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n ): ObjectCacheKey[] {\n // update the cache for any object that has changed\n // and save the mapped values to return\n return values.map(v =>\n this.getQuery({\n apiName: v.$apiName,\n pk: v.$primaryKey as string | number,\n }).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n ).cacheKey\n );\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA,SAASA,cAAc,QAAQ,sBAAsB;AAIrD,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,OAAO,MAAMC,aAAa,SAASF,cAAc,CAG/C;EACAG,OAAOA,CACLC,OAAgC,EAChCC,KAA8B,EACE;IAChC,OAAO,KAAK,CAACF,OAAO,CAACC,OAAO,EAAEC,KAAK,CAAC;EACtC;EAEAC,QAAQA,CACNF,OAAgC,EACnB;IACb,MAAMG,OAAO,GAAG,OAAOH,OAAO,CAACG,OAAO,KAAK,QAAQ,GAC/CH,OAAO,CAACG,OAAO,GACfH,OAAO,CAACG,OAAO,CAACA,OAAO;IAC3B,MAAM;MAAEC;IAAG,CAAC,GAAGJ,OAAO;IAEtB,MAAMK,cAAc,GAAG,IAAI,CAACC,SAAS,CAACC,GAAG,CACvC,QAAQ,EACRJ,OAAO,EACPC,EACF,CAAC;IAED,OAAO,IAAI,CAACI,KAAK,CAACC,OAAO,CAACF,GAAG,CAACF,cAAc,EAAE,MAC5C,IAAIR,WAAW,CACb,IAAI,CAACW,KAAK,EACV,IAAI,CAACA,KAAK,CAACE,QAAQ,CAACH,GAAG,CAACF,cAAc,CAAC,EACvCF,OAAO,EACPC,EAAE,EACFC,cAAc,EACd;MAAEM,cAAc,EAAE;IAAE,CACtB,CAAC,CAAC;EACN;;EAEA;AACF;AACA;AACA;AACA;EACSC,kBAAkBA,CACvBC,MAAiE,EACjEC,KAAmB,EACD;IAClB;IACA;IACA,OAAOD,MAAM,CAACE,GAAG,CAACC,CAAC,IACjB,IAAI,CAACd,QAAQ,CAAC;MACZC,OAAO,EAAEa,CAAC,CAACC,QAAQ;MACnBb,EAAE,EAAEY,CAAC,CAACE;IACR,CAAC,CAAC,CAACC,YAAY,CACbH,CAAC,EACD,QAAQ,EACRF,KACF,CAAC,CAACM,QACJ,CAAC;EACH;AACF","ignoreList":[]}
@@ -0,0 +1,78 @@
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
+ /**
18
+ * Strategy interface for collection sorting
19
+ */
20
+
21
+ /**
22
+ * No-operation sorting strategy that preserves original order
23
+ */
24
+ export class NoOpSortingStrategy {
25
+ sortCacheKeys(objectCacheKeys) {
26
+ return objectCacheKeys;
27
+ }
28
+ }
29
+ /**
30
+ * Sorting strategy for OrderBy clauses
31
+ */
32
+ export class OrderBySortingStrategy {
33
+ constructor(apiName, orderBy) {
34
+ this.apiName = apiName;
35
+ this.orderBy = orderBy;
36
+ this.sortFns = createOrderBySortFns(orderBy);
37
+ }
38
+ sortCacheKeys(objectCacheKeys, batch) {
39
+ if (Object.keys(this.orderBy).length === 0) {
40
+ return objectCacheKeys;
41
+ }
42
+ return objectCacheKeys.sort((a, b) => {
43
+ for (const sortFn of this.sortFns) {
44
+ const ret = sortFn(batch.read(a)?.value?.$as(this.apiName), batch.read(b)?.value?.$as(this.apiName));
45
+ if (ret !== 0) {
46
+ return ret;
47
+ }
48
+ }
49
+ return 0;
50
+ });
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Creates sort functions for an orderBy clause
56
+ * @param orderBy - The order by clause
57
+ * @returns Array of sort functions
58
+ */
59
+ export function createOrderBySortFns(orderBy) {
60
+ return Object.entries(orderBy).map(([key, order]) => {
61
+ return (a, b) => {
62
+ const aValue = a?.[key];
63
+ const bValue = b?.[key];
64
+ if (aValue == null && bValue == null) {
65
+ return 0;
66
+ }
67
+ if (aValue == null) {
68
+ return 1;
69
+ }
70
+ if (bValue == null) {
71
+ return -1;
72
+ }
73
+ const m = order === "asc" ? -1 : 1;
74
+ return aValue < bValue ? m : aValue > bValue ? -m : 0;
75
+ };
76
+ });
77
+ }
78
+ //# sourceMappingURL=SortingStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SortingStrategy.js","names":["NoOpSortingStrategy","sortCacheKeys","objectCacheKeys","OrderBySortingStrategy","constructor","apiName","orderBy","sortFns","createOrderBySortFns","batch","Object","keys","length","sort","a","b","sortFn","ret","read","value","$as","entries","map","key","order","aValue","bValue","m"],"sources":["SortingStrategy.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { InterfaceHolder } from \"../../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { ObjectCacheKey } from \"../object/ObjectCacheKey.js\";\n\n/**\n * Strategy interface for collection sorting\n */\nexport interface SortingStrategy {\n /**\n * Sort an array of object cache keys\n * @param objectCacheKeys - Keys to sort\n * @param batch - Batch context for reading objects\n * @returns Sorted array of keys\n */\n sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n batch: BatchContext,\n ): ObjectCacheKey[];\n}\n\n/**\n * No-operation sorting strategy that preserves original order\n */\nexport class NoOpSortingStrategy implements SortingStrategy {\n sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n _batch: BatchContext,\n ): ObjectCacheKey[] {\n return objectCacheKeys;\n }\n}\n\ntype ObjectInterfaceComparer = (\n a: ObjectHolder | InterfaceHolder | undefined,\n b: ObjectHolder | InterfaceHolder | undefined,\n) => number;\n\n/**\n * Sorting strategy for OrderBy clauses\n */\nexport class OrderBySortingStrategy implements SortingStrategy {\n private readonly sortFns: Array<ObjectInterfaceComparer>;\n\n constructor(\n private readonly apiName: string,\n private readonly orderBy: Canonical<\n Record<string, \"asc\" | \"desc\" | undefined>\n >,\n ) {\n this.sortFns = createOrderBySortFns(orderBy);\n }\n\n sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n batch: BatchContext,\n ): ObjectCacheKey[] {\n if (Object.keys(this.orderBy).length === 0) {\n return objectCacheKeys;\n }\n\n return objectCacheKeys.sort((a, b) => {\n for (const sortFn of this.sortFns) {\n const ret = sortFn(\n batch.read(a)?.value?.$as(this.apiName),\n batch.read(b)?.value?.$as(this.apiName),\n );\n if (ret !== 0) {\n return ret;\n }\n }\n return 0;\n });\n }\n}\n\n/**\n * Creates sort functions for an orderBy clause\n * @param orderBy - The order by clause\n * @returns Array of sort functions\n */\nexport function createOrderBySortFns(\n orderBy: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>,\n): ObjectInterfaceComparer[] {\n return Object.entries(orderBy).map(([key, order]) => {\n return (\n a: ObjectHolder | InterfaceHolder | undefined,\n b: ObjectHolder | InterfaceHolder | undefined,\n ): number => {\n const aValue = a?.[key];\n const bValue = b?.[key];\n\n if (aValue == null && bValue == null) {\n return 0;\n }\n if (aValue == null) {\n return 1;\n }\n if (bValue == null) {\n return -1;\n }\n const m = order === \"asc\" ? -1 : 1;\n return aValue < bValue ? m : aValue > bValue ? -m : 0;\n };\n });\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;;AAcA;AACA;AACA;AACA,OAAO,MAAMA,mBAAmB,CAA4B;EAC1DC,aAAaA,CACXC,eAAiC,EAEf;IAClB,OAAOA,eAAe;EACxB;AACF;AAOA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,CAA4B;EAG7DC,WAAWA,CACQC,OAAe,EACfC,OAEhB,EACD;IAAA,KAJiBD,OAAe,GAAfA,OAAe;IAAA,KACfC,OAEhB,GAFgBA,OAEhB;IAED,IAAI,CAACC,OAAO,GAAGC,oBAAoB,CAACF,OAAO,CAAC;EAC9C;EAEAL,aAAaA,CACXC,eAAiC,EACjCO,KAAmB,EACD;IAClB,IAAIC,MAAM,CAACC,IAAI,CAAC,IAAI,CAACL,OAAO,CAAC,CAACM,MAAM,KAAK,CAAC,EAAE;MAC1C,OAAOV,eAAe;IACxB;IAEA,OAAOA,eAAe,CAACW,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;MACpC,KAAK,MAAMC,MAAM,IAAI,IAAI,CAACT,OAAO,EAAE;QACjC,MAAMU,GAAG,GAAGD,MAAM,CAChBP,KAAK,CAACS,IAAI,CAACJ,CAAC,CAAC,EAAEK,KAAK,EAAEC,GAAG,CAAC,IAAI,CAACf,OAAO,CAAC,EACvCI,KAAK,CAACS,IAAI,CAACH,CAAC,CAAC,EAAEI,KAAK,EAAEC,GAAG,CAAC,IAAI,CAACf,OAAO,CACxC,CAAC;QACD,IAAIY,GAAG,KAAK,CAAC,EAAE;UACb,OAAOA,GAAG;QACZ;MACF;MACA,OAAO,CAAC;IACV,CAAC,CAAC;EACJ;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAST,oBAAoBA,CAClCF,OAA8D,EACnC;EAC3B,OAAOI,MAAM,CAACW,OAAO,CAACf,OAAO,CAAC,CAACgB,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEC,KAAK,CAAC,KAAK;IACnD,OAAO,CACLV,CAA6C,EAC7CC,CAA6C,KAClC;MACX,MAAMU,MAAM,GAAGX,CAAC,GAAGS,GAAG,CAAC;MACvB,MAAMG,MAAM,GAAGX,CAAC,GAAGQ,GAAG,CAAC;MAEvB,IAAIE,MAAM,IAAI,IAAI,IAAIC,MAAM,IAAI,IAAI,EAAE;QACpC,OAAO,CAAC;MACV;MACA,IAAID,MAAM,IAAI,IAAI,EAAE;QAClB,OAAO,CAAC;MACV;MACA,IAAIC,MAAM,IAAI,IAAI,EAAE;QAClB,OAAO,CAAC,CAAC;MACX;MACA,MAAMC,CAAC,GAAGH,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;MAClC,OAAOC,MAAM,GAAGC,MAAM,GAAGC,CAAC,GAAGF,MAAM,GAAGC,MAAM,GAAG,CAACC,CAAC,GAAG,CAAC;IACvD,CAAC;EACH,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -0,0 +1,23 @@
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
+ export async function invalidateList(store, args) {
18
+ const where = store.whereCanonicalizer.canonicalize(args.where ?? {});
19
+ const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});
20
+ const cacheKey = store.cacheKeys.get("list", args.type.type, args.type.apiName, where, orderBy);
21
+ await store.queries.peek(cacheKey)?.revalidate(true);
22
+ }
23
+ //# sourceMappingURL=invalidateList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidateList.js","names":["invalidateList","store","args","where","whereCanonicalizer","canonicalize","orderBy","orderByCanonicalizer","cacheKey","cacheKeys","get","type","apiName","queries","peek","revalidate"],"sources":["invalidateList.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport type { OrderBy } from \"../../ObservableClient.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { ListCacheKey } from \"../list/ListCacheKey.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\n\nexport async function invalidateList<T extends ObjectTypeDefinition>(\n store: Store,\n args: {\n type: Pick<T, \"apiName\" | \"type\">;\n where?: WhereClause<T> | SimpleWhereClause;\n orderBy?: OrderBy<T>;\n },\n): Promise<void> {\n const where = store.whereCanonicalizer.canonicalize(args.where ?? {});\n const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});\n\n const cacheKey = store.cacheKeys.get<ListCacheKey>(\n \"list\",\n args.type.type,\n args.type.apiName,\n where,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n await store.queries.peek(cacheKey)?.revalidate(true);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,OAAO,eAAeA,cAAcA,CAClCC,KAAY,EACZC,IAIC,EACc;EACf,MAAMC,KAAK,GAAGF,KAAK,CAACG,kBAAkB,CAACC,YAAY,CAACH,IAAI,CAACC,KAAK,IAAI,CAAC,CAAC,CAAC;EACrE,MAAMG,OAAO,GAAGL,KAAK,CAACM,oBAAoB,CAACF,YAAY,CAACH,IAAI,CAACI,OAAO,IAAI,CAAC,CAAC,CAAC;EAE3E,MAAME,QAAQ,GAAGP,KAAK,CAACQ,SAAS,CAACC,GAAG,CAClC,MAAM,EACNR,IAAI,CAACS,IAAI,CAACA,IAAI,EACdT,IAAI,CAACS,IAAI,CAACC,OAAO,EACjBT,KAAK,EACLG,OACF,CAAC;EAED,MAAML,KAAK,CAACY,OAAO,CAACC,IAAI,CAACN,QAAQ,CAAC,EAAEO,UAAU,CAAC,IAAI,CAAC;AACtD","ignoreList":[]}
@@ -0,0 +1,69 @@
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 { createDefer, expectSingleLinkCallAndClear, mockLinkSubCallback, waitForCall } from "../../testUtils.js";
18
+ const defer = createDefer();
19
+
20
+ /**
21
+ * Utility function for testing link observation behavior between objects
22
+ *
23
+ * This function provides the following guarantees:
24
+ * - Sets up a link subscription using the Store's observeLinks method
25
+ * - Validates that an initial "loading" state is emitted with empty results
26
+ * - Waits for the link data to be fetched and emitted
27
+ * - Validates the "loaded" state contains the expected linked objects
28
+ * - Returns both the link payload and mock subscription function for further assertions
29
+ *
30
+ * This helper creates a standardized test flow for link observations that:
31
+ * 1. Creates a subscription to observe links from source to target objects
32
+ * 2. Verifies the initial loading state is emitted with empty results
33
+ * 3. Waits for the data loading to complete
34
+ * 4. Verifies the loaded state with the expected linked objects
35
+ * 5. Provides the result objects for additional assertions in tests
36
+ *
37
+ * @typeParam S - The source object type definition
38
+ * @typeParam T - The target object type definition
39
+ */
40
+ export async function expectStandardObserveLink({
41
+ store,
42
+ srcObject,
43
+ srcLinkName,
44
+ targetType,
45
+ expected
46
+ }) {
47
+ const linkSubFn = mockLinkSubCallback();
48
+ defer(store.links.observe({
49
+ linkName: srcLinkName,
50
+ srcType: {
51
+ type: "object",
52
+ apiName: srcObject.$apiName
53
+ },
54
+ pk: srcObject.$primaryKey
55
+ }, linkSubFn));
56
+ await waitForCall(linkSubFn);
57
+ expectSingleLinkCallAndClear(linkSubFn, [], {
58
+ status: "loading"
59
+ });
60
+ await waitForCall(linkSubFn);
61
+ const payload = expectSingleLinkCallAndClear(linkSubFn, expected, {
62
+ status: "loaded"
63
+ });
64
+ return {
65
+ payload,
66
+ linkSubFn
67
+ };
68
+ }
69
+ //# sourceMappingURL=expectStandardObserveLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expectStandardObserveLink.js","names":["createDefer","expectSingleLinkCallAndClear","mockLinkSubCallback","waitForCall","defer","expectStandardObserveLink","store","srcObject","srcLinkName","targetType","expected","linkSubFn","links","observe","linkName","srcType","type","apiName","$apiName","pk","$primaryKey","status","payload"],"sources":["expectStandardObserveLink.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport type { Observer } from \"type-fest\";\nimport type { MockedObject } from \"vitest\";\nimport type { ObjectHolder } from \"../../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { SpecificLinkPayload } from \"../../../LinkPayload.js\";\nimport type { Store } from \"../../Store.js\";\nimport {\n createDefer,\n expectSingleLinkCallAndClear,\n mockLinkSubCallback,\n waitForCall,\n} from \"../../testUtils.js\";\n\nconst defer = createDefer();\n\n/**\n * Utility function for testing link observation behavior between objects\n *\n * This function provides the following guarantees:\n * - Sets up a link subscription using the Store's observeLinks method\n * - Validates that an initial \"loading\" state is emitted with empty results\n * - Waits for the link data to be fetched and emitted\n * - Validates the \"loaded\" state contains the expected linked objects\n * - Returns both the link payload and mock subscription function for further assertions\n *\n * This helper creates a standardized test flow for link observations that:\n * 1. Creates a subscription to observe links from source to target objects\n * 2. Verifies the initial loading state is emitted with empty results\n * 3. Waits for the data loading to complete\n * 4. Verifies the loaded state with the expected linked objects\n * 5. Provides the result objects for additional assertions in tests\n *\n * @typeParam S - The source object type definition\n * @typeParam T - The target object type definition\n */\nexport async function expectStandardObserveLink<\n S extends ObjectTypeDefinition,\n T extends ObjectTypeDefinition,\n>(\n {\n store,\n srcObject,\n srcLinkName,\n targetType,\n expected,\n }: {\n /** The Store instance to use for observation */\n store: Store;\n /** The source object that contains the link */\n srcObject: Osdk.Instance<S>;\n /** The name of the link field to observe */\n srcLinkName: string;\n /** The type definition of the linked objects */\n targetType: T;\n /** The expected linked objects that should be returned */\n expected: ObjectHolder<Osdk.Instance<T>>[];\n },\n): Promise<{\n /** The link payload containing the linked objects and metadata */\n payload: SpecificLinkPayload | undefined;\n /** The mocked subscription callback for further testing assertions */\n linkSubFn: MockedObject<\n Observer<\n SpecificLinkPayload | undefined\n >\n >;\n}> {\n const linkSubFn = mockLinkSubCallback();\n defer(\n store.links.observe({\n linkName: srcLinkName,\n srcType: { type: \"object\", apiName: srcObject.$apiName },\n pk: srcObject.$primaryKey,\n }, linkSubFn),\n );\n\n await waitForCall(linkSubFn);\n expectSingleLinkCallAndClear(linkSubFn, [], { status: \"loading\" });\n\n await waitForCall(linkSubFn);\n\n const payload = expectSingleLinkCallAndClear(linkSubFn, expected, {\n status: \"loaded\",\n });\n\n return { payload, linkSubFn };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,SACEA,WAAW,EACXC,4BAA4B,EAC5BC,mBAAmB,EACnBC,WAAW,QACN,oBAAoB;AAE3B,MAAMC,KAAK,GAAGJ,WAAW,CAAC,CAAC;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeK,yBAAyBA,CAI7C;EACEC,KAAK;EACLC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC;AAYF,CAAC,EAUA;EACD,MAAMC,SAAS,GAAGT,mBAAmB,CAAC,CAAC;EACvCE,KAAK,CACHE,KAAK,CAACM,KAAK,CAACC,OAAO,CAAC;IAClBC,QAAQ,EAAEN,WAAW;IACrBO,OAAO,EAAE;MAAEC,IAAI,EAAE,QAAQ;MAAEC,OAAO,EAAEV,SAAS,CAACW;IAAS,CAAC;IACxDC,EAAE,EAAEZ,SAAS,CAACa;EAChB,CAAC,EAAET,SAAS,CACd,CAAC;EAED,MAAMR,WAAW,CAACQ,SAAS,CAAC;EAC5BV,4BAA4B,CAACU,SAAS,EAAE,EAAE,EAAE;IAAEU,MAAM,EAAE;EAAU,CAAC,CAAC;EAElE,MAAMlB,WAAW,CAACQ,SAAS,CAAC;EAE5B,MAAMW,OAAO,GAAGrB,4BAA4B,CAACU,SAAS,EAAED,QAAQ,EAAE;IAChEW,MAAM,EAAE;EACV,CAAC,CAAC;EAEF,OAAO;IAAEC,OAAO;IAAEX;EAAU,CAAC;AAC/B","ignoreList":[]}
@@ -0,0 +1,56 @@
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 { expect } from "vitest";
18
+ import { createDefer, expectSingleObjectCallAndClear, mockSingleSubCallback, waitForCall } from "../../testUtils.js";
19
+ const defer = createDefer();
20
+
21
+ /**
22
+ * Utility function for testing object observation behavior
23
+ *
24
+ * This function provides the following guarantees:
25
+ * - Validates the initial "loading" state is emitted
26
+ * - Waits for the subscription callback to be called again
27
+ * - Validates the "loaded" state with the expected object containing apiName and primaryKey
28
+ * - Returns both the observed object and mock subscription function for further assertions
29
+ *
30
+ * @param cache - The Store instance to use for observation
31
+ * @param apiName - The API name for the object to observe
32
+ * @param primaryKey - The primary key of the object to observe
33
+ * @returns A promise that resolves to the observed object and the mocked subscription callback
34
+ */
35
+ export async function expectStandardObserveObject({
36
+ cache,
37
+ type,
38
+ primaryKey
39
+ }) {
40
+ const subFn = mockSingleSubCallback();
41
+ defer(cache.objects.observe({
42
+ apiName: type,
43
+ pk: primaryKey
44
+ }, subFn));
45
+ expectSingleObjectCallAndClear(subFn, undefined, "loading");
46
+ await waitForCall(subFn);
47
+ const obj = expectSingleObjectCallAndClear(subFn, expect.objectContaining({
48
+ $apiName: type.apiName,
49
+ $primaryKey: primaryKey
50
+ }), "loaded");
51
+ return {
52
+ payload: obj,
53
+ subFn
54
+ };
55
+ }
56
+ //# sourceMappingURL=expectStandardObserveObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expectStandardObserveObject.js","names":["expect","createDefer","expectSingleObjectCallAndClear","mockSingleSubCallback","waitForCall","defer","expectStandardObserveObject","cache","type","primaryKey","subFn","objects","observe","apiName","pk","undefined","obj","objectContaining","$apiName","$primaryKey","payload"],"sources":["expectStandardObserveObject.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, PrimaryKeyType } from \"@osdk/api\";\nimport { expect } from \"vitest\";\nimport type { TypedObjectPayload } from \"../../../ObjectPayload.js\";\nimport type { Store } from \"../../Store.js\";\nimport type { MockedSingleSubCallback } from \"../../testUtils.js\";\nimport {\n createDefer,\n expectSingleObjectCallAndClear,\n mockSingleSubCallback,\n waitForCall,\n} from \"../../testUtils.js\";\n\nconst defer = createDefer();\n\n/**\n * Utility function for testing object observation behavior\n *\n * This function provides the following guarantees:\n * - Validates the initial \"loading\" state is emitted\n * - Waits for the subscription callback to be called again\n * - Validates the \"loaded\" state with the expected object containing apiName and primaryKey\n * - Returns both the observed object and mock subscription function for further assertions\n *\n * @param cache - The Store instance to use for observation\n * @param apiName - The API name for the object to observe\n * @param primaryKey - The primary key of the object to observe\n * @returns A promise that resolves to the observed object and the mocked subscription callback\n */\nexport async function expectStandardObserveObject<\n T extends ObjectTypeDefinition,\n>(\n { cache, type, primaryKey }: {\n cache: Store;\n type: T;\n primaryKey: PrimaryKeyType<T>;\n },\n): Promise<{\n payload: TypedObjectPayload<T>;\n subFn: MockedSingleSubCallback;\n}> {\n const subFn = mockSingleSubCallback();\n defer(\n cache.objects.observe({\n apiName: type,\n pk: primaryKey,\n }, subFn),\n );\n\n expectSingleObjectCallAndClear(\n subFn,\n undefined,\n \"loading\",\n );\n\n await waitForCall(subFn);\n\n const obj = expectSingleObjectCallAndClear(\n subFn,\n expect.objectContaining({\n $apiName: type.apiName,\n $primaryKey: primaryKey,\n }),\n \"loaded\",\n );\n return { payload: obj as TypedObjectPayload<T>, subFn };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,MAAM,QAAQ,QAAQ;AAI/B,SACEC,WAAW,EACXC,8BAA8B,EAC9BC,qBAAqB,EACrBC,WAAW,QACN,oBAAoB;AAE3B,MAAMC,KAAK,GAAGJ,WAAW,CAAC,CAAC;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeK,2BAA2BA,CAG/C;EAAEC,KAAK;EAAEC,IAAI;EAAEC;AAIf,CAAC,EAIA;EACD,MAAMC,KAAK,GAAGP,qBAAqB,CAAC,CAAC;EACrCE,KAAK,CACHE,KAAK,CAACI,OAAO,CAACC,OAAO,CAAC;IACpBC,OAAO,EAAEL,IAAI;IACbM,EAAE,EAAEL;EACN,CAAC,EAAEC,KAAK,CACV,CAAC;EAEDR,8BAA8B,CAC5BQ,KAAK,EACLK,SAAS,EACT,SACF,CAAC;EAED,MAAMX,WAAW,CAACM,KAAK,CAAC;EAExB,MAAMM,GAAG,GAAGd,8BAA8B,CACxCQ,KAAK,EACLV,MAAM,CAACiB,gBAAgB,CAAC;IACtBC,QAAQ,EAAEV,IAAI,CAACK,OAAO;IACtBM,WAAW,EAAEV;EACf,CAAC,CAAC,EACF,QACF,CAAC;EACD,OAAO;IAAEW,OAAO,EAAEJ,GAA4B;IAAEN;EAAM,CAAC;AACzD","ignoreList":[]}
@@ -15,22 +15,25 @@
15
15
  */
16
16
 
17
17
  import { Chalk } from "chalk";
18
+ import { inspect } from "node:util";
18
19
  import pDefer from "p-defer";
19
20
  import invariant from "tiny-invariant";
20
21
  import { afterEach, beforeEach, expect, vi, vitest } from "vitest";
21
22
  import { additionalContext } from "../../Client.js";
22
- import { storeOsdkInstances } from "./ObjectQuery.js";
23
23
  const chalk = new Chalk(); // new Chalk({ level: 3 });
24
24
 
25
25
  function mockLog(...args) {
26
26
  // eslint-disable-next-line no-console
27
27
  console.log(chalk.yellow("mockClient"), ...args);
28
28
  }
29
- // interface Logger.LogFn {
30
- // (obj: unknown, msg?: string, ...args: any[]): void;
31
- // (msg: string, ...args: any[]): void;
32
- // }
33
29
 
30
+ /**
31
+ * Testing utilities for ObservableClient implementation.
32
+ * - Mock creation helpers for client, observers, and callbacks
33
+ * - Expectation utilities for validating payloads
34
+ * - Tools for managing test lifecycle and cleanup
35
+ * - Creates a colorized logger for test environments
36
+ */
34
37
  export function createTestLogger(bindings, options) {
35
38
  const colors = {
36
39
  debug: [chalk.cyan, chalk.bgCyan],
@@ -71,6 +74,10 @@ export function createTestLogger(bindings, options) {
71
74
  isLevelEnabled: vi.fn(() => true)
72
75
  };
73
76
  }
77
+
78
+ /**
79
+ * Creates mocked client helpers with deferred promise control
80
+ */
74
81
  export function createClientMockHelper() {
75
82
  const client = vitest.fn();
76
83
  const logger = createTestLogger({});
@@ -183,6 +190,10 @@ export function createClientMockHelper() {
183
190
  }
184
191
  };
185
192
  }
193
+
194
+ /**
195
+ * Manages test subscriptions with automatic cleanup
196
+ */
186
197
  export function createDefer() {
187
198
  let subscriptions;
188
199
  beforeEach(() => {
@@ -199,6 +210,18 @@ export function createDefer() {
199
210
  return x;
200
211
  };
201
212
  }
213
+ export function expectSingleLinkCallAndClear(subFn, resolvedList, payloadOptions = {}) {
214
+ if (vitest.isFakeTimers()) {
215
+ vitest.runOnlyPendingTimers();
216
+ }
217
+ expect(subFn.next).toHaveBeenCalledExactlyOnceWith(linkPayloadContaining({
218
+ ...payloadOptions,
219
+ resolvedList: resolvedList
220
+ }));
221
+ const ret = subFn.next.mock.calls[0][0];
222
+ subFn.next.mockClear();
223
+ return ret;
224
+ }
202
225
  export function expectSingleListCallAndClear(subFn, resolvedList, payloadOptions = {}) {
203
226
  if (vitest.isFakeTimers()) {
204
227
  vitest.runOnlyPendingTimers();
@@ -209,12 +232,18 @@ export function expectSingleListCallAndClear(subFn, resolvedList, payloadOptions
209
232
  }));
210
233
  subFn.next.mockClear();
211
234
  }
235
+
236
+ /**
237
+ * Validates object payload emissions in tests
238
+ */
212
239
  export function expectSingleObjectCallAndClear(subFn, object, status) {
213
240
  expect(subFn.next).toHaveBeenCalledExactlyOnceWith(expect.objectContaining({
214
241
  object,
215
242
  status: status ?? expect.any(String)
216
243
  }));
244
+ const ret = subFn.next.mock.calls[0][0];
217
245
  subFn.next.mockClear();
246
+ return ret;
218
247
  }
219
248
  export async function waitForCall(subFn, times = 1) {
220
249
  if ("next" in subFn && "error" in subFn && "complete" in subFn) {
@@ -223,8 +252,16 @@ export async function waitForCall(subFn, times = 1) {
223
252
  try {
224
253
  await vi.waitFor(() => {
225
254
  expect(subFn).toHaveBeenCalledTimes(times);
255
+ }, {
256
+ interval: 0
226
257
  });
227
258
  } catch (e) {
259
+ // eslint-disable-next-line no-console
260
+ console.log(`We are going to fail waiting for ${times} calls because these are our calls: `, inspect(subFn.mock.calls, {
261
+ depth: 9,
262
+ colors: true,
263
+ compact: 2
264
+ }));
228
265
  // we don't need the error, it will retrigger on the next line
229
266
  // and that provides better behavior in the vitest vscode
230
267
  // plugin. This places the error in the test itself instead of
@@ -286,9 +323,16 @@ export function mockObserver() {
286
323
  complete: vitest.fn()
287
324
  };
288
325
  }
326
+
327
+ // todo: find uses of this and replace with direct call to mockObserver<ListPayload | undefined>
289
328
  export function mockListSubCallback() {
290
329
  return mockObserver();
291
330
  }
331
+
332
+ // todo: find uses of this and replace with direct call to mockObserver<SpecificLinkPayload | undefined>
333
+ export function mockLinkSubCallback() {
334
+ return mockObserver();
335
+ }
292
336
  export function cacheEntryContaining(x) {
293
337
  return {
294
338
  cacheKey: x.cacheKey ?? expect.any(Object),
@@ -318,6 +362,16 @@ export function listPayloadContaining(x) {
318
362
  lastUpdated: x.lastUpdated ?? expect.anything()
319
363
  };
320
364
  }
365
+ export function linkPayloadContaining(x) {
366
+ return {
367
+ fetchMore: x.fetchMore ?? expect.any(Function),
368
+ hasMore: x.hasMore ?? expect.any(Boolean),
369
+ resolvedList: x.resolvedList ?? expect.anything(),
370
+ isOptimistic: expect.any(Boolean),
371
+ status: x.status ?? expect.anything(),
372
+ lastUpdated: x.lastUpdated ?? expect.anything()
373
+ };
374
+ }
321
375
  export function applyCustomMatchers() {
322
376
  expect.extend({
323
377
  toBeGreaterThan: (r, e) => {
@@ -356,21 +410,29 @@ export function updateList(store, {
356
410
  optimisticId
357
411
  });
358
412
  }
359
- const query = store.getListQuery(type, where ?? {}, orderBy ?? {}, opts);
413
+ const query = store.lists.getQuery({
414
+ ...opts,
415
+ type,
416
+ where: where ?? {},
417
+ orderBy: orderBy ?? {}
418
+ });
360
419
  store.batch({
361
420
  optimisticId
362
421
  }, batch => {
363
- const objectCacheKeys = storeOsdkInstances(store, objects, batch);
364
- query._updateList(objectCacheKeys, false, "loaded", batch);
422
+ const objectCacheKeys = store.objects.storeOsdkInstances(objects, batch);
423
+ query._updateList(objectCacheKeys, "loaded", batch, false);
365
424
  });
366
425
  }
367
426
  export function getObject(store, type, pk) {
368
- return store.getValue(store.getCacheKey("object", type, pk))?.value;
427
+ return store.getValue(store.cacheKeys.get("object", type, pk))?.value;
369
428
  }
370
429
  export function updateObject(store, value, {
371
430
  optimisticId
372
431
  } = {}) {
373
- const query = store.getObjectQuery(value.$apiName, value.$primaryKey);
432
+ const query = store.objects.getQuery({
433
+ apiName: value.$apiName,
434
+ pk: value.$primaryKey
435
+ });
374
436
  store.batch({
375
437
  optimisticId
376
438
  }, batch => {