@osdk/client 2.7.1 → 2.8.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/CHANGELOG.md +92 -157
  2. package/build/browser/Client.js +1 -1
  3. package/build/browser/Client.js.map +1 -1
  4. package/build/browser/MinimalClientContext.js.map +1 -1
  5. package/build/browser/actions/applyAction.js +5 -0
  6. package/build/browser/actions/applyAction.js.map +1 -1
  7. package/build/browser/createClient.js +2 -1
  8. package/build/browser/createClient.js.map +1 -1
  9. package/build/browser/createMinimalClient.js +1 -0
  10. package/build/browser/createMinimalClient.js.map +1 -1
  11. package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +17 -1
  12. package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
  13. package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js +101 -0
  14. package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
  15. package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js +1 -1
  16. package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -1
  17. package/build/browser/fetchMetadata.test.js +9 -0
  18. package/build/browser/fetchMetadata.test.js.map +1 -1
  19. package/build/browser/intellisense.test.js +1 -1
  20. package/build/browser/intellisense.test.js.map +1 -1
  21. package/build/browser/internal/conversions/modernToLegacyWhereClause.js +1 -1
  22. package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
  23. package/build/browser/object/aggregate.js +1 -0
  24. package/build/browser/object/aggregate.js.map +1 -1
  25. package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
  26. package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js +3 -0
  27. package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
  28. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +4 -0
  29. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  30. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +85 -3
  31. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  32. package/build/browser/object/convertWireToOsdkObjects.js +4 -4
  33. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  34. package/build/browser/object/convertWireToOsdkObjects.test.js +48 -27
  35. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  36. package/build/browser/object/fetchPage.js +18 -5
  37. package/build/browser/object/fetchPage.js.map +1 -1
  38. package/build/browser/object/object.test.js +123 -0
  39. package/build/browser/object/object.test.js.map +1 -1
  40. package/build/browser/objectSet/ObjectSet.test.js +6 -6
  41. package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
  42. package/build/browser/objectSet/ObjectSetListenerWebsocket.js +4 -4
  43. package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  44. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +3 -1
  45. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  46. package/build/browser/objectSet/createObjectSet.js +0 -4
  47. package/build/browser/objectSet/createObjectSet.js.map +1 -1
  48. package/build/browser/objectSet/fetchLinksPage.js +1 -0
  49. package/build/browser/objectSet/fetchLinksPage.js.map +1 -1
  50. package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -1
  51. package/build/browser/observable/ObservableClient.js +11 -0
  52. package/build/browser/observable/ObservableClient.js.map +1 -1
  53. package/build/browser/observable/internal/AbstractHelper.js +56 -3
  54. package/build/browser/observable/internal/AbstractHelper.js.map +1 -1
  55. package/build/browser/observable/internal/AbstractHelper.test.js +114 -0
  56. package/build/browser/observable/internal/AbstractHelper.test.js.map +1 -0
  57. package/build/browser/observable/internal/BulkObjectLoader.js +71 -9
  58. package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
  59. package/build/browser/observable/internal/BulkObjectLoader.test.js +79 -0
  60. package/build/browser/observable/internal/BulkObjectLoader.test.js.map +1 -1
  61. package/build/browser/observable/internal/CacheKeys.js +19 -8
  62. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  63. package/build/browser/observable/internal/ListQueryView.js +120 -0
  64. package/build/browser/observable/internal/ListQueryView.js.map +1 -0
  65. package/build/browser/observable/internal/ObservableClientImpl.js +136 -24
  66. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  67. package/build/browser/observable/internal/PivotCanonicalizer.js +4 -4
  68. package/build/browser/observable/internal/PivotCanonicalizer.js.map +1 -1
  69. package/build/browser/observable/internal/Query.js +7 -5
  70. package/build/browser/observable/internal/Query.js.map +1 -1
  71. package/build/browser/observable/internal/RdpCanonicalizer.test.js +23 -7
  72. package/build/browser/observable/internal/RdpCanonicalizer.test.js.map +1 -1
  73. package/build/browser/observable/internal/Store.js +19 -2
  74. package/build/browser/observable/internal/Store.js.map +1 -1
  75. package/build/browser/observable/internal/Store.test.js +328 -1
  76. package/build/browser/observable/internal/Store.test.js.map +1 -1
  77. package/build/browser/observable/internal/actions/ActionApplication.js +7 -4
  78. package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -1
  79. package/build/browser/observable/internal/actions/OptimisticJob.js +1 -1
  80. package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -1
  81. package/build/browser/observable/internal/aggregation/AggregationCacheKey.js +5 -3
  82. package/build/browser/observable/internal/aggregation/AggregationCacheKey.js.map +1 -1
  83. package/build/browser/observable/internal/aggregation/AggregationQuery.js +28 -2
  84. package/build/browser/observable/internal/aggregation/AggregationQuery.js.map +1 -1
  85. package/build/browser/observable/internal/aggregation/AggregationsHelper.js +18 -2
  86. package/build/browser/observable/internal/aggregation/AggregationsHelper.js.map +1 -1
  87. package/build/browser/observable/internal/aggregation/AggregationsHelper.test.js +103 -0
  88. package/build/browser/observable/internal/aggregation/AggregationsHelper.test.js.map +1 -0
  89. package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js +22 -3
  90. package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -1
  91. package/build/browser/observable/internal/base-list/BaseListQuery.js +73 -6
  92. package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -1
  93. package/build/browser/observable/internal/function/FunctionQuery.js +27 -1
  94. package/build/browser/observable/internal/function/FunctionQuery.js.map +1 -1
  95. package/build/browser/observable/internal/function/FunctionsHelper.js +2 -1
  96. package/build/browser/observable/internal/function/FunctionsHelper.js.map +1 -1
  97. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +2 -2
  98. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -1
  99. package/build/browser/observable/internal/links/LinksHelper.js +3 -2
  100. package/build/browser/observable/internal/links/LinksHelper.js.map +1 -1
  101. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +7 -5
  102. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
  103. package/build/browser/observable/internal/links/SpecificLinkQuery.js +97 -62
  104. package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -1
  105. package/build/browser/observable/internal/list/InterfaceListQuery.js +19 -1
  106. package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -1
  107. package/build/browser/observable/internal/list/ListQuery.js +30 -10
  108. package/build/browser/observable/internal/list/ListQuery.js.map +1 -1
  109. package/build/browser/observable/internal/list/ListQuery.test.js +262 -1
  110. package/build/browser/observable/internal/list/ListQuery.test.js.map +1 -1
  111. package/build/browser/observable/internal/list/ListsHelper.js +1 -1
  112. package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
  113. package/build/browser/observable/internal/list/ObjectListQuery.js +22 -21
  114. package/build/browser/observable/internal/list/ObjectListQuery.js.map +1 -1
  115. package/build/browser/observable/internal/object/ObjectQuery.js +23 -6
  116. package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -1
  117. package/build/browser/observable/internal/object/ObjectsHelper.js +12 -3
  118. package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
  119. package/build/browser/observable/internal/object/ObjectsHelper.test.js +200 -0
  120. package/build/browser/observable/internal/object/ObjectsHelper.test.js.map +1 -0
  121. package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
  122. package/build/browser/observable/internal/objectset/ObjectSetHelper.js +3 -2
  123. package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
  124. package/build/browser/observable/internal/objectset/ObjectSetHelper.test.js +94 -0
  125. package/build/browser/observable/internal/objectset/ObjectSetHelper.test.js.map +1 -0
  126. package/build/browser/observable/internal/objectset/ObjectSetQuery.js +4 -1
  127. package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
  128. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +1 -0
  129. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -1
  130. package/build/browser/observable/internal/testUtils.js.map +1 -1
  131. package/build/browser/observable/internal/utils/rdpFieldOperations.js +7 -2
  132. package/build/browser/observable/internal/utils/rdpFieldOperations.js.map +1 -1
  133. package/build/browser/observable/internal/utils/rdpFieldOperations.test.js +55 -0
  134. package/build/browser/observable/internal/utils/rdpFieldOperations.test.js.map +1 -1
  135. package/build/browser/ontology/loadActionMetadata.js +3 -1
  136. package/build/browser/ontology/loadActionMetadata.js.map +1 -1
  137. package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
  138. package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
  139. package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
  140. package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
  141. package/build/browser/public/unstable-do-not-use.js +1 -0
  142. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  143. package/build/browser/util/UserAgent.js +2 -2
  144. package/build/browser/util/UserAgent.js.map +1 -1
  145. package/build/browser/util/interfaceUtils.js +7 -0
  146. package/build/browser/util/interfaceUtils.js.map +1 -1
  147. package/build/cjs/{chunk-OVZCGOMG.cjs → chunk-6VOFZIIJ.cjs} +196 -92
  148. package/build/cjs/chunk-6VOFZIIJ.cjs.map +1 -0
  149. package/build/cjs/{chunk-OZNDU7AU.cjs → chunk-YVZM2JPW.cjs} +237 -196
  150. package/build/cjs/chunk-YVZM2JPW.cjs.map +1 -0
  151. package/build/cjs/{createClient-BDmrDOzZ.d.cts → createClient-BPK4om7e.d.cts} +1 -0
  152. package/build/cjs/index.cjs +8 -8
  153. package/build/cjs/index.d.cts +1 -1
  154. package/build/cjs/public/internal.cjs +8 -8
  155. package/build/cjs/public/unstable-do-not-use.cjs +928 -360
  156. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  157. package/build/cjs/public/unstable-do-not-use.d.cts +65 -27
  158. package/build/esm/Client.js +1 -1
  159. package/build/esm/Client.js.map +1 -1
  160. package/build/esm/MinimalClientContext.js.map +1 -1
  161. package/build/esm/actions/applyAction.js +5 -0
  162. package/build/esm/actions/applyAction.js.map +1 -1
  163. package/build/esm/createClient.js +2 -1
  164. package/build/esm/createClient.js.map +1 -1
  165. package/build/esm/createMinimalClient.js +1 -0
  166. package/build/esm/createMinimalClient.js.map +1 -1
  167. package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +17 -1
  168. package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
  169. package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js +101 -0
  170. package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
  171. package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js +1 -1
  172. package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -1
  173. package/build/esm/fetchMetadata.test.js +9 -0
  174. package/build/esm/fetchMetadata.test.js.map +1 -1
  175. package/build/esm/intellisense.test.js +1 -1
  176. package/build/esm/intellisense.test.js.map +1 -1
  177. package/build/esm/internal/conversions/modernToLegacyWhereClause.js +1 -1
  178. package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
  179. package/build/esm/object/aggregate.js +1 -0
  180. package/build/esm/object/aggregate.js.map +1 -1
  181. package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
  182. package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js +3 -0
  183. package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
  184. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +4 -0
  185. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  186. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +85 -3
  187. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  188. package/build/esm/object/convertWireToOsdkObjects.js +4 -4
  189. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  190. package/build/esm/object/convertWireToOsdkObjects.test.js +48 -27
  191. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  192. package/build/esm/object/fetchPage.js +18 -5
  193. package/build/esm/object/fetchPage.js.map +1 -1
  194. package/build/esm/object/object.test.js +123 -0
  195. package/build/esm/object/object.test.js.map +1 -1
  196. package/build/esm/objectSet/ObjectSet.test.js +6 -6
  197. package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
  198. package/build/esm/objectSet/ObjectSetListenerWebsocket.js +4 -4
  199. package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  200. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +3 -1
  201. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  202. package/build/esm/objectSet/createObjectSet.js +0 -4
  203. package/build/esm/objectSet/createObjectSet.js.map +1 -1
  204. package/build/esm/objectSet/fetchLinksPage.js +1 -0
  205. package/build/esm/objectSet/fetchLinksPage.js.map +1 -1
  206. package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -1
  207. package/build/esm/observable/ObservableClient.js +11 -0
  208. package/build/esm/observable/ObservableClient.js.map +1 -1
  209. package/build/esm/observable/internal/AbstractHelper.js +56 -3
  210. package/build/esm/observable/internal/AbstractHelper.js.map +1 -1
  211. package/build/esm/observable/internal/AbstractHelper.test.js +114 -0
  212. package/build/esm/observable/internal/AbstractHelper.test.js.map +1 -0
  213. package/build/esm/observable/internal/BulkObjectLoader.js +71 -9
  214. package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
  215. package/build/esm/observable/internal/BulkObjectLoader.test.js +79 -0
  216. package/build/esm/observable/internal/BulkObjectLoader.test.js.map +1 -1
  217. package/build/esm/observable/internal/CacheKeys.js +19 -8
  218. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  219. package/build/esm/observable/internal/ListQueryView.js +120 -0
  220. package/build/esm/observable/internal/ListQueryView.js.map +1 -0
  221. package/build/esm/observable/internal/ObservableClientImpl.js +136 -24
  222. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  223. package/build/esm/observable/internal/PivotCanonicalizer.js +4 -4
  224. package/build/esm/observable/internal/PivotCanonicalizer.js.map +1 -1
  225. package/build/esm/observable/internal/Query.js +7 -5
  226. package/build/esm/observable/internal/Query.js.map +1 -1
  227. package/build/esm/observable/internal/RdpCanonicalizer.test.js +23 -7
  228. package/build/esm/observable/internal/RdpCanonicalizer.test.js.map +1 -1
  229. package/build/esm/observable/internal/Store.js +19 -2
  230. package/build/esm/observable/internal/Store.js.map +1 -1
  231. package/build/esm/observable/internal/Store.test.js +328 -1
  232. package/build/esm/observable/internal/Store.test.js.map +1 -1
  233. package/build/esm/observable/internal/actions/ActionApplication.js +7 -4
  234. package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -1
  235. package/build/esm/observable/internal/actions/OptimisticJob.js +1 -1
  236. package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -1
  237. package/build/esm/observable/internal/aggregation/AggregationCacheKey.js +5 -3
  238. package/build/esm/observable/internal/aggregation/AggregationCacheKey.js.map +1 -1
  239. package/build/esm/observable/internal/aggregation/AggregationQuery.js +28 -2
  240. package/build/esm/observable/internal/aggregation/AggregationQuery.js.map +1 -1
  241. package/build/esm/observable/internal/aggregation/AggregationsHelper.js +18 -2
  242. package/build/esm/observable/internal/aggregation/AggregationsHelper.js.map +1 -1
  243. package/build/esm/observable/internal/aggregation/AggregationsHelper.test.js +103 -0
  244. package/build/esm/observable/internal/aggregation/AggregationsHelper.test.js.map +1 -0
  245. package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js +22 -3
  246. package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -1
  247. package/build/esm/observable/internal/base-list/BaseListQuery.js +73 -6
  248. package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -1
  249. package/build/esm/observable/internal/function/FunctionQuery.js +27 -1
  250. package/build/esm/observable/internal/function/FunctionQuery.js.map +1 -1
  251. package/build/esm/observable/internal/function/FunctionsHelper.js +2 -1
  252. package/build/esm/observable/internal/function/FunctionsHelper.js.map +1 -1
  253. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +2 -2
  254. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -1
  255. package/build/esm/observable/internal/links/LinksHelper.js +3 -2
  256. package/build/esm/observable/internal/links/LinksHelper.js.map +1 -1
  257. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +7 -5
  258. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
  259. package/build/esm/observable/internal/links/SpecificLinkQuery.js +97 -62
  260. package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -1
  261. package/build/esm/observable/internal/list/InterfaceListQuery.js +19 -1
  262. package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -1
  263. package/build/esm/observable/internal/list/ListQuery.js +30 -10
  264. package/build/esm/observable/internal/list/ListQuery.js.map +1 -1
  265. package/build/esm/observable/internal/list/ListQuery.test.js +262 -1
  266. package/build/esm/observable/internal/list/ListQuery.test.js.map +1 -1
  267. package/build/esm/observable/internal/list/ListsHelper.js +1 -1
  268. package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
  269. package/build/esm/observable/internal/list/ObjectListQuery.js +22 -21
  270. package/build/esm/observable/internal/list/ObjectListQuery.js.map +1 -1
  271. package/build/esm/observable/internal/object/ObjectQuery.js +23 -6
  272. package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -1
  273. package/build/esm/observable/internal/object/ObjectsHelper.js +12 -3
  274. package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
  275. package/build/esm/observable/internal/object/ObjectsHelper.test.js +200 -0
  276. package/build/esm/observable/internal/object/ObjectsHelper.test.js.map +1 -0
  277. package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
  278. package/build/esm/observable/internal/objectset/ObjectSetHelper.js +3 -2
  279. package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
  280. package/build/esm/observable/internal/objectset/ObjectSetHelper.test.js +94 -0
  281. package/build/esm/observable/internal/objectset/ObjectSetHelper.test.js.map +1 -0
  282. package/build/esm/observable/internal/objectset/ObjectSetQuery.js +4 -1
  283. package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
  284. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +1 -0
  285. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -1
  286. package/build/esm/observable/internal/testUtils.js.map +1 -1
  287. package/build/esm/observable/internal/utils/rdpFieldOperations.js +7 -2
  288. package/build/esm/observable/internal/utils/rdpFieldOperations.js.map +1 -1
  289. package/build/esm/observable/internal/utils/rdpFieldOperations.test.js +55 -0
  290. package/build/esm/observable/internal/utils/rdpFieldOperations.test.js.map +1 -1
  291. package/build/esm/ontology/loadActionMetadata.js +3 -1
  292. package/build/esm/ontology/loadActionMetadata.js.map +1 -1
  293. package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
  294. package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
  295. package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
  296. package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
  297. package/build/esm/public/unstable-do-not-use.js +1 -0
  298. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  299. package/build/esm/util/UserAgent.js +2 -2
  300. package/build/esm/util/UserAgent.js.map +1 -1
  301. package/build/esm/util/interfaceUtils.js +7 -0
  302. package/build/esm/util/interfaceUtils.js.map +1 -1
  303. package/build/types/Client.d.ts +1 -1
  304. package/build/types/MinimalClientContext.d.ts +1 -1
  305. package/build/types/actions/applyAction.d.ts.map +1 -1
  306. package/build/types/createClient.d.ts +1 -0
  307. package/build/types/createClient.d.ts.map +1 -1
  308. package/build/types/object/convertWireToOsdkObjects/InternalSymbols.d.ts +2 -0
  309. package/build/types/object/convertWireToOsdkObjects/InternalSymbols.d.ts.map +1 -1
  310. package/build/types/object/convertWireToOsdkObjects.d.ts +4 -4
  311. package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
  312. package/build/types/object/fetchPage.d.ts.map +1 -1
  313. package/build/types/object/object.test.d.ts.map +1 -1
  314. package/build/types/objectSet/createObjectSet.d.ts +5 -14
  315. package/build/types/objectSet/createObjectSet.d.ts.map +1 -1
  316. package/build/types/objectSet/fetchLinksPage.d.ts +1 -9
  317. package/build/types/objectSet/fetchLinksPage.d.ts.map +1 -1
  318. package/build/types/observable/ObservableClient/ObserveLink.d.ts +2 -1
  319. package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -1
  320. package/build/types/observable/ObservableClient.d.ts +71 -25
  321. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  322. package/build/types/observable/internal/AbstractHelper.d.ts +1 -1
  323. package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -1
  324. package/build/types/observable/internal/AbstractHelper.test.d.ts +1 -0
  325. package/build/types/observable/internal/AbstractHelper.test.d.ts.map +1 -0
  326. package/build/types/observable/internal/BulkObjectLoader.d.ts +2 -1
  327. package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
  328. package/build/types/observable/internal/CacheKeys.d.ts +5 -0
  329. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  330. package/build/types/observable/internal/ListQueryView.d.ts +21 -0
  331. package/build/types/observable/internal/ListQueryView.d.ts.map +1 -0
  332. package/build/types/observable/internal/PivotCanonicalizer.d.ts +2 -2
  333. package/build/types/observable/internal/PivotCanonicalizer.d.ts.map +1 -1
  334. package/build/types/observable/internal/Query.d.ts.map +1 -1
  335. package/build/types/observable/internal/Store.d.ts.map +1 -1
  336. package/build/types/observable/internal/Store.test.d.ts.map +1 -1
  337. package/build/types/observable/internal/actions/ActionApplication.d.ts.map +1 -1
  338. package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -1
  339. package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts +6 -4
  340. package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts.map +1 -1
  341. package/build/types/observable/internal/aggregation/AggregationQuery.d.ts +8 -3
  342. package/build/types/observable/internal/aggregation/AggregationQuery.d.ts.map +1 -1
  343. package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts +19 -14
  344. package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts.map +1 -1
  345. package/build/types/observable/internal/aggregation/AggregationsHelper.test.d.ts +1 -0
  346. package/build/types/observable/internal/aggregation/AggregationsHelper.test.d.ts.map +1 -0
  347. package/build/types/observable/internal/aggregation/ObjectAggregationQuery.d.ts.map +1 -1
  348. package/build/types/observable/internal/base-list/BaseListQuery.d.ts +47 -2
  349. package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -1
  350. package/build/types/observable/internal/function/FunctionQuery.d.ts +1 -1
  351. package/build/types/observable/internal/function/FunctionQuery.d.ts.map +1 -1
  352. package/build/types/observable/internal/function/FunctionsHelper.d.ts +1 -0
  353. package/build/types/observable/internal/function/FunctionsHelper.d.ts.map +1 -1
  354. package/build/types/observable/internal/links/LinksHelper.d.ts +5 -5
  355. package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -1
  356. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +8 -6
  357. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -1
  358. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +3 -4
  359. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -1
  360. package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -1
  361. package/build/types/observable/internal/list/ListQuery.d.ts +0 -3
  362. package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -1
  363. package/build/types/observable/internal/list/ListsHelper.d.ts +4 -4
  364. package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -1
  365. package/build/types/observable/internal/list/ObjectListQuery.d.ts.map +1 -1
  366. package/build/types/observable/internal/object/ObjectQuery.d.ts +2 -1
  367. package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -1
  368. package/build/types/observable/internal/object/ObjectsHelper.d.ts +8 -4
  369. package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
  370. package/build/types/observable/internal/object/ObjectsHelper.test.d.ts +1 -0
  371. package/build/types/observable/internal/object/ObjectsHelper.test.d.ts.map +1 -0
  372. package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts +2 -1
  373. package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts.map +1 -1
  374. package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +3 -1
  375. package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -1
  376. package/build/types/observable/internal/objectset/ObjectSetHelper.test.d.ts +1 -0
  377. package/build/types/observable/internal/objectset/ObjectSetHelper.test.d.ts.map +1 -0
  378. package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +2 -0
  379. package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -1
  380. package/build/types/observable/internal/testUtils.d.ts +2 -2
  381. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  382. package/build/types/public/unstable-do-not-use.d.ts +1 -0
  383. package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
  384. package/build/types/util/interfaceUtils.d.ts +2 -1
  385. package/build/types/util/interfaceUtils.d.ts.map +1 -1
  386. package/package.json +15 -14
  387. package/build/cjs/chunk-OVZCGOMG.cjs.map +0 -1
  388. package/build/cjs/chunk-OZNDU7AU.cjs.map +0 -1
