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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/CHANGELOG.md +33 -4
  2. package/build/browser/MinimalClientContext.js.map +1 -1
  3. package/build/browser/actions/applyAction.js +4 -0
  4. package/build/browser/actions/applyAction.js.map +1 -1
  5. package/build/browser/createClient.js +2 -1
  6. package/build/browser/createClient.js.map +1 -1
  7. package/build/browser/createMinimalClient.js +2 -1
  8. package/build/browser/createMinimalClient.js.map +1 -1
  9. package/build/browser/index.js +2 -0
  10. package/build/browser/index.js.map +1 -1
  11. package/build/browser/object/Cache.test.js +1 -1
  12. package/build/browser/object/Cache.test.js.map +1 -1
  13. package/build/browser/object/aggregate.js +2 -0
  14. package/build/browser/object/aggregate.js.map +1 -1
  15. package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
  16. package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
  17. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
  18. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  19. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
  20. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  21. package/build/browser/object/convertWireToOsdkObjects.test.js +2 -0
  22. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  23. package/build/browser/object/fetchPage.js +5 -2
  24. package/build/browser/object/fetchPage.js.map +1 -1
  25. package/build/browser/observable/internal/AbstractHelper.js +4 -3
  26. package/build/browser/observable/internal/AbstractHelper.js.map +1 -1
  27. package/build/browser/observable/internal/BatchContext.js +2 -0
  28. package/build/browser/observable/internal/BatchContext.js.map +1 -0
  29. package/build/browser/observable/internal/CacheKeys.js +61 -36
  30. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  31. package/build/browser/observable/internal/Changes.js.map +1 -1
  32. package/build/browser/observable/internal/KnownCacheKey.js.map +1 -1
  33. package/build/browser/observable/internal/Layer.js +0 -8
  34. package/build/browser/observable/internal/Layer.js.map +1 -1
  35. package/build/browser/observable/internal/Layers.js +151 -0
  36. package/build/browser/observable/internal/Layers.js.map +1 -0
  37. package/build/browser/observable/internal/ObservableClientImpl.js +3 -1
  38. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  39. package/build/browser/observable/internal/OrderByCanonicalizer.js +1 -37
  40. package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -1
  41. package/build/browser/observable/internal/Queries.js +40 -0
  42. package/build/browser/observable/internal/Queries.js.map +1 -0
  43. package/build/browser/observable/internal/Query.js +1 -0
  44. package/build/browser/observable/internal/Query.js.map +1 -1
  45. package/build/browser/observable/internal/Store.js +37 -226
  46. package/build/browser/observable/internal/Store.js.map +1 -1
  47. package/build/browser/observable/internal/Store.test.js +12 -10
  48. package/build/browser/observable/internal/Store.test.js.map +1 -1
  49. package/build/browser/observable/internal/SubjectPayload.js +2 -0
  50. package/build/browser/observable/internal/SubjectPayload.js.map +1 -0
  51. package/build/browser/observable/internal/Subjects.js +55 -0
  52. package/build/browser/observable/internal/Subjects.js.map +1 -0
  53. package/build/browser/observable/internal/WeakRefTrie.js +61 -0
  54. package/build/browser/observable/internal/WeakRefTrie.js.map +1 -0
  55. package/build/browser/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
  56. package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -0
  57. package/build/browser/observable/internal/{OptimisticJob.js → actions/OptimisticJob.js} +3 -3
  58. package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -0
  59. package/build/browser/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
  60. package/build/browser/observable/internal/base-list/BaseListQuery.js +411 -0
  61. package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -0
  62. package/build/{esm/observable/internal → browser/observable/internal/base-list}/createCollectionConnectable.js +2 -2
  63. package/build/browser/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
  64. package/build/{esm/observable/internal → browser/observable/internal/base-list}/createCollectionConnectable.test.js +24 -26
  65. package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
  66. package/build/browser/observable/internal/base-list/removeDuplicates.js.map +1 -0
  67. package/build/browser/observable/internal/createInitEntry.js +25 -0
  68. package/build/browser/observable/internal/createInitEntry.js.map +1 -0
  69. package/build/browser/observable/internal/links/LinksHelper.js +5 -5
  70. package/build/browser/observable/internal/links/LinksHelper.js.map +1 -1
  71. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
  72. package/build/browser/observable/internal/links/SpecificLinkQuery.js +1 -1
  73. package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -1
  74. package/build/browser/observable/internal/{ListCacheKey.js.map → list/ListCacheKey.js.map} +1 -1
  75. package/build/browser/observable/internal/{ListQuery.js → list/ListQuery.js} +12 -421
  76. package/build/browser/observable/internal/list/ListQuery.js.map +1 -0
  77. package/build/browser/observable/internal/list/ListQueryOptions.js +2 -0
  78. package/build/browser/observable/internal/list/ListQueryOptions.js.map +1 -0
  79. package/build/browser/observable/internal/list/ListsHelper.js +6 -6
  80. package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
  81. package/build/browser/observable/internal/object/ObjectCacheKey.js +2 -0
  82. package/build/browser/observable/internal/object/ObjectCacheKey.js.map +1 -0
  83. package/build/browser/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +4 -20
  84. package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -0
  85. package/build/browser/observable/internal/object/ObjectsHelper.js +17 -3
  86. package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
  87. package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -1
  88. package/build/browser/observable/internal/testUtils/invalidateList.js +2 -2
  89. package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -1
  90. package/build/browser/observable/internal/testUtils.js +2 -3
  91. package/build/browser/observable/internal/testUtils.js.map +1 -1
  92. package/build/browser/ontology/loadActionMetadata.js +3 -1
  93. package/build/browser/ontology/loadActionMetadata.js.map +1 -1
  94. package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
  95. package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
  96. package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
  97. package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
  98. package/build/browser/queries/applyQuery.js +3 -3
  99. package/build/browser/queries/applyQuery.js.map +1 -1
  100. package/build/browser/util/UserAgent.js +2 -2
  101. package/build/browser/util/extractObjectOrInterfaceType.js +9 -1
  102. package/build/browser/util/extractObjectOrInterfaceType.js.map +1 -1
  103. package/build/browser/util/extractObjectOrInterfaceType.test.js +2 -2
  104. package/build/browser/util/extractObjectOrInterfaceType.test.js.map +1 -1
  105. package/build/cjs/{chunk-6CBVXAAV.cjs → chunk-4GWXMQZE.cjs} +107 -75
  106. package/build/cjs/chunk-4GWXMQZE.cjs.map +1 -0
  107. package/build/cjs/{chunk-QR7IBJPZ.cjs → chunk-5KDG5ZET.cjs} +18 -6
  108. package/build/cjs/chunk-5KDG5ZET.cjs.map +1 -0
  109. package/build/cjs/{createClient-BJo8T7Js.d.cts → createClient-mOlFts15.d.cts} +1 -0
  110. package/build/cjs/index.cjs +7 -7
  111. package/build/cjs/index.d.cts +1 -1
  112. package/build/cjs/public/internal.cjs +8 -8
  113. package/build/cjs/public/unstable-do-not-use.cjs +831 -775
  114. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  115. package/build/cjs/public/unstable-do-not-use.d.cts +1 -1
  116. package/build/esm/MinimalClientContext.js.map +1 -1
  117. package/build/esm/actions/applyAction.js +4 -0
  118. package/build/esm/actions/applyAction.js.map +1 -1
  119. package/build/esm/createClient.js +2 -1
  120. package/build/esm/createClient.js.map +1 -1
  121. package/build/esm/createMinimalClient.js +2 -1
  122. package/build/esm/createMinimalClient.js.map +1 -1
  123. package/build/esm/index.js +2 -0
  124. package/build/esm/index.js.map +1 -1
  125. package/build/esm/object/Cache.test.js +1 -1
  126. package/build/esm/object/Cache.test.js.map +1 -1
  127. package/build/esm/object/aggregate.js +2 -0
  128. package/build/esm/object/aggregate.js.map +1 -1
  129. package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
  130. package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
  131. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
  132. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  133. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
  134. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  135. package/build/esm/object/convertWireToOsdkObjects.test.js +2 -0
  136. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  137. package/build/esm/object/fetchPage.js +5 -2
  138. package/build/esm/object/fetchPage.js.map +1 -1
  139. package/build/esm/observable/internal/AbstractHelper.js +4 -3
  140. package/build/esm/observable/internal/AbstractHelper.js.map +1 -1
  141. package/build/esm/observable/internal/BatchContext.js +2 -0
  142. package/build/esm/observable/internal/BatchContext.js.map +1 -0
  143. package/build/esm/observable/internal/CacheKeys.js +61 -36
  144. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  145. package/build/esm/observable/internal/Changes.js.map +1 -1
  146. package/build/esm/observable/internal/KnownCacheKey.js.map +1 -1
  147. package/build/esm/observable/internal/Layer.js +0 -8
  148. package/build/esm/observable/internal/Layer.js.map +1 -1
  149. package/build/esm/observable/internal/Layers.js +151 -0
  150. package/build/esm/observable/internal/Layers.js.map +1 -0
  151. package/build/esm/observable/internal/ObservableClientImpl.js +3 -1
  152. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  153. package/build/esm/observable/internal/OrderByCanonicalizer.js +1 -37
  154. package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -1
  155. package/build/esm/observable/internal/Queries.js +40 -0
  156. package/build/esm/observable/internal/Queries.js.map +1 -0
  157. package/build/esm/observable/internal/Query.js +1 -0
  158. package/build/esm/observable/internal/Query.js.map +1 -1
  159. package/build/esm/observable/internal/Store.js +37 -226
  160. package/build/esm/observable/internal/Store.js.map +1 -1
  161. package/build/esm/observable/internal/Store.test.js +12 -10
  162. package/build/esm/observable/internal/Store.test.js.map +1 -1
  163. package/build/esm/observable/internal/SubjectPayload.js +2 -0
  164. package/build/esm/observable/internal/SubjectPayload.js.map +1 -0
  165. package/build/esm/observable/internal/Subjects.js +55 -0
  166. package/build/esm/observable/internal/Subjects.js.map +1 -0
  167. package/build/esm/observable/internal/WeakRefTrie.js +61 -0
  168. package/build/esm/observable/internal/WeakRefTrie.js.map +1 -0
  169. package/build/esm/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
  170. package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -0
  171. package/build/esm/observable/internal/{OptimisticJob.js → actions/OptimisticJob.js} +3 -3
  172. package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -0
  173. package/build/esm/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
  174. package/build/esm/observable/internal/base-list/BaseListQuery.js +411 -0
  175. package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -0
  176. package/build/{browser/observable/internal → esm/observable/internal/base-list}/createCollectionConnectable.js +2 -2
  177. package/build/esm/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
  178. package/build/{browser/observable/internal → esm/observable/internal/base-list}/createCollectionConnectable.test.js +24 -26
  179. package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
  180. package/build/esm/observable/internal/base-list/removeDuplicates.js.map +1 -0
  181. package/build/esm/observable/internal/createInitEntry.js +25 -0
  182. package/build/esm/observable/internal/createInitEntry.js.map +1 -0
  183. package/build/esm/observable/internal/links/LinksHelper.js +5 -5
  184. package/build/esm/observable/internal/links/LinksHelper.js.map +1 -1
  185. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
  186. package/build/esm/observable/internal/links/SpecificLinkQuery.js +1 -1
  187. package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -1
  188. package/build/esm/observable/internal/{ListCacheKey.js.map → list/ListCacheKey.js.map} +1 -1
  189. package/build/esm/observable/internal/{ListQuery.js → list/ListQuery.js} +12 -421
  190. package/build/esm/observable/internal/list/ListQuery.js.map +1 -0
  191. package/build/esm/observable/internal/list/ListQueryOptions.js +2 -0
  192. package/build/esm/observable/internal/list/ListQueryOptions.js.map +1 -0
  193. package/build/esm/observable/internal/list/ListsHelper.js +6 -6
  194. package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
  195. package/build/esm/observable/internal/object/ObjectCacheKey.js +2 -0
  196. package/build/esm/observable/internal/object/ObjectCacheKey.js.map +1 -0
  197. package/build/esm/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +4 -20
  198. package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -0
  199. package/build/esm/observable/internal/object/ObjectsHelper.js +17 -3
  200. package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
  201. package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -1
  202. package/build/esm/observable/internal/testUtils/invalidateList.js +2 -2
  203. package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -1
  204. package/build/esm/observable/internal/testUtils.js +2 -3
  205. package/build/esm/observable/internal/testUtils.js.map +1 -1
  206. package/build/esm/ontology/loadActionMetadata.js +3 -1
  207. package/build/esm/ontology/loadActionMetadata.js.map +1 -1
  208. package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
  209. package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
  210. package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
  211. package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
  212. package/build/esm/queries/applyQuery.js +3 -3
  213. package/build/esm/queries/applyQuery.js.map +1 -1
  214. package/build/esm/util/UserAgent.js +2 -2
  215. package/build/esm/util/extractObjectOrInterfaceType.js +9 -1
  216. package/build/esm/util/extractObjectOrInterfaceType.js.map +1 -1
  217. package/build/esm/util/extractObjectOrInterfaceType.test.js +2 -2
  218. package/build/esm/util/extractObjectOrInterfaceType.test.js.map +1 -1
  219. package/build/types/MinimalClientContext.d.ts +1 -0
  220. package/build/types/MinimalClientContext.d.ts.map +1 -1
  221. package/build/types/actions/applyAction.d.ts.map +1 -1
  222. package/build/types/createClient.d.ts +1 -0
  223. package/build/types/createClient.d.ts.map +1 -1
  224. package/build/types/index.d.ts +1 -1
  225. package/build/types/index.d.ts.map +1 -1
  226. package/build/types/observable/internal/AbstractHelper.d.ts +3 -1
  227. package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -1
  228. package/build/types/observable/internal/BatchContext.d.ts +11 -0
  229. package/build/types/observable/internal/BatchContext.d.ts.map +1 -0
  230. package/build/types/observable/internal/CacheKeys.d.ts +9 -9
  231. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  232. package/build/types/observable/internal/Changes.d.ts +2 -2
  233. package/build/types/observable/internal/Changes.d.ts.map +1 -1
  234. package/build/types/observable/internal/KnownCacheKey.d.ts +2 -2
  235. package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -1
  236. package/build/types/observable/internal/Layer.d.ts +1 -2
  237. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  238. package/build/types/observable/internal/Layers.d.ts +26 -0
  239. package/build/types/observable/internal/Layers.d.ts.map +1 -0
  240. package/build/types/observable/internal/OrderByCanonicalizer.d.ts +0 -7
  241. package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -1
  242. package/build/types/observable/internal/Queries.d.ts +9 -0
  243. package/build/types/observable/internal/Queries.d.ts.map +1 -0
  244. package/build/types/observable/internal/Query.d.ts +5 -1
  245. package/build/types/observable/internal/Query.d.ts.map +1 -1
  246. package/build/types/observable/internal/Store.d.ts +19 -34
  247. package/build/types/observable/internal/Store.d.ts.map +1 -1
  248. package/build/types/observable/internal/Store.test.d.ts.map +1 -1
  249. package/build/types/observable/internal/SubjectPayload.d.ts +5 -0
  250. package/build/types/observable/internal/SubjectPayload.d.ts.map +1 -0
  251. package/build/types/observable/internal/Subjects.d.ts +16 -0
  252. package/build/types/observable/internal/Subjects.d.ts.map +1 -0
  253. package/build/types/observable/internal/WeakRefTrie.d.ts +13 -0
  254. package/build/types/observable/internal/WeakRefTrie.d.ts.map +1 -0
  255. package/build/types/observable/internal/{ActionApplication.d.ts → actions/ActionApplication.d.ts} +2 -2
  256. package/build/types/observable/internal/{ActionApplication.d.ts.map → actions/ActionApplication.d.ts.map} +1 -1
  257. package/build/types/observable/internal/{OptimisticJob.d.ts → actions/OptimisticJob.d.ts} +4 -4
  258. package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -0
  259. package/build/types/observable/internal/{BaseCollectionQuery.d.ts → base-list/BaseCollectionQuery.d.ts} +4 -4
  260. package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts.map +1 -0
  261. package/build/types/observable/internal/{ListQuery.d.ts → base-list/BaseListQuery.d.ts} +9 -91
  262. package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -0
  263. package/build/types/observable/internal/{createCollectionConnectable.d.ts → base-list/createCollectionConnectable.d.ts} +5 -4
  264. package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts.map +1 -0
  265. package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts.map +1 -0
  266. package/build/types/observable/internal/{removeDuplicates.d.ts → base-list/removeDuplicates.d.ts} +2 -2
  267. package/build/types/observable/internal/base-list/removeDuplicates.d.ts.map +1 -0
  268. package/build/types/observable/internal/createInitEntry.d.ts +3 -0
  269. package/build/types/observable/internal/createInitEntry.d.ts.map +1 -0
  270. package/build/types/observable/internal/links/LinksHelper.d.ts +3 -1
  271. package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -1
  272. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +1 -1
  273. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -1
  274. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +4 -2
  275. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -1
  276. package/build/types/observable/internal/{ListCacheKey.d.ts → list/ListCacheKey.d.ts} +4 -4
  277. package/build/types/observable/internal/list/ListCacheKey.d.ts.map +1 -0
  278. package/build/types/observable/internal/list/ListQuery.d.ts +75 -0
  279. package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -0
  280. package/build/types/observable/internal/list/ListQueryOptions.d.ts +4 -0
  281. package/build/types/observable/internal/list/ListQueryOptions.d.ts.map +1 -0
  282. package/build/types/observable/internal/list/ListsHelper.d.ts +4 -2
  283. package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -1
  284. package/build/types/observable/internal/object/ObjectCacheKey.d.ts +5 -0
  285. package/build/types/observable/internal/object/ObjectCacheKey.d.ts.map +1 -0
  286. package/build/types/observable/internal/{ObjectQuery.d.ts → object/ObjectQuery.d.ts} +10 -10
  287. package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -0
  288. package/build/types/observable/internal/object/ObjectsHelper.d.ts +1 -1
  289. package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
  290. package/build/types/observable/internal/sorting/SortingStrategy.d.ts +2 -2
  291. package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -1
  292. package/build/types/observable/internal/testUtils.d.ts +1 -1
  293. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  294. package/package.json +23 -23
  295. package/build/browser/observable/internal/ActionApplication.js.map +0 -1
  296. package/build/browser/observable/internal/BaseCollectionQuery.js.map +0 -1
  297. package/build/browser/observable/internal/ListQuery.js.map +0 -1
  298. package/build/browser/observable/internal/ObjectQuery.js.map +0 -1
  299. package/build/browser/observable/internal/OptimisticJob.js.map +0 -1
  300. package/build/browser/observable/internal/createCollectionConnectable.js.map +0 -1
  301. package/build/browser/observable/internal/createCollectionConnectable.test.js.map +0 -1
  302. package/build/browser/observable/internal/removeDuplicates.js.map +0 -1
  303. package/build/cjs/chunk-6CBVXAAV.cjs.map +0 -1
  304. package/build/cjs/chunk-QR7IBJPZ.cjs.map +0 -1
  305. package/build/esm/observable/internal/ActionApplication.js.map +0 -1
  306. package/build/esm/observable/internal/BaseCollectionQuery.js.map +0 -1
  307. package/build/esm/observable/internal/ListQuery.js.map +0 -1
  308. package/build/esm/observable/internal/ObjectQuery.js.map +0 -1
  309. package/build/esm/observable/internal/OptimisticJob.js.map +0 -1
  310. package/build/esm/observable/internal/createCollectionConnectable.js.map +0 -1
  311. package/build/esm/observable/internal/createCollectionConnectable.test.js.map +0 -1
  312. package/build/esm/observable/internal/removeDuplicates.js.map +0 -1
  313. package/build/types/observable/internal/BaseCollectionQuery.d.ts.map +0 -1
  314. package/build/types/observable/internal/ListCacheKey.d.ts.map +0 -1
  315. package/build/types/observable/internal/ListQuery.d.ts.map +0 -1
  316. package/build/types/observable/internal/ObjectQuery.d.ts.map +0 -1
  317. package/build/types/observable/internal/OptimisticJob.d.ts.map +0 -1
  318. package/build/types/observable/internal/createCollectionConnectable.d.ts.map +0 -1
  319. package/build/types/observable/internal/createCollectionConnectable.test.d.ts.map +0 -1
  320. package/build/types/observable/internal/removeDuplicates.d.ts.map +0 -1
  321. /package/build/browser/observable/internal/{BaseCollectionQuery.js → base-list/BaseCollectionQuery.js} +0 -0
  322. /package/build/browser/observable/internal/{removeDuplicates.js → base-list/removeDuplicates.js} +0 -0
  323. /package/build/browser/observable/internal/{ListCacheKey.js → list/ListCacheKey.js} +0 -0
  324. /package/build/esm/observable/internal/{BaseCollectionQuery.js → base-list/BaseCollectionQuery.js} +0 -0
  325. /package/build/esm/observable/internal/{removeDuplicates.js → base-list/removeDuplicates.js} +0 -0
  326. /package/build/esm/observable/internal/{ListCacheKey.js → list/ListCacheKey.js} +0 -0
  327. /package/build/types/observable/internal/{createCollectionConnectable.test.d.ts → base-list/createCollectionConnectable.test.d.ts} +0 -0
