@osdk/client 2.5.0-beta.4 → 2.5.0-beta.6

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 (327) hide show
  1. package/CHANGELOG.md +33 -4
  2. package/build/browser/MinimalClientContext.js.map +1 -1
  3. package/build/browser/actions/applyAction.js +4 -0
  4. package/build/browser/actions/applyAction.js.map +1 -1
  5. package/build/browser/createClient.js +2 -1
  6. package/build/browser/createClient.js.map +1 -1
  7. package/build/browser/createMinimalClient.js +2 -1
  8. package/build/browser/createMinimalClient.js.map +1 -1
  9. package/build/browser/index.js +2 -0
  10. package/build/browser/index.js.map +1 -1
  11. package/build/browser/object/Cache.test.js +1 -1
  12. package/build/browser/object/Cache.test.js.map +1 -1
  13. package/build/browser/object/aggregate.js +2 -0
  14. package/build/browser/object/aggregate.js.map +1 -1
  15. package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
  16. package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
  17. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
  18. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  19. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
  20. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  21. package/build/browser/object/convertWireToOsdkObjects.test.js +2 -0
  22. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  23. package/build/browser/object/fetchPage.js +5 -2
  24. package/build/browser/object/fetchPage.js.map +1 -1
  25. package/build/browser/observable/internal/AbstractHelper.js +4 -3
  26. package/build/browser/observable/internal/AbstractHelper.js.map +1 -1
  27. package/build/browser/observable/internal/BatchContext.js +2 -0
  28. package/build/browser/observable/internal/BatchContext.js.map +1 -0
  29. package/build/browser/observable/internal/CacheKeys.js +61 -36
  30. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  31. package/build/browser/observable/internal/Changes.js.map +1 -1
  32. package/build/browser/observable/internal/KnownCacheKey.js.map +1 -1
  33. package/build/browser/observable/internal/Layer.js +0 -8
  34. package/build/browser/observable/internal/Layer.js.map +1 -1
  35. package/build/browser/observable/internal/Layers.js +151 -0
  36. package/build/browser/observable/internal/Layers.js.map +1 -0
  37. package/build/browser/observable/internal/ObservableClientImpl.js +3 -1
  38. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  39. package/build/browser/observable/internal/OrderByCanonicalizer.js +1 -37
  40. package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -1
  41. package/build/browser/observable/internal/Queries.js +40 -0
  42. package/build/browser/observable/internal/Queries.js.map +1 -0
  43. package/build/browser/observable/internal/Query.js +1 -0
  44. package/build/browser/observable/internal/Query.js.map +1 -1
  45. package/build/browser/observable/internal/Store.js +37 -226
  46. package/build/browser/observable/internal/Store.js.map +1 -1
  47. package/build/browser/observable/internal/Store.test.js +12 -10
  48. package/build/browser/observable/internal/Store.test.js.map +1 -1
  49. package/build/browser/observable/internal/SubjectPayload.js +2 -0
  50. package/build/browser/observable/internal/SubjectPayload.js.map +1 -0
  51. package/build/browser/observable/internal/Subjects.js +55 -0
  52. package/build/browser/observable/internal/Subjects.js.map +1 -0
  53. package/build/browser/observable/internal/WeakRefTrie.js +61 -0
  54. package/build/browser/observable/internal/WeakRefTrie.js.map +1 -0
  55. package/build/browser/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
  56. package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -0
  57. package/build/browser/observable/internal/{OptimisticJob.js → actions/OptimisticJob.js} +3 -3
  58. package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -0
  59. package/build/browser/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
  60. package/build/browser/observable/internal/base-list/BaseListQuery.js +411 -0
  61. package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -0
  62. package/build/{esm/observable/internal → browser/observable/internal/base-list}/createCollectionConnectable.js +2 -2
  63. package/build/browser/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
  64. package/build/{esm/observable/internal → browser/observable/internal/base-list}/createCollectionConnectable.test.js +24 -26
  65. package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
  66. package/build/browser/observable/internal/base-list/removeDuplicates.js.map +1 -0
  67. package/build/browser/observable/internal/createInitEntry.js +25 -0
  68. package/build/browser/observable/internal/createInitEntry.js.map +1 -0
  69. package/build/browser/observable/internal/links/LinksHelper.js +5 -5
  70. package/build/browser/observable/internal/links/LinksHelper.js.map +1 -1
  71. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
  72. package/build/browser/observable/internal/links/SpecificLinkQuery.js +1 -1
  73. package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -1
  74. package/build/browser/observable/internal/{ListCacheKey.js.map → list/ListCacheKey.js.map} +1 -1
  75. package/build/browser/observable/internal/{ListQuery.js → list/ListQuery.js} +12 -421
  76. package/build/browser/observable/internal/list/ListQuery.js.map +1 -0
  77. package/build/browser/observable/internal/list/ListQueryOptions.js +2 -0
  78. package/build/browser/observable/internal/list/ListQueryOptions.js.map +1 -0
  79. package/build/browser/observable/internal/list/ListsHelper.js +6 -6
  80. package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
  81. package/build/browser/observable/internal/object/ObjectCacheKey.js +2 -0
  82. package/build/browser/observable/internal/object/ObjectCacheKey.js.map +1 -0
  83. package/build/browser/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +4 -20
  84. package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -0
  85. package/build/browser/observable/internal/object/ObjectsHelper.js +17 -3
  86. package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
  87. package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -1
  88. package/build/browser/observable/internal/testUtils/invalidateList.js +2 -2
  89. package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -1
  90. package/build/browser/observable/internal/testUtils.js +2 -3
  91. package/build/browser/observable/internal/testUtils.js.map +1 -1
  92. package/build/browser/ontology/loadActionMetadata.js +3 -1
  93. package/build/browser/ontology/loadActionMetadata.js.map +1 -1
  94. package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
  95. package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
  96. package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
  97. package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
  98. package/build/browser/queries/applyQuery.js +3 -3
  99. package/build/browser/queries/applyQuery.js.map +1 -1
  100. package/build/browser/util/UserAgent.js +2 -2
  101. package/build/browser/util/extractObjectOrInterfaceType.js +9 -1
  102. package/build/browser/util/extractObjectOrInterfaceType.js.map +1 -1
  103. package/build/browser/util/extractObjectOrInterfaceType.test.js +2 -2
  104. package/build/browser/util/extractObjectOrInterfaceType.test.js.map +1 -1
  105. package/build/cjs/{chunk-6CBVXAAV.cjs → chunk-4GWXMQZE.cjs} +107 -75
  106. package/build/cjs/chunk-4GWXMQZE.cjs.map +1 -0
  107. package/build/cjs/{chunk-QR7IBJPZ.cjs → chunk-5KDG5ZET.cjs} +18 -6
  108. package/build/cjs/chunk-5KDG5ZET.cjs.map +1 -0
  109. package/build/cjs/{createClient-BJo8T7Js.d.cts → createClient-mOlFts15.d.cts} +1 -0
  110. package/build/cjs/index.cjs +7 -7
  111. package/build/cjs/index.d.cts +1 -1
  112. package/build/cjs/public/internal.cjs +8 -8
  113. package/build/cjs/public/unstable-do-not-use.cjs +831 -775
  114. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  115. package/build/cjs/public/unstable-do-not-use.d.cts +1 -1
  116. package/build/esm/MinimalClientContext.js.map +1 -1
  117. package/build/esm/actions/applyAction.js +4 -0
  118. package/build/esm/actions/applyAction.js.map +1 -1
  119. package/build/esm/createClient.js +2 -1
  120. package/build/esm/createClient.js.map +1 -1
  121. package/build/esm/createMinimalClient.js +2 -1
  122. package/build/esm/createMinimalClient.js.map +1 -1
  123. package/build/esm/index.js +2 -0
  124. package/build/esm/index.js.map +1 -1
  125. package/build/esm/object/Cache.test.js +1 -1
  126. package/build/esm/object/Cache.test.js.map +1 -1
  127. package/build/esm/object/aggregate.js +2 -0
  128. package/build/esm/object/aggregate.js.map +1 -1
  129. package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
  130. package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
  131. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
  132. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  133. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
  134. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  135. package/build/esm/object/convertWireToOsdkObjects.test.js +2 -0
  136. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  137. package/build/esm/object/fetchPage.js +5 -2
  138. package/build/esm/object/fetchPage.js.map +1 -1
  139. package/build/esm/observable/internal/AbstractHelper.js +4 -3
  140. package/build/esm/observable/internal/AbstractHelper.js.map +1 -1
  141. package/build/esm/observable/internal/BatchContext.js +2 -0
  142. package/build/esm/observable/internal/BatchContext.js.map +1 -0
  143. package/build/esm/observable/internal/CacheKeys.js +61 -36
  144. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  145. package/build/esm/observable/internal/Changes.js.map +1 -1
  146. package/build/esm/observable/internal/KnownCacheKey.js.map +1 -1
  147. package/build/esm/observable/internal/Layer.js +0 -8
  148. package/build/esm/observable/internal/Layer.js.map +1 -1
  149. package/build/esm/observable/internal/Layers.js +151 -0
  150. package/build/esm/observable/internal/Layers.js.map +1 -0
  151. package/build/esm/observable/internal/ObservableClientImpl.js +3 -1
  152. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  153. package/build/esm/observable/internal/OrderByCanonicalizer.js +1 -37
  154. package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -1
  155. package/build/esm/observable/internal/Queries.js +40 -0
  156. package/build/esm/observable/internal/Queries.js.map +1 -0
  157. package/build/esm/observable/internal/Query.js +1 -0
  158. package/build/esm/observable/internal/Query.js.map +1 -1
  159. package/build/esm/observable/internal/Store.js +37 -226
  160. package/build/esm/observable/internal/Store.js.map +1 -1
  161. package/build/esm/observable/internal/Store.test.js +12 -10
  162. package/build/esm/observable/internal/Store.test.js.map +1 -1
  163. package/build/esm/observable/internal/SubjectPayload.js +2 -0
  164. package/build/esm/observable/internal/SubjectPayload.js.map +1 -0
  165. package/build/esm/observable/internal/Subjects.js +55 -0
  166. package/build/esm/observable/internal/Subjects.js.map +1 -0
  167. package/build/esm/observable/internal/WeakRefTrie.js +61 -0
  168. package/build/esm/observable/internal/WeakRefTrie.js.map +1 -0
  169. package/build/esm/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
  170. package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -0
  171. package/build/esm/observable/internal/{OptimisticJob.js → actions/OptimisticJob.js} +3 -3
  172. package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -0
  173. package/build/esm/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
  174. package/build/esm/observable/internal/base-list/BaseListQuery.js +411 -0
  175. package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -0
  176. package/build/{browser/observable/internal → esm/observable/internal/base-list}/createCollectionConnectable.js +2 -2
  177. package/build/esm/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
  178. package/build/{browser/observable/internal → esm/observable/internal/base-list}/createCollectionConnectable.test.js +24 -26
  179. package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
  180. package/build/esm/observable/internal/base-list/removeDuplicates.js.map +1 -0
  181. package/build/esm/observable/internal/createInitEntry.js +25 -0
  182. package/build/esm/observable/internal/createInitEntry.js.map +1 -0
  183. package/build/esm/observable/internal/links/LinksHelper.js +5 -5
  184. package/build/esm/observable/internal/links/LinksHelper.js.map +1 -1
  185. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
  186. package/build/esm/observable/internal/links/SpecificLinkQuery.js +1 -1
  187. package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -1
  188. package/build/esm/observable/internal/{ListCacheKey.js.map → list/ListCacheKey.js.map} +1 -1
  189. package/build/esm/observable/internal/{ListQuery.js → list/ListQuery.js} +12 -421
  190. package/build/esm/observable/internal/list/ListQuery.js.map +1 -0
  191. package/build/esm/observable/internal/list/ListQueryOptions.js +2 -0
  192. package/build/esm/observable/internal/list/ListQueryOptions.js.map +1 -0
  193. package/build/esm/observable/internal/list/ListsHelper.js +6 -6
  194. package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
  195. package/build/esm/observable/internal/object/ObjectCacheKey.js +2 -0
  196. package/build/esm/observable/internal/object/ObjectCacheKey.js.map +1 -0
  197. package/build/esm/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +4 -20
  198. package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -0
  199. package/build/esm/observable/internal/object/ObjectsHelper.js +17 -3
  200. package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
  201. package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -1
  202. package/build/esm/observable/internal/testUtils/invalidateList.js +2 -2
  203. package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -1
  204. package/build/esm/observable/internal/testUtils.js +2 -3
  205. package/build/esm/observable/internal/testUtils.js.map +1 -1
  206. package/build/esm/ontology/loadActionMetadata.js +3 -1
  207. package/build/esm/ontology/loadActionMetadata.js.map +1 -1
  208. package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
  209. package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
  210. package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
  211. package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
  212. package/build/esm/queries/applyQuery.js +3 -3
  213. package/build/esm/queries/applyQuery.js.map +1 -1
  214. package/build/esm/util/UserAgent.js +2 -2
  215. package/build/esm/util/extractObjectOrInterfaceType.js +9 -1
  216. package/build/esm/util/extractObjectOrInterfaceType.js.map +1 -1
  217. package/build/esm/util/extractObjectOrInterfaceType.test.js +2 -2
  218. package/build/esm/util/extractObjectOrInterfaceType.test.js.map +1 -1
  219. package/build/types/MinimalClientContext.d.ts +1 -0
  220. package/build/types/MinimalClientContext.d.ts.map +1 -1
  221. package/build/types/actions/applyAction.d.ts.map +1 -1
  222. package/build/types/createClient.d.ts +1 -0
  223. package/build/types/createClient.d.ts.map +1 -1
  224. package/build/types/index.d.ts +1 -1
  225. package/build/types/index.d.ts.map +1 -1
  226. package/build/types/observable/internal/AbstractHelper.d.ts +3 -1
  227. package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -1
  228. package/build/types/observable/internal/BatchContext.d.ts +11 -0
  229. package/build/types/observable/internal/BatchContext.d.ts.map +1 -0
  230. package/build/types/observable/internal/CacheKeys.d.ts +9 -9
  231. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  232. package/build/types/observable/internal/Changes.d.ts +2 -2
  233. package/build/types/observable/internal/Changes.d.ts.map +1 -1
  234. package/build/types/observable/internal/KnownCacheKey.d.ts +2 -2
  235. package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -1
  236. package/build/types/observable/internal/Layer.d.ts +1 -2
  237. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  238. package/build/types/observable/internal/Layers.d.ts +26 -0
  239. package/build/types/observable/internal/Layers.d.ts.map +1 -0
  240. package/build/types/observable/internal/OrderByCanonicalizer.d.ts +0 -7
  241. package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -1
  242. package/build/types/observable/internal/Queries.d.ts +9 -0
  243. package/build/types/observable/internal/Queries.d.ts.map +1 -0
  244. package/build/types/observable/internal/Query.d.ts +5 -1
  245. package/build/types/observable/internal/Query.d.ts.map +1 -1
  246. package/build/types/observable/internal/Store.d.ts +19 -34
  247. package/build/types/observable/internal/Store.d.ts.map +1 -1
  248. package/build/types/observable/internal/Store.test.d.ts.map +1 -1
  249. package/build/types/observable/internal/SubjectPayload.d.ts +5 -0
  250. package/build/types/observable/internal/SubjectPayload.d.ts.map +1 -0
  251. package/build/types/observable/internal/Subjects.d.ts +16 -0
  252. package/build/types/observable/internal/Subjects.d.ts.map +1 -0
  253. package/build/types/observable/internal/WeakRefTrie.d.ts +13 -0
  254. package/build/types/observable/internal/WeakRefTrie.d.ts.map +1 -0
  255. package/build/types/observable/internal/{ActionApplication.d.ts → actions/ActionApplication.d.ts} +2 -2
  256. package/build/types/observable/internal/{ActionApplication.d.ts.map → actions/ActionApplication.d.ts.map} +1 -1
  257. package/build/types/observable/internal/{OptimisticJob.d.ts → actions/OptimisticJob.d.ts} +4 -4
  258. package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -0
  259. package/build/types/observable/internal/{BaseCollectionQuery.d.ts → base-list/BaseCollectionQuery.d.ts} +4 -4
  260. package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts.map +1 -0
  261. package/build/types/observable/internal/{ListQuery.d.ts → base-list/BaseListQuery.d.ts} +9 -91
  262. package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -0
  263. package/build/types/observable/internal/{createCollectionConnectable.d.ts → base-list/createCollectionConnectable.d.ts} +5 -4
  264. package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts.map +1 -0
  265. package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts.map +1 -0
  266. package/build/types/observable/internal/{removeDuplicates.d.ts → base-list/removeDuplicates.d.ts} +2 -2
  267. package/build/types/observable/internal/base-list/removeDuplicates.d.ts.map +1 -0
  268. package/build/types/observable/internal/createInitEntry.d.ts +3 -0
  269. package/build/types/observable/internal/createInitEntry.d.ts.map +1 -0
  270. package/build/types/observable/internal/links/LinksHelper.d.ts +3 -1
  271. package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -1
  272. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +1 -1
  273. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -1
  274. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +4 -2
  275. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -1
  276. package/build/types/observable/internal/{ListCacheKey.d.ts → list/ListCacheKey.d.ts} +4 -4
  277. package/build/types/observable/internal/list/ListCacheKey.d.ts.map +1 -0
  278. package/build/types/observable/internal/list/ListQuery.d.ts +75 -0
  279. package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -0
  280. package/build/types/observable/internal/list/ListQueryOptions.d.ts +4 -0
  281. package/build/types/observable/internal/list/ListQueryOptions.d.ts.map +1 -0
  282. package/build/types/observable/internal/list/ListsHelper.d.ts +4 -2
  283. package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -1
  284. package/build/types/observable/internal/object/ObjectCacheKey.d.ts +5 -0
  285. package/build/types/observable/internal/object/ObjectCacheKey.d.ts.map +1 -0
  286. package/build/types/observable/internal/{ObjectQuery.d.ts → object/ObjectQuery.d.ts} +10 -10
  287. package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -0
  288. package/build/types/observable/internal/object/ObjectsHelper.d.ts +1 -1
  289. package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
  290. package/build/types/observable/internal/sorting/SortingStrategy.d.ts +2 -2
  291. package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -1
  292. package/build/types/observable/internal/testUtils.d.ts +1 -1
  293. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  294. package/package.json +23 -23
  295. package/build/browser/observable/internal/ActionApplication.js.map +0 -1
  296. package/build/browser/observable/internal/BaseCollectionQuery.js.map +0 -1
  297. package/build/browser/observable/internal/ListQuery.js.map +0 -1
  298. package/build/browser/observable/internal/ObjectQuery.js.map +0 -1
  299. package/build/browser/observable/internal/OptimisticJob.js.map +0 -1
  300. package/build/browser/observable/internal/createCollectionConnectable.js.map +0 -1
  301. package/build/browser/observable/internal/createCollectionConnectable.test.js.map +0 -1
  302. package/build/browser/observable/internal/removeDuplicates.js.map +0 -1
  303. package/build/cjs/chunk-6CBVXAAV.cjs.map +0 -1
  304. package/build/cjs/chunk-QR7IBJPZ.cjs.map +0 -1
  305. package/build/esm/observable/internal/ActionApplication.js.map +0 -1
  306. package/build/esm/observable/internal/BaseCollectionQuery.js.map +0 -1
  307. package/build/esm/observable/internal/ListQuery.js.map +0 -1
  308. package/build/esm/observable/internal/ObjectQuery.js.map +0 -1
  309. package/build/esm/observable/internal/OptimisticJob.js.map +0 -1
  310. package/build/esm/observable/internal/createCollectionConnectable.js.map +0 -1
  311. package/build/esm/observable/internal/createCollectionConnectable.test.js.map +0 -1
  312. package/build/esm/observable/internal/removeDuplicates.js.map +0 -1
  313. package/build/types/observable/internal/BaseCollectionQuery.d.ts.map +0 -1
  314. package/build/types/observable/internal/ListCacheKey.d.ts.map +0 -1
  315. package/build/types/observable/internal/ListQuery.d.ts.map +0 -1
  316. package/build/types/observable/internal/ObjectQuery.d.ts.map +0 -1
  317. package/build/types/observable/internal/OptimisticJob.d.ts.map +0 -1
  318. package/build/types/observable/internal/createCollectionConnectable.d.ts.map +0 -1
  319. package/build/types/observable/internal/createCollectionConnectable.test.d.ts.map +0 -1
  320. package/build/types/observable/internal/removeDuplicates.d.ts.map +0 -1
  321. /package/build/browser/observable/internal/{BaseCollectionQuery.js → base-list/BaseCollectionQuery.js} +0 -0
  322. /package/build/browser/observable/internal/{removeDuplicates.js → base-list/removeDuplicates.js} +0 -0
  323. /package/build/browser/observable/internal/{ListCacheKey.js → list/ListCacheKey.js} +0 -0
  324. /package/build/esm/observable/internal/{BaseCollectionQuery.js → base-list/BaseCollectionQuery.js} +0 -0
  325. /package/build/esm/observable/internal/{removeDuplicates.js → base-list/removeDuplicates.js} +0 -0
  326. /package/build/esm/observable/internal/{ListCacheKey.js → list/ListCacheKey.js} +0 -0
  327. /package/build/types/observable/internal/{createCollectionConnectable.test.d.ts → base-list/createCollectionConnectable.test.d.ts} +0 -0