@@ -15,6 +15,9 @@
15
15
  */
16
16
 
17
17
  import { Subscription } from "rxjs";
18
+ import { additionalContext } from "../../Client.js";
19
+ import { getWireObjectSet, isObjectSet } from "../../objectSet/createObjectSet.js";
20
+ import { extractObjectOrInterfaceType } from "../../util/extractObjectOrInterfaceType.js";
18
21
  import { UnsubscribableWrapper } from "./UnsubscribableWrapper.js";
19
22
 
20
23
  /**
@@ -45,42 +48,45 @@ export class ObservableClientImpl {
45
48
  // cast to cross typed to untyped barrier
46
49
  subFn);
47
50
  };
48
- observeAggregation = (options, subFn) => {
51
+ observeAggregation(options, subFn) {
52
+ if (options.objectSet) {
53
+ return this.__experimentalStore.aggregations.observeAsync(options, subFn);
54
+ }
49
55
  return this.__experimentalStore.aggregations.observe(options, subFn);
50
- };
56
+ }
51
57
  observeFunction = (queryDef, params, options, subFn) => {
52
58
  const dependsOn = options.dependsOn?.map(dep => typeof dep === "string" ? dep : dep.apiName);
53
- const dependsOnObjects = options.dependsOnObjects?.map(obj => ({
54
- $apiName: obj.$objectType ?? obj.$apiName,
55
- $primaryKey: obj.$primaryKey
56
- }));
59
+
60
+ // Partition dependsOnObjects into instances vs ObjectSets
61
+
62
+ const instances = [];
63
+ const objectSetWires = [];
64
+ for (const item of options.dependsOnObjects ?? []) {
65
+ if (isObjectSet(item)) {
66
+ objectSetWires.push(getWireObjectSet(item));
67
+ } else {
68
+ instances.push({
69
+ $apiName: item.$objectType ?? item.$apiName,
70
+ $primaryKey: item.$primaryKey
71
+ });
72
+ }
73
+ }
74
+
75
+ // Start async extraction of ObjectSet types
76
+ const objectSetTypesPromise = objectSetWires.length > 0 ? Promise.all(objectSetWires.map(wire => extractObjectOrInterfaceType(this.__experimentalStore.client[additionalContext], wire))).then(types => types.filter(t => t != null).map(t => t.apiName)) : undefined;
57
77
  return this.__experimentalStore.functions.observe({
58
78
  ...options,
59
79
  queryDef,
60
80
  params,
61
81
  dependsOn,
62
- dependsOnObjects
82
+ dependsOnObjects: instances,
83
+ objectSetTypesPromise
63
84
  }, subFn);
64
85
  };
65
86
  observeLinks = (objects, linkName, options, subFn) => {
66
- // Convert to array if single object provided
67
87
  const objectsArray = Array.isArray(objects) ? objects : [objects];
68
- const parentSub = new Subscription();
69
- for (const obj of objectsArray) {
70
- const querySubscription = this.__experimentalStore.links.observe({
71
- ...options,
72
- srcType: {
73
- type: "object",
74
- apiName: obj.$objectType ?? obj.$apiName
75
- },
76
- linkName,
77
- pk: obj.$primaryKey
78
- },
79
- // cast to cross typed to untyped barrier
80
- subFn);
81
- parentSub.add(querySubscription);
82
- }
83
- return new UnsubscribableWrapper(parentSub);
88
+ const observer = subFn;
89
+ return objectsArray.length <= 1 ? observeSingleLink(this.__experimentalStore, objectsArray, linkName, options, observer) : observeMultiLinks(this.__experimentalStore, objectsArray, linkName, options, observer);
84
90
  };
85
91
  observeObjectSet(baseObjectSet, options, subFn) {
86
92
  return this.__experimentalStore.objectSets.observe({
@@ -109,4 +115,110 @@ export class ObservableClientImpl {
109
115
  return this.__experimentalStore.whereCanonicalizer.canonicalize(where);
110
116
  }
111
117
  }
118
+ function observeSingleLink(store, objectsArray, linkName, options, observer) {
119
+ if (objectsArray.length === 0) {
120
+ observer.next({
121
+ resolvedList: [],
122
+ isOptimistic: false,
123
+ lastUpdated: 0,
124
+ fetchMore: () => Promise.resolve(),
125
+ hasMore: false,
126
+ status: "loaded",
127
+ totalCount: "0"
128
+ });
129
+ return new UnsubscribableWrapper(new Subscription());
130
+ }
131
+ const parentSub = new Subscription();
132
+ for (const obj of objectsArray) {
133
+ const sourceType = obj.$apiName === obj.$objectType ? "object" : "interface";
134
+ parentSub.add(store.links.observe({
135
+ ...options,
136
+ srcType: {
137
+ type: sourceType,
138
+ apiName: obj.$apiName
139
+ },
140
+ sourceUnderlyingObjectType: obj.$objectType,
141
+ linkName,
142
+ pk: obj.$primaryKey
143
+ }, observer));
144
+ }
145
+ return new UnsubscribableWrapper(parentSub);
146
+ }
147
+ function observeMultiLinks(store, objectsArray, linkName, options, observer) {
148
+ const parentSub = new Subscription();
149
+ const totalExpected = objectsArray.length;
150
+ const perObjectResults = new Map();
151
+ let errored = false;
152
+ function mergeAndEmit() {
153
+ if (errored) {
154
+ return;
155
+ }
156
+ const seen = new Map();
157
+ const fetchMores = [];
158
+ let latestUpdated = 0;
159
+ let hasMore = false;
160
+ let isOptimistic = false;
161
+ for (const payload of perObjectResults.values()) {
162
+ for (const obj of payload.resolvedList) {
163
+ seen.set(`${obj.$objectType}:${obj.$primaryKey}`, obj);
164
+ }
165
+ if (payload.lastUpdated > latestUpdated) {
166
+ latestUpdated = payload.lastUpdated;
167
+ }
168
+ if (payload.isOptimistic) {
169
+ isOptimistic = true;
170
+ }
171
+ if (payload.hasMore) {
172
+ hasMore = true;
173
+ fetchMores.push(payload.fetchMore);
174
+ }
175
+ }
176
+ const payloads = [...perObjectResults.values()];
177
+ const loading = perObjectResults.size < totalExpected || payloads.some(p => p.status === "init" || p.status === "loading");
178
+ observer.next({
179
+ resolvedList: Array.from(seen.values()),
180
+ isOptimistic,
181
+ lastUpdated: latestUpdated,
182
+ fetchMore: hasMore ? () => Promise.all(fetchMores.map(fn => fn())).then(() => {}) : () => Promise.resolve(),
183
+ hasMore,
184
+ status: loading ? "loading" : payloads.some(p => p.status === "error") ? "error" : "loaded",
185
+ ...(!hasMore ? {
186
+ totalCount: String(seen.size)
187
+ } : {})
188
+ });
189
+ }
190
+ for (const obj of objectsArray) {
191
+ const objKey = `${obj.$objectType ?? obj.$apiName}:${obj.$primaryKey}`;
192
+ const sourceType = obj.$apiName === obj.$objectType ? "object" : "interface";
193
+ parentSub.add(store.links.observe({
194
+ ...options,
195
+ srcType: {
196
+ type: sourceType,
197
+ apiName: obj.$apiName
198
+ },
199
+ sourceUnderlyingObjectType: obj.$objectType,
200
+ linkName,
201
+ pk: obj.$primaryKey
202
+ }, {
203
+ next: payload => {
204
+ if (errored) {
205
+ return;
206
+ }
207
+ perObjectResults.set(objKey, payload);
208
+ mergeAndEmit();
209
+ },
210
+ error: err => {
211
+ if (errored) {
212
+ return;
213
+ }
214
+ errored = true;
215
+ parentSub.unsubscribe();
216
+ observer.error(err);
217
+ },
218
+ // store link queries are long-lived and do not complete
219
+ complete: () => {}
220
+ }));
221
+ }
222
+ return new UnsubscribableWrapper(parentSub);
223
+ }
112
224
  //# sourceMappingURL=ObservableClientImpl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableClientImpl.js","names":["Subscription","UnsubscribableWrapper","ObservableClientImpl","constructor","store","__experimentalStore","applyAction","bind","validateAction","observeObject","apiName","pk","options","subFn","objects","observe","observeList","lists","observeAggregation","aggregations","observeFunction","queryDef","params","dependsOn","map","dep","dependsOnObjects","obj","$apiName","$objectType","$primaryKey","functions","observeLinks","linkName","objectsArray","Array","isArray","parentSub","querySubscription","links","srcType","type","add","observeObjectSet","baseObjectSet","objectSets","invalidateAll","invalidateObjects","invalidateObjectType","undefined","invalidateFunction","invalidateFunctionsByObject","primaryKey","canonicalizeWhereClause","where","whereCanonicalizer","canonicalize"],"sources":["ObservableClientImpl.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n AggregateOpts,\n CompileTimeMetadata,\n InterfaceDefinition,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n QueryDefinition,\n SimplePropertyDef,\n WhereClause,\n WirePropertyTypes,\n} from \"@osdk/api\";\nimport { Subscription } from \"rxjs\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport type { FunctionPayload } from \"../FunctionPayload.js\";\nimport type { SpecificLinkPayload } from \"../LinkPayload.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type { ObjectSetPayload } from \"../ObjectSetPayload.js\";\nimport type {\n ObservableClient,\n ObserveAggregationArgs,\n ObserveAggregationOptions,\n ObserveFunctionCallbackArgs,\n ObserveFunctionOptions,\n ObserveListOptions,\n ObserveObjectCallbackArgs,\n ObserveObjectOptions,\n ObserveObjectsCallbackArgs,\n ObserveObjectSetArgs,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { Observer } from \"../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../ObservableClient/ObserveLink.js\";\nimport type { AggregationPayloadBase } from \"./aggregation/AggregationQuery.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport type { ObserveObjectSetOptions } from \"./objectset/ObjectSetQueryOptions.js\";\nimport type { Store } from \"./Store.js\";\nimport { UnsubscribableWrapper } from \"./UnsubscribableWrapper.js\";\n\n/**\n * Implementation of the public ObservableClient interface.\n * - Delegates all operations to the Store for consistency\n * - Serves as the entry point for reactive data management\n * - Ensures proper method binding and API exposure\n *\n * @internal\n */\nexport class ObservableClientImpl implements ObservableClient {\n __experimentalStore: Store;\n\n constructor(store: Store) {\n this.__experimentalStore = store;\n\n this.applyAction = store.applyAction.bind(store);\n this.validateAction = store.validateAction.bind(store);\n }\n\n public observeObject: <T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: Omit<ObserveObjectOptions<T>, \"apiName\" | \"pk\">,\n subFn: Observer<ObserveObjectCallbackArgs<T>>,\n ) => Unsubscribable = (apiName, pk, options, subFn) => {\n return this.__experimentalStore.objects.observe(\n {\n ...options,\n apiName,\n pk,\n },\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ObjectPayload>,\n );\n };\n\n public observeList: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveListOptions<T, RDPs>,\n subFn: Observer<ObserveObjectsCallbackArgs<T, RDPs>>,\n ) => Unsubscribable = (options, subFn) => {\n return this.__experimentalStore.lists.observe(\n options,\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ListPayload>,\n );\n };\n\n public observeAggregation: <\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptions<T, A, RDPs>,\n subFn: Observer<ObserveAggregationArgs<T, A>>,\n ) => Unsubscribable = <\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptions<T, A, RDPs>,\n subFn: Observer<ObserveAggregationArgs<T, A>>,\n ) => {\n return this.__experimentalStore.aggregations.observe(\n options,\n subFn as Observer<AggregationPayloadBase>,\n );\n };\n\n public observeFunction: <Q extends QueryDefinition<unknown>>(\n queryDef: Q,\n params: Record<string, unknown> | undefined,\n options: ObserveFunctionOptions,\n subFn: Observer<ObserveFunctionCallbackArgs<Q>>,\n ) => Unsubscribable = (queryDef, params, options, subFn) => {\n const dependsOn = options.dependsOn?.map(dep =>\n typeof dep === \"string\" ? dep : dep.apiName\n );\n const dependsOnObjects = options.dependsOnObjects?.map(obj => ({\n $apiName: obj.$objectType ?? obj.$apiName,\n $primaryKey: obj.$primaryKey,\n }));\n\n return this.__experimentalStore.functions.observe(\n {\n ...options,\n queryDef,\n params,\n dependsOn,\n dependsOnObjects,\n },\n subFn as unknown as Observer<FunctionPayload>,\n );\n };\n\n public observeLinks: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(\n objects: Osdk.Instance<T> | Array<Osdk.Instance<T>>,\n linkName: L,\n options: ObserveLinks.Options<T, L>,\n subFn: Observer<\n ObserveLinks.CallbackArgs<\n CompileTimeMetadata<T>[\"links\"][L][\"targetType\"]\n >\n >,\n ) => Unsubscribable = (objects, linkName, options, subFn) => {\n // Convert to array if single object provided\n const objectsArray = Array.isArray(objects) ? objects : [objects];\n\n const parentSub = new Subscription();\n\n for (const obj of objectsArray) {\n const querySubscription = this.__experimentalStore.links\n .observe(\n {\n ...options,\n srcType: {\n type: \"object\",\n apiName: obj.$objectType ?? obj.$apiName,\n },\n linkName,\n pk: obj.$primaryKey,\n },\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<SpecificLinkPayload>,\n );\n\n parentSub.add(querySubscription);\n }\n\n return new UnsubscribableWrapper(parentSub);\n };\n\n public applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: ObservableClient.ApplyActionOptions,\n ) => Promise<ActionEditResponse>;\n\n public validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse>;\n\n public observeObjectSet<\n T extends ObjectTypeDefinition,\n RDPs extends Record<\n string,\n WirePropertyTypes | undefined | Array<WirePropertyTypes>\n > = {},\n >(\n baseObjectSet: ObjectSet<T>,\n options: ObserveObjectSetOptions<T, RDPs>,\n subFn: Observer<ObserveObjectSetArgs<T, RDPs>>,\n ): Unsubscribable {\n return this.__experimentalStore.objectSets.observe(\n { baseObjectSet, ...options },\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ObjectSetPayload>,\n );\n }\n\n public invalidateAll(): Promise<void> {\n return this.__experimentalStore.invalidateAll();\n }\n\n public invalidateObjects(\n objects:\n | Osdk.Instance<ObjectTypeDefinition>\n | ReadonlyArray<Osdk.Instance<ObjectTypeDefinition>>,\n ): Promise<void> {\n return this.__experimentalStore.invalidateObjects(objects);\n }\n\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n type: T | T[\"apiName\"],\n ): Promise<void> {\n return this.__experimentalStore.invalidateObjectType(type, undefined);\n }\n\n public invalidateFunction(\n apiName: string | QueryDefinition<unknown>,\n params?: Record<string, unknown>,\n ): Promise<void> {\n return this.__experimentalStore.invalidateFunction(apiName, params);\n }\n\n public invalidateFunctionsByObject(\n apiName: string,\n primaryKey: string | number,\n ): Promise<void> {\n return this.__experimentalStore.invalidateFunctionsByObject(\n apiName,\n primaryKey,\n );\n }\n\n public canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(where: WhereClause<T, RDPs>): Canonical<WhereClause<T, RDPs>> {\n return this.__experimentalStore.whereCanonicalizer\n .canonicalize(where) as Canonical<WhereClause<T, RDPs>>;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ObservableClientImpl.js","names":["Subscription","additionalContext","getWireObjectSet","isObjectSet","extractObjectOrInterfaceType","UnsubscribableWrapper","ObservableClientImpl","constructor","store","__experimentalStore","applyAction","bind","validateAction","observeObject","apiName","pk","options","subFn","objects","observe","observeList","lists","observeAggregation","objectSet","aggregations","observeAsync","observeFunction","queryDef","params","dependsOn","map","dep","instances","objectSetWires","item","dependsOnObjects","push","$apiName","$objectType","$primaryKey","objectSetTypesPromise","length","Promise","all","wire","client","then","types","filter","t","undefined","functions","observeLinks","linkName","objectsArray","Array","isArray","observer","observeSingleLink","observeMultiLinks","observeObjectSet","baseObjectSet","objectSets","invalidateAll","invalidateObjects","invalidateObjectType","type","invalidateFunction","invalidateFunctionsByObject","primaryKey","canonicalizeWhereClause","where","whereCanonicalizer","canonicalize","next","resolvedList","isOptimistic","lastUpdated","fetchMore","resolve","hasMore","status","totalCount","parentSub","obj","sourceType","add","links","srcType","sourceUnderlyingObjectType","totalExpected","perObjectResults","Map","errored","mergeAndEmit","seen","fetchMores","latestUpdated","payload","values","set","payloads","loading","size","some","p","from","fn","String","objKey","error","err","unsubscribe","complete"],"sources":["ObservableClientImpl.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ActionValidationResponse,\n AggregateOpts,\n CompileTimeMetadata,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n QueryDefinition,\n SimplePropertyDef,\n WhereClause,\n WirePropertyTypes,\n} from \"@osdk/api\";\nimport { Subscription } from \"rxjs\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext } from \"../../Client.js\";\nimport {\n getWireObjectSet,\n isObjectSet,\n} from \"../../objectSet/createObjectSet.js\";\nimport { extractObjectOrInterfaceType } from \"../../util/extractObjectOrInterfaceType.js\";\nimport type { FunctionPayload } from \"../FunctionPayload.js\";\nimport type { SpecificLinkPayload } from \"../LinkPayload.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type { ObjectSetPayload } from \"../ObjectSetPayload.js\";\nimport type {\n ObservableClient,\n ObserveAggregationArgs,\n ObserveAggregationOptions,\n ObserveAggregationOptionsWithObjectSet,\n ObserveFunctionCallbackArgs,\n ObserveFunctionOptions,\n ObserveListOptions,\n ObserveObjectCallbackArgs,\n ObserveObjectOptions,\n ObserveObjectsCallbackArgs,\n ObserveObjectSetArgs,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { Observer } from \"../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../ObservableClient/ObserveLink.js\";\nimport type { AggregationPayloadBase } from \"./aggregation/AggregationQuery.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport type { ObserveObjectSetOptions } from \"./objectset/ObjectSetQueryOptions.js\";\nimport type { Store } from \"./Store.js\";\nimport { UnsubscribableWrapper } from \"./UnsubscribableWrapper.js\";\n\n/**\n * Implementation of the public ObservableClient interface.\n * - Delegates all operations to the Store for consistency\n * - Serves as the entry point for reactive data management\n * - Ensures proper method binding and API exposure\n *\n * @internal\n */\nexport class ObservableClientImpl implements ObservableClient {\n __experimentalStore: Store;\n\n constructor(store: Store) {\n this.__experimentalStore = store;\n\n this.applyAction = store.applyAction.bind(store);\n this.validateAction = store.validateAction.bind(store);\n }\n\n public observeObject: <T extends ObjectOrInterfaceDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: Omit<ObserveObjectOptions<T>, \"apiName\" | \"pk\">,\n subFn: Observer<ObserveObjectCallbackArgs<T>>,\n ) => Unsubscribable = (apiName, pk, options, subFn) => {\n return this.__experimentalStore.objects.observe(\n {\n ...options,\n apiName,\n pk,\n },\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ObjectPayload>,\n );\n };\n\n public observeList: <\n T extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveListOptions<T, RDPs>,\n subFn: Observer<ObserveObjectsCallbackArgs<T, RDPs>>,\n ) => Unsubscribable = (options, subFn) => {\n return this.__experimentalStore.lists.observe(\n options,\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ListPayload>,\n );\n };\n\n public observeAggregation<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptions<T, A, RDPs>,\n subFn: Observer<ObserveAggregationArgs<T, A>>,\n ): Unsubscribable;\n public observeAggregation<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptionsWithObjectSet<T, A, RDPs>,\n subFn: Observer<ObserveAggregationArgs<T, A>>,\n ): Promise<Unsubscribable>;\n public observeAggregation<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options:\n | ObserveAggregationOptions<T, A, RDPs>\n | ObserveAggregationOptionsWithObjectSet<T, A, RDPs>,\n subFn: Observer<ObserveAggregationArgs<T, A>>,\n ): Unsubscribable | Promise<Unsubscribable> {\n if (options.objectSet) {\n return this.__experimentalStore.aggregations.observeAsync(\n options as ObserveAggregationOptionsWithObjectSet<T, A, RDPs>,\n subFn as Observer<AggregationPayloadBase>,\n );\n }\n return this.__experimentalStore.aggregations.observe(\n options as ObserveAggregationOptions<T, A, RDPs>,\n subFn as Observer<AggregationPayloadBase>,\n );\n }\n\n public observeFunction: <Q extends QueryDefinition<unknown>>(\n queryDef: Q,\n params: Record<string, unknown> | undefined,\n options: ObserveFunctionOptions,\n subFn: Observer<ObserveFunctionCallbackArgs<Q>>,\n ) => Unsubscribable = (queryDef, params, options, subFn) => {\n const dependsOn = options.dependsOn?.map(dep =>\n typeof dep === \"string\" ? dep : dep.apiName\n );\n\n // Partition dependsOnObjects into instances vs ObjectSets\n type ObjectDependency = { $apiName: string; $primaryKey: string | number };\n const instances: ObjectDependency[] = [];\n const objectSetWires: Array<\n ReturnType<typeof getWireObjectSet>\n > = [];\n\n for (const item of options.dependsOnObjects ?? []) {\n if (isObjectSet(item)) {\n objectSetWires.push(getWireObjectSet(item));\n } else {\n instances.push({\n $apiName: item.$objectType ?? item.$apiName,\n $primaryKey: item.$primaryKey,\n });\n }\n }\n\n // Start async extraction of ObjectSet types\n const objectSetTypesPromise = objectSetWires.length > 0\n ? Promise.all(\n objectSetWires.map(wire =>\n extractObjectOrInterfaceType(\n this.__experimentalStore.client[additionalContext],\n wire,\n )\n ),\n ).then(types =>\n types\n .filter((t): t is NonNullable<typeof t> => t != null)\n .map(t => t.apiName)\n )\n : undefined;\n\n return this.__experimentalStore.functions.observe(\n {\n ...options,\n queryDef,\n params,\n dependsOn,\n dependsOnObjects: instances,\n objectSetTypesPromise,\n },\n subFn as unknown as Observer<FunctionPayload>,\n );\n };\n\n public observeLinks: <\n T extends ObjectOrInterfaceDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(\n objects: Osdk.Instance<T> | Array<Osdk.Instance<T>>,\n linkName: L,\n options: ObserveLinks.Options<T, L>,\n subFn: Observer<\n ObserveLinks.CallbackArgs<\n CompileTimeMetadata<T>[\"links\"][L][\"targetType\"]\n >\n >,\n ) => Unsubscribable = (objects, linkName, options, subFn) => {\n const objectsArray = Array.isArray(objects) ? objects : [objects];\n const observer = subFn as unknown as Observer<SpecificLinkPayload>;\n\n return objectsArray.length <= 1\n ? observeSingleLink(\n this.__experimentalStore,\n objectsArray,\n linkName,\n options,\n observer,\n )\n : observeMultiLinks(\n this.__experimentalStore,\n objectsArray,\n linkName,\n options,\n observer,\n );\n };\n\n public applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: ObservableClient.ApplyActionOptions,\n ) => Promise<ActionEditResponse>;\n\n public validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse>;\n\n public observeObjectSet<\n T extends ObjectTypeDefinition,\n RDPs extends Record<\n string,\n WirePropertyTypes | undefined | Array<WirePropertyTypes>\n > = {},\n >(\n baseObjectSet: ObjectSet<T>,\n options: ObserveObjectSetOptions<T, RDPs>,\n subFn: Observer<ObserveObjectSetArgs<T, RDPs>>,\n ): Unsubscribable {\n return this.__experimentalStore.objectSets.observe(\n { baseObjectSet, ...options },\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ObjectSetPayload>,\n );\n }\n\n public invalidateAll(): Promise<void> {\n return this.__experimentalStore.invalidateAll();\n }\n\n public invalidateObjects(\n objects:\n | Osdk.Instance<ObjectTypeDefinition>\n | ReadonlyArray<Osdk.Instance<ObjectTypeDefinition>>,\n ): Promise<void> {\n return this.__experimentalStore.invalidateObjects(objects);\n }\n\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n type: T | T[\"apiName\"],\n ): Promise<void> {\n return this.__experimentalStore.invalidateObjectType(type, undefined);\n }\n\n public invalidateFunction(\n apiName: string | QueryDefinition<unknown>,\n params?: Record<string, unknown>,\n ): Promise<void> {\n return this.__experimentalStore.invalidateFunction(apiName, params);\n }\n\n public invalidateFunctionsByObject(\n apiName: string,\n primaryKey: string | number,\n ): Promise<void> {\n return this.__experimentalStore.invalidateFunctionsByObject(\n apiName,\n primaryKey,\n );\n }\n\n public canonicalizeWhereClause<\n T extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(where: WhereClause<T, RDPs>): Canonical<WhereClause<T, RDPs>> {\n return this.__experimentalStore.whereCanonicalizer\n .canonicalize(where) as Canonical<WhereClause<T, RDPs>>;\n }\n}\n\nfunction observeSingleLink(\n store: Store,\n objectsArray: ReadonlyArray<Osdk.Instance<ObjectOrInterfaceDefinition>>,\n linkName: string,\n options: ObserveLinks.Options<ObjectOrInterfaceDefinition, string>,\n observer: Observer<SpecificLinkPayload>,\n): Unsubscribable {\n if (objectsArray.length === 0) {\n observer.next({\n resolvedList: [],\n isOptimistic: false,\n lastUpdated: 0,\n fetchMore: () => Promise.resolve(),\n hasMore: false,\n status: \"loaded\",\n totalCount: \"0\",\n });\n return new UnsubscribableWrapper(new Subscription());\n }\n\n const parentSub = new Subscription();\n\n for (const obj of objectsArray) {\n const sourceType: \"object\" | \"interface\" = obj.$apiName === obj.$objectType\n ? \"object\"\n : \"interface\";\n\n parentSub.add(\n store.links.observe(\n {\n ...options,\n srcType: {\n type: sourceType,\n apiName: obj.$apiName,\n },\n sourceUnderlyingObjectType: obj.$objectType,\n linkName,\n pk: obj.$primaryKey,\n },\n observer,\n ),\n );\n }\n\n return new UnsubscribableWrapper(parentSub);\n}\n\nfunction observeMultiLinks(\n store: Store,\n objectsArray: ReadonlyArray<Osdk.Instance<ObjectOrInterfaceDefinition>>,\n linkName: string,\n options: ObserveLinks.Options<ObjectOrInterfaceDefinition, string>,\n observer: Observer<SpecificLinkPayload>,\n): Unsubscribable {\n const parentSub = new Subscription();\n const totalExpected = objectsArray.length;\n const perObjectResults = new Map<string, SpecificLinkPayload>();\n let errored = false;\n\n function mergeAndEmit() {\n if (errored) {\n return;\n }\n\n const seen = new Map<string, SpecificLinkPayload[\"resolvedList\"][number]>();\n const fetchMores: Array<() => Promise<void>> = [];\n let latestUpdated = 0;\n let hasMore = false;\n let isOptimistic = false;\n\n for (const payload of perObjectResults.values()) {\n for (const obj of payload.resolvedList) {\n seen.set(`${obj.$objectType}:${obj.$primaryKey}`, obj);\n }\n if (payload.lastUpdated > latestUpdated) {\n latestUpdated = payload.lastUpdated;\n }\n if (payload.isOptimistic) {\n isOptimistic = true;\n }\n if (payload.hasMore) {\n hasMore = true;\n fetchMores.push(payload.fetchMore);\n }\n }\n\n const payloads = [...perObjectResults.values()];\n const loading = perObjectResults.size < totalExpected\n || payloads.some(p => p.status === \"init\" || p.status === \"loading\");\n\n observer.next({\n resolvedList: Array.from(seen.values()),\n isOptimistic,\n lastUpdated: latestUpdated,\n fetchMore: hasMore\n ? () => Promise.all(fetchMores.map(fn => fn())).then(() => {})\n : () => Promise.resolve(),\n hasMore,\n status: loading\n ? \"loading\"\n : payloads.some(p => p.status === \"error\")\n ? \"error\"\n : \"loaded\",\n ...(!hasMore ? { totalCount: String(seen.size) } : {}),\n });\n }\n\n for (const obj of objectsArray) {\n const objKey = `${obj.$objectType ?? obj.$apiName}:${obj.$primaryKey}`;\n\n const sourceType: \"object\" | \"interface\" = obj.$apiName === obj.$objectType\n ? \"object\"\n : \"interface\";\n\n parentSub.add(\n store.links.observe(\n {\n ...options,\n srcType: {\n type: sourceType,\n apiName: obj.$apiName,\n },\n sourceUnderlyingObjectType: obj.$objectType,\n linkName,\n pk: obj.$primaryKey,\n },\n {\n next: (payload: SpecificLinkPayload) => {\n if (errored) {\n return;\n }\n perObjectResults.set(objKey, payload);\n mergeAndEmit();\n },\n error: (err: unknown) => {\n if (errored) {\n return;\n }\n errored = true;\n parentSub.unsubscribe();\n observer.error(err);\n },\n // store link queries are long-lived and do not complete\n complete: () => {},\n },\n ),\n );\n }\n\n return new UnsubscribableWrapper(parentSub);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -16,14 +16,14 @@
16
16
 
17
17
  export class PivotCanonicalizer {
18
18
  #cache = new Map();
19
- canonicalize(sourceType, linkName) {
20
- const key = `${sourceType}::${linkName}`;
19
+ canonicalize(sourceType, sourceTypeKind, linkName) {
20
+ const key = `${sourceTypeKind}:${sourceType}::${linkName}`;
21
21
  let canonical = this.#cache.get(key);
22
22
  if (!canonical) {
23
23
  canonical = {
24
24
  sourceType,
25
- linkName,
26
- targetType: "<targetType>"
25
+ sourceTypeKind,
26
+ linkName
27
27
  };
28
28
  this.#cache.set(key, canonical);
29
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PivotCanonicalizer.js","names":["PivotCanonicalizer","cache","Map","canonicalize","sourceType","linkName","key","canonical","get","targetType","set"],"sources":["PivotCanonicalizer.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Canonical } from \"./Canonical.js\";\n\nexport interface PivotInfo {\n sourceType: string;\n linkName: string;\n targetType: string;\n}\n\nexport class PivotCanonicalizer {\n #cache = new Map<string, Canonical<PivotInfo>>();\n\n canonicalize(sourceType: string, linkName: string): Canonical<PivotInfo> {\n const key = `${sourceType}::${linkName}`;\n\n let canonical = this.#cache.get(key);\n\n if (!canonical) {\n canonical = {\n sourceType,\n linkName,\n targetType: \"<targetType>\",\n } as Canonical<PivotInfo>;\n this.#cache.set(key, canonical);\n }\n\n return canonical;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,OAAO,MAAMA,kBAAkB,CAAC;EAC9B,CAACC,KAAK,GAAG,IAAIC,GAAG,CAA+B,CAAC;EAEhDC,YAAYA,CAACC,UAAkB,EAAEC,QAAgB,EAAwB;IACvE,MAAMC,GAAG,GAAG,GAAGF,UAAU,KAAKC,QAAQ,EAAE;IAExC,IAAIE,SAAS,GAAG,IAAI,CAAC,CAACN,KAAK,CAACO,GAAG,CAACF,GAAG,CAAC;IAEpC,IAAI,CAACC,SAAS,EAAE;MACdA,SAAS,GAAG;QACVH,UAAU;QACVC,QAAQ;QACRI,UAAU,EAAE;MACd,CAAyB;MACzB,IAAI,CAAC,CAACR,KAAK,CAACS,GAAG,CAACJ,GAAG,EAAEC,SAAS,CAAC;IACjC;IAEA,OAAOA,SAAS;EAClB;AACF","ignoreList":[]}
1
+ {"version":3,"file":"PivotCanonicalizer.js","names":["PivotCanonicalizer","cache","Map","canonicalize","sourceType","sourceTypeKind","linkName","key","canonical","get","set"],"sources":["PivotCanonicalizer.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Canonical } from \"./Canonical.js\";\n\nexport interface PivotInfo {\n sourceType: string;\n sourceTypeKind: \"object\" | \"interface\";\n linkName: string;\n}\n\nexport class PivotCanonicalizer {\n #cache = new Map<string, Canonical<PivotInfo>>();\n\n canonicalize(\n sourceType: string,\n sourceTypeKind: \"object\" | \"interface\",\n linkName: string,\n ): Canonical<PivotInfo> {\n const key = `${sourceTypeKind}:${sourceType}::${linkName}`;\n\n let canonical = this.#cache.get(key);\n\n if (!canonical) {\n canonical = {\n sourceType,\n sourceTypeKind,\n linkName,\n } as Canonical<PivotInfo>;\n this.#cache.set(key, canonical);\n }\n\n return canonical;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,OAAO,MAAMA,kBAAkB,CAAC;EAC9B,CAACC,KAAK,GAAG,IAAIC,GAAG,CAA+B,CAAC;EAEhDC,YAAYA,CACVC,UAAkB,EAClBC,cAAsC,EACtCC,QAAgB,EACM;IACtB,MAAMC,GAAG,GAAG,GAAGF,cAAc,IAAID,UAAU,KAAKE,QAAQ,EAAE;IAE1D,IAAIE,SAAS,GAAG,IAAI,CAAC,CAACP,KAAK,CAACQ,GAAG,CAACF,GAAG,CAAC;IAEpC,IAAI,CAACC,SAAS,EAAE;MACdA,SAAS,GAAG;QACVJ,UAAU;QACVC,cAAc;QACdC;MACF,CAAyB;MACzB,IAAI,CAAC,CAACL,KAAK,CAACS,GAAG,CAACH,GAAG,EAAEC,SAAS,CAAC;IACjC;IAEA,OAAOA,SAAS;EAClB;AACF","ignoreList":[]}
@@ -111,12 +111,14 @@ export class Query {
111
111
  await this.pendingFetch;
112
112
  return;
113
113
  }
114
- const minDedupeInterval = this.getMinimumDedupeInterval();
115
- if (minDedupeInterval > 0 && this.lastFetchStarted != null && Date.now() - this.lastFetchStarted < minDedupeInterval) {
116
- if (process.env.NODE_ENV !== "production") {
117
- logger?.debug("Within dupeInterval, aborting revalidate");
114
+ if (!force) {
115
+ const minDedupeInterval = this.getMinimumDedupeInterval();
116
+ if (minDedupeInterval > 0 && this.lastFetchStarted != null && Date.now() - this.lastFetchStarted < minDedupeInterval) {
117
+ if (process.env.NODE_ENV !== "production") {
118
+ logger?.debug("Within dupeInterval, aborting revalidate");
119
+ }
120
+ return Promise.resolve();
118
121
  }
119
- return Promise.resolve();
120
122
  }
121
123
  if (process.env.NODE_ENV !== "production") {
122
124
  logger?.debug("Starting actual revalidate");
@@ -1 +1 @@
1
- {"version":3,"file":"Query.js","names":["additionalContext","Query","retainCount","connectable","subscription","subject","subscriptionDedupeIntervals","Map","constructor","store","observable","opts","cacheKey","logger","options","cacheKeys","process","env","NODE_ENV","client","child","msgPrefix","type","otherKeys","map","x","JSON","stringify","join","subscribe","observer","_createConnectable","connect","sub","next","value","error","err","complete","registerSubscriptionDedupeInterval","subscriptionId","dedupeInterval","set","unregisterSubscriptionDedupeInterval","delete","getMinimumDedupeInterval","size","Math","min","values","revalidate","force","methodName","abortController","abort","pendingFetch","debug","minDedupeInterval","lastFetchStarted","Date","now","Promise","resolve","batch","setStatus","_preFetch","_fetchAndStore","finally","undefined","status","existing","read","write","dispose","unsubscribe","_dispose"],"sources":["Query.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Logger } from \"@osdk/api\";\nimport type {\n Connectable,\n Observable,\n Observer,\n Subscribable,\n Subscription,\n} from \"rxjs\";\nimport { additionalContext } from \"../../Client.js\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../ObservableClient/common.js\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport type { CacheKeys } from \"./CacheKeys.js\";\nimport type { Changes } from \"./Changes.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport type { OptimisticId } from \"./OptimisticId.js\";\nimport type { Store } from \"./Store.js\";\nimport type { SubjectPayload } from \"./SubjectPayload.js\";\n\nexport abstract class Query<\n KEY extends KnownCacheKey,\n PAYLOAD,\n O extends CommonObserveOptions,\n> implements Subscribable<PAYLOAD> {\n lastFetchStarted?: number;\n pendingFetch?: Promise<void>;\n retainCount: number = 0;\n options: O;\n cacheKey: KEY;\n store: Store;\n abortController?: AbortController;\n #connectable?: Connectable<PAYLOAD>;\n #subscription?: Subscription;\n #subject: Observable<SubjectPayload<KEY>>;\n #subscriptionDedupeIntervals: Map<string, number> = new Map();\n\n /** @internal */\n protected logger: Logger | undefined;\n\n protected readonly cacheKeys: CacheKeys<KnownCacheKey>;\n\n constructor(\n store: Store,\n observable: Observable<SubjectPayload<KEY>>,\n opts: O,\n cacheKey: KEY,\n logger?: Logger,\n ) {\n this.options = opts;\n this.cacheKey = cacheKey;\n this.store = store;\n this.cacheKeys = store.cacheKeys;\n this.#subject = observable;\n\n this.logger = logger ?? (\n process.env.NODE_ENV === \"production\"\n ? store.client[additionalContext].logger\n : store.client[additionalContext].logger?.child({}, {\n msgPrefix: process.env.NODE_ENV !== \"production\"\n ? (`Query<${cacheKey.type}, ${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`)\n : \"Query\",\n })\n );\n }\n\n protected abstract _createConnectable(\n subject: Observable<SubjectPayload<KEY>>,\n ): Connectable<PAYLOAD>;\n\n public subscribe(\n observer: Observer<PAYLOAD>,\n ): Subscription {\n this.#connectable ??= this._createConnectable(this.#subject);\n this.#subscription = this.#connectable.connect();\n const sub = this.#connectable.subscribe({\n next: (value) => {\n if (observer.next) {\n observer.next(value);\n }\n },\n error: (err) => {\n if (observer.error) {\n observer.error(err);\n }\n },\n complete: () => {\n if (observer.complete) {\n observer.complete();\n }\n },\n });\n return sub;\n }\n\n /**\n * Register a subscription's dedupeInterval value\n */\n registerSubscriptionDedupeInterval(\n subscriptionId: string,\n dedupeInterval: number | undefined,\n ): void {\n if (dedupeInterval != null && dedupeInterval > 0) {\n this.#subscriptionDedupeIntervals.set(subscriptionId, dedupeInterval);\n }\n }\n\n /**\n * Unregister a subscription's dedupeInterval value\n */\n unregisterSubscriptionDedupeInterval(subscriptionId: string): void {\n this.#subscriptionDedupeIntervals.delete(subscriptionId);\n }\n\n /**\n * Get the minimum dedupeInterval from all active subscriptions\n */\n private getMinimumDedupeInterval(): number {\n if (this.#subscriptionDedupeIntervals.size === 0) {\n return this.options.dedupeInterval ?? 0;\n }\n\n return Math.min(...this.#subscriptionDedupeIntervals.values());\n }\n\n /**\n * Causes the query to revalidate. This will cause the query to fetch\n * the latest data from the server and update the store if it is deemed\n * \"stale\" or if `force` is true.\n *\n * @param force\n * @returns\n */\n async revalidate(force?: boolean): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"revalidate\" })\n : this.logger;\n\n if (force) {\n this.abortController?.abort();\n }\n\n // n.b. I think this isn't quite right since we may require multiple\n // pages to properly \"revalidate\" for someone. This only really works if you\n // have a single page/object. It needs to be redone. FIXME\n\n // if we are pending the first page/object we can just ignore this\n if (this.pendingFetch) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Fetch is already pending, using it\");\n }\n await this.pendingFetch;\n return;\n }\n\n const minDedupeInterval = this.getMinimumDedupeInterval();\n if (\n minDedupeInterval > 0 && (\n this.lastFetchStarted != null\n && Date.now() - this.lastFetchStarted < minDedupeInterval\n )\n ) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Within dupeInterval, aborting revalidate\");\n }\n\n return Promise.resolve();\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Starting actual revalidate\");\n }\n\n this.store.batch({}, (batch) => {\n // make sure the truth layer knows we are loading\n\n // this will not trigger an update to `changes` so it cannot trigger an\n // update of a list either. This may not be the behavior we want.\n this.setStatus(\"loading\", batch);\n });\n\n this._preFetch();\n\n this.lastFetchStarted = Date.now();\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"calling _fetchAndStore()\");\n }\n this.pendingFetch = this._fetchAndStore()\n .finally(() => {\n logger?.debug(\"promise's finally for _fetchAndStore()\");\n this.pendingFetch = undefined;\n });\n\n await this.pendingFetch;\n return;\n }\n\n protected _preFetch(): void {}\n\n protected abstract _fetchAndStore(): Promise<void>;\n\n /**\n * Sets the status of the query in the store (but does not store that in `changes`).\n *\n * @param status\n * @param batch\n * @returns\n */\n setStatus(\n status: Status,\n batch: BatchContext,\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Attempting to set status to '${status}'`,\n );\n }\n const existing = batch.read(this.cacheKey);\n if (existing?.status === status) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Status is already set to '${status}'; aborting`,\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Writing status '${status}' to cache`,\n );\n }\n batch.write(this.cacheKey, existing?.value, status);\n }\n\n dispose(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n this.#subscription?.unsubscribe();\n this._dispose();\n }\n\n /**\n * Per query type dispose functionality\n */\n protected _dispose(): void {}\n\n /**\n * The purpose of this method is to provide a way for others to write\n * directly into the store for this query.\n *\n * @param data\n * @param status\n * @param batch\n */\n abstract writeToStore(\n data: KEY[\"__cacheKey\"][\"value\"],\n status: Status,\n batch: BatchContext,\n ): Entry<KEY>;\n\n /**\n * @param changes\n * @param optimisticId\n * @returns If revalidation is needed, a promise that resolves after the\n * revalidation is complete. Otherwise, undefined.\n */\n maybeUpdateAndRevalidate?: (\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ) => Promise<void> | undefined;\n\n abstract invalidateObjectType(\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void>;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Query.js","names":["additionalContext","Query","retainCount","connectable","subscription","subject","subscriptionDedupeIntervals","Map","constructor","store","observable","opts","cacheKey","logger","options","cacheKeys","process","env","NODE_ENV","client","child","msgPrefix","type","otherKeys","map","x","JSON","stringify","join","subscribe","observer","_createConnectable","connect","sub","next","value","error","err","complete","registerSubscriptionDedupeInterval","subscriptionId","dedupeInterval","set","unregisterSubscriptionDedupeInterval","delete","getMinimumDedupeInterval","size","Math","min","values","revalidate","force","methodName","abortController","abort","pendingFetch","debug","minDedupeInterval","lastFetchStarted","Date","now","Promise","resolve","batch","setStatus","_preFetch","_fetchAndStore","finally","undefined","status","existing","read","write","dispose","unsubscribe","_dispose"],"sources":["Query.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Logger } from \"@osdk/api\";\nimport type {\n Connectable,\n Observable,\n Observer,\n Subscribable,\n Subscription,\n} from \"rxjs\";\nimport { additionalContext } from \"../../Client.js\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../ObservableClient/common.js\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport type { CacheKeys } from \"./CacheKeys.js\";\nimport type { Changes } from \"./Changes.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport type { OptimisticId } from \"./OptimisticId.js\";\nimport type { Store } from \"./Store.js\";\nimport type { SubjectPayload } from \"./SubjectPayload.js\";\n\nexport abstract class Query<\n KEY extends KnownCacheKey,\n PAYLOAD,\n O extends CommonObserveOptions,\n> implements Subscribable<PAYLOAD> {\n lastFetchStarted?: number;\n pendingFetch?: Promise<void>;\n retainCount: number = 0;\n options: O;\n cacheKey: KEY;\n store: Store;\n abortController?: AbortController;\n #connectable?: Connectable<PAYLOAD>;\n #subscription?: Subscription;\n #subject: Observable<SubjectPayload<KEY>>;\n #subscriptionDedupeIntervals: Map<string, number> = new Map();\n\n /** @internal */\n protected logger: Logger | undefined;\n\n protected readonly cacheKeys: CacheKeys<KnownCacheKey>;\n\n constructor(\n store: Store,\n observable: Observable<SubjectPayload<KEY>>,\n opts: O,\n cacheKey: KEY,\n logger?: Logger,\n ) {\n this.options = opts;\n this.cacheKey = cacheKey;\n this.store = store;\n this.cacheKeys = store.cacheKeys;\n this.#subject = observable;\n\n this.logger = logger ?? (\n process.env.NODE_ENV === \"production\"\n ? store.client[additionalContext].logger\n : store.client[additionalContext].logger?.child({}, {\n msgPrefix: process.env.NODE_ENV !== \"production\"\n ? (`Query<${cacheKey.type}, ${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`)\n : \"Query\",\n })\n );\n }\n\n protected abstract _createConnectable(\n subject: Observable<SubjectPayload<KEY>>,\n ): Connectable<PAYLOAD>;\n\n public subscribe(\n observer: Observer<PAYLOAD>,\n ): Subscription {\n this.#connectable ??= this._createConnectable(this.#subject);\n this.#subscription = this.#connectable.connect();\n const sub = this.#connectable.subscribe({\n next: (value) => {\n if (observer.next) {\n observer.next(value);\n }\n },\n error: (err) => {\n if (observer.error) {\n observer.error(err);\n }\n },\n complete: () => {\n if (observer.complete) {\n observer.complete();\n }\n },\n });\n return sub;\n }\n\n /**\n * Register a subscription's dedupeInterval value\n */\n registerSubscriptionDedupeInterval(\n subscriptionId: string,\n dedupeInterval: number | undefined,\n ): void {\n if (dedupeInterval != null && dedupeInterval > 0) {\n this.#subscriptionDedupeIntervals.set(subscriptionId, dedupeInterval);\n }\n }\n\n /**\n * Unregister a subscription's dedupeInterval value\n */\n unregisterSubscriptionDedupeInterval(subscriptionId: string): void {\n this.#subscriptionDedupeIntervals.delete(subscriptionId);\n }\n\n /**\n * Get the minimum dedupeInterval from all active subscriptions\n */\n private getMinimumDedupeInterval(): number {\n if (this.#subscriptionDedupeIntervals.size === 0) {\n return this.options.dedupeInterval ?? 0;\n }\n\n return Math.min(...this.#subscriptionDedupeIntervals.values());\n }\n\n /**\n * Causes the query to revalidate. This will cause the query to fetch\n * the latest data from the server and update the store if it is deemed\n * \"stale\" or if `force` is true.\n *\n * @param force\n * @returns\n */\n async revalidate(force?: boolean): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"revalidate\" })\n : this.logger;\n\n if (force) {\n this.abortController?.abort();\n }\n\n // n.b. I think this isn't quite right since we may require multiple\n // pages to properly \"revalidate\" for someone. This only really works if you\n // have a single page/object. It needs to be redone. FIXME\n\n // if we are pending the first page/object we can just ignore this\n if (this.pendingFetch) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Fetch is already pending, using it\");\n }\n await this.pendingFetch;\n return;\n }\n\n if (!force) {\n const minDedupeInterval = this.getMinimumDedupeInterval();\n if (\n minDedupeInterval > 0 && (\n this.lastFetchStarted != null\n && Date.now() - this.lastFetchStarted < minDedupeInterval\n )\n ) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Within dupeInterval, aborting revalidate\");\n }\n\n return Promise.resolve();\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Starting actual revalidate\");\n }\n\n this.store.batch({}, (batch) => {\n // make sure the truth layer knows we are loading\n\n // this will not trigger an update to `changes` so it cannot trigger an\n // update of a list either. This may not be the behavior we want.\n this.setStatus(\"loading\", batch);\n });\n\n this._preFetch();\n\n this.lastFetchStarted = Date.now();\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"calling _fetchAndStore()\");\n }\n this.pendingFetch = this._fetchAndStore()\n .finally(() => {\n logger?.debug(\"promise's finally for _fetchAndStore()\");\n this.pendingFetch = undefined;\n });\n\n await this.pendingFetch;\n return;\n }\n\n protected _preFetch(): void {}\n\n protected abstract _fetchAndStore(): Promise<void>;\n\n /**\n * Sets the status of the query in the store (but does not store that in `changes`).\n *\n * @param status\n * @param batch\n * @returns\n */\n setStatus(\n status: Status,\n batch: BatchContext,\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Attempting to set status to '${status}'`,\n );\n }\n const existing = batch.read(this.cacheKey);\n if (existing?.status === status) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Status is already set to '${status}'; aborting`,\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Writing status '${status}' to cache`,\n );\n }\n batch.write(this.cacheKey, existing?.value, status);\n }\n\n dispose(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n this.#subscription?.unsubscribe();\n this._dispose();\n }\n\n /**\n * Per query type dispose functionality\n */\n protected _dispose(): void {}\n\n /**\n * The purpose of this method is to provide a way for others to write\n * directly into the store for this query.\n *\n * @param data\n * @param status\n * @param batch\n */\n abstract writeToStore(\n data: KEY[\"__cacheKey\"][\"value\"],\n status: Status,\n batch: BatchContext,\n ): Entry<KEY>;\n\n /**\n * @param changes\n * @param optimisticId\n * @returns If revalidation is needed, a promise that resolves after the\n * revalidation is complete. Otherwise, undefined.\n */\n maybeUpdateAndRevalidate?: (\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ) => Promise<void> | undefined;\n\n abstract invalidateObjectType(\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void>;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -16,27 +16,26 @@
16
16
 
17
17
  import { describe, expect, it } from "vitest";
18
18
  import { RdpCanonicalizer } from "./RdpCanonicalizer.js";
19
+ import { extractRdpFieldNames } from "./utils/rdpFieldOperations.js";
19
20
  describe("RdpCanonicalizer", () => {
20
21
  it("returns same canonical object for functionally identical RDPs with different function references", () => {
21
22
  const canonicalizer = new RdpCanonicalizer();
22
-
23
- // Create first RDP with a function
24
23
  const rdp1 = {
25
24
  derivedAddress: base => base.pivotTo("lead").selectProperty("employeeId"),
26
25
  derivedName: base => base.pivotTo("lead").selectProperty("fullName")
27
26
  };
28
27
 
29
- // Create second RDP with new function references but same logic
28
+ // Same logic, different function references
30
29
  const rdp2 = {
31
30
  derivedAddress: base => base.pivotTo("lead").selectProperty("employeeId"),
32
31
  derivedName: base => base.pivotTo("lead").selectProperty("fullName")
33
32
  };
34
33
 
35
- // The functions should have different references
34
+ // Different references...
36
35
  expect(rdp1.derivedAddress).not.toBe(rdp2.derivedAddress);
37
36
  expect(rdp1.derivedName).not.toBe(rdp2.derivedName);
38
37
 
39
- // But canonicalization should return the same object
38
+ // ...but same canonical object
40
39
  const canonical1 = canonicalizer.canonicalize(rdp1);
41
40
  const canonical2 = canonicalizer.canonicalize(rdp2);
42
41
  expect(canonical1).toBe(canonical2);
@@ -60,9 +59,26 @@ describe("RdpCanonicalizer", () => {
60
59
  };
61
60
  const canonical1 = canonicalizer.canonicalize(rdp);
62
61
  const canonical2 = canonicalizer.canonicalize(rdp);
63
-
64
- // Same input object should return cached result
65
62
  expect(canonical1).toBe(canonical2);
66
63
  });
64
+ it("shared canonicalizer produces identical canonical and field sets across callers", () => {
65
+ const sharedCanonicalizer = new RdpCanonicalizer();
66
+
67
+ // Two callers (e.g. ListsHelper, ObjectSetHelper) with same RDP definition
68
+
69
+ const listCanonical = sharedCanonicalizer.canonicalize({
70
+ derivedAddress: base => base.pivotTo("lead").selectProperty("employeeId"),
71
+ derivedName: base => base.pivotTo("lead").selectProperty("fullName")
72
+ });
73
+ const objectSetCanonical = sharedCanonicalizer.canonicalize({
74
+ derivedAddress: base => base.pivotTo("lead").selectProperty("employeeId"),
75
+ derivedName: base => base.pivotTo("lead").selectProperty("fullName")
76
+ });
77
+ expect(listCanonical).toBe(objectSetCanonical);
78
+ const listFields = extractRdpFieldNames(listCanonical);
79
+ const objectSetFields = extractRdpFieldNames(objectSetCanonical);
80
+ expect(listFields).toEqual(objectSetFields);
81
+ expect(listFields).toEqual(new Set(["derivedAddress", "derivedName"]));
82
+ });
67
83
  });
68
84
  //# sourceMappingURL=RdpCanonicalizer.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RdpCanonicalizer.test.js","names":["describe","expect","it","RdpCanonicalizer","canonicalizer","rdp1","derivedAddress","base","pivotTo","selectProperty","derivedName","rdp2","not","toBe","canonical1","canonicalize","canonical2","peepsCount","aggregate","leadName","rdp","derivedProp"],"sources":["RdpCanonicalizer.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DerivedProperty } from \"@osdk/api\";\nimport type { Employee } from \"@osdk/client.test.ontology\";\nimport { describe, expect, it } from \"vitest\";\nimport { RdpCanonicalizer } from \"./RdpCanonicalizer.js\";\n\ndescribe(\"RdpCanonicalizer\", () => {\n it(\"returns same canonical object for functionally identical RDPs with different function references\", () => {\n const canonicalizer = new RdpCanonicalizer();\n\n // Create first RDP with a function\n const rdp1: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n // Create second RDP with new function references but same logic\n const rdp2: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n // The functions should have different references\n expect(rdp1.derivedAddress).not.toBe(rdp2.derivedAddress);\n expect(rdp1.derivedName).not.toBe(rdp2.derivedName);\n\n // But canonicalization should return the same object\n const canonical1 = canonicalizer.canonicalize(rdp1);\n const canonical2 = canonicalizer.canonicalize(rdp2);\n\n expect(canonical1).toBe(canonical2);\n });\n\n it(\"handles complex RDP with aggregations\", () => {\n const canonicalizer = new RdpCanonicalizer();\n\n const rdp1: DerivedProperty.Clause<typeof Employee> = {\n peepsCount: (base) => base.pivotTo(\"peeps\").aggregate(\"$count\"),\n leadName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n const rdp2: DerivedProperty.Clause<typeof Employee> = {\n peepsCount: (base) => base.pivotTo(\"peeps\").aggregate(\"$count\"),\n leadName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n const canonical1 = canonicalizer.canonicalize(rdp1);\n const canonical2 = canonicalizer.canonicalize(rdp2);\n\n expect(canonical1).toBe(canonical2);\n });\n\n it(\"caches results for the same input object\", () => {\n const canonicalizer = new RdpCanonicalizer();\n\n const rdp: DerivedProperty.Clause<typeof Employee> = {\n derivedProp: (base) => base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n };\n\n const canonical1 = canonicalizer.canonicalize(rdp);\n const canonical2 = canonicalizer.canonicalize(rdp);\n\n // Same input object should return cached result\n expect(canonical1).toBe(canonical2);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"RdpCanonicalizer.test.js","names":["describe","expect","it","RdpCanonicalizer","extractRdpFieldNames","canonicalizer","rdp1","derivedAddress","base","pivotTo","selectProperty","derivedName","rdp2","not","toBe","canonical1","canonicalize","canonical2","peepsCount","aggregate","leadName","rdp","derivedProp","sharedCanonicalizer","listCanonical","objectSetCanonical","listFields","objectSetFields","toEqual","Set"],"sources":["RdpCanonicalizer.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DerivedProperty } from \"@osdk/api\";\nimport type { Employee } from \"@osdk/client.test.ontology\";\nimport { describe, expect, it } from \"vitest\";\nimport { RdpCanonicalizer } from \"./RdpCanonicalizer.js\";\nimport { extractRdpFieldNames } from \"./utils/rdpFieldOperations.js\";\n\ndescribe(\"RdpCanonicalizer\", () => {\n it(\"returns same canonical object for functionally identical RDPs with different function references\", () => {\n const canonicalizer = new RdpCanonicalizer();\n\n const rdp1: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n // Same logic, different function references\n const rdp2: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n // Different references...\n expect(rdp1.derivedAddress).not.toBe(rdp2.derivedAddress);\n expect(rdp1.derivedName).not.toBe(rdp2.derivedName);\n\n // ...but same canonical object\n const canonical1 = canonicalizer.canonicalize(rdp1);\n const canonical2 = canonicalizer.canonicalize(rdp2);\n\n expect(canonical1).toBe(canonical2);\n });\n\n it(\"handles complex RDP with aggregations\", () => {\n const canonicalizer = new RdpCanonicalizer();\n\n const rdp1: DerivedProperty.Clause<typeof Employee> = {\n peepsCount: (base) => base.pivotTo(\"peeps\").aggregate(\"$count\"),\n leadName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n const rdp2: DerivedProperty.Clause<typeof Employee> = {\n peepsCount: (base) => base.pivotTo(\"peeps\").aggregate(\"$count\"),\n leadName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n\n const canonical1 = canonicalizer.canonicalize(rdp1);\n const canonical2 = canonicalizer.canonicalize(rdp2);\n\n expect(canonical1).toBe(canonical2);\n });\n\n it(\"caches results for the same input object\", () => {\n const canonicalizer = new RdpCanonicalizer();\n\n const rdp: DerivedProperty.Clause<typeof Employee> = {\n derivedProp: (base) => base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n };\n\n const canonical1 = canonicalizer.canonicalize(rdp);\n const canonical2 = canonicalizer.canonicalize(rdp);\n\n expect(canonical1).toBe(canonical2);\n });\n\n it(\"shared canonicalizer produces identical canonical and field sets across callers\", () => {\n const sharedCanonicalizer = new RdpCanonicalizer();\n\n // Two callers (e.g. ListsHelper, ObjectSetHelper) with same RDP definition\n const listWithProperties: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n const listCanonical = sharedCanonicalizer.canonicalize(listWithProperties);\n\n const objectSetWithProperties: DerivedProperty.Clause<typeof Employee> = {\n derivedAddress: (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n derivedName: (base) => base.pivotTo(\"lead\").selectProperty(\"fullName\"),\n };\n const objectSetCanonical = sharedCanonicalizer.canonicalize(\n objectSetWithProperties,\n );\n\n expect(listCanonical).toBe(objectSetCanonical);\n\n const listFields = extractRdpFieldNames(listCanonical);\n const objectSetFields = extractRdpFieldNames(objectSetCanonical);\n expect(listFields).toEqual(objectSetFields);\n expect(listFields).toEqual(new Set([\"derivedAddress\", \"derivedName\"]));\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -62,6 +62,18 @@ export class Store {
62
62
  /** @internal */
63
63
 
64
64
  queries = new Queries();
65
+
66
+ /**
67
+ * Tracks cache keys with deferred cleanup. During React unmount-remount
68
+ * cycles, a subscription may be cleaned up and immediately re-created.
69
+ * By deferring cleanup to a microtask, we prevent propagateWrite from
70
+ * skipping keys that are momentarily between subscriptions.
71
+ *
72
+ * The value is a count (not a boolean) so multiple unsubscribes within the
73
+ * same tick schedule the correct number of releases.
74
+ * @internal
75
+ */
76
+ pendingCleanup = new Map();
65
77
  objectCacheKeyRegistry = new ObjectCacheKeyRegistry();
66
78
  layers = new Layers({
67
79
  logger: this.logger,
@@ -79,12 +91,12 @@ export class Store {
79
91
  this.cacheKeys = new CacheKeys({
80
92
  onDestroy: this.#cleanupCacheKey
81
93
  });
82
- this.aggregations = new AggregationsHelper(this, this.cacheKeys, this.whereCanonicalizer, this.rdpCanonicalizer);
94
+ this.aggregations = new AggregationsHelper(this, this.cacheKeys, this.whereCanonicalizer, this.rdpCanonicalizer, this.intersectCanonicalizer);
83
95
  this.functions = new FunctionsHelper(this, this.cacheKeys);
84
96
  this.lists = new ListsHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer, this.rdpCanonicalizer, this.intersectCanonicalizer, this.pivotCanonicalizer, this.ridListCanonicalizer);
85
97
  this.objects = new ObjectsHelper(this, this.cacheKeys);
86
98
  this.links = new LinksHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer);
87
- this.objectSets = new ObjectSetHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer);
99
+ this.objectSets = new ObjectSetHelper(this, this.cacheKeys, this.whereCanonicalizer, this.orderByCanonicalizer, this.rdpCanonicalizer);
88
100
  }
89
101
 
90
102
  /**
@@ -270,6 +282,11 @@ export class Store {
270
282
  return cacheKey.otherKeys[LIST_RDP_IDX];
271
283
  } else if (cacheKey.type === "aggregation") {
272
284
  return cacheKey.otherKeys[AGGREGATION_RDP_IDX];
285
+ } else if (cacheKey.type === "objectSet") {
286
+ const query = this.queries.peek(cacheKey);
287
+ if (query) {
288
+ return query.rdpConfig;
289
+ }
273
290
  }
274
291
  // Links and other types would also be at LIST_RDP_IDX
275
292
  }