@@ -15,61 +15,86 @@
15
15
  */
16
16
 
17
17
  import { Trie } from "@wry/trie";
18
- import invariant from "tiny-invariant";
19
- import { DEBUG_CACHE_KEYS } from "../DebugFlags.js";
18
+ import { DEBUG_CACHE_KEYS, DEBUG_REFCOUNTS } from "../DebugFlags.js";
19
+ import { RefCounts } from "./RefCounts.js";
20
+
20
21
  /**
21
22
  * Cache key management with canonicalization.
22
- * - Formats: {type}:{pk} | {type}:list:{where} | {source}:{pk}:{link}:{where}
23
23
  * - Uses Trie structure for efficient storage and lookup
24
- * - Ensures consistent keys through canonicalization
25
24
  */
26
25
  export class CacheKeys {
27
26
  #cacheKeys = new Trie(false, keys => {
28
- const ret = {
27
+ const cacheKey = {
29
28
  type: keys[0],
30
29
  otherKeys: keys.slice(1)
31
30
  };
32
- this.#onCreate(ret);
33
- return ret;
31
+ this.#onCreate?.(cacheKey);
32
+ if (DEBUG_REFCOUNTS) {
33
+ // eslint-disable-next-line no-console
34
+ console.log(`CacheKeys.onCreate(${cacheKey.type}, ${JSON.stringify(cacheKey.otherKeys)})`);
35
+ this.#finalizationRegistry.register(cacheKey, () => {
36
+ // eslint-disable-next-line no-console
37
+ console.log(`CacheKey Finalization(${cacheKey.type}, ${JSON.stringify(cacheKey.otherKeys)})`);
38
+ });
39
+ }
40
+ return cacheKey;
34
41
  });