@@ -1,21 +1,21 @@
1
1
  'use strict';
2
2
 
3
- var chunk6CBVXAAV_cjs = require('../chunk-6CBVXAAV.cjs');
4
- var chunkQR7IBJPZ_cjs = require('../chunk-QR7IBJPZ.cjs');
3
+ var chunk4GWXMQZE_cjs = require('../chunk-4GWXMQZE.cjs');
4
+ var chunk5KDG5ZET_cjs = require('../chunk-5KDG5ZET.cjs');
5
5
  require('../chunk-Q7SFCCGT.cjs');
6
6
  var shared_net_fetch = require('@osdk/shared.net.fetch');
7
7
  var rxjs = require('rxjs');
8
8
  var invariant2 = require('tiny-invariant');
9
9
  var trie = require('@wry/trie');
10
10
  var mnemonist = require('mnemonist');
11
- var deepEqual2 = require('fast-deep-equal');
11
+ var deepEqual4 = require('fast-deep-equal');
12
12
  var groupBy = require('object.groupby');
13
13
  var shared_net_errors = require('@osdk/shared.net.errors');
14
14
 
15
15
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
17
17
  var invariant2__default = /*#__PURE__*/_interopDefault(invariant2);
18
- var deepEqual2__default = /*#__PURE__*/_interopDefault(deepEqual2);
18
+ var deepEqual4__default = /*#__PURE__*/_interopDefault(deepEqual4);
19
19
  var groupBy__default = /*#__PURE__*/_interopDefault(groupBy);
20
20
 
21
21
  // src/observable/internal/UnsubscribableWrapper.ts
@@ -35,7 +35,6 @@ var ObservableClientImpl = class {
35
35
  this.__experimentalStore = store;
36
36
  this.applyAction = store.applyAction.bind(store);
37
37
  this.validateAction = store.validateAction.bind(store);
38
- this.canonicalizeWhereClause = store.canonicalizeWhereClause.bind(store);
39
38
  }
40
39
  observeObject = (apiName, pk, options, subFn) => {
41
40
  return this.__experimentalStore.objects.observe(
@@ -76,6 +75,9 @@ var ObservableClientImpl = class {
76
75
  }
77
76
  return new UnsubscribableWrapper(parentSub);
78
77
  };
78
+ canonicalizeWhereClause(where) {
79
+ return this.__experimentalStore.whereCanonicalizer.canonicalize(where);
80
+ }
79
81
  };
80
82
 
81
83
  // src/observable/DebugFlags.ts
@@ -95,7 +97,7 @@ function createOptimisticId() {
95
97
  return /* @__PURE__ */ Object.create(null);
96
98
  }
97
99
 
98
- // src/observable/internal/OptimisticJob.ts
100
+ // src/observable/internal/actions/OptimisticJob.ts
99
101
  var OptimisticJob = class {
100
102
  #result;
101
103
  constructor(store, optimisticId) {
@@ -142,7 +144,7 @@ var OptimisticJob = class {
142
144
  return this;
143
145
  },
144
146
  createObject(type, pk, properties) {
145
- const create = store.client[chunkQR7IBJPZ_cjs.additionalContext].objectFactory2(store.client[chunkQR7IBJPZ_cjs.additionalContext], [{
147
+ const create = store.client[chunk5KDG5ZET_cjs.additionalContext].objectFactory2(store.client[chunk5KDG5ZET_cjs.additionalContext], [{
146
148
  $primaryKey: pk,
147
149
  $apiName: type.apiName,
148
150
  $objectType: type.apiName,
@@ -173,12 +175,12 @@ function runOptimisticJob(store, optimisticUpdate) {
173
175
  // we don't want to leak the result
174
176
  () => void 0
175
177
  ).finally(() => {
176
- store.removeLayer(optimisticId);
178
+ store.layers.remove(optimisticId);
177
179
  });
178
180
  };
179
181
  }
180
182
 
181
- // src/observable/internal/ActionApplication.ts
183
+ // src/observable/internal/actions/ActionApplication.ts
182
184
  var ACTION_DELAY = process.env.NODE_ENV === "production" ? 0 : 1e3;
183
185
  var ActionApplication = class {
184
186
  constructor(store) {
@@ -244,8 +246,8 @@ var ActionApplication = class {
244
246
  objectType,
245
247
  primaryKey
246
248
  } of deletedObjects ?? []) {
247
- const cacheKey = this.store.getCacheKey("object", objectType, primaryKey);
248
- this.store.peekQuery(cacheKey)?.deleteFromStore(
249
+ const cacheKey = this.store.cacheKeys.get("object", objectType, primaryKey);
250
+ this.store.queries.peek(cacheKey)?.deleteFromStore(
249
251
  "loaded",
250
252
  // this is probably not the best value to use
251
253
  batch
@@ -260,45 +262,110 @@ var ActionApplication = class {
260
262
  }
261
263
  };
262
264
  };
265
+
266
+ // src/observable/internal/RefCounts.ts
267
+ var RefCounts = class {
268
+ refCounts = /* @__PURE__ */ new Map();
269
+ // keeps our objects around for some extended duration after they are no longer
270
+ // needed which is good for quick clicks across tabs.
271
+ gcMap = /* @__PURE__ */ new Map();
272
+ constructor(keepAlive, cleanup) {
273
+ this.keepAlive = keepAlive;
274
+ this.cleanup = cleanup;
275
+ }
276
+ register(key) {
277
+ if (!this.refCounts.has(key)) {
278
+ this.gcMap.set(key, Date.now() + this.keepAlive);
279
+ }
280
+ return key;
281
+ }
282
+ retain(key) {
283
+ const count = this.refCounts.get(key) ?? 0;
284
+ this.refCounts.set(key, count + 1);
285
+ if (this.gcMap.has(key)) {
286
+ this.gcMap.delete(key);
287
+ }
288
+ }
289
+ release(key) {
290
+ const count = this.refCounts.get(key);
291
+ if (count === void 0) ; else if (count === 1) {
292
+ this.refCounts.delete(key);
293
+ this.gcMap.set(key, Date.now() + this.keepAlive);
294
+ } else {
295
+ this.refCounts.set(key, count - 1);
296
+ }
297
+ }
298
+ has(key) {
299
+ return this.refCounts.has(key);
300
+ }
301
+ gc() {
302
+ const now = Date.now();
303
+ for (const [key, deathTime] of this.gcMap) {
304
+ if (deathTime < now) {
305
+ this.gcMap.delete(key);
306
+ this.cleanup(key);
307
+ }
308
+ }
309
+ }
310
+ };
311
+
312
+ // src/observable/internal/CacheKeys.ts
263
313
  var CacheKeys = class {
264
314
  #cacheKeys = new trie.Trie(false, (keys) => {
265
- const ret = {
315
+ const cacheKey = {
266
316
  type: keys[0],
267
317
  otherKeys: keys.slice(1)
268
318
  };
269
- this.#onCreate(ret);
270
- return ret;
319
+ this.#onCreate?.(cacheKey);
320
+ return cacheKey;
271
321
  });
272
- #cacheKeyFactories = /* @__PURE__ */ new Map();
322
+ #refCounts = new RefCounts(6e4, (k) => this.#cleanupCacheKey(k));
323
+ // we are currently only using this for debug logging and should just remove it in the future if that
324
+ // continues to be true
325
+ #finalizationRegistry;
273
326
  #onCreate;
274
- constructor(whereCanonicalizer, orderByCanonicalizer, onCreate) {
327
+ #onDestroy;
328
+ constructor({
329
+ onCreate,
330
+ onDestroy
331
+ }) {
275
332
  this.#onCreate = onCreate;
276
- this.#registerCacheKeyFactory("object", (apiName, pk) => {
277
- if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) ;
278
- return this.#cacheKeys.lookupArray(["object", apiName, pk]);
279
- });
280
- this.#registerCacheKeyFactory("list", (type, apiName, where, orderBy) => {
281
- const cacheKeyArgs = ["list", type, apiName, whereCanonicalizer.canonicalize(where), orderByCanonicalizer.canonicalize(orderBy)];
282
- if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) ;
283
- return this.#cacheKeys.lookupArray(cacheKeyArgs);
284
- });
285
- this.#registerCacheKeyFactory("specificLink", (sourceObjectType, sourcePk, linkName, where, orderBy) => {
286
- const cacheKeyArgs = ["specificLink", sourceObjectType, sourcePk, linkName, whereCanonicalizer.canonicalize(where), orderByCanonicalizer.canonicalize(orderBy)];
287
- if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) ;
288
- return this.#cacheKeys.lookupArray(cacheKeyArgs);
333
+ this.#onDestroy = onDestroy;
334
+ setInterval(() => {
335
+ this.#refCounts.gc();
336
+ }, 1e3);
337
+ this.#finalizationRegistry = new FinalizationRegistry((cleanupCallback) => {
338
+ try {
339
+ cleanupCallback();
340
+ } catch (e) {
341
+ console.error("Caught an error while running a finalization callback", e);
342
+ }
289
343
  });
290
344
  }
291
- #registerCacheKeyFactory(type, factory) {
292
- this.#cacheKeyFactories.set(type, factory);
293
- }
294
345
  get(type, ...args) {
295
- const factory = this.#cacheKeyFactories.get(type);
296
- !factory ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, `no cache key factory for type "${type}"`) : invariant2__default.default(false) : void 0;
297
- return factory(...args);
346
+ const cacheKeyArgs = [type, ...args];
347
+ if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) ;
348
+ const cacheKey = this.#cacheKeys.lookupArray(cacheKeyArgs);
349
+ this.#refCounts.register(cacheKey);
350
+ return cacheKey;
351
+ }
352
+ retain(cacheKey) {
353
+ this.#refCounts.retain(cacheKey);
354
+ }
355
+ release(cacheKey) {
356
+ this.#refCounts.release(cacheKey);
298
357
  }