35
- #cacheKeyFactories = new Map();
42
+ #refCounts = new RefCounts(DEBUG_REFCOUNTS ? 15_000 : 60_000, k => this.#cleanupCacheKey(k));
43
+
44
+ // we are currently only using this for debug logging and should just remove it in the future if that
45
+ // continues to be true
46
+ #finalizationRegistry;
36
47
  #onCreate;
37
- constructor(whereCanonicalizer, orderByCanonicalizer, onCreate) {
48
+ #onDestroy;
49
+ constructor({
50
+ onCreate,
51
+ onDestroy
52
+ }) {
38
53
  this.#onCreate = onCreate;
39
- this.#registerCacheKeyFactory("object", (apiName, pk) => {
40
- if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) {
41
- // eslint-disable-next-line no-console
42
- console.debug(`CacheKeys.get([object, ${apiName}, ${pk}]) -- already exists? `, this.#cacheKeys.peekArray(["object", apiName, pk]) != null);
43
- }
44
- return this.#cacheKeys.lookupArray(["object", apiName, pk]);
45
- });
46
- this.#registerCacheKeyFactory("list", (type, apiName, where, orderBy) => {
47
- const cacheKeyArgs = ["list", type, apiName, whereCanonicalizer.canonicalize(where), orderByCanonicalizer.canonicalize(orderBy)];
48
- if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) {
49
- // eslint-disable-next-line no-console
50
- console.debug(`CacheKeys.get([list, ${apiName}, ${JSON.stringify(where)}, ${JSON.stringify(orderBy)}]) -- already exists? `, this.#cacheKeys.peekArray(cacheKeyArgs) != null);
51
- }
52
- return this.#cacheKeys.lookupArray(cacheKeyArgs);
53
- });
54
- this.#registerCacheKeyFactory("specificLink", (sourceObjectType, sourcePk, linkName, where, orderBy) => {
55
- const cacheKeyArgs = ["specificLink", sourceObjectType, sourcePk, linkName, whereCanonicalizer.canonicalize(where), orderByCanonicalizer.canonicalize(orderBy)];
56
- if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) {
54
+ this.#onDestroy = onDestroy;
55
+ setInterval(() => {
56
+ this.#refCounts.gc();
57
+ }, 1000);
58
+ this.#finalizationRegistry = new FinalizationRegistry(cleanupCallback => {
59
+ try {
60
+ cleanupCallback();
61
+ } catch (e) {
57
62
  // eslint-disable-next-line no-console
58
- console.debug(`CacheKeys.get([specificLink, ${sourceObjectType}, ${sourcePk}, ${linkName}, ${JSON.stringify(where)}, ${JSON.stringify(orderBy)}]) -- already exists? `, this.#cacheKeys.peekArray(cacheKeyArgs) != null);
63
+ console.error("Caught an error while running a finalization callback", e);
59
64
  }
60
- return this.#cacheKeys.lookupArray(cacheKeyArgs);
61
65
  });
62
66
  }
63
- #registerCacheKeyFactory(type, factory) {
64
- this.#cacheKeyFactories.set(type, factory);
65
- }
66
67
  get(type, ...args) {
67
- const factory = this.#cacheKeyFactories.get(type);
68
- !factory ? process.env.NODE_ENV !== "production" ? invariant(false, `no cache key factory for type "${type}"`) : invariant(false) : void 0;
69
- return factory(...args);
68
+ const cacheKeyArgs = [type, ...args];
69
+ if (process.env.NODE_ENV !== "production" && DEBUG_CACHE_KEYS) {
70
+ // eslint-disable-next-line no-console
71
+ console.debug(`CacheKeys.get([${type},
72
+ ${args.map(x => JSON.stringify(x)).join(", ")}]) - already exists? `, this.#cacheKeys.peekArray(cacheKeyArgs) != null);
73
+ }
74
+ const cacheKey = this.#cacheKeys.lookupArray(cacheKeyArgs);
75
+
76
+ // This is an idempotent call that ensures the cache key is registered for
77
+ // cleanup. If already registered, this does nothing.
78
+ this.#refCounts.register(cacheKey);
79
+ return cacheKey;
70
80
  }
71
- remove(cacheKey) {
81
+ retain(cacheKey) {
82
+ this.#refCounts.retain(cacheKey);
83
+ }
84
+ release(cacheKey) {
85
+ this.#refCounts.release(cacheKey);
86
+ }
87
+ #remove(cacheKey) {
72
88
  this.#cacheKeys.remove(cacheKey.type, ...cacheKey.otherKeys);
73
89
  }
90
+
91
+ /**
92
+ * Called after a key is no longer retained and the timeout has elapsed
93
+ * @param key
94
+ */
95
+ #cleanupCacheKey = key => {
96
+ this.#onDestroy?.(key);
97
+ this.#remove(key);
98
+ };
74
99
  }
75
100
  //# sourceMappingURL=CacheKeys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CacheKeys.js","names":["Trie","invariant","DEBUG_CACHE_KEYS","CacheKeys","cacheKeys","keys","ret","type","otherKeys","slice","onCreate","cacheKeyFactories","Map","constructor","whereCanonicalizer","orderByCanonicalizer","registerCacheKeyFactory","apiName","pk","process","env","NODE_ENV","console","debug","peekArray","lookupArray","where","orderBy","cacheKeyArgs","canonicalize","JSON","stringify","sourceObjectType","sourcePk","linkName","#registerCacheKeyFactory","factory","set","get","args","remove","cacheKey"],"sources":["CacheKeys.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 { Trie } from \"@wry/trie\";\nimport invariant from \"tiny-invariant\";\nimport { DEBUG_CACHE_KEYS } from \"../DebugFlags.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport type { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport type { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\ntype CacheKeyArgs<K extends CacheKey> = [K[\"type\"], ...K[\"otherKeys\"]];\n\n/**\n * Cache key management with canonicalization.\n * - Formats: {type}:{pk} | {type}:list:{where} | {source}:{pk}:{link}:{where}\n * - Uses Trie structure for efficient storage and lookup\n * - Ensures consistent keys through canonicalization\n */\nexport class CacheKeys {\n #cacheKeys = new Trie<KnownCacheKey>(false, (keys) => {\n const ret = {\n type: keys[0],\n otherKeys: keys.slice(1),\n } as unknown as KnownCacheKey;\n this.#onCreate(ret);\n return ret;\n });\n #cacheKeyFactories = new Map<string, (...args: any[]) => KnownCacheKey>();\n #onCreate: (cacheKey: KnownCacheKey) => void;\n\n constructor(\n whereCanonicalizer: WhereClauseCanonicalizer,\n orderByCanonicalizer: OrderByCanonicalizer,\n onCreate: (cacheKey: KnownCacheKey) => void,\n ) {\n this.#onCreate = onCreate;\n this.#registerCacheKeyFactory<ObjectCacheKey>(\n \"object\",\n (apiName, pk) => {\n if (process.env.NODE_ENV !== \"production\" && DEBUG_CACHE_KEYS) {\n // eslint-disable-next-line no-console\n console.debug(\n `CacheKeys.get([object, ${apiName}, ${pk}]) -- already exists? `,\n this.#cacheKeys.peekArray([\n \"object\",\n apiName,\n pk,\n ]) != null,\n );\n }\n return this.#cacheKeys.lookupArray([\n \"object\",\n apiName,\n pk,\n ]) as ObjectCacheKey;\n },\n );\n this.#registerCacheKeyFactory<ListCacheKey>(\n \"list\",\n (type, apiName, where, orderBy) => {\n const cacheKeyArgs: CacheKeyArgs<ListCacheKey> = [\n \"list\",\n type,\n apiName,\n whereCanonicalizer.canonicalize(where),\n orderByCanonicalizer.canonicalize(orderBy),\n ];\n\n if (process.env.NODE_ENV !== \"production\" && DEBUG_CACHE_KEYS) {\n // eslint-disable-next-line no-console\n console.debug(\n `CacheKeys.get([list, ${apiName}, ${JSON.stringify(where)}, ${\n JSON.stringify(orderBy)\n }]) -- already exists? `,\n this.#cacheKeys.peekArray(cacheKeyArgs) != null,\n );\n }\n\n return this.#cacheKeys.lookupArray<\n CacheKeyArgs<ListCacheKey>\n >(cacheKeyArgs) as ListCacheKey;\n },\n );\n this.#registerCacheKeyFactory<SpecificLinkCacheKey>(\n \"specificLink\",\n (sourceObjectType, sourcePk, linkName, where, orderBy) => {\n const cacheKeyArgs: CacheKeyArgs<SpecificLinkCacheKey> = [\n \"specificLink\",\n sourceObjectType,\n sourcePk,\n linkName,\n whereCanonicalizer.canonicalize(where),\n orderByCanonicalizer.canonicalize(orderBy),\n ];\n\n if (process.env.NODE_ENV !== \"production\" && DEBUG_CACHE_KEYS) {\n // eslint-disable-next-line no-console\n console.debug(\n `CacheKeys.get([specificLink, ${sourceObjectType}, ${sourcePk}, ${linkName}, ${\n JSON.stringify(where)\n }, ${JSON.stringify(orderBy)}]) -- already exists? `,\n this.#cacheKeys.peekArray(cacheKeyArgs) != null,\n );\n }\n\n return this.#cacheKeys.lookupArray(\n cacheKeyArgs,\n ) as SpecificLinkCacheKey;\n },\n );\n }\n\n #registerCacheKeyFactory<K extends KnownCacheKey>(\n type: K[\"type\"],\n factory: (...args: K[\"__cacheKey\"][\"args\"]) => K,\n ): void {\n this.#cacheKeyFactories.set(type, factory);\n }\n\n get<K extends KnownCacheKey>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n const factory = this.#cacheKeyFactories.get(type);\n invariant(factory, `no cache key factory for type \"${type}\"`);\n return factory(...args) as K;\n }\n\n remove<K extends KnownCacheKey>(\n cacheKey: K,\n ): void {\n this.#cacheKeys.remove(cacheKey.type, ...cacheKey.otherKeys);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CacheKeys.js","names":["Trie","DEBUG_CACHE_KEYS","DEBUG_REFCOUNTS","RefCounts","CacheKeys","cacheKeys","keys","cacheKey","type","otherKeys","slice","onCreate","console","log","JSON","stringify","finalizationRegistry","register","refCounts","k","cleanupCacheKey","onDestroy","constructor","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","get","args","cacheKeyArgs","process","env","NODE_ENV","debug","map","x","join","peekArray","lookupArray","retain","release","remove","#remove","key"],"sources":["CacheKeys.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 { Trie } from \"@wry/trie\";\nimport { DEBUG_CACHE_KEYS, DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { RefCounts } from \"./RefCounts.js\";\n\n/**\n * Cache key management with canonicalization.\n * - Uses Trie structure for efficient storage and lookup\n */\nexport class CacheKeys<TCacheKey extends CacheKey> {\n #cacheKeys = new Trie<TCacheKey>(false, (keys) => {\n const cacheKey = {\n type: keys[0],\n otherKeys: keys.slice(1),\n } as unknown as TCacheKey;\n this.#onCreate?.(cacheKey);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKeys.onCreate(${cacheKey.type}, ${\n JSON.stringify(cacheKey.otherKeys)\n })`,\n );\n\n this.#finalizationRegistry.register(cacheKey, () => {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey Finalization(${cacheKey.type}, ${\n JSON.stringify(cacheKey.otherKeys)\n })`,\n );\n });\n }\n return cacheKey;\n });\n\n #refCounts = new RefCounts<TCacheKey>(\n DEBUG_REFCOUNTS ? 15_000 : 60_000,\n (k) => this.#cleanupCacheKey(k),\n );\n\n // we are currently only using this for debug logging and should just remove it in the future if that\n // continues to be true\n #finalizationRegistry: FinalizationRegistry<() => void>;\n\n #onCreate?: (cacheKey: TCacheKey) => void;\n #onDestroy?: (cacheKey: TCacheKey) => void;\n\n constructor(\n { onCreate, onDestroy }: {\n onCreate?: (cacheKey: TCacheKey) => void;\n onDestroy?: (cacheKey: TCacheKey) => void;\n },\n ) {\n this.#onCreate = onCreate;\n this.#onDestroy = onDestroy;\n\n setInterval(() => {\n this.#refCounts.gc();\n }, 1000);\n\n this.#finalizationRegistry = new FinalizationRegistry<() => void>(\n (cleanupCallback) => {\n try {\n cleanupCallback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"Caught an error while running a finalization callback\",\n e,\n );\n }\n },\n );\n }\n\n get<K extends TCacheKey>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n const cacheKeyArgs = [type, ...args];\n if (process.env.NODE_ENV !== \"production\" && DEBUG_CACHE_KEYS) {\n // eslint-disable-next-line no-console\n console.debug(\n `CacheKeys.get([${type}, \n ${args.map(x => JSON.stringify(x)).join(\", \")}]) - already exists? `,\n this.#cacheKeys.peekArray(cacheKeyArgs) != null,\n );\n }\n\n const cacheKey = this.#cacheKeys.lookupArray(\n cacheKeyArgs,\n ) as K;\n\n // This is an idempotent call that ensures the cache key is registered for\n // cleanup. If already registered, this does nothing.\n this.#refCounts.register(cacheKey);\n\n return cacheKey;\n }\n\n retain(cacheKey: TCacheKey): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: TCacheKey): void {\n this.#refCounts.release(cacheKey);\n }\n\n #remove<K extends TCacheKey>(cacheKey: K): void {\n this.#cacheKeys.remove(cacheKey.type, ...cacheKey.otherKeys);\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: TCacheKey) => {\n this.#onDestroy?.(key);\n this.#remove(key);\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Changes.js","names":["MultiMap","DEBUG_ONLY__cacheKeyToString","Changes","modifiedObjects","addedObjects","added","Set","modified","deleted","registerObject","cacheKey","data","isNew","set","$apiName","add","deleteObject","registerList","key","registerLink","deleteLink","isEmpty","size","createChangedObjects","DEBUG_ONLY__changesToString","changes","process","env","NODE_ENV","JSON","stringify","multimapHelper","listHelper","Error","Array","from","map","multimap","Object","fromEntries","associations","type","objects","o","$primaryKey"],"sources":["Changes.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 { MultiMap } from \"mnemonist\";\nimport type { ObjectHolder } from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { DEBUG_ONLY__cacheKeyToString } from \"./CacheKey.js\";\nimport type { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\n\nexport class Changes {\n modifiedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n addedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n\n added: Set<ListCacheKey | ObjectCacheKey | SpecificLinkCacheKey> = new Set();\n modified: Set<ListCacheKey | ObjectCacheKey | SpecificLinkCacheKey> =\n new Set();\n deleted: Set<ListCacheKey | ObjectCacheKey | SpecificLinkCacheKey> =\n new Set();\n\n registerObject = (\n cacheKey: ObjectCacheKey,\n data: ObjectHolder,\n isNew: boolean,\n ): void => {\n this[isNew ? \"addedObjects\" : \"modifiedObjects\"].set(data.$apiName, data);\n this[isNew ? \"added\" : \"modified\"].add(cacheKey);\n };\n\n deleteObject = (cacheKey: ObjectCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n registerList = (key: ListCacheKey): void => {\n this.modified.add(key);\n };\n\n registerLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.modified.add(cacheKey);\n };\n\n deleteLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n isEmpty(): boolean {\n return (\n this.modifiedObjects.size === 0\n && this.addedObjects.size === 0\n && this.added.size === 0\n && this.modified.size === 0\n && this.deleted.size === 0\n );\n }\n}\n\nexport function createChangedObjects(): Changes {\n return new Changes();\n}\n\nexport function DEBUG_ONLY__changesToString(changes: Changes): string {\n if (process.env.NODE_ENV !== \"production\") {\n return JSON.stringify(\n {\n modifiedObjects: multimapHelper(changes.modifiedObjects),\n addedObjects: multimapHelper(changes.addedObjects),\n added: listHelper(changes.added),\n modified: listHelper(changes.modified),\n },\n null,\n 2,\n );\n } else {\n throw new Error(\"not implemented\");\n }\n}\n\nfunction listHelper(set: Set<CacheKey>) {\n return Array.from(set).map(DEBUG_ONLY__cacheKeyToString);\n}\n\nfunction multimapHelper(\n multimap: MultiMap<string, ObjectHolder>,\n) {\n return Object.fromEntries(\n Array.from(multimap.associations()).map(\n ([type, objects]) => {\n return [type, objects.map(o => o.$primaryKey)];\n },\n ),\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Changes.js","names":["MultiMap","DEBUG_ONLY__cacheKeyToString","Changes","modifiedObjects","addedObjects","added","Set","modified","deleted","registerObject","cacheKey","data","isNew","set","$apiName","add","deleteObject","registerList","key","registerLink","deleteLink","isEmpty","size","createChangedObjects","DEBUG_ONLY__changesToString","changes","process","env","NODE_ENV","JSON","stringify","multimapHelper","listHelper","Error","Array","from","map","multimap","Object","fromEntries","associations","type","objects","o","$primaryKey"],"sources":["Changes.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 { MultiMap } from \"mnemonist\";\nimport type { ObjectHolder } from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { DEBUG_ONLY__cacheKeyToString } from \"./CacheKey.js\";\nimport type { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./list/ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./object/ObjectCacheKey.js\";\n\nexport class Changes {\n modifiedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n addedObjects: MultiMap<string, ObjectHolder> = new MultiMap();\n\n added: Set<ListCacheKey | ObjectCacheKey | SpecificLinkCacheKey> = new Set();\n modified: Set<ListCacheKey | ObjectCacheKey | SpecificLinkCacheKey> =\n new Set();\n deleted: Set<ListCacheKey | ObjectCacheKey | SpecificLinkCacheKey> =\n new Set();\n\n registerObject = (\n cacheKey: ObjectCacheKey,\n data: ObjectHolder,\n isNew: boolean,\n ): void => {\n this[isNew ? \"addedObjects\" : \"modifiedObjects\"].set(data.$apiName, data);\n this[isNew ? \"added\" : \"modified\"].add(cacheKey);\n };\n\n deleteObject = (cacheKey: ObjectCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n registerList = (key: ListCacheKey): void => {\n this.modified.add(key);\n };\n\n registerLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.modified.add(cacheKey);\n };\n\n deleteLink = (cacheKey: SpecificLinkCacheKey): void => {\n this.deleted.add(cacheKey);\n };\n\n isEmpty(): boolean {\n return (\n this.modifiedObjects.size === 0\n && this.addedObjects.size === 0\n && this.added.size === 0\n && this.modified.size === 0\n && this.deleted.size === 0\n );\n }\n}\n\nexport function createChangedObjects(): Changes {\n return new Changes();\n}\n\nexport function DEBUG_ONLY__changesToString(changes: Changes): string {\n if (process.env.NODE_ENV !== \"production\") {\n return JSON.stringify(\n {\n modifiedObjects: multimapHelper(changes.modifiedObjects),\n addedObjects: multimapHelper(changes.addedObjects),\n added: listHelper(changes.added),\n modified: listHelper(changes.modified),\n },\n null,\n 2,\n );\n } else {\n throw new Error(\"not implemented\");\n }\n}\n\nfunction listHelper(set: Set<CacheKey>) {\n return Array.from(set).map(DEBUG_ONLY__cacheKeyToString);\n}\n\nfunction multimapHelper(\n multimap: MultiMap<string, ObjectHolder>,\n) {\n return Object.fromEntries(\n Array.from(multimap.associations()).map(\n ([type, objects]) => {\n return [type, objects.map(o => o.$primaryKey)];\n },\n ),\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"KnownCacheKey.js","names":[],"sources":["KnownCacheKey.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 { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\n\nexport type KnownCacheKey =\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ListCacheKey;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"KnownCacheKey.js","names":[],"sources":["KnownCacheKey.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 { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./list/ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./object/ObjectCacheKey.js\";\n\nexport type KnownCacheKey =\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ListCacheKey;\n"],"mappings":"","ignoreList":[]}