299
- remove(cacheKey) {
358
+ #remove(cacheKey) {
300
359
  this.#cacheKeys.remove(cacheKey.type, ...cacheKey.otherKeys);
301
360
  }
361
+ /**
362
+ * Called after a key is no longer retained and the timeout has elapsed
363
+ * @param key
364
+ */
365
+ #cleanupCacheKey = (key) => {
366
+ this.#onDestroy?.(key);
367
+ this.#remove(key);
368
+ };
302
369
  };
303
370
 
304
371
  // src/observable/internal/CacheKey.ts
@@ -368,6 +435,16 @@ function multimapHelper(multimap) {
368
435
  }));
369
436
  }
370
437
 
438
+ // src/observable/internal/createInitEntry.ts
439
+ function createInitEntry(cacheKey) {
440
+ return {
441
+ cacheKey,
442
+ status: "init",
443
+ value: void 0,
444
+ lastUpdated: 0
445
+ };
446
+ }
447
+
371
448
  // src/observable/internal/WeakMapWithEntries.ts
372
449
  var WeakMapWithEntries = class {
373
450
  #map = /* @__PURE__ */ new WeakMap();
@@ -515,12 +592,159 @@ var Layer = class _Layer {
515
592
  this.#cache.set(cacheKey, value);
516
593
  }
517
594
  };
518
- var Entry = class {
519
- constructor(cacheKey, value, lastUpdated, status = "init") {
520
- this.cacheKey = cacheKey;
521
- this.value = value;
522
- this.lastUpdated = lastUpdated;
523
- this.status = status;
595
+ var Subjects = class {
596
+ #layers;
597
+ // we can use a regular Map here because the refCounting will
598
+ // handle cleanup.
599
+ #cacheKeyToSubject = /* @__PURE__ */ new WeakMap();
600
+ constructor({
601
+ logger,
602
+ layers
603
+ }) {
604
+ this.logger = logger;
605
+ this.#layers = layers;
606
+ }
607
+ peek = (cacheKey) => {
608
+ return this.#cacheKeyToSubject.get(cacheKey);
609
+ };
610
+ get = (cacheKey) => {
611
+ let subject = this.#cacheKeyToSubject.get(cacheKey);
612
+ if (!subject) {
613
+ const initialValue = this.#layers.top.get(cacheKey) ?? createInitEntry(cacheKey);
614
+ subject = new rxjs.BehaviorSubject({
615
+ ...initialValue,
616
+ isOptimistic: initialValue.value !== this.#layers.truth.get(cacheKey)?.value
617
+ });
618
+ this.#cacheKeyToSubject.set(cacheKey, subject);
619
+ }
620
+ return subject;
621
+ };
622
+ delete = (cacheKey) => {
623
+ const subject = this.peek(cacheKey);
624
+ if (subject) {
625
+ subject.complete();
626
+ this.#cacheKeyToSubject.delete(cacheKey);
627
+ }
628
+ };
629
+ };
630
+
631
+ // src/observable/internal/tombstone.ts
632
+ var tombstone = void 0;
633
+
634
+ // src/observable/internal/Layers.ts
635
+ var Layers = class {
636
+ #truthLayer = new Layer(void 0, void 0);
637
+ #topLayer;
638
+ #onRevalidate;
639
+ constructor({
640
+ logger,
641
+ onRevalidate
642
+ }) {
643
+ this.logger = logger;
644
+ this.#topLayer = this.#truthLayer;
645
+ this.subjects = new Subjects({
646
+ logger,
647
+ layers: this
648
+ });
649
+ this.#onRevalidate = onRevalidate;
650
+ }
651
+ get top() {
652
+ return this.#topLayer;
653
+ }
654
+ get truth() {
655
+ return this.#truthLayer;
656
+ }
657
+ remove(layerId) {
658
+ !(layerId != null) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "undefined is the reserved layerId for the truth layer") : invariant2__default.default(false) : void 0;
659
+ let currentLayer = this.#topLayer;
660
+ const cacheKeys = /* @__PURE__ */ new Map();
661
+ while (currentLayer != null && currentLayer.parentLayer != null) {
662
+ if (currentLayer.layerId === layerId) {
663
+ for (const [k, v] of currentLayer.entries()) {
664
+ if (cacheKeys.has(k)) continue;
665
+ cacheKeys.set(k, v);
666
+ }
667
+ }
668
+ currentLayer = currentLayer.parentLayer;
669
+ }
670
+ this.#topLayer = this.#topLayer.removeLayer(layerId);
671
+ for (const [k, oldEntry] of cacheKeys) {
672
+ const currentEntry = this.#topLayer.get(k);
673
+ if (oldEntry !== currentEntry) {
674
+ const newEntry = currentEntry ?? createInitEntry(k);
675
+ this.subjects.peek(k)?.next({
676
+ ...newEntry,
677
+ isOptimistic: currentEntry?.value !== this.#truthLayer.get(k)?.value
678
+ });
679
+ }
680
+ }
681
+ }
682
+ batch({
683
+ optimisticId,
684
+ changes
685
+ }, batchFn) {
686
+ !(optimisticId === void 0 || !!optimisticId) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "optimistic must be undefined or not falsy") : invariant2__default.default(false) : void 0;
687
+ const batchContext = this.#createBatchContext({
688
+ optimisticId,
689
+ changes
690
+ });
691
+ const retVal = batchFn(batchContext);
692
+ this.#onRevalidate(changes, optimisticId).catch((e) => {
693
+ if (this.logger) {
694
+ this.logger.error("Unhandled error in batch", e);
695
+ } else {
696
+ console.error("Unhandled error in batch", e);
697
+ throw e;
698
+ }
699
+ });
700
+ return {
701
+ batchResult: batchContext,
702
+ retVal,
703
+ changes: batchContext.changes
704
+ };
705
+ }
706
+ #createBatchContext({
707
+ optimisticId,
708
+ changes
709
+ }) {
710
+ let needsLayer = optimisticId !== void 0;
711
+ const batchContext = {
712
+ changes,
713
+ createLayerIfNeeded: () => {
714
+ if (needsLayer) {
715
+ this.#topLayer = this.#topLayer.addLayer(optimisticId);
716
+ needsLayer = false;
717
+ }
718
+ },
719
+ optimisticWrite: !!optimisticId,
720
+ write: (cacheKey, value, status) => {
721
+ const oldTopValue = this.#topLayer.get(cacheKey);
722
+ if (optimisticId) batchContext.createLayerIfNeeded();
723
+ const writeLayer = optimisticId ? this.#topLayer : this.#truthLayer;
724
+ const newValue = {
725
+ cacheKey,
726
+ value,
727
+ lastUpdated: Date.now(),
728
+ status
729
+ };
730
+ writeLayer.set(cacheKey, newValue);
731
+ const newTopValue = this.#topLayer.get(cacheKey);
732
+ if (oldTopValue !== newTopValue) {
733
+ this.subjects.get(cacheKey)?.next({
734
+ ...newValue,
735
+ isOptimistic: newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value
736
+ });
737
+ }
738
+ return newValue;
739
+ },
740
+ delete: (cacheKey, status) => {
741
+ return batchContext.write(cacheKey, tombstone, status);
742
+ },
743
+ read: (cacheKey) => {
744
+ return optimisticId ? this.#topLayer.get(cacheKey) : this.#truthLayer.get(cacheKey);
745
+ }
746
+ };
747
+ return batchContext;
524
748
  }
525
749
  };
526
750
 