@@ -68,12 +68,4 @@ export class Layer {
68
68
  this.#cache.set(cacheKey, value);
69
69
  }
70
70
  }
71
- export class Entry {
72
- constructor(cacheKey, value, lastUpdated, status = "init") {
73
- this.cacheKey = cacheKey;
74
- this.value = value;
75
- this.lastUpdated = lastUpdated;
76
- this.status = status;
77
- }
78
- }
79
71
  //# sourceMappingURL=Layer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Layer.js","names":["WeakMapWithEntries","Layer","parent","cache","layerId","constructor","parentLayer","addLayer","removeLayer","entries","keys","get","cacheKey","set","value","Entry","lastUpdated","status"],"sources":["Layer.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 { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport { WeakMapWithEntries } from \"./WeakMapWithEntries.js\";\n\n/*\n Image some layers\n\n [\n { cache: { obj1: { a: 1 } }, layerId: undefined },\n { cache: { obj1: { a: 1, b: 2 } }, layerId: \"layer1\" },\n { cache: { obj1: { a: undefined, b: 2 } }, layerId: \"layer2\" },\n { cache: { obj1: { a: 1, b: 2 } }, layerId: \"layer3\" },\n ]\n*/\n\nexport class Layer {\n #parent: Layer | undefined;\n #cache = new WeakMapWithEntries<KnownCacheKey, Entry<any>>();\n #layerId: unknown;\n\n constructor(parent: Layer | undefined, layerId: unknown) {\n this.#parent = parent;\n this.#layerId = layerId;\n }\n\n get parentLayer(): Layer | undefined {\n return this.#parent;\n }\n\n get layerId(): unknown {\n return this.#layerId;\n }\n\n addLayer(layerId: unknown): Layer {\n return new Layer(this, layerId);\n }\n\n removeLayer(layerId: unknown): Layer {\n if (layerId == null || this.#parent == null) {\n // we are the root, so we can't remove anything\n return this;\n }\n\n if (this.#layerId !== layerId) {\n this.#parent = this.#parent.removeLayer(layerId);\n return this;\n }\n\n return this.#parent.removeLayer(layerId);\n }\n\n entries(): IterableIterator<[KnownCacheKey, Entry<any>]> {\n return this.#cache.entries();\n }\n\n keys(): IterableIterator<KnownCacheKey> {\n return this.#cache.keys();\n }\n\n public get<K extends KnownCacheKey>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#cache.get(cacheKey) as Entry<K> | undefined\n ?? this.#parent?.get(cacheKey) as Entry<K> | undefined;\n }\n\n public set<K extends KnownCacheKey>(\n cacheKey: K,\n value: Entry<K>,\n ): void {\n this.#cache.set(cacheKey, value);\n }\n}\n\nexport class Entry<K extends KnownCacheKey> {\n readonly cacheKey: K;\n value: K[\"__cacheKey\"][\"value\"] | undefined;\n lastUpdated: number;\n status: \"init\" | \"loading\" | \"loaded\" | \"error\";\n\n constructor(\n cacheKey: K,\n value: K[\"__cacheKey\"][\"value\"] | undefined,\n lastUpdated: number,\n status: \"init\" | \"loading\" | \"loaded\" | \"error\" = \"init\",\n ) {\n this.cacheKey = cacheKey;\n this.value = value;\n this.lastUpdated = lastUpdated;\n this.status = status;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,kBAAkB,QAAQ,yBAAyB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,MAAMC,KAAK,CAAC;EACjB,CAACC,MAAM;EACP,CAACC,KAAK,GAAG,IAAIH,kBAAkB,CAA4B,CAAC;EAC5D,CAACI,OAAO;EAERC,WAAWA,CAACH,MAAyB,EAAEE,OAAgB,EAAE;IACvD,IAAI,CAAC,CAACF,MAAM,GAAGA,MAAM;IACrB,IAAI,CAAC,CAACE,OAAO,GAAGA,OAAO;EACzB;EAEA,IAAIE,WAAWA,CAAA,EAAsB;IACnC,OAAO,IAAI,CAAC,CAACJ,MAAM;EACrB;EAEA,IAAIE,OAAOA,CAAA,EAAY;IACrB,OAAO,IAAI,CAAC,CAACA,OAAO;EACtB;EAEAG,QAAQA,CAACH,OAAgB,EAAS;IAChC,OAAO,IAAIH,KAAK,CAAC,IAAI,EAAEG,OAAO,CAAC;EACjC;EAEAI,WAAWA,CAACJ,OAAgB,EAAS;IACnC,IAAIA,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,CAACF,MAAM,IAAI,IAAI,EAAE;MAC3C;MACA,OAAO,IAAI;IACb;IAEA,IAAI,IAAI,CAAC,CAACE,OAAO,KAAKA,OAAO,EAAE;MAC7B,IAAI,CAAC,CAACF,MAAM,GAAG,IAAI,CAAC,CAACA,MAAM,CAACM,WAAW,CAACJ,OAAO,CAAC;MAChD,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAAC,CAACF,MAAM,CAACM,WAAW,CAACJ,OAAO,CAAC;EAC1C;EAEAK,OAAOA,CAAA,EAAkD;IACvD,OAAO,IAAI,CAAC,CAACN,KAAK,CAACM,OAAO,CAAC,CAAC;EAC9B;EAEAC,IAAIA,CAAA,EAAoC;IACtC,OAAO,IAAI,CAAC,CAACP,KAAK,CAACO,IAAI,CAAC,CAAC;EAC3B;EAEOC,GAAGA,CACRC,QAAW,EACW;IACtB,OAAO,IAAI,CAAC,CAACT,KAAK,CAACQ,GAAG,CAACC,QAAQ,CAAC,IAC3B,IAAI,CAAC,CAACV,MAAM,EAAES,GAAG,CAACC,QAAQ,CAAyB;EAC1D;EAEOC,GAAGA,CACRD,QAAW,EACXE,KAAe,EACT;IACN,IAAI,CAAC,CAACX,KAAK,CAACU,GAAG,CAACD,QAAQ,EAAEE,KAAK,CAAC;EAClC;AACF;AAEA,OAAO,MAAMC,KAAK,CAA0B;EAM1CV,WAAWA,CACTO,QAAW,EACXE,KAA2C,EAC3CE,WAAmB,EACnBC,MAA+C,GAAG,MAAM,EACxD;IACA,IAAI,CAACL,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACE,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACE,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;AACF","ignoreList":[]}