@@ -545,15 +769,16 @@ var QuerySubscription = class extends UnsubscribableWrapper {
545
769
 
546
770
  // src/observable/internal/AbstractHelper.ts
547
771
  var AbstractHelper = class {
548
- constructor(store) {
772
+ constructor(store, cacheKeys) {
549
773
  this.store = store;
774
+ this.cacheKeys = cacheKeys;
550
775
  }
551
776
  observe(options, subFn) {
552
777
  const query = this.getQuery(options);
553
778
  return this._subscribe(query, options, subFn);
554
779
  }
555
780
  _subscribe(query, options, subFn) {
556
- this.store.retain(query.cacheKey);
781
+ this.store.cacheKeys.retain(query.cacheKey);
557
782
  if (options.mode !== "offline") {
558
783
  query.revalidate(options.mode === "force").catch((e) => {
559
784
  subFn.error(e);
@@ -566,225 +791,38 @@ var AbstractHelper = class {
566
791
  }
567
792
  const sub = query.subscribe(subFn);
568
793
  sub.add(() => {
569
- this.store.release(query.cacheKey);
794
+ this.store.cacheKeys.release(query.cacheKey);
570
795
  });
571
796
  return new QuerySubscription(query, sub);
572
797
  }
573
798
  };
574
- function createCollectionConnectable(subject, store, createPayload) {
575
- return rxjs.connectable(subject.pipe(rxjs.switchMap((listEntry) => {
576
- const resolvedData = listEntry?.value?.data == null || listEntry.value.data.length === 0 ? rxjs.of([]) : rxjs.combineLatest(listEntry.value.data.map((cacheKey) => store.getSubject(cacheKey).pipe(rxjs.map((objectEntry) => objectEntry?.value), rxjs.distinctUntilChanged())));
577
- return rxjs.scheduled(rxjs.combineLatest({
578
- resolvedData,
579
- isOptimistic: rxjs.of(listEntry.isOptimistic),
580
- status: rxjs.of(listEntry.status),
581
- lastUpdated: rxjs.of(listEntry.lastUpdated)
582
- }).pipe(rxjs.map((params) => createPayload({
583
- resolvedData: Array.isArray(params.resolvedData) ? params.resolvedData : [],
584
- isOptimistic: params.isOptimistic,
585
- status: params.status,
586
- lastUpdated: params.lastUpdated
587
- }))), rxjs.asapScheduler);
588
- })), {
589
- resetOnDisconnect: false,
590
- connector: () => new rxjs.ReplaySubject(1)
591
- });
592
- }
593
799
 
594
800
  // src/observable/internal/isObjectInstance.ts
595
801
  function isObjectInstance(item) {
596
802
  return item != null && typeof item === "object" && "$primaryKey" in item;
597
803
  }
598
- function is$and(whereClause) {
599
- if (process.env.NODE_ENV !== "production") {
600
- if ("$and" in whereClause) {
601
- !Array.isArray(whereClause.$and) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected $and to be an array") : invariant2__default.default(false) : void 0;
602
- !(Object.keys(whereClause).length === 1) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected only $and to be present") : invariant2__default.default(false) : void 0;
603
- }
604
- }
605
- return "$and" in whereClause;
606
- }
607
- function is$or(whereClause) {
608
- if (process.env.NODE_ENV !== "production") {
609
- if ("$or" in whereClause) {
610
- !Array.isArray(whereClause.$or) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected $or to be an array") : invariant2__default.default(false) : void 0;
611
- !(Object.keys(whereClause).length === 1) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected only $or to be present") : invariant2__default.default(false) : void 0;
612
- }
613
- }
614
- return "$or" in whereClause;
615
- }
616
- function is$not(whereClause) {
617
- if (process.env.NODE_ENV !== "production") {
618
- if ("$not" in whereClause) {
619
- !(Object.keys(whereClause).length === 1) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected only $not to be present") : invariant2__default.default(false) : void 0;
620
- }
804
+
805
+ // src/observable/internal/Query.ts
806
+ var Query = class {
807
+ retainCount = 0;
808
+ #connectable;
809
+ #subscription;
810
+ #subject;
811
+ /** @internal */
812
+ constructor(store, observable, opts, cacheKey, logger) {
813
+ this.options = opts;
814
+ this.cacheKey = cacheKey;
815
+ this.store = store;
816
+ this.cacheKeys = store.cacheKeys;
817
+ this.#subject = observable;
818
+ this.logger = logger ?? (process.env.NODE_ENV === "production" ? store.client[chunk5KDG5ZET_cjs.additionalContext].logger : store.client[chunk5KDG5ZET_cjs.additionalContext].logger?.child({}, {
819
+ msgPrefix: process.env.NODE_ENV !== "production" ? `Query<${cacheKey.type}, ${cacheKey.otherKeys.map((x) => JSON.stringify(x)).join(", ")}>` : "Query"
820
+ }));
621
821
  }
622
- return "$not" in whereClause;
623
- }
624
- function objectSortaMatchesWhereClause(o, whereClause, strict) {
625
- if (deepEqual2__default.default({}, whereClause)) {
626
- return true;
627
- }
628
- if (is$and(whereClause)) {
629
- return whereClause.$and.every((w) => objectSortaMatchesWhereClause(o, w, strict));
630
- }
631
- if (is$or(whereClause)) {
632
- return whereClause.$or.some((w) => objectSortaMatchesWhereClause(o, w, strict));
633
- }
634
- if (is$not(whereClause)) {
635
- return !objectSortaMatchesWhereClause(o, whereClause.$not, strict);
636
- }
637
- return Object.entries(whereClause).every(([key, filter]) => {
638
- if (typeof filter === "object") {
639
- const realValue = o[key];
640
- const [f] = Object.keys(filter);
641
- const expected = filter[f];
642
- switch (f) {
643
- case "$eq":
644
- return realValue === expected;
645
- case "$gt":
646
- return realValue > expected;
647
- case "$lt":
648
- return realValue < expected;
649
- case "$gte":
650
- return realValue >= expected;
651
- case "$lte":
652
- return realValue <= expected;
653
- case "$ne":
654
- return realValue !== expected;
655
- case "$in":
656
- return expected.$in.includes(realValue);
657
- case "$isNull":
658
- return realValue == null;
659
- case "$startsWith":
660
- return realValue.startsWith(expected);
661
- case "$contains":
662
- case "$containsAllTerms":
663
- case "$containsAllTermsInOrder":
664
- case "$containsAnyTerm":
665
- case "$intersects":
666
- case "$within":
667
- return !strict;
668
- default:
669
- if (process.env.NODE_ENV !== "production") {
670
- process.env.NODE_ENV !== "production" ? invariant2__default.default(false, `Unknown where filter ${f}`) : invariant2__default.default(false) ;
671
- }
672
- return !strict;
673
- }
674
- }
675
- if (key in o) {
676
- if (o[key] === filter) {
677
- return true;
678
- }
679
- }
680
- return false;
681
- });
682
- }
683
-
684
- // ../../node_modules/.pnpm/p-defer@4.0.1/node_modules/p-defer/index.js
685
- function pDefer() {
686
- const deferred = {};
687
- deferred.promise = new Promise((resolve, reject) => {
688
- deferred.resolve = resolve;
689
- deferred.reject = reject;
690
- });
691
- return deferred;
692
- }
693
-
694
- // src/observable/internal/BulkObjectLoader.ts
695
- var weakCache = new mnemonist.DefaultWeakMap((c) => new BulkObjectLoader(c));
696
- function getBulkObjectLoader(client) {
697
- return weakCache.get(client);
698
- }
699
- var BulkObjectLoader = class {
700
- #client;
701
- #m = new mnemonist.DefaultMap(() => ({
702
- data: [],
703
- timer: void 0
704
- }));
705
- #logger;
706
- #maxWait;
707
- #maxEntries;
708
- constructor(client, maxWait = 25, maxEntries = 100) {
709
- this.#client = client;
710
- this.#logger = client[chunkQR7IBJPZ_cjs.additionalContext].logger;
711
- this.#maxWait = maxWait;
712
- this.#maxEntries = maxEntries;
713
- }
714
- async fetch(apiName, primaryKey) {
715
- const deferred = pDefer();
716
- const entry = this.#m.get(apiName);
717
- entry.data.push({
718
- primaryKey,
719
- deferred
720
- });
721
- if (!entry.timer) {
722
- entry.timer = setTimeout(() => {
723
- this.#loadObjects(apiName, entry.data);
724
- }, this.#maxWait);
725
- }
726
- if (entry.data.length >= this.#maxEntries) {
727
- clearTimeout(entry.timer);
728
- this.#loadObjects(apiName, entry.data);
729
- }
730
- return await deferred.promise;
731
- }
732
- #loadObjects(apiName, arr) {
733
- this.#m.delete(apiName);
734
- this.#reallyLoadObjects(apiName, arr).catch((e) => {
735
- this.#logger?.error("Unhandled exception", e);
736
- });
737
- }
738
- async #reallyLoadObjects(apiName, arr) {
739
- const miniDef = {
740
- type: "object",
741
- apiName
742
- };
743
- const objMetadata = await this.#client.fetchMetadata(miniDef);
744
- const pks = arr.map((x) => x.primaryKey);
745
- const {
746
- data
747
- } = await this.#client(miniDef).where({
748
- [objMetadata.primaryKeyApiName]: {
749
- $in: pks
750
- }
751
- }).fetchPage({
752
- $pageSize: pks.length
753
- });
754
- for (const {
755
- primaryKey,
756
- deferred
757
- } of arr) {
758
- const object = data.find((x) => x.$primaryKey === primaryKey);
759
- if (object) {
760
- deferred.resolve(object);
761
- } else {
762
- deferred.reject(new shared_net_errors.PalantirApiError(`Object not found: ${primaryKey}`));
763
- }
764
- }
765
- }
766
- };
767
-
768
- // src/observable/internal/Query.ts
769
- var Query = class {
770
- retainCount = 0;
771
- #connectable;
772
- #subscription;
773
- #subject;
774
- /** @internal */
775
- constructor(store, observable, opts, cacheKey, logger) {
776
- this.options = opts;
777
- this.cacheKey = cacheKey;
778
- this.store = store;
779
- this.#subject = observable;
780
- this.logger = logger ?? (process.env.NODE_ENV === "production" ? store.client[chunkQR7IBJPZ_cjs.additionalContext].logger : store.client[chunkQR7IBJPZ_cjs.additionalContext].logger?.child({}, {
781
- msgPrefix: process.env.NODE_ENV !== "production" ? `Query<${cacheKey.type}, ${cacheKey.otherKeys.map((x) => JSON.stringify(x)).join(", ")}>` : "Query"
782
- }));
783
- }
784
- subscribe(observer) {
785
- this.#connectable ??= this._createConnectable(this.#subject);
786
- this.#subscription = this.#connectable.connect();
787
- return this.#connectable.subscribe(observer);
822
+ subscribe(observer) {
823
+ this.#connectable ??= this._createConnectable(this.#subject);
824
+ this.#subscription = this.#connectable.connect();
825
+ return this.#connectable.subscribe(observer);
788
826
  }
789
827
  /**
790
828
  * Causes the query to revalidate. This will cause the query to fetch
@@ -891,136 +929,6 @@ var Query = class {
891
929
  */
892
930
  };
893
931
 
894
- // src/observable/internal/tombstone.ts
895
- var tombstone = void 0;
896
-
897
- // src/observable/internal/ObjectQuery.ts
898
- var ObjectQuery = class extends Query {
899
- #apiName;
900
- #pk;
901
- constructor(store, subject, type, pk, cacheKey, opts) {
902
- super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[chunkQR7IBJPZ_cjs.additionalContext].logger?.child({}, {
903
- msgPrefix: `ObjectQuery<${cacheKey.otherKeys.map((x) => JSON.stringify(x)).join(", ")}>`
904
- }) : void 0);
905
- this.#apiName = type;
906
- this.#pk = pk;
907
- }
908
- _createConnectable(subject) {
909
- return rxjs.connectable(subject.pipe(rxjs.map((x) => {
910
- return {
911
- status: x.status,
912
- object: x.value,
913
- lastUpdated: x.lastUpdated,
914
- isOptimistic: x.isOptimistic
915
- };
916
- })), {
917
- connector: () => new rxjs.BehaviorSubject({
918
- status: "init",
919
- object: void 0,
920
- lastUpdated: 0,
921
- isOptimistic: false
922
- })
923
- });
924
- }
925
- async _fetchAndStore() {
926
- if (process.env.NODE_ENV !== "production") {
927
- this.logger?.child({
928
- methodName: "_fetchAndStore"
929
- }).debug("calling _fetchAndStore");
930
- }
931
- const obj = await getBulkObjectLoader(this.store.client).fetch(this.#apiName, this.#pk);
932
- this.store.batch({}, (batch) => {
933
- this.writeToStore(obj, "loaded", batch);
934
- });
935
- }
936
- writeToStore(data, status, batch) {
937
- const entry = batch.read(this.cacheKey);
938
- if (entry && deepEqual2__default.default(data, entry.value)) {
939
- if (entry.status === status) {
940
- if (process.env.NODE_ENV !== "production") {
941
- this.logger?.child({
942
- methodName: "writeToStore"
943
- }).debug(`Object was deep equal and status unchanged (${status}), skipping update`);
944
- }
945
- return entry;
946
- }
947
- if (process.env.NODE_ENV !== "production") {
948
- this.logger?.child({
949
- methodName: "writeToStore"
950
- }).debug(`Object was deep equal, just setting status (old status: ${entry.status}, new status: ${status})`);
951
- }
952
- return batch.write(this.cacheKey, entry.value, status);
953
- }
954
- if (process.env.NODE_ENV !== "production") {
955
- this.logger?.child({
956
- methodName: "writeToStore"
957
- }).debug(JSON.stringify({
958
- status
959
- }), data);
960
- }
961
- const ret = batch.write(this.cacheKey, data, status);
962
- batch.changes.registerObject(
963
- this.cacheKey,
964
- data,
965
- /* isNew */
966
- !entry
967
- );
968
- return ret;
969
- }
970
- deleteFromStore(status, batch) {
971
- const entry = batch.read(this.cacheKey);
972
- if (entry && deepEqual2__default.default(tombstone, entry.value)) {
973
- if (process.env.NODE_ENV !== "production") {
974
- this.logger?.child({
975
- methodName: "deleteFromStore"
976
- }).debug(`Object was deep equal, just setting status`);
977
- }
978
- return batch.write(this.cacheKey, entry.value, status);
979
- }
980
- if (process.env.NODE_ENV !== "production") {
981
- this.logger?.child({
982
- methodName: "deleteFromStore"
983
- }).debug(JSON.stringify({
984
- status
985
- }));
986
- }
987
- if (!entry || !entry.value) {
988
- return;
989
- }
990
- const ret = batch.delete(this.cacheKey, status);
991
- batch.changes.deleteObject(this.cacheKey);
992
- return ret;
993
- }
994
- invalidateObjectType = (objectType, changes) => {
995
- if (this.#apiName === objectType) {
996
- changes?.modified.add(this.cacheKey);
997
- return this.revalidate(true);
998
- }
999
- return Promise.resolve();
1000
- };
1001
- };
1002
- function storeOsdkInstances(store, values, batch) {
1003
- return values.map((v) => {
1004
- return store.objects.getQuery({
1005
- apiName: v.$apiName,
1006
- pk: v.$primaryKey
1007
- }).writeToStore(v, "loaded", batch).cacheKey;
1008
- });
1009
- }
1010
-
1011
- // src/observable/internal/removeDuplicates.ts
1012
- function removeDuplicates(objectCacheKeys, batch) {
1013
- const visited = /* @__PURE__ */ new Set();
1014
- return objectCacheKeys.filter((key) => {
1015
- batch.read(key);
1016
- if (visited.has(key)) {
1017
- return false;
1018
- }
1019
- visited.add(key);
1020
- return true;
1021
- });
1022
- }
1023
-
1024
932
  // src/observable/internal/sorting/SortingStrategy.ts
1025
933
  var NoOpSortingStrategy = class {
1026
934
  sortCacheKeys(objectCacheKeys, _batch) {
@@ -1067,9 +975,40 @@ function createOrderBySortFns(orderBy) {
1067
975
  };
1068
976
  });
1069
977
  }
978
+ function createCollectionConnectable(subject, subjects, createPayload) {
979
+ return rxjs.connectable(subject.pipe(rxjs.switchMap((listEntry) => {
980
+ const resolvedData = listEntry?.value?.data == null || listEntry.value.data.length === 0 ? rxjs.of([]) : rxjs.combineLatest(listEntry.value.data.map((cacheKey) => subjects.get(cacheKey).pipe(rxjs.map((objectEntry) => objectEntry?.value), rxjs.distinctUntilChanged())));
981
+ return rxjs.scheduled(rxjs.combineLatest({
982
+ resolvedData,
983
+ isOptimistic: rxjs.of(listEntry.isOptimistic),
984
+ status: rxjs.of(listEntry.status),
985
+ lastUpdated: rxjs.of(listEntry.lastUpdated)
986
+ }).pipe(rxjs.map((params) => createPayload({
987
+ resolvedData: Array.isArray(params.resolvedData) ? params.resolvedData : [],
988
+ isOptimistic: params.isOptimistic,
989
+ status: params.status,
990
+ lastUpdated: params.lastUpdated
991
+ }))), rxjs.asapScheduler);
992
+ })), {
993
+ resetOnDisconnect: false,
994
+ connector: () => new rxjs.ReplaySubject(1)
995
+ });
996
+ }
1070
997
 