1
+ {"version":3,"file":"Layer.js","names":["WeakMapWithEntries","Layer","parent","cache","layerId","constructor","parentLayer","addLayer","removeLayer","entries","keys","get","cacheKey","set","value"],"sources":["Layer.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 { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport { WeakMapWithEntries } from \"./WeakMapWithEntries.js\";\n\n/*\n Image some layers\n\n [\n { cache: { obj1: { a: 1 } }, layerId: undefined },\n { cache: { obj1: { a: 1, b: 2 } }, layerId: \"layer1\" },\n { cache: { obj1: { a: undefined, b: 2 } }, layerId: \"layer2\" },\n { cache: { obj1: { a: 1, b: 2 } }, layerId: \"layer3\" },\n ]\n*/\n\nexport class Layer {\n #parent: Layer | undefined;\n #cache = new WeakMapWithEntries<KnownCacheKey, Entry<any>>();\n #layerId: unknown;\n\n constructor(parent: Layer | undefined, layerId: unknown) {\n this.#parent = parent;\n this.#layerId = layerId;\n }\n\n get parentLayer(): Layer | undefined {\n return this.#parent;\n }\n\n get layerId(): unknown {\n return this.#layerId;\n }\n\n addLayer(layerId: unknown): Layer {\n return new Layer(this, layerId);\n }\n\n removeLayer(layerId: unknown): Layer {\n if (layerId == null || this.#parent == null) {\n // we are the root, so we can't remove anything\n return this;\n }\n\n if (this.#layerId !== layerId) {\n this.#parent = this.#parent.removeLayer(layerId);\n return this;\n }\n\n return this.#parent.removeLayer(layerId);\n }\n\n entries(): IterableIterator<[KnownCacheKey, Entry<any>]> {\n return this.#cache.entries();\n }\n\n keys(): IterableIterator<KnownCacheKey> {\n return this.#cache.keys();\n }\n\n public get<K extends KnownCacheKey>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#cache.get(cacheKey) as Entry<K> | undefined\n ?? this.#parent?.get(cacheKey) as Entry<K> | undefined;\n }\n\n public set<K extends KnownCacheKey>(\n cacheKey: K,\n value: Entry<K>,\n ): void {\n this.#cache.set(cacheKey, value);\n }\n}\n\nexport interface Entry<K extends KnownCacheKey> {\n readonly cacheKey: K;\n value: K[\"__cacheKey\"][\"value\"] | undefined;\n lastUpdated: number;\n status: \"init\" | \"loading\" | \"loaded\" | \"error\";\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,kBAAkB,QAAQ,yBAAyB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,MAAMC,KAAK,CAAC;EACjB,CAACC,MAAM;EACP,CAACC,KAAK,GAAG,IAAIH,kBAAkB,CAA4B,CAAC;EAC5D,CAACI,OAAO;EAERC,WAAWA,CAACH,MAAyB,EAAEE,OAAgB,EAAE;IACvD,IAAI,CAAC,CAACF,MAAM,GAAGA,MAAM;IACrB,IAAI,CAAC,CAACE,OAAO,GAAGA,OAAO;EACzB;EAEA,IAAIE,WAAWA,CAAA,EAAsB;IACnC,OAAO,IAAI,CAAC,CAACJ,MAAM;EACrB;EAEA,IAAIE,OAAOA,CAAA,EAAY;IACrB,OAAO,IAAI,CAAC,CAACA,OAAO;EACtB;EAEAG,QAAQA,CAACH,OAAgB,EAAS;IAChC,OAAO,IAAIH,KAAK,CAAC,IAAI,EAAEG,OAAO,CAAC;EACjC;EAEAI,WAAWA,CAACJ,OAAgB,EAAS;IACnC,IAAIA,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,CAACF,MAAM,IAAI,IAAI,EAAE;MAC3C;MACA,OAAO,IAAI;IACb;IAEA,IAAI,IAAI,CAAC,CAACE,OAAO,KAAKA,OAAO,EAAE;MAC7B,IAAI,CAAC,CAACF,MAAM,GAAG,IAAI,CAAC,CAACA,MAAM,CAACM,WAAW,CAACJ,OAAO,CAAC;MAChD,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAAC,CAACF,MAAM,CAACM,WAAW,CAACJ,OAAO,CAAC;EAC1C;EAEAK,OAAOA,CAAA,EAAkD;IACvD,OAAO,IAAI,CAAC,CAACN,KAAK,CAACM,OAAO,CAAC,CAAC;EAC9B;EAEAC,IAAIA,CAAA,EAAoC;IACtC,OAAO,IAAI,CAAC,CAACP,KAAK,CAACO,IAAI,CAAC,CAAC;EAC3B;EAEOC,GAAGA,CACRC,QAAW,EACW;IACtB,OAAO,IAAI,CAAC,CAACT,KAAK,CAACQ,GAAG,CAACC,QAAQ,CAAC,IAC3B,IAAI,CAAC,CAACV,MAAM,EAAES,GAAG,CAACC,QAAQ,CAAyB;EAC1D;EAEOC,GAAGA,CACRD,QAAW,EACXE,KAAe,EACT;IACN,IAAI,CAAC,CAACX,KAAK,CAACU,GAAG,CAACD,QAAQ,EAAEE,KAAK,CAAC;EAClC;AACF","ignoreList":[]}
@@ -0,0 +1,151 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import invariant from "tiny-invariant";
18
+ import { createInitEntry } from "./createInitEntry.js";
19
+ import { Layer } from "./Layer.js";
20
+ import { Subjects } from "./Subjects.js";
21
+ import { tombstone } from "./tombstone.js";
22
+ export class Layers {
23
+ #truthLayer = new Layer(undefined, undefined);
24
+ #topLayer;
25
+ #onRevalidate;
26
+ constructor({
27
+ logger,
28
+ onRevalidate
29
+ }) {
30
+ this.logger = logger;
31
+ this.#topLayer = this.#truthLayer;
32
+ this.subjects = new Subjects({
33
+ logger,
34
+ layers: this
35
+ });
36
+ this.#onRevalidate = onRevalidate;
37
+ }
38
+ get top() {
39
+ return this.#topLayer;
40
+ }
41
+ get truth() {
42
+ return this.#truthLayer;
43
+ }
44
+ remove(layerId) {
45
+ !(layerId != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "undefined is the reserved layerId for the truth layer") : invariant(false) : void 0;
46
+ // 1. collect all cache keys for a given layerId
47
+ let currentLayer = this.#topLayer;
48
+ const cacheKeys = new Map();
49
+ while (currentLayer != null && currentLayer.parentLayer != null) {
50
+ if (currentLayer.layerId === layerId) {
51
+ for (const [k, v] of currentLayer.entries()) {
52
+ if (cacheKeys.has(k)) continue;
53
+ cacheKeys.set(k, v);
54
+ }
55
+ }
56
+ currentLayer = currentLayer.parentLayer;
57
+ }
58
+
59
+ // 2. remove the layers from the chain
60
+ this.#topLayer = this.#topLayer.removeLayer(layerId);
61
+
62
+ // 3. check each cache key to see if it is different in the new chain
63
+ for (const [k, oldEntry] of cacheKeys) {
64
+ const currentEntry = this.#topLayer.get(k);
65
+
66
+ // 4. if different, update the subject
67
+ if (oldEntry !== currentEntry) {
68
+ const newEntry = currentEntry ?? createInitEntry(k);
69
+ // We are going to be pretty lazy here and just re-emit the value.
70
+ // In the future it may benefit us to deep equal check her but I think
71
+ // the subjects are effectively doing this anyway.
72
+ this.subjects.peek(k)?.next({
73
+ ...newEntry,
74
+ isOptimistic: currentEntry?.value !== this.#truthLayer.get(k)?.value
75
+ });
76
+ }
77
+ }
78
+ }
79
+ batch({
80
+ optimisticId,
81
+ changes
82
+ }, batchFn) {
83
+ !(optimisticId === undefined || !!optimisticId) ? process.env.NODE_ENV !== "production" ? invariant(false, "optimistic must be undefined or not falsy") : invariant(false) : void 0;
84
+ const batchContext = this.#createBatchContext({
85
+ optimisticId,
86
+ changes
87
+ });
88
+ const retVal = batchFn(batchContext);
89
+ this.#onRevalidate(changes, optimisticId).catch(e => {
90
+ // we don't want batch() to return a promise,
91
+ // so we settle for logging an error here instead of
92
+ // dropping it on the floor.
93
+ if (this.logger) {
94
+ this.logger.error("Unhandled error in batch", e);
95
+ } else {
96
+ // eslint-disable-next-line no-console
97
+ console.error("Unhandled error in batch", e);
98
+ throw e;
99
+ }
100
+ });
101
+ return {
102
+ batchResult: batchContext,
103
+ retVal: retVal,
104
+ changes: batchContext.changes
105
+ };
106
+ }
107
+ #createBatchContext({
108
+ optimisticId,
109
+ changes
110
+ }) {
111
+ let needsLayer = optimisticId !== undefined;
112
+ const batchContext = {
113
+ changes,
114
+ createLayerIfNeeded: () => {
115
+ if (needsLayer) {
116
+ this.#topLayer = this.#topLayer.addLayer(optimisticId);
117
+ needsLayer = false;
118
+ }
119
+ },
120
+ optimisticWrite: !!optimisticId,
121
+ write: (cacheKey, value, status) => {
122
+ const oldTopValue = this.#topLayer.get(cacheKey);
123
+ if (optimisticId) batchContext.createLayerIfNeeded();
124
+ const writeLayer = optimisticId ? this.#topLayer : this.#truthLayer;
125
+ const newValue = {
126
+ cacheKey,
127
+ value,
128
+ lastUpdated: Date.now(),
129
+ status
130
+ };
131
+ writeLayer.set(cacheKey, newValue);
132
+ const newTopValue = this.#topLayer.get(cacheKey);
133
+ if (oldTopValue !== newTopValue) {
134
+ this.subjects.get(cacheKey)?.next({
135
+ ...newValue,
136
+ isOptimistic: newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value
137
+ });
138
+ }
139
+ return newValue;
140
+ },
141
+ delete: (cacheKey, status) => {
142
+ return batchContext.write(cacheKey, tombstone, status);
143
+ },
144
+ read: cacheKey => {
145
+ return optimisticId ? this.#topLayer.get(cacheKey) : this.#truthLayer.get(cacheKey);
146
+ }
147
+ };
148
+ return batchContext;
149
+ }
150
+ }
151
+ //# sourceMappingURL=Layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layers.js","names":["invariant","createInitEntry","Layer","Subjects","tombstone","Layers","truthLayer","undefined","topLayer","onRevalidate","constructor","logger","subjects","layers","top","truth","remove","layerId","process","env","NODE_ENV","currentLayer","cacheKeys","Map","parentLayer","k","v","entries","has","set","removeLayer","oldEntry","currentEntry","get","newEntry","peek","next","isOptimistic","value","batch","optimisticId","changes","batchFn","batchContext","createBatchContext","retVal","catch","e","error","console","batchResult","#createBatchContext","needsLayer","createLayerIfNeeded","addLayer","optimisticWrite","write","cacheKey","status","oldTopValue","writeLayer","newValue","lastUpdated","Date","now","newTopValue","delete","read"],"sources":["Layers.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 invariant from \"tiny-invariant\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport { type Changes } from \"./Changes.js\";\nimport { createInitEntry } from \"./createInitEntry.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { Layer } from \"./Layer.js\";\nimport type { OptimisticId } from \"./OptimisticId.js\";\nimport { Subjects } from \"./Subjects.js\";\nimport { tombstone } from \"./tombstone.js\";\n\nexport class Layers {\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n #onRevalidate: (\n changes: Changes,\n optimisticId?: OptimisticId,\n ) => Promise<void>;\n\n logger?: Logger;\n\n readonly subjects: Subjects;\n\n constructor(\n { logger, onRevalidate }: {\n logger?: Logger;\n onRevalidate: (\n changes: Changes,\n optimisticId?: OptimisticId,\n ) => Promise<void>;\n },\n ) {\n this.logger = logger;\n this.#topLayer = this.#truthLayer;\n this.subjects = new Subjects({ logger, layers: this });\n this.#onRevalidate = onRevalidate;\n }\n\n get top(): Layer {\n return this.#topLayer;\n }\n\n get truth(): Layer {\n return this.#truthLayer;\n }\n\n remove(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<KnownCacheKey, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const newEntry = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.subjects.peek(k)?.next(\n {\n ...newEntry,\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n public batch<X>(\n { optimisticId, changes }: {\n optimisticId?: OptimisticId;\n changes: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n const batchContext: BatchContext = this.#createBatchContext({\n optimisticId,\n changes,\n });\n\n const retVal = batchFn(batchContext);\n\n this.#onRevalidate(changes, optimisticId).catch(e => {\n // we don't want batch() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in batch\", e);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in batch\", e);\n throw e;\n }\n });\n\n return {\n batchResult: batchContext,\n retVal: retVal,\n changes: batchContext.changes,\n };\n }\n\n #createBatchContext(\n { optimisticId, changes }: {\n optimisticId?: OptimisticId;\n changes: Changes;\n },\n ): BatchContext {\n let needsLayer = optimisticId !== undefined;\n\n const batchContext: BatchContext = {\n changes,\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue: Entry<typeof cacheKey> = {\n cacheKey,\n value,\n lastUpdated: Date.now(),\n status,\n };\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.subjects.get(cacheKey)?.next({\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n delete: (cacheKey, status) => {\n return batchContext.write(cacheKey, tombstone, status);\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n return batchContext;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -30,7 +30,6 @@ export class ObservableClientImpl {
30
30
  this.__experimentalStore = store;
31
31
  this.applyAction = store.applyAction.bind(store);
32
32
  this.validateAction = store.validateAction.bind(store);
33
- this.canonicalizeWhereClause = store.canonicalizeWhereClause.bind(store);
34
33
  }