1071
- // src/observable/internal/ListQuery.ts
1072
- var API_NAME_IDX = 1;
998
+ // src/observable/internal/base-list/removeDuplicates.ts
999
+ function removeDuplicates(objectCacheKeys, batch) {
1000
+ const visited = /* @__PURE__ */ new Set();
1001
+ return objectCacheKeys.filter((key) => {
1002
+ batch.read(key);
1003
+ if (visited.has(key)) {
1004
+ return false;
1005
+ }
1006
+ visited.add(key);
1007
+ return true;
1008
+ });
1009
+ }
1010
+
1011
+ // src/observable/internal/base-list/BaseListQuery.ts
1073
1012
  var BaseListQuery = class extends Query {
1074
1013
  /**
1075
1014
  * The sorting strategy to use for this collection
@@ -1100,16 +1039,15 @@ var BaseListQuery = class extends Query {
1100
1039
  */
1101
1040
  _updateList(items, status, batch, append = false) {
1102
1041
  if (process.env.NODE_ENV !== "production") {
1103
- const logger = process.env.NODE_ENV !== "production" ? this.logger?.child({
1042
+ this.logger?.child({
1104
1043
  methodName: "updateList"
1105
- }) : this.logger;
1106
- logger?.debug(`{status: ${status}, append: ${append}}`, JSON.stringify(items, null, 2));
1044
+ }).debug(`{status: ${status}, append: ${append}}`, JSON.stringify(items, null, 2));
1107
1045
  }
1108
1046
  let objectCacheKeys;
1109
1047
  if (items.length === 0) {
1110
1048
  objectCacheKeys = [];
1111
1049
  } else if (isObjectInstance(items[0])) {
1112
- objectCacheKeys = this.storeObjects(items, batch);
1050
+ objectCacheKeys = this.store.objects.storeOsdkInstances(items, batch);
1113
1051
  } else {
1114
1052
  objectCacheKeys = items;
1115
1053
  }
@@ -1128,7 +1066,7 @@ var BaseListQuery = class extends Query {
1128
1066
  */
1129
1067
  writeToStore(data, status, batch) {
1130
1068
  const entry = batch.read(this.cacheKey);
1131
- if (entry && deepEqual2__default.default(data, entry.value)) {
1069
+ if (entry && deepEqual4__default.default(data, entry.value)) {
1132
1070
  if (entry.status === status) {
1133
1071
  if (process.env.NODE_ENV !== "production") {
1134
1072
  this.logger?.child({
@@ -1157,17 +1095,6 @@ var BaseListQuery = class extends Query {
1157
1095
  * Register changes to the cache based on the specific collection type
1158
1096
  * Implemented by subclasses to handle specific change registration
1159
1097
  */
1160
- /**
1161
- * Common method to store objects in the cache and return their cache keys
1162
- * Used by collection queries when storing object references
1163
- *
1164
- * @param objects Array of objects to store
1165
- * @param batch The batch context to use
1166
- * @returns Array of cache keys for the stored objects
1167
- */
1168
- storeObjects(objects, batch) {
1169
- return objects.length > 0 ? storeOsdkInstances(this.store, objects, batch) : [];
1170
- }
1171
1098
  /**
1172
1099
  * Common method for managing object reference counting and appending results
1173
1100
  * Used by collection queries when updating object references
@@ -1182,11 +1109,11 @@ var BaseListQuery = class extends Query {
1182
1109
  if (!batch.optimisticWrite) {
1183
1110
  if (!append) {
1184
1111
  for (const objectCacheKey of existingList?.value?.data ?? []) {
1185
- this.store.release(objectCacheKey);
1112
+ this.store.cacheKeys.release(objectCacheKey);
1186
1113
  }
1187
1114
  }
1188
1115
  for (const objectCacheKey of objectCacheKeys) {
1189
- this.store.retain(objectCacheKey);
1116
+ this.store.cacheKeys.retain(objectCacheKey);
1190
1117
  }
1191
1118
  }
1192
1119
  if (append) {
@@ -1195,12 +1122,11 @@ var BaseListQuery = class extends Query {
1195
1122
  return objectCacheKeys;
1196
1123
  }
1197
1124
  _dispose() {
1198
- console.log("DISPOSE LIST QUERY");
1199
1125
  this.store.batch({}, (batch) => {
1200
1126
  const entry = batch.read(this.cacheKey);
1201
1127
  if (entry) {
1202
1128
  for (const objectCacheKey of entry.value?.data ?? []) {
1203
- this.store.release(objectCacheKey);
1129
+ this.store.cacheKeys.release(objectCacheKey);
1204
1130
  }
1205
1131
  }
1206
1132
  });
@@ -1231,7 +1157,7 @@ var BaseListQuery = class extends Query {
1231
1157
  * @returns A connectable observable of the collection's payload type
1232
1158
  */
1233
1159
  _createConnectable(subject) {
1234
- return createCollectionConnectable(subject, this.store, (params) => this.createPayload(params));
1160
+ return createCollectionConnectable(subject, this.store.subjects, (params) => this.createPayload(params));
1235
1161
  }
1236
1162
  /**
1237
1163
  * @override Reset pagination state before a fetch
@@ -1325,7 +1251,7 @@ var BaseListQuery = class extends Query {
1325
1251
  } = this.store.batch({}, (batch) => {
1326
1252
  const append = this.nextPageToken != null;
1327
1253
  const finalStatus = result.nextPageToken ? status : "loaded";
1328
- return this._updateList(this.storeObjects(result.data, batch), finalStatus, batch, append);
1254
+ return this._updateList(this.store.objects.storeOsdkInstances(result.data, batch), finalStatus, batch, append);
1329
1255
  });
1330
1256
  return retVal;
1331
1257
  } catch (error) {
@@ -1390,22 +1316,236 @@ var BaseListQuery = class extends Query {
1390
1316
  }) : this.logger;
1391
1317
  logger?.debug(`{status: ${options.status}, append: ${options.append}}`, JSON.stringify(items, null, 2));
1392
1318
  }
1393
- let objectCacheKeys;
1394
- if (items.length === 0) {
1395
- objectCacheKeys = [];
1396
- } else if (isObjectInstance(items[0])) {
1397
- objectCacheKeys = this.storeObjects(items, batch);
1398
- } else {
1399
- objectCacheKeys = items;
1319
+ let objectCacheKeys;
1320
+ if (items.length === 0) {
1321
+ objectCacheKeys = [];
1322
+ } else if (isObjectInstance(items[0])) {
1323
+ objectCacheKeys = this.store.objects.storeOsdkInstances(items, batch);
1324
+ } else {
1325
+ objectCacheKeys = items;
1326
+ }
1327
+ objectCacheKeys = this.#retainReleaseAppend(batch, options.append ?? false, objectCacheKeys);
1328
+ objectCacheKeys = this._sortCacheKeys(objectCacheKeys, batch);
1329
+ objectCacheKeys = removeDuplicates(objectCacheKeys, batch);
1330
+ return this.writeToStore({
1331
+ data: objectCacheKeys
1332
+ }, options.status, batch);
1333
+ }
1334
+ };
1335
+
1336
+ // src/observable/internal/links/SpecificLinkQuery.ts
1337
+ var SpecificLinkQuery = class extends BaseListQuery {
1338
+ #sourceApiName;
1339
+ #sourcePk;
1340
+ #linkName;
1341
+ #whereClause;
1342
+ #orderBy;
1343
+ /**
1344
+ * Register changes to the cache specific to SpecificLinkQuery
1345
+ */
1346
+ registerCacheChanges(batch) {
1347
+ batch.changes.modified.add(this.cacheKey);
1348
+ }
1349
+ constructor(store, subject, cacheKey, opts) {
1350
+ super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[chunk5KDG5ZET_cjs.additionalContext].logger?.child({}, {
1351
+ msgPrefix: `SpecificLinkQuery<${cacheKey.otherKeys.map((x) => JSON.stringify(x)).join(", ")}>`
1352
+ }) : void 0);
1353
+ [this.#sourceApiName, this.#sourcePk, this.#linkName, this.#whereClause, this.#orderBy] = cacheKey.otherKeys;
1354
+ this.sortingStrategy = new OrderBySortingStrategy(this.#linkName, this.#orderBy);
1355
+ }
1356
+ // _fetchAndStore is now implemented in BaseCollectionQuery
1357
+ /**
1358
+ * Implements fetchPageData from the BaseCollectionQuery template method pattern
1359
+ * Fetches a page of linked objects
1360
+ */
1361
+ async fetchPageData(signal) {
1362
+ const client = this.store.client;
1363
+ const sourceObjectDef = {
1364
+ type: "object",
1365
+ apiName: this.#sourceApiName
1366
+ };
1367
+ const sourceMetadata = await client[chunk5KDG5ZET_cjs.additionalContext].ontologyProvider.getObjectDefinition(this.#sourceApiName);
1368
+ const sourceQuery = client(sourceObjectDef).where({
1369
+ [sourceMetadata.primaryKeyApiName]: this.#sourcePk
1370
+ });
1371
+ const linkQuery = sourceQuery.pivotTo(this.#linkName);
1372
+ if (signal?.aborted) {
1373
+ throw new Error("Aborted");
1374
+ }
1375
+ const queryParams = {
1376
+ $pageSize: this.options.pageSize || 100,
1377
+ $nextPageToken: this.nextPageToken
1378
+ };
1379
+ if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {
1380
+ queryParams.$orderBy = this.#orderBy;
1381
+ }
1382
+ if (this.#whereClause && Object.keys(this.#whereClause).length > 0) {
1383
+ queryParams.$where = this.#whereClause;
1384
+ }
1385
+ const response = await linkQuery.fetchPage(queryParams);
1386
+ this.nextPageToken = response.nextPageToken;
1387
+ return response;
1388
+ }
1389
+ /**
1390
+ * Removes a link query from the store
1391
+ */
1392
+ deleteFromStore(status, batch) {
1393
+ const entry = batch.read(this.cacheKey);
1394
+ if (entry && deepEqual4__default.default(tombstone, entry.value)) {
1395
+ if (process.env.NODE_ENV !== "production") {
1396
+ this.logger?.child({
1397
+ methodName: "deleteFromStore"
1398
+ }).debug(`Links were already deleted, just setting status`);
1399
+ }
1400
+ return batch.write(this.cacheKey, entry.value, status);
1401
+ }
1402
+ if (process.env.NODE_ENV !== "production") {
1403
+ this.logger?.child({
1404
+ methodName: "deleteFromStore"
1405
+ }).debug(JSON.stringify({
1406
+ status
1407
+ }));
1408
+ }
1409
+ if (!entry || !entry.value) {
1410
+ return;
1411
+ }
1412
+ const ret = batch.delete(this.cacheKey, status);
1413
+ batch.changes.deleted.add(this.cacheKey);
1414
+ return ret;
1415
+ }
1416
+ /**
1417
+ * Implements Query.maybeUpdateAndRevalidate to handle cache invalidation
1418
+ */
1419
+ maybeUpdateAndRevalidate = async (changes, _optimisticId) => {
1420
+ if (changes.modified.has(this.cacheKey)) {
1421
+ return this.revalidate(true);
1422
+ }
1423
+ return Promise.resolve();
1424
+ };
1425
+ invalidateObjectType = (objectType, changes) => {
1426
+ if (this.#sourceApiName === objectType) {
1427
+ changes?.modified.add(this.cacheKey);
1428
+ return this.revalidate(true);
1429
+ } else {
1430
+ return (async () => {
1431
+ const sourceMetadata = await this.store.client[chunk5KDG5ZET_cjs.additionalContext].ontologyProvider.getObjectDefinition(this.#sourceApiName);
1432
+ const linkDef = sourceMetadata.links?.[this.#linkName];
1433
+ if (!linkDef || linkDef.targetType !== objectType) return;
1434
+ const promise = this.revalidate(true);
1435
+ changes?.modified.add(this.cacheKey);
1436
+ return promise;
1437
+ })();
1438
+ }
1439
+ };
1440
+ };
1441
+
1442
+ // src/observable/internal/links/LinksHelper.ts
1443
+ var LinksHelper = class extends AbstractHelper {
1444
+ constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer) {
1445
+ super(store, cacheKeys);
1446
+ this.whereCanonicalizer = whereCanonicalizer;
1447
+ this.orderByCanonicalizer = orderByCanonicalizer;
1448
+ }
1449
+ getQuery(options) {
1450
+ const {
1451
+ apiName
1452
+ } = options.srcType;
1453
+ const canonWhere = this.whereCanonicalizer.canonicalize(options.where ?? {});
1454
+ const canonOrderBy = this.orderByCanonicalizer.canonicalize(options.orderBy ?? {});
1455
+ const linkCacheKey = this.cacheKeys.get("specificLink", apiName, options.pk, options.linkName, canonWhere, canonOrderBy);
1456
+ return this.store.queries.get(linkCacheKey, () => {
1457
+ return new SpecificLinkQuery(this.store, this.store.subjects.get(linkCacheKey), linkCacheKey, options);
1458
+ });
1459
+ }
1460
+ };
1461
+ function is$and(whereClause) {
1462
+ if (process.env.NODE_ENV !== "production") {
1463
+ if ("$and" in whereClause) {
1464
+ !Array.isArray(whereClause.$and) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected $and to be an array") : invariant2__default.default(false) : void 0;
1465
+ !(Object.keys(whereClause).length === 1) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected only $and to be present") : invariant2__default.default(false) : void 0;
1466
+ }
1467
+ }
1468
+ return "$and" in whereClause;
1469
+ }
1470
+ function is$or(whereClause) {
1471
+ if (process.env.NODE_ENV !== "production") {
1472
+ if ("$or" in whereClause) {
1473
+ !Array.isArray(whereClause.$or) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected $or to be an array") : invariant2__default.default(false) : void 0;
1474
+ !(Object.keys(whereClause).length === 1) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected only $or to be present") : invariant2__default.default(false) : void 0;
1475
+ }
1476
+ }
1477
+ return "$or" in whereClause;
1478
+ }
1479
+ function is$not(whereClause) {
1480
+ if (process.env.NODE_ENV !== "production") {
1481
+ if ("$not" in whereClause) {
1482
+ !(Object.keys(whereClause).length === 1) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "expected only $not to be present") : invariant2__default.default(false) : void 0;
1483
+ }
1484
+ }
1485
+ return "$not" in whereClause;
1486
+ }
1487
+ function objectSortaMatchesWhereClause(o, whereClause, strict) {
1488
+ if (deepEqual4__default.default({}, whereClause)) {
1489
+ return true;
1490
+ }
1491
+ if (is$and(whereClause)) {
1492
+ return whereClause.$and.every((w) => objectSortaMatchesWhereClause(o, w, strict));
1493
+ }
1494
+ if (is$or(whereClause)) {
1495
+ return whereClause.$or.some((w) => objectSortaMatchesWhereClause(o, w, strict));
1496
+ }
1497
+ if (is$not(whereClause)) {
1498
+ return !objectSortaMatchesWhereClause(o, whereClause.$not, strict);
1499
+ }
1500
+ return Object.entries(whereClause).every(([key, filter]) => {
1501
+ if (typeof filter === "object") {
1502
+ const realValue = o[key];
1503
+ const [f] = Object.keys(filter);
1504
+ const expected = filter[f];
1505
+ switch (f) {
1506
+ case "$eq":
1507
+ return realValue === expected;
1508
+ case "$gt":
1509
+ return realValue > expected;
1510
+ case "$lt":
1511
+ return realValue < expected;
1512
+ case "$gte":
1513
+ return realValue >= expected;
1514
+ case "$lte":
1515
+ return realValue <= expected;
1516
+ case "$ne":
1517
+ return realValue !== expected;
1518
+ case "$in":
1519
+ return expected.$in.includes(realValue);
1520
+ case "$isNull":
1521
+ return realValue == null;
1522
+ case "$startsWith":
1523
+ return realValue.startsWith(expected);
1524
+ case "$contains":
1525
+ case "$containsAllTerms":
1526
+ case "$containsAllTermsInOrder":
1527
+ case "$containsAnyTerm":
1528
+ case "$intersects":
1529
+ case "$within":
1530
+ return !strict;
1531
+ default:
1532
+ if (process.env.NODE_ENV !== "production") {
1533
+ process.env.NODE_ENV !== "production" ? invariant2__default.default(false, `Unknown where filter ${f}`) : invariant2__default.default(false) ;
1534
+ }
1535
+ return !strict;
1536
+ }
1537
+ }
1538
+ if (key in o) {
1539
+ if (o[key] === filter) {
1540
+ return true;
1541
+ }
1400
1542
  }
1401
- objectCacheKeys = this.#retainReleaseAppend(batch, options.append ?? false, objectCacheKeys);
1402
- objectCacheKeys = this._sortCacheKeys(objectCacheKeys, batch);
1403
- objectCacheKeys = removeDuplicates(objectCacheKeys, batch);
1404
- return this.writeToStore({
1405
- data: objectCacheKeys
1406
- }, options.status, batch);
1407
- }
1408
- };
1543
+ return false;
1544
+ });
1545
+ }
1546
+
1547
+ // src/observable/internal/list/ListQuery.ts
1548
+ var API_NAME_IDX = 1;
1409
1549
  var ListQuery = class extends BaseListQuery {
1410
1550
  // pageSize?: number; // this is the internal page size. we need to track this properly
1411
1551
  #type;
@@ -1421,7 +1561,7 @@ var ListQuery = class extends BaseListQuery {
1421
1561
  batch.changes.registerList(this.cacheKey);
1422
1562
  }
1423
1563
  constructor(store, subject, apiType, apiName, whereClause, orderBy, cacheKey, opts) {
1424
- super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[chunkQR7IBJPZ_cjs.additionalContext].logger?.child({}, {
1564
+ super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[chunk5KDG5ZET_cjs.additionalContext].logger?.child({}, {
1425
1565
  msgPrefix: `ListQuery<${cacheKey.otherKeys.map((x) => JSON.stringify(x)).join(", ")}>`
1426
1566
  }) : void 0);
1427
1567
  this.#type = apiType;
@@ -1470,7 +1610,7 @@ var ListQuery = class extends BaseListQuery {
1470
1610
  */
1471
1611
  handleFetchError(error, _status, batch) {
1472
1612
  this.logger?.error("error", error);
1473
- this.store.getSubject(this.cacheKey).error(error);
1613
+ this.store.subjects.get(this.cacheKey).error(error);
1474
1614
  return this.writeToStore({
1475
1615
  data: []
1476
1616
  }, "error", batch);
@@ -1549,7 +1689,7 @@ var ListQuery = class extends BaseListQuery {
1549
1689
  const toRemove = new Set(changes.deleted);
1550
1690
  for (const obj of relevantObjects.modified.all) {
1551
1691
  if (relevantObjects.modified.strictMatches.has(obj)) {
1552
- const objectCacheKey = this.store.getCacheKey("object", obj.$objectType, obj.$primaryKey);
1692
+ const objectCacheKey = this.cacheKeys.get("object", obj.$objectType, obj.$primaryKey);
1553
1693
  if (!existingList.has(objectCacheKey)) {
1554
1694
  toAdd.add(obj);
1555
1695
  }
@@ -1557,7 +1697,7 @@ var ListQuery = class extends BaseListQuery {
1557
1697
  } else if (batch.optimisticWrite) {
1558
1698
  continue;
1559
1699
  } else {
1560
- const existingObjectCacheKey = this.store.getCacheKey("object", obj.$objectType, obj.$primaryKey);
1700
+ const existingObjectCacheKey = this.cacheKeys.get("object", obj.$objectType, obj.$primaryKey);
1561
1701
  toRemove.add(existingObjectCacheKey);
1562
1702
  if (relevantObjects.modified.sortaMatches.has(obj)) {
1563
1703
  needsRevalidation = true;
@@ -1569,7 +1709,7 @@ var ListQuery = class extends BaseListQuery {
1569
1709
  newList.push(key);
1570
1710
  }
1571
1711
  for (const obj of toAdd) {
1572
- newList.push(this.store.getCacheKey("object", obj.$objectType, obj.$primaryKey));
1712
+ newList.push(this.cacheKeys.get("object", obj.$objectType, obj.$primaryKey));
1573
1713
  }
1574
1714
  this._updateList(
1575
1715
  newList,
@@ -1614,7 +1754,7 @@ var ListQuery = class extends BaseListQuery {
1614
1754
  }
1615
1755
  #extractRelevantObjectsForTypeInterface(changes) {
1616
1756
  const matchesApiName = ([, object]) => {
1617
- return this.#apiName in object[chunk6CBVXAAV_cjs.ObjectDefRef].interfaceMap;
1757
+ return this.#apiName in object[chunk4GWXMQZE_cjs.ObjectDefRef].interfaceMap;
1618
1758
  };
1619
1759
  const added = Array.from(changes.addedObjects).filter(matchesApiName).map(([, object]) => object.$as(this.#apiName));
1620
1760
  const modified = Array.from(changes.modifiedObjects).filter(matchesApiName).map(([, object]) => object.$as(this.#apiName));
@@ -1705,7 +1845,7 @@ var ListQuery = class extends BaseListQuery {
1705
1845
  if (state === "ADDED_OR_UPDATED") {
1706
1846
  const object = objOrIface.$apiName !== objOrIface.$objectType ? objOrIface.$as(objOrIface.$objectType) : objOrIface;
1707
1847
  this.store.batch({}, (batch) => {
1708
- this.storeObjects([object], batch);
1848
+ this.store.objects.storeOsdkInstances([object], batch);
1709
1849
  });
1710
1850
  } else if (state === "REMOVED") {
1711
1851
  this.#onOswRemoved(objOrIface, logger);
@@ -1716,7 +1856,7 @@ var ListQuery = class extends BaseListQuery {
1716
1856
  const existing = batch.read(this.cacheKey);
1717
1857
  !existing ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "the truth value for our list should exist as we already subscribed") : invariant2__default.default(false) : void 0;
1718
1858
  if (existing.status === "loaded") {
1719
- const objectCacheKey = this.store.getCacheKey("object", objOrIface.$objectType, objOrIface.$primaryKey);
1859
+ const objectCacheKey = this.cacheKeys.get("object", objOrIface.$objectType, objOrIface.$primaryKey);
1720
1860
  const newObjects = existing.value?.data.filter((o) => o !== objectCacheKey);
1721
1861
  if (newObjects?.length !== existing.value?.data.length) {
1722
1862
  batch.changes.registerList(this.cacheKey);
@@ -1745,7 +1885,7 @@ var ListQuery = class extends BaseListQuery {
1745
1885
  async function reloadDataAsFullObjects(client, data) {
1746
1886
  const groups = groupBy__default.default(data, (x) => x.$objectType);
1747
1887
  const objectTypeToPrimaryKeyToObject = Object.fromEntries(await Promise.all(Object.entries(groups).map(async ([apiName, objects]) => {
1748
- const objectDef = objects[0][chunk6CBVXAAV_cjs.UnderlyingOsdkObject][chunk6CBVXAAV_cjs.ObjectDefRef];
1888
+ const objectDef = objects[0][chunk4GWXMQZE_cjs.UnderlyingOsdkObject][chunk4GWXMQZE_cjs.ObjectDefRef];
1749
1889
  const where = {
1750
1890
  [objectDef.primaryKeyApiName]: {
1751
1891
  $in: objects.map((x) => x.$primaryKey)
@@ -1761,69 +1901,202 @@ async function reloadDataAsFullObjects(client, data) {
1761
1901
  return data;
1762
1902
  }
1763
1903
 
1764
- // src/observable/internal/links/SpecificLinkQuery.ts
1765
- var SpecificLinkQuery = class extends BaseListQuery {
1766
- #sourceApiName;
1767
- #sourcePk;
1768
- #linkName;
1769
- #whereClause;
1770
- #orderBy;
1771
- /**
1772
- * Register changes to the cache specific to SpecificLinkQuery
1773
- */
1774
- registerCacheChanges(batch) {
1775
- batch.changes.modified.add(this.cacheKey);
1904
+ // src/observable/internal/list/ListsHelper.ts
1905
+ var ListsHelper = class extends AbstractHelper {
1906
+ constructor(store, cacheKeys, whereCanonicalizer, orderByCanonicalizer) {
1907
+ super(store, cacheKeys);
1908
+ this.whereCanonicalizer = whereCanonicalizer;
1909
+ this.orderByCanonicalizer = orderByCanonicalizer;
1776
1910
  }
1777
- constructor(store, subject, cacheKey, opts) {
1778
- super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[chunkQR7IBJPZ_cjs.additionalContext].logger?.child({}, {
1779
- msgPrefix: `SpecificLinkQuery<${cacheKey.otherKeys.map((x) => JSON.stringify(x)).join(", ")}>`
1780
- }) : void 0);
1781
- [this.#sourceApiName, this.#sourcePk, this.#linkName, this.#whereClause, this.#orderBy] = cacheKey.otherKeys;
1782
- this.sortingStrategy = new OrderBySortingStrategy(this.#linkName, this.#orderBy);
1911
+ observe(options, subFn) {
1912
+ const ret = super.observe(options, subFn);
1913
+ if (options.streamUpdates) {
1914
+ ret.query.registerStreamUpdates(ret.subscription);
1915
+ }
1916
+ return ret;
1783
1917
  }
1784
- // _fetchAndStore is now implemented in BaseCollectionQuery
1785
- /**
1786
- * Implements fetchPageData from the BaseCollectionQuery template method pattern
1787
- * Fetches a page of linked objects
1788
- */
1789
- async fetchPageData(signal) {
1790
- const client = this.store.client;
1791
- const sourceObjectDef = {
1918
+ getQuery(options) {
1919
+ const {
1920
+ type: {
1921
+ apiName,
1922
+ type
1923
+ },
1924
+ where,
1925
+ orderBy
1926
+ } = options;
1927
+ const canonWhere = this.whereCanonicalizer.canonicalize(where ?? {});
1928
+ const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy ?? {});
1929
+ const listCacheKey = this.cacheKeys.get("list", type, apiName, canonWhere, canonOrderBy);
1930
+ return this.store.queries.get(listCacheKey, () => {
1931
+ return new ListQuery(this.store, this.store.subjects.get(listCacheKey), type, apiName, canonWhere, canonOrderBy, listCacheKey, options);
1932
+ });
1933
+ }
1934
+ };
1935
+
1936
+ // ../../node_modules/.pnpm/p-defer@4.0.1/node_modules/p-defer/index.js
1937
+ function pDefer() {
1938
+ const deferred = {};
1939
+ deferred.promise = new Promise((resolve, reject) => {
1940
+ deferred.resolve = resolve;
1941
+ deferred.reject = reject;
1942
+ });
1943
+ return deferred;
1944
+ }
1945
+
1946
+ // src/observable/internal/BulkObjectLoader.ts
1947
+ var weakCache = new mnemonist.DefaultWeakMap((c) => new BulkObjectLoader(c));
1948
+ function getBulkObjectLoader(client) {
1949
+ return weakCache.get(client);
1950
+ }
1951
+ var BulkObjectLoader = class {
1952
+ #client;
1953
+ #m = new mnemonist.DefaultMap(() => ({
1954
+ data: [],
1955
+ timer: void 0
1956
+ }));
1957
+ #logger;
1958
+ #maxWait;
1959
+ #maxEntries;
1960
+ constructor(client, maxWait = 25, maxEntries = 100) {
1961
+ this.#client = client;
1962
+ this.#logger = client[chunk5KDG5ZET_cjs.additionalContext].logger;
1963
+ this.#maxWait = maxWait;
1964
+ this.#maxEntries = maxEntries;
1965
+ }
1966
+ async fetch(apiName, primaryKey) {
1967
+ const deferred = pDefer();
1968
+ const entry = this.#m.get(apiName);
1969
+ entry.data.push({
1970
+ primaryKey,
1971
+ deferred
1972
+ });
1973
+ if (!entry.timer) {
1974
+ entry.timer = setTimeout(() => {
1975
+ this.#loadObjects(apiName, entry.data);
1976
+ }, this.#maxWait);
1977
+ }
1978
+ if (entry.data.length >= this.#maxEntries) {
1979
+ clearTimeout(entry.timer);
1980
+ this.#loadObjects(apiName, entry.data);
1981
+ }
1982
+ return await deferred.promise;
1983
+ }
1984
+ #loadObjects(apiName, arr) {
1985
+ this.#m.delete(apiName);
1986
+ this.#reallyLoadObjects(apiName, arr).catch((e) => {
1987
+ this.#logger?.error("Unhandled exception", e);
1988
+ });
1989
+ }
1990
+ async #reallyLoadObjects(apiName, arr) {
1991
+ const miniDef = {
1792
1992
  type: "object",
1793
- apiName: this.#sourceApiName
1993
+ apiName
1794
1994
  };
1795
- const sourceMetadata = await client[chunkQR7IBJPZ_cjs.additionalContext].ontologyProvider.getObjectDefinition(this.#sourceApiName);
1796
- const sourceQuery = client(sourceObjectDef).where({
1797
- [sourceMetadata.primaryKeyApiName]: this.#sourcePk
1995
+ const objMetadata = await this.#client.fetchMetadata(miniDef);
1996
+ const pks = arr.map((x) => x.primaryKey);
1997
+ const {
1998
+ data
1999
+ } = await this.#client(miniDef).where({
2000
+ [objMetadata.primaryKeyApiName]: {
2001
+ $in: pks
2002
+ }
2003
+ }).fetchPage({
2004
+ $pageSize: pks.length
1798
2005
  });
1799
- const linkQuery = sourceQuery.pivotTo(this.#linkName);
1800
- if (signal?.aborted) {
1801
- throw new Error("Aborted");
2006
+ for (const {
2007
+ primaryKey,
2008
+ deferred
2009
+ } of arr) {
2010
+ const object = data.find((x) => x.$primaryKey === primaryKey);
2011
+ if (object) {
2012
+ deferred.resolve(object);
2013
+ } else {
2014
+ deferred.reject(new shared_net_errors.PalantirApiError(`Object not found: ${primaryKey}`));
2015
+ }
1802
2016
  }
1803
- const queryParams = {
1804
- $pageSize: this.options.pageSize || 100,
1805
- $nextPageToken: this.nextPageToken
1806
- };
1807
- if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {
1808
- queryParams.$orderBy = this.#orderBy;
2017
+ }
2018
+ };
2019
+
2020
+ // src/observable/internal/object/ObjectQuery.ts
2021
+ var ObjectQuery = class extends Query {
2022
+ #apiName;
2023
+ #pk;
2024
+ constructor(store, subject, type, pk, cacheKey, opts) {
2025
+ super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[chunk5KDG5ZET_cjs.additionalContext].logger?.child({}, {
2026
+ msgPrefix: `ObjectQuery<${cacheKey.otherKeys.map((x) => JSON.stringify(x)).join(", ")}>`
2027
+ }) : void 0);
2028
+ this.#apiName = type;
2029
+ this.#pk = pk;
2030
+ }
2031
+ _createConnectable(subject) {
2032
+ return rxjs.connectable(subject.pipe(rxjs.map((x) => {
2033
+ return {
2034
+ status: x.status,
2035
+ object: x.value,
2036
+ lastUpdated: x.lastUpdated,
2037
+ isOptimistic: x.isOptimistic
2038
+ };
2039
+ })), {
2040
+ connector: () => new rxjs.BehaviorSubject({
2041
+ status: "init",
2042
+ object: void 0,
2043
+ lastUpdated: 0,
2044
+ isOptimistic: false
2045
+ })
2046
+ });
2047
+ }
2048
+ async _fetchAndStore() {
2049
+ if (process.env.NODE_ENV !== "production") {
2050
+ this.logger?.child({
2051
+ methodName: "_fetchAndStore"
2052
+ }).debug("calling _fetchAndStore");
1809
2053
  }
1810
- if (this.#whereClause && Object.keys(this.#whereClause).length > 0) {
1811
- queryParams.$where = this.#whereClause;
2054
+ const obj = await getBulkObjectLoader(this.store.client).fetch(this.#apiName, this.#pk);
2055
+ this.store.batch({}, (batch) => {
2056
+ this.writeToStore(obj, "loaded", batch);
2057
+ });
2058
+ }
2059
+ writeToStore(data, status, batch) {
2060
+ const entry = batch.read(this.cacheKey);
2061
+ if (entry && deepEqual4__default.default(data, entry.value)) {
2062
+ if (entry.status === status) {
2063
+ if (process.env.NODE_ENV !== "production") {
2064
+ this.logger?.child({
2065
+ methodName: "writeToStore"
2066
+ }).debug(`Object was deep equal and status unchanged (${status}), skipping update`);
2067
+ }
2068
+ return entry;
2069
+ }
2070
+ if (process.env.NODE_ENV !== "production") {
2071
+ this.logger?.child({
2072
+ methodName: "writeToStore"
2073
+ }).debug(`Object was deep equal, just setting status (old status: ${entry.status}, new status: ${status})`);
2074
+ }
2075
+ return batch.write(this.cacheKey, entry.value, status);
1812
2076
  }
1813
- const response = await linkQuery.fetchPage(queryParams);
1814
- this.nextPageToken = response.nextPageToken;
1815
- return response;
2077
+ if (process.env.NODE_ENV !== "production") {
2078
+ this.logger?.child({
2079
+ methodName: "writeToStore"
2080
+ }).debug(JSON.stringify({
2081
+ status
2082
+ }), data);
2083
+ }
2084
+ const ret = batch.write(this.cacheKey, data, status);
2085
+ batch.changes.registerObject(
2086
+ this.cacheKey,
2087
+ data,
2088
+ /* isNew */
2089
+ !entry
2090
+ );
2091
+ return ret;
1816
2092
  }
1817
- /**
1818
- * Removes a link query from the store
1819
- */
1820
2093
  deleteFromStore(status, batch) {
1821
2094
  const entry = batch.read(this.cacheKey);
1822
- if (entry && deepEqual2__default.default(tombstone, entry.value)) {
2095
+ if (entry && deepEqual4__default.default(tombstone, entry.value)) {
1823
2096
  if (process.env.NODE_ENV !== "production") {
1824
2097
  this.logger?.child({
1825
2098
  methodName: "deleteFromStore"
1826
- }).debug(`Links were already deleted, just setting status`);
2099
+ }).debug(`Object was deep equal, just setting status`);
1827
2100
  }
1828
2101
  return batch.write(this.cacheKey, entry.value, status);
1829
2102
  }
@@ -1838,87 +2111,18 @@ var SpecificLinkQuery = class extends BaseListQuery {
1838
2111
  return;
1839
2112
  }
1840
2113
  const ret = batch.delete(this.cacheKey, status);
1841
- batch.changes.deleted.add(this.cacheKey);
2114
+ batch.changes.deleteObject(this.cacheKey);
1842
2115
  return ret;
1843
2116
  }
1844
- /**
1845
- * Implements Query.maybeUpdateAndRevalidate to handle cache invalidation
1846
- */
1847
- maybeUpdateAndRevalidate = async (changes, _optimisticId) => {
1848
- if (changes.modified.has(this.cacheKey)) {
1849
- return this.revalidate(true);
1850
- }
1851
- return Promise.resolve();
1852
- };
1853
2117
  invalidateObjectType = (objectType, changes) => {
1854
- if (this.#sourceApiName === objectType) {
2118
+ if (this.#apiName === objectType) {
1855
2119
  changes?.modified.add(this.cacheKey);
1856
2120
  return this.revalidate(true);
1857
- } else {
1858
- return (async () => {
1859
- const sourceMetadata = await this.store.client[chunkQR7IBJPZ_cjs.additionalContext].ontologyProvider.getObjectDefinition(this.#sourceApiName);
1860
- const linkDef = sourceMetadata.links?.[this.#linkName];
1861
- if (!linkDef || linkDef.targetType !== objectType) return;
1862
- const promise = this.revalidate(true);
1863
- changes?.modified.add(this.cacheKey);
1864
- return promise;
1865
- })();
1866
2121
  }
2122
+ return Promise.resolve();
1867
2123
  };
1868
2124
  };
1869
2125
 
1870
- // src/observable/internal/links/LinksHelper.ts
1871
- var LinksHelper = class extends AbstractHelper {
1872
- constructor(store, whereCanonicalizer, orderByCanonicalizer) {
1873
- super(store);
1874
- this.whereCanonicalizer = whereCanonicalizer;
1875
- this.orderByCanonicalizer = orderByCanonicalizer;
1876
- }
1877
- getQuery(options) {
1878
- const {
1879
- apiName
1880
- } = options.srcType;
1881
- const canonWhere = this.whereCanonicalizer.canonicalize(options.where ?? {});
1882
- const canonOrderBy = this.orderByCanonicalizer.canonicalize(options.orderBy ?? {});
1883
- const linkCacheKey = this.store.getCacheKey("specificLink", apiName, options.pk, options.linkName, canonWhere, canonOrderBy);
1884
- return this.store.getQuery(linkCacheKey, () => {
1885
- return new SpecificLinkQuery(this.store, this.store.getSubject(linkCacheKey), linkCacheKey, options);
1886
- });
1887
- }
1888
- };
1889
-
1890
- // src/observable/internal/list/ListsHelper.ts
1891
- var ListsHelper = class extends AbstractHelper {
1892
- constructor(store, whereCanonicalizer, orderByCanonicalizer) {
1893
- super(store);
1894
- this.whereCanonicalizer = whereCanonicalizer;
1895
- this.orderByCanonicalizer = orderByCanonicalizer;
1896
- }
1897
- observe(options, subFn) {
1898
- const ret = super.observe(options, subFn);
1899
- if (options.streamUpdates) {
1900
- ret.query.registerStreamUpdates(ret.subscription);
1901
- }
1902
- return ret;
1903
- }
1904
- getQuery(options) {
1905
- const {
1906
- type: {
1907
- apiName,
1908
- type
1909
- },
1910
- where,
1911
- orderBy
1912
- } = options;
1913
- const canonWhere = this.whereCanonicalizer.canonicalize(where ?? {});
1914
- const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy ?? {});
1915
- const listCacheKey = this.store.getCacheKey("list", type, apiName, canonWhere, canonOrderBy);
1916
- return this.store.getQuery(listCacheKey, () => {
1917
- return new ListQuery(this.store, this.store.getSubject(listCacheKey), type, apiName, canonWhere, canonOrderBy, listCacheKey, options);
1918
- });
1919
- }
1920
- };
1921
-
1922
2126
  // src/observable/internal/object/ObjectsHelper.ts
1923
2127
  var ObjectsHelper = class extends AbstractHelper {
1924
2128
  observe(options, subFn) {
@@ -1929,11 +2133,22 @@ var ObjectsHelper = class extends AbstractHelper {
1929
2133
  const {
1930
2134
  pk
1931
2135
  } = options;
1932
- const objectCacheKey = this.store.getCacheKey("object", apiName, pk);
1933
- return this.store.getQuery(objectCacheKey, () => new ObjectQuery(this.store, this.store.getSubject(objectCacheKey), apiName, pk, objectCacheKey, {
2136
+ const objectCacheKey = this.cacheKeys.get("object", apiName, pk);
2137
+ return this.store.queries.get(objectCacheKey, () => new ObjectQuery(this.store, this.store.subjects.get(objectCacheKey), apiName, pk, objectCacheKey, {
1934
2138
  dedupeInterval: 0
1935
2139
  }));
1936
2140
  }
2141
+ /**
2142
+ * Internal helper method for writing objects to the store and returning their
2143
+ * object keys
2144
+ * @internal
2145
+ */
2146
+ storeOsdkInstances(values, batch) {
2147
+ return values.map((v) => this.getQuery({
2148
+ apiName: v.$apiName,
2149
+ pk: v.$primaryKey
2150
+ }).writeToStore(v, "loaded", batch).cacheKey);
2151
+ }
1937
2152
  };
1938
2153
  var defaultMakeData = () => /* @__PURE__ */ Object.create(null);
1939
2154
  var WeakRefTrie = class {
@@ -1969,6 +2184,8 @@ var WeakRefTrie = class {
1969
2184
  return this.#trie.removeArray(array)?.deref();
1970
2185
  }
1971
2186
  };
2187
+
2188
+ // src/observable/internal/OrderByCanonicalizer.ts
1972
2189
  var OrderByCanonicalizer = class {
1973
2190
  #trie = new WeakRefTrie((array) => {
1974
2191
  const pairs = array.reduce(function(result, _, index, array2) {
@@ -1989,49 +2206,28 @@ var OrderByCanonicalizer = class {
1989
2206
  };
1990
2207
  };
1991
2208
 
1992
- // src/observable/internal/RefCounts.ts
1993
- var RefCounts = class {
1994
- refCounts = /* @__PURE__ */ new Map();
1995
- // keeps our objects around for some extended duration after they are no longer
1996
- // needed which is good for quick clicks across tabs.
1997
- gcMap = /* @__PURE__ */ new Map();
1998
- constructor(keepAlive, cleanup) {
1999
- this.keepAlive = keepAlive;
2000
- this.cleanup = cleanup;
2001
- }
2002
- register(key) {
2003
- if (!this.refCounts.has(key)) {
2004
- this.gcMap.set(key, Date.now() + this.keepAlive);
2005
- }
2006
- return key;
2007
- }
2008
- retain(key) {
2009
- const count = this.refCounts.get(key) ?? 0;
2010
- this.refCounts.set(key, count + 1);
2011
- if (this.gcMap.has(key)) {
2012
- this.gcMap.delete(key);
2013
- }
2209
+ // src/observable/internal/Queries.ts
2210
+ var Queries = class {
2211
+ // we can use a regular Map here because the refCounting will
2212
+ // handle cleanup.
2213
+ map = /* @__PURE__ */ new Map();
2214
+ peek(cacheKey) {
2215
+ return this.map.get(cacheKey);
2014
2216
  }
2015
- release(key) {
2016
- const count = this.refCounts.get(key);
2017
- if (count === void 0) ; else if (count === 1) {
2018
- this.refCounts.delete(key);
2019
- this.gcMap.set(key, Date.now() + this.keepAlive);
2020
- } else {
2021
- this.refCounts.set(key, count - 1);
2217
+ get(cacheKey, createQuery) {
2218
+ let query = this.peek(cacheKey);
2219
+ if (!query) {
2220
+ query = createQuery();
2221
+ this.map.set(cacheKey, query);
2022
2222
  }
2223
+ return query;
2023
2224
  }
2024
- has(key) {
2025
- return this.refCounts.has(key);
2225
+ keys() {
2226
+ return this.map.keys();
2026
2227
  }
2027
- gc() {
2028
- const now = Date.now();
2029
- for (const [key, deathTime] of this.gcMap) {
2030
- if (deathTime < now) {
2031
- this.gcMap.delete(key);
2032
- this.cleanup(key);
2033
- }
2034
- }
2228
+ delete(cacheKey) {
2229
+ this.map.get(cacheKey)?.dispose();
2230
+ this.map.delete(cacheKey);
2035
2231
  }
2036
2232
  };
2037
2233
  var WhereClauseCanonicalizer = class {
@@ -2066,7 +2262,7 @@ var WhereClauseCanonicalizer = class {
2066
2262
  options: []
2067
2263
  };
2068
2264
  this.#existingOptions.set(cacheKey, lookupEntry);
2069
- const canon = lookupEntry.options.find((ref) => deepEqual2__default.default(ref.deref(), calculatedCanon))?.deref() ?? calculatedCanon;
2265
+ const canon = lookupEntry.options.find((ref) => deepEqual4__default.default(ref.deref(), calculatedCanon))?.deref() ?? calculatedCanon;
2070
2266
  if (canon === calculatedCanon) {
2071
2267
  lookupEntry.options.push(new WeakRef(canon));
2072
2268
  }
@@ -2100,69 +2296,40 @@ var WhereClauseCanonicalizer = class {
2100
2296
  };
2101
2297
 
2102
2298
  // src/observable/internal/Store.ts
2103
- function createInitEntry(cacheKey) {
2104
- return {
2105
- cacheKey,
2106
- status: "init",
2107
- value: void 0,
2108
- lastUpdated: 0
2109
- };
2110
- }
2111
2299
  var Store = class {
2112
2300
  whereCanonicalizer = new WhereClauseCanonicalizer();
2113
2301
  orderByCanonicalizer = new OrderByCanonicalizer();
2114
- #truthLayer = new Layer(void 0, void 0);
2115
- #topLayer;
2116
2302
  /** @internal */
2117
- // we can use a regular Map here because the refCounting will
2118
- // handle cleanup.
2119
- #queries = /* @__PURE__ */ new Map();
2120
- #cacheKeyToSubject = /* @__PURE__ */ new WeakMap();
2121
- #cacheKeys;
2122
- #refCounts = new RefCounts(6e4, (k) => this.#cleanupCacheKey(k));
2123
- // we are currently only using this for debug logging and should just remove it in the future if that
2124
- // continues to be true
2125
- #finalizationRegistry;
2303
+ queries = new Queries();
2304
+ layers = new Layers({
2305
+ logger: this.logger,
2306
+ onRevalidate: this.#maybeRevalidateQueries.bind(this)
2307
+ });
2308
+ subjects = this.layers.subjects;
2126
2309
  // these are hopefully temporary
2127
2310
  constructor(client) {
2128
- this.client = client;
2129
- this.logger = client[chunkQR7IBJPZ_cjs.additionalContext].logger?.child({}, {
2311
+ this.logger = client[chunk5KDG5ZET_cjs.additionalContext].logger?.child({}, {
2130
2312
  msgPrefix: "Store"
2131
2313
  });
2132
- this.lists = new ListsHelper(this, this.whereCanonicalizer, this.orderByCanonicalizer);
2133
- this.objects = new ObjectsHelper(this);
2134
- this.links = new LinksHelper(this, this.whereCanonicalizer, this.orderByCanonicalizer);
2135
- this.#topLayer = this.#truthLayer;
2136
- this.#cacheKeys = new CacheKeys(this.whereCanonicalizer, this.orderByCanonicalizer, (k) => {
2137
- this.#refCounts.register(k);
2138
- });
2139
- setInterval(() => {
2140
- this.#refCounts.gc();
2141
- }, 1e3);
2142
- this.#finalizationRegistry = new FinalizationRegistry((cleanupCallback) => {
2143
- try {
2144
- cleanupCallback();
2145
- } catch (e) {
2146
- console.error("Caught an error while running a finalization callback", e);
2147
- }
2314
+ this.client = client;
2315
+ this.cacheKeys = new CacheKeys({
2316
+ onDestroy: this.#cleanupCacheKey
2148
2317
  });
2318
+ this.lists = new ListsHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer);
2319
+ this.objects = new ObjectsHelper(this, this.cacheKeys);
2320
+ this.links = new LinksHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer);
2149
2321
  }
2150
2322
  /**
2151
2323
  * Called after a key is no longer retained and the timeout has elapsed
2152
2324
  * @param key
2153
2325
  */
2154
2326
  #cleanupCacheKey = (key) => {
2155
- const subject = this.peekSubject(key);
2156
- this.#cacheKeys.remove(key);
2327
+ const subject = this.subjects.peek(key);
2157
2328
  if (process.env.NODE_ENV !== "production") {
2158
2329
  !subject ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false) : invariant2__default.default(false) : void 0;
2159
2330
  }
2160
- if (subject) {
2161
- subject.complete();
2162
- this.#cacheKeyToSubject.delete(key);
2163
- }
2164
- this.#queries.get(key)?.dispose();
2165
- this.#queries.delete(key);
2331
+ this.subjects.delete(key);
2332
+ this.queries.delete(key);
2166
2333
  };
2167
2334
  applyAction = async (action, args, opts) => {
2168
2335
  return await new ActionApplication(this).applyAction(action, args, opts);
@@ -2174,120 +2341,18 @@ var Store = class {
2174
2341
  });
2175
2342
  return result;
2176
2343
  };
2177
- removeLayer(layerId) {
2178
- !(layerId != null) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "undefined is the reserved layerId for the truth layer") : invariant2__default.default(false) : void 0;
2179
- let currentLayer = this.#topLayer;
2180
- const cacheKeys = /* @__PURE__ */ new Map();
2181
- while (currentLayer != null && currentLayer.parentLayer != null) {
2182
- if (currentLayer.layerId === layerId) {
2183
- for (const [k, v] of currentLayer.entries()) {
2184
- if (cacheKeys.has(k)) continue;
2185
- cacheKeys.set(k, v);
2186
- }
2187
- }
2188
- currentLayer = currentLayer.parentLayer;
2189
- }
2190
- this.#topLayer = this.#topLayer.removeLayer(layerId);
2191
- for (const [k, oldEntry] of cacheKeys) {
2192
- const currentEntry = this.#topLayer.get(k);
2193
- if (oldEntry !== currentEntry) {
2194
- this.peekSubject(k)?.next({
2195
- // eslint-disable-next-line @typescript-eslint/no-misused-spread
2196
- ...currentEntry ?? createInitEntry(k),
2197
- isOptimistic: currentEntry?.value !== this.#truthLayer.get(k)?.value
2198
- });
2199
- }
2200
- }
2201
- }
2202
- getCacheKey(type, ...args) {
2203
- return this.#refCounts.register(this.#cacheKeys.get(type, ...args));
2204
- }
2205
- peekSubject = (cacheKey) => {
2206
- return this.#cacheKeyToSubject.get(cacheKey);
2207
- };
2208
- getSubject = (cacheKey) => {
2209
- let subject = this.#cacheKeyToSubject.get(cacheKey);
2210
- if (!subject) {
2211
- const initialValue = this.#topLayer.get(cacheKey) ?? createInitEntry(cacheKey);
2212
- subject = new rxjs.BehaviorSubject({
2213
- // eslint-disable-next-line @typescript-eslint/no-misused-spread
2214
- ...initialValue,
2215
- isOptimistic: initialValue.value !== this.#truthLayer.get(cacheKey)?.value
2216
- });
2217
- this.#cacheKeyToSubject.set(cacheKey, subject);
2218
- }
2219
- return subject;
2220
- };
2221
- canonicalizeWhereClause(where) {
2222
- return this.whereCanonicalizer.canonicalize(where);
2223
- }
2224
- peekQuery(cacheKey) {
2225
- return this.#queries.get(cacheKey);
2226
- }
2227
- getQuery(cacheKey, createQuery) {
2228
- let query = this.peekQuery(cacheKey);
2229
- if (!query) {
2230
- query = createQuery();
2231
- this.#queries.set(cacheKey, query);
2232
- }
2233
- return query;
2234
- }
2235
2344
  getValue(cacheKey) {
2236
- return this.#topLayer.get(cacheKey);
2345
+ return this.layers.top.get(cacheKey);
2237
2346
  }
2238
- batch = ({
2347
+ batch({
2239
2348
  optimisticId,
2240
2349
  changes = createChangedObjects()
2241
- }, batchFn) => {
2242
- !(optimisticId === void 0 || !!optimisticId) ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "optimistic must be undefined or not falsy") : invariant2__default.default(false) : void 0;
2243
- let needsLayer = optimisticId !== void 0;
2244
- const batchContext = {
2245
- changes,
2246
- createLayerIfNeeded: () => {
2247
- if (needsLayer) {
2248
- this.#topLayer = this.#topLayer.addLayer(optimisticId);
2249
- needsLayer = false;
2250
- }
2251
- },
2252
- optimisticWrite: !!optimisticId,
2253
- write: (cacheKey, value, status) => {
2254
- const oldTopValue = this.#topLayer.get(cacheKey);
2255
- if (optimisticId) batchContext.createLayerIfNeeded();
2256
- const writeLayer = optimisticId ? this.#topLayer : this.#truthLayer;
2257
- const newValue = new Entry(cacheKey, value, Date.now(), status);
2258
- writeLayer.set(cacheKey, newValue);
2259
- const newTopValue = this.#topLayer.get(cacheKey);
2260
- if (oldTopValue !== newTopValue) {
2261
- this.getSubject(cacheKey)?.next({
2262
- // eslint-disable-next-line @typescript-eslint/no-misused-spread
2263
- ...newValue,
2264
- isOptimistic: newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value
2265
- });
2266
- }
2267
- return newValue;
2268
- },
2269
- delete: (cacheKey, status) => {
2270
- return batchContext.write(cacheKey, tombstone, status);
2271
- },
2272
- read: (cacheKey) => {
2273
- return optimisticId ? this.#topLayer.get(cacheKey) : this.#truthLayer.get(cacheKey);
2274
- }
2275
- };
2276
- const retVal = batchFn(batchContext);
2277
- this.maybeRevalidateQueries(changes, optimisticId).catch((e) => {
2278
- if (this.logger) {
2279
- this.logger.error("Unhandled error in batch", e);
2280
- } else {
2281
- console.error("Unhandled error in batch", e);
2282
- throw e;
2283
- }
2284
- });
2285
- return {
2286
- batchResult: batchContext,
2287
- retVal,
2288
- changes: batchContext.changes
2289
- };
2290
- };
2350
+ }, batchFn) {
2351
+ return this.layers.batch({
2352
+ optimisticId,
2353
+ changes
2354
+ }, batchFn);
2355
+ }
2291
2356
  invalidateObject(apiName, pk) {
2292
2357
  if (typeof apiName !== "string") {
2293
2358
  apiName = apiName.apiName;
@@ -2300,34 +2365,31 @@ var Store = class {
2300
2365
  true
2301
2366
  );
2302
2367
  }
2303
- async maybeRevalidateQueries(changes, optimisticId) {
2368
+ async #maybeRevalidateQueries(changes, optimisticId) {
2369
+ const logger = process.env.NODE_ENV !== "production" ? this.logger?.child({
2370
+ methodName: "maybeRevalidateQueries"
2371
+ }) : void 0;
2304
2372
  if (changes.isEmpty()) {
2305
2373
  if (process.env.NODE_ENV !== "production") {
2306
- this.logger?.child({
2307
- methodName: "maybeRevalidateQueries"
2308
- }).debug("No changes, aborting");
2374
+ logger?.debug("No changes, aborting");
2309
2375
  }
2310
2376
  return;
2311
2377
  }
2312
2378
  if (process.env.NODE_ENV !== "production") {
2313
- this.logger?.child({
2314
- methodName: "maybeRevalidateQueries"
2315
- }).debug(DEBUG_ONLY__changesToString(changes), {
2379
+ logger?.debug(DEBUG_ONLY__changesToString(changes), {
2316
2380
  optimisticId
2317
2381
  });
2318
2382
  }
2319
2383
  try {
2320
2384
  const promises = [];
2321
- for (const cacheKey of this.#queries.keys()) {
2322
- const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(changes, optimisticId);
2385
+ for (const cacheKey of this.queries.keys()) {
2386
+ const promise = this.queries.peek(cacheKey)?.maybeUpdateAndRevalidate?.(changes, optimisticId);
2323
2387
  if (promise) promises.push(promise);
2324
2388
  }
2325
2389
  await Promise.all(promises);
2326
2390
  } finally {
2327
2391
  if (process.env.NODE_ENV !== "production") {
2328
- this.logger?.child({
2329
- methodName: "maybeRevalidateQueries"
2330
- }).debug("in finally", DEBUG_ONLY__changesToString(changes));
2392
+ logger?.debug("in finally", DEBUG_ONLY__changesToString(changes));
2331
2393
  }
2332
2394
  }
2333
2395
  }
@@ -2352,30 +2414,24 @@ var Store = class {
2352
2414
  }).info(changes ? DEBUG_ONLY__changesToString(changes) : void 0);
2353
2415
  }
2354
2416
  const promises = [];
2355
- for (const cacheKey of this.#truthLayer.keys()) {
2417
+ for (const cacheKey of this.layers.truth.keys()) {
2356
2418
  if (changes && changes.modified.has(cacheKey)) {
2357
2419
  continue;
2358
2420
  }
2359
- const query = this.peekQuery(cacheKey);
2421
+ const query = this.queries.peek(cacheKey);
2360
2422
  if (!query) continue;
2361
2423
  promises.push(query.invalidateObjectType(apiName, changes));
2362
2424
  }
2363
2425
  return Promise.allSettled(promises).then(() => void 0);
2364
2426
  }
2365
- retain(cacheKey) {
2366
- this.#refCounts.retain(cacheKey);
2367
- }
2368
- release(cacheKey) {
2369
- this.#refCounts.release(cacheKey);
2370
- }
2371
2427
  };
2372
2428
 
2373
2429
  // src/observable/ObservableClient.ts
2374
2430
  function createObservableClient(client) {
2375
- const tweakedClient = chunk6CBVXAAV_cjs.createClientFromContext({
2376
- ...client[chunkQR7IBJPZ_cjs.additionalContext],
2377
- fetch: shared_net_fetch.createFetchHeaderMutator(client[chunkQR7IBJPZ_cjs.additionalContext].fetch, (headers) => {
2378
- headers.set("Fetch-User-Agent", [headers.get("Fetch-User-Agent"), chunk6CBVXAAV_cjs.OBSERVABLE_USER_AGENT].filter((x) => x && x?.length > 0).join(" "));
2431
+ const tweakedClient = chunk4GWXMQZE_cjs.createClientFromContext({
2432
+ ...client[chunk5KDG5ZET_cjs.additionalContext],
2433
+ fetch: shared_net_fetch.createFetchHeaderMutator(client[chunk5KDG5ZET_cjs.additionalContext].fetch, (headers) => {
2434
+ headers.set("Fetch-User-Agent", [headers.get("Fetch-User-Agent"), chunk4GWXMQZE_cjs.OBSERVABLE_USER_AGENT].filter((x) => x && x?.length > 0).join(" "));
2379
2435
  return headers;
2380
2436
  })
2381
2437
  });
@@ -2418,11 +2474,11 @@ function getOsdkConfig(ontologyRid) {
2418
2474
 
2419
2475
  Object.defineProperty(exports, "createClientWithTransaction", {
2420
2476
  enumerable: true,
2421
- get: function () { return chunk6CBVXAAV_cjs.createClientWithTransaction; }
2477
+ get: function () { return chunk4GWXMQZE_cjs.createClientWithTransaction; }
2422
2478
  });
2423
2479
  Object.defineProperty(exports, "augment", {
2424
2480
  enumerable: true,
2425
- get: function () { return chunkQR7IBJPZ_cjs.augment; }
2481
+ get: function () { return chunk5KDG5ZET_cjs.augment; }
2426
2482
  });
2427
2483
  exports.createObservableClient = createObservableClient;
2428
2484
  exports.getMetaTagContent = getMetaTagContent;