35
34
  observeObject = (apiName, pk, options, subFn) => {
36
35
  return this.__experimentalStore.objects.observe({
@@ -66,5 +65,8 @@ export class ObservableClientImpl {
66
65
  }
67
66
  return new UnsubscribableWrapper(parentSub);
68
67
  };
68
+ canonicalizeWhereClause(where) {
69
+ return this.__experimentalStore.whereCanonicalizer.canonicalize(where);
70
+ }
69
71
  }
70
72
  //# sourceMappingURL=ObservableClientImpl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableClientImpl.js","names":["Subscription","UnsubscribableWrapper","ObservableClientImpl","constructor","store","__experimentalStore","applyAction","bind","validateAction","canonicalizeWhereClause","observeObject","apiName","pk","options","subFn","objects","observe","observeList","lists","observeLinks","linkName","objectsArray","Array","isArray","parentSub","obj","querySubscription","links","srcType","type","$apiName","$primaryKey","add"],"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 ActionValidationResponse,\n CompileTimeMetadata,\n InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { Subscription } from \"rxjs\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport type { SpecificLinkPayload } from \"../LinkPayload.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObservableClient,\n ObserveListOptions,\n ObserveObjectArgs,\n ObserveObjectOptions,\n ObserveObjectsArgs,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { Observer } from \"../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../ObservableClient/ObserveLink.js\";\nimport type { Canonical } from \"./Canonical.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 this.canonicalizeWhereClause = store.canonicalizeWhereClause.bind(\n store,\n ) as typeof this.canonicalizeWhereClause;\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<ObserveObjectArgs<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: <T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ObserveObjectsArgs<T>>,\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 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.$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<unknown>;\n\n public validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse>;\n\n public canonicalizeWhereClause: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ) => Canonical<WhereClause<T>>;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,SAASA,YAAY,QAAQ,MAAM;AAiBnC,SAASC,qBAAqB,QAAQ,4BAA4B;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,CAA6B;EAG5DC,WAAWA,CAACC,KAAY,EAAE;IACxB,IAAI,CAACC,mBAAmB,GAAGD,KAAK;IAEhC,IAAI,CAACE,WAAW,GAAGF,KAAK,CAACE,WAAW,CAACC,IAAI,CAACH,KAAK,CAAC;IAChD,IAAI,CAACI,cAAc,GAAGJ,KAAK,CAACI,cAAc,CAACD,IAAI,CAACH,KAAK,CAAC;IACtD,IAAI,CAACK,uBAAuB,GAAGL,KAAK,CAACK,uBAAuB,CAACF,IAAI,CAC/DH,KACF,CAAwC;EAC1C;EAEOM,aAAa,GAKEA,CAACC,OAAO,EAAEC,EAAE,EAAEC,OAAO,EAAEC,KAAK,KAAK;IACrD,OAAO,IAAI,CAACT,mBAAmB,CAACU,OAAO,CAACC,OAAO,CAC7C;MACE,GAAGH,OAAO;MACVF,OAAO;MACPC;IACF,CAAC;IACD;IACAE,KACF,CAAC;EACH,CAAC;EAEMG,WAAW,GAGIA,CAACJ,OAAO,EAAEC,KAAK,KAAK;IACxC,OAAO,IAAI,CAACT,mBAAmB,CAACa,KAAK,CAACF,OAAO,CAC3CH,OAAO;IACP;IACAC,KACF,CAAC;EACH,CAAC;EAEMK,YAAY,GAYGA,CAACJ,OAAO,EAAEK,QAAQ,EAAEP,OAAO,EAAEC,KAAK,KAAK;IAC3D;IACA,MAAMO,YAAY,GAAGC,KAAK,CAACC,OAAO,CAACR,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC;IAEjE,MAAMS,SAAS,GAAG,IAAIxB,YAAY,CAAC,CAAC;IAEpC,KAAK,MAAMyB,GAAG,IAAIJ,YAAY,EAAE;MAC9B,MAAMK,iBAAiB,GAAG,IAAI,CAACrB,mBAAmB,CAACsB,KAAK,CACrDX,OAAO,CACN;QACE,GAAGH,OAAO;QACVe,OAAO,EAAE;UACPC,IAAI,EAAE,QAAQ;UACdlB,OAAO,EAAEc,GAAG,CAACK;QACf,CAAC;QACDV,QAAQ;QACRR,EAAE,EAAEa,GAAG,CAACM;MACV,CAAC;MACD;MACAjB,KACF,CAAC;MAEHU,SAAS,CAACQ,GAAG,CAACN,iBAAiB,CAAC;IAClC;IAEA,OAAO,IAAIzB,qBAAqB,CAACuB,SAAS,CAAC;EAC7C,CAAC;AAkBH","ignoreList":[]}
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","observeLinks","linkName","objectsArray","Array","isArray","parentSub","obj","querySubscription","links","srcType","type","$apiName","$primaryKey","add","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 ActionValidationResponse,\n CompileTimeMetadata,\n InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { Subscription } from \"rxjs\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport type { SpecificLinkPayload } from \"../LinkPayload.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObservableClient,\n ObserveListOptions,\n ObserveObjectArgs,\n ObserveObjectOptions,\n ObserveObjectsArgs,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { Observer } from \"../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../ObservableClient/ObserveLink.js\";\nimport type { Canonical } from \"./Canonical.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<ObserveObjectArgs<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: <T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ObserveObjectsArgs<T>>,\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 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.$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<unknown>;\n\n public validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse>;\n\n public canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(where: WhereClause<T>): Canonical<WhereClause<T>> {\n return this.__experimentalStore.whereCanonicalizer\n .canonicalize(where) as Canonical<WhereClause<T>>;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,SAASA,YAAY,QAAQ,MAAM;AAiBnC,SAASC,qBAAqB,QAAQ,4BAA4B;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,CAA6B;EAG5DC,WAAWA,CAACC,KAAY,EAAE;IACxB,IAAI,CAACC,mBAAmB,GAAGD,KAAK;IAEhC,IAAI,CAACE,WAAW,GAAGF,KAAK,CAACE,WAAW,CAACC,IAAI,CAACH,KAAK,CAAC;IAChD,IAAI,CAACI,cAAc,GAAGJ,KAAK,CAACI,cAAc,CAACD,IAAI,CAACH,KAAK,CAAC;EACxD;EAEOK,aAAa,GAKEA,CAACC,OAAO,EAAEC,EAAE,EAAEC,OAAO,EAAEC,KAAK,KAAK;IACrD,OAAO,IAAI,CAACR,mBAAmB,CAACS,OAAO,CAACC,OAAO,CAC7C;MACE,GAAGH,OAAO;MACVF,OAAO;MACPC;IACF,CAAC;IACD;IACAE,KACF,CAAC;EACH,CAAC;EAEMG,WAAW,GAGIA,CAACJ,OAAO,EAAEC,KAAK,KAAK;IACxC,OAAO,IAAI,CAACR,mBAAmB,CAACY,KAAK,CAACF,OAAO,CAC3CH,OAAO;IACP;IACAC,KACF,CAAC;EACH,CAAC;EAEMK,YAAY,GAYGA,CAACJ,OAAO,EAAEK,QAAQ,EAAEP,OAAO,EAAEC,KAAK,KAAK;IAC3D;IACA,MAAMO,YAAY,GAAGC,KAAK,CAACC,OAAO,CAACR,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC;IAEjE,MAAMS,SAAS,GAAG,IAAIvB,YAAY,CAAC,CAAC;IAEpC,KAAK,MAAMwB,GAAG,IAAIJ,YAAY,EAAE;MAC9B,MAAMK,iBAAiB,GAAG,IAAI,CAACpB,mBAAmB,CAACqB,KAAK,CACrDX,OAAO,CACN;QACE,GAAGH,OAAO;QACVe,OAAO,EAAE;UACPC,IAAI,EAAE,QAAQ;UACdlB,OAAO,EAAEc,GAAG,CAACK;QACf,CAAC;QACDV,QAAQ;QACRR,EAAE,EAAEa,GAAG,CAACM;MACV,CAAC;MACD;MACAjB,KACF,CAAC;MAEHU,SAAS,CAACQ,GAAG,CAACN,iBAAiB,CAAC;IAClC;IAEA,OAAO,IAAIxB,qBAAqB,CAACsB,SAAS,CAAC;EAC7C,CAAC;EAaMS,uBAAuBA,CAE5BC,KAAqB,EAA6B;IAClD,OAAO,IAAI,CAAC5B,mBAAmB,CAAC6B,kBAAkB,CAC/CC,YAAY,CAACF,KAAK,CAAC;EACxB;AACF","ignoreList":[]}
@@ -14,43 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { Trie } from "@wry/trie";
18
- const defaultMakeData = () => Object.create(null);
19
- export class WeakRefTrie {
20
- #finalizer = new FinalizationRegistry(orderBy => {
21
- this.#trie.removeArray(Object.entries(orderBy).flat());
22
- });
23
- #trie;
24
- constructor(makeData = defaultMakeData) {
25
- this.#trie = new Trie(false, array => {
26
- const data = makeData(array);
27
- this.#finalizer.register(data, array);
28
- return new WeakRef(data);
29
- });
30
- }
31
- lookupArray(array) {
32
- const maybe = this.#trie.lookupArray(array);
33
- let ret = maybe.deref();
34
- if (maybe && !ret) {
35
- // in case finalizer hasn't run
36
- this.#trie.removeArray(array);
37
- ret = this.#trie.lookupArray(array).deref();
38
- }
39
- return ret;
40
- }
41
- peekArray(array) {
42
- const maybe = this.#trie.peekArray(array);
43
- const ret = maybe?.deref();
44
- if (maybe && !ret) {
45
- // in case finalizer hasn't run
46
- this.#trie.removeArray(array);
47
- }
48
- return ret;
49
- }
50
- removeArray(array) {
51
- return this.#trie.removeArray(array)?.deref();
52
- }
53
- }
17
+ import { WeakRefTrie } from "./WeakRefTrie.js";
54
18
  export class OrderByCanonicalizer {
55
19
  #trie = new WeakRefTrie(array => {
56
20
  const pairs = array.reduce(function (result, _, index, array) {
@@ -1 +1 @@
1
- {"version":3,"file":"OrderByCanonicalizer.js","names":["Trie","defaultMakeData","Object","create","WeakRefTrie","finalizer","FinalizationRegistry","orderBy","trie","removeArray","entries","flat","constructor","makeData","array","data","register","WeakRef","lookupArray","maybe","ret","deref","peekArray","OrderByCanonicalizer","pairs","reduce","result","_","index","push","slice","fromEntries","process","env","NODE_ENV","freeze","canonicalize","strings"],"sources":["OrderByCanonicalizer.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition } from \"@osdk/api\";\nimport { Trie } from \"@wry/trie\";\nimport type { OrderBy } from \"../ObservableClient.js\";\nimport type { Canonical } from \"./Canonical.js\";\n\nconst defaultMakeData = () => Object.create(null);\n\nexport class WeakRefTrie<X extends object> {\n #finalizer = new FinalizationRegistry<\n Array<string>\n >((orderBy) => {\n this.#trie.removeArray(\n Object.entries(orderBy).flat(),\n );\n });\n\n #trie: Trie<WeakRef<X>>;\n\n constructor(makeData: (array: any[]) => X = defaultMakeData) {\n this.#trie = new Trie<WeakRef<X>>(\n false,\n (array) => {\n const data = makeData(array);\n this.#finalizer.register(data, array);\n return new WeakRef(data);\n },\n );\n }\n\n lookupArray<T extends IArguments | any[]>(array: T): X {\n const maybe = this.#trie.lookupArray(array);\n let ret = maybe.deref();\n if (maybe && !ret) {\n // in case finalizer hasn't run\n this.#trie.removeArray(array);\n ret = this.#trie.lookupArray(array).deref();\n }\n return ret!;\n }\n\n peekArray<T extends IArguments | any[]>(array: T): X | undefined {\n const maybe = this.#trie.peekArray(array);\n const ret = maybe?.deref();\n if (maybe && !ret) {\n // in case finalizer hasn't run\n this.#trie.removeArray(array);\n }\n return ret;\n }\n\n removeArray<T extends IArguments | any[]>(array: T): X | undefined {\n return this.#trie.removeArray(array)?.deref();\n }\n}\n\nexport class OrderByCanonicalizer {\n #trie = new WeakRefTrie(\n (array: Array<string>) => {\n const pairs = array.reduce<Array<[string, \"asc\" | \"desc\"]>>(\n function(result, _, index, array) {\n if (index % 2 === 0 && array[index] != null) {\n result.push(\n array.slice(index, index + 2) as [string, \"asc\" | \"desc\"],\n );\n }\n return result;\n },\n [],\n );\n let data = Object.fromEntries(pairs) satisfies Record<\n string,\n \"asc\" | \"desc\"\n > as Canonical<OrderBy<ObjectTypeDefinition>>;\n\n if (process.env.NODE_ENV !== \"production\") {\n data = Object.freeze(data);\n }\n return data;\n },\n );\n\n canonicalize: (\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n ) => Canonical<Record<string, \"asc\" | \"desc\" | undefined>> = (\n orderBy,\n ) => {\n const strings = Object.entries(orderBy).flat();\n return this.#trie.lookupArray(strings);\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,IAAI,QAAQ,WAAW;AAIhC,MAAMC,eAAe,GAAGA,CAAA,KAAMC,MAAM,CAACC,MAAM,CAAC,IAAI,CAAC;AAEjD,OAAO,MAAMC,WAAW,CAAmB;EACzC,CAACC,SAAS,GAAG,IAAIC,oBAAoB,CAElCC,OAAO,IAAK;IACb,IAAI,CAAC,CAACC,IAAI,CAACC,WAAW,CACpBP,MAAM,CAACQ,OAAO,CAACH,OAAO,CAAC,CAACI,IAAI,CAAC,CAC/B,CAAC;EACH,CAAC,CAAC;EAEF,CAACH,IAAI;EAELI,WAAWA,CAACC,QAA6B,GAAGZ,eAAe,EAAE;IAC3D,IAAI,CAAC,CAACO,IAAI,GAAG,IAAIR,IAAI,CACnB,KAAK,EACJc,KAAK,IAAK;MACT,MAAMC,IAAI,GAAGF,QAAQ,CAACC,KAAK,CAAC;MAC5B,IAAI,CAAC,CAACT,SAAS,CAACW,QAAQ,CAACD,IAAI,EAAED,KAAK,CAAC;MACrC,OAAO,IAAIG,OAAO,CAACF,IAAI,CAAC;IAC1B,CACF,CAAC;EACH;EAEAG,WAAWA,CAA+BJ,KAAQ,EAAK;IACrD,MAAMK,KAAK,GAAG,IAAI,CAAC,CAACX,IAAI,CAACU,WAAW,CAACJ,KAAK,CAAC;IAC3C,IAAIM,GAAG,GAAGD,KAAK,CAACE,KAAK,CAAC,CAAC;IACvB,IAAIF,KAAK,IAAI,CAACC,GAAG,EAAE;MACjB;MACA,IAAI,CAAC,CAACZ,IAAI,CAACC,WAAW,CAACK,KAAK,CAAC;MAC7BM,GAAG,GAAG,IAAI,CAAC,CAACZ,IAAI,CAACU,WAAW,CAACJ,KAAK,CAAC,CAACO,KAAK,CAAC,CAAC;IAC7C;IACA,OAAOD,GAAG;EACZ;EAEAE,SAASA,CAA+BR,KAAQ,EAAiB;IAC/D,MAAMK,KAAK,GAAG,IAAI,CAAC,CAACX,IAAI,CAACc,SAAS,CAACR,KAAK,CAAC;IACzC,MAAMM,GAAG,GAAGD,KAAK,EAAEE,KAAK,CAAC,CAAC;IAC1B,IAAIF,KAAK,IAAI,CAACC,GAAG,EAAE;MACjB;MACA,IAAI,CAAC,CAACZ,IAAI,CAACC,WAAW,CAACK,KAAK,CAAC;IAC/B;IACA,OAAOM,GAAG;EACZ;EAEAX,WAAWA,CAA+BK,KAAQ,EAAiB;IACjE,OAAO,IAAI,CAAC,CAACN,IAAI,CAACC,WAAW,CAACK,KAAK,CAAC,EAAEO,KAAK,CAAC,CAAC;EAC/C;AACF;AAEA,OAAO,MAAME,oBAAoB,CAAC;EAChC,CAACf,IAAI,GAAG,IAAIJ,WAAW,CACpBU,KAAoB,IAAK;IACxB,MAAMU,KAAK,GAAGV,KAAK,CAACW,MAAM,CACxB,UAASC,MAAM,EAAEC,CAAC,EAAEC,KAAK,EAAEd,KAAK,EAAE;MAChC,IAAIc,KAAK,GAAG,CAAC,KAAK,CAAC,IAAId,KAAK,CAACc,KAAK,CAAC,IAAI,IAAI,EAAE;QAC3CF,MAAM,CAACG,IAAI,CACTf,KAAK,CAACgB,KAAK,CAACF,KAAK,EAAEA,KAAK,GAAG,CAAC,CAC9B,CAAC;MACH;MACA,OAAOF,MAAM;IACf,CAAC,EACD,EACF,CAAC;IACD,IAAIX,IAAI,GAAGb,MAAM,CAAC6B,WAAW,CAACP,KAAK,CAGU;IAE7C,IAAIQ,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzCnB,IAAI,GAAGb,MAAM,CAACiC,MAAM,CAACpB,IAAI,CAAC;IAC5B;IACA,OAAOA,IAAI;EACb,CACF,CAAC;EAEDqB,YAAY,GAGV7B,OAAO,IACJ;IACH,MAAM8B,OAAO,GAAGnC,MAAM,CAACQ,OAAO,CAACH,OAAO,CAAC,CAACI,IAAI,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,CAACH,IAAI,CAACU,WAAW,CAACmB,OAAO,CAAC;EACxC,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"OrderByCanonicalizer.js","names":["WeakRefTrie","OrderByCanonicalizer","trie","array","pairs","reduce","result","_","index","push","slice","data","Object","fromEntries","process","env","NODE_ENV","freeze","canonicalize","orderBy","strings","entries","flat","lookupArray"],"sources":["OrderByCanonicalizer.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition } from \"@osdk/api\";\nimport type { OrderBy } from \"../ObservableClient.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport { WeakRefTrie } from \"./WeakRefTrie.js\";\n\nexport class OrderByCanonicalizer {\n #trie = new WeakRefTrie(\n (array: Array<string>) => {\n const pairs = array.reduce<Array<[string, \"asc\" | \"desc\"]>>(\n function(result, _, index, array) {\n if (index % 2 === 0 && array[index] != null) {\n result.push(\n array.slice(index, index + 2) as [string, \"asc\" | \"desc\"],\n );\n }\n return result;\n },\n [],\n );\n let data = Object.fromEntries(pairs) satisfies Record<\n string,\n \"asc\" | \"desc\"\n > as Canonical<OrderBy<ObjectTypeDefinition>>;\n\n if (process.env.NODE_ENV !== \"production\") {\n data = Object.freeze(data);\n }\n return data;\n },\n );\n\n canonicalize: (\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n ) => Canonical<Record<string, \"asc\" | \"desc\" | undefined>> = (\n orderBy,\n ) => {\n const strings = Object.entries(orderBy).flat();\n return this.#trie.lookupArray(strings);\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,WAAW,QAAQ,kBAAkB;AAE9C,OAAO,MAAMC,oBAAoB,CAAC;EAChC,CAACC,IAAI,GAAG,IAAIF,WAAW,CACpBG,KAAoB,IAAK;IACxB,MAAMC,KAAK,GAAGD,KAAK,CAACE,MAAM,CACxB,UAASC,MAAM,EAAEC,CAAC,EAAEC,KAAK,EAAEL,KAAK,EAAE;MAChC,IAAIK,KAAK,GAAG,CAAC,KAAK,CAAC,IAAIL,KAAK,CAACK,KAAK,CAAC,IAAI,IAAI,EAAE;QAC3CF,MAAM,CAACG,IAAI,CACTN,KAAK,CAACO,KAAK,CAACF,KAAK,EAAEA,KAAK,GAAG,CAAC,CAC9B,CAAC;MACH;MACA,OAAOF,MAAM;IACf,CAAC,EACD,EACF,CAAC;IACD,IAAIK,IAAI,GAAGC,MAAM,CAACC,WAAW,CAACT,KAAK,CAGU;IAE7C,IAAIU,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzCL,IAAI,GAAGC,MAAM,CAACK,MAAM,CAACN,IAAI,CAAC;IAC5B;IACA,OAAOA,IAAI;EACb,CACF,CAAC;EAEDO,YAAY,GAGVC,OAAO,IACJ;IACH,MAAMC,OAAO,GAAGR,MAAM,CAACS,OAAO,CAACF,OAAO,CAAC,CAACG,IAAI,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,CAACpB,IAAI,CAACqB,WAAW,CAACH,OAAO,CAAC;EACxC,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export class Queries {
18
+ // we can use a regular Map here because the refCounting will
19
+ // handle cleanup.
20
+ map = new Map();
21
+ peek(cacheKey) {
22
+ return this.map.get(cacheKey);
23
+ }
24
+ get(cacheKey, createQuery) {
25
+ let query = this.peek(cacheKey);
26
+ if (!query) {
27
+ query = createQuery();
28
+ this.map.set(cacheKey, query);
29
+ }
30
+ return query;
31
+ }
32
+ keys() {
33
+ return this.map.keys();
34
+ }
35
+ delete(cacheKey) {
36
+ this.map.get(cacheKey)?.dispose();
37
+ this.map.delete(cacheKey);
38
+ }
39
+ }
40
+ //# sourceMappingURL=Queries.js.map