@osdk/client 2.2.0-beta.7 → 2.2.0-beta.9

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 (253) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/build/browser/Client.js.map +1 -1
  3. package/build/browser/createClient.js +11 -4
  4. package/build/browser/createClient.js.map +1 -1
  5. package/build/browser/createMinimalClient.js +2 -2
  6. package/build/browser/createMinimalClient.js.map +1 -1
  7. package/build/browser/index.js +1 -0
  8. package/build/browser/index.js.map +1 -1
  9. package/build/browser/object/SimpleOsdkProperties.js +2 -0
  10. package/build/browser/object/SimpleOsdkProperties.js.map +1 -0
  11. package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
  12. package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
  13. package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
  14. package/build/browser/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
  15. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
  16. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  17. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +10 -3
  18. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  19. package/build/browser/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
  20. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  21. package/build/browser/object/convertWireToOsdkObjects.js +12 -3
  22. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  23. package/build/browser/object/convertWireToOsdkObjects.test.js +7 -3
  24. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  25. package/build/browser/object/createObjectSpecifierFromPrimaryKey.js +20 -0
  26. package/build/browser/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
  27. package/build/browser/object/fetchPage.js +13 -1
  28. package/build/browser/object/fetchPage.js.map +1 -1
  29. package/build/browser/object/fetchPage.test.js +56 -2
  30. package/build/browser/object/fetchPage.test.js.map +1 -1
  31. package/build/browser/object/object.test.js +109 -0
  32. package/build/browser/object/object.test.js.map +1 -1
  33. package/build/browser/objectSet/InterfaceObjectSet.test.js +18 -2
  34. package/build/browser/objectSet/InterfaceObjectSet.test.js.map +1 -1
  35. package/build/browser/objectSet/ObjectSet.test.js +104 -100
  36. package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
  37. package/build/browser/objectSet/ObjectSetListenerWebsocket.js +18 -14
  38. package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  39. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
  40. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  41. package/build/browser/objectSet/createObjectSet.js.map +1 -1
  42. package/build/browser/observable/ListPayload.js.map +1 -1
  43. package/build/browser/observable/ObjectPayload.js.map +1 -1
  44. package/build/browser/observable/ObservableClient.js.map +1 -1
  45. package/build/browser/observable/internal/ActionApplication.js +29 -29
  46. package/build/browser/observable/internal/ActionApplication.js.map +1 -1
  47. package/build/browser/observable/internal/CacheKey.js +1 -1
  48. package/build/browser/observable/internal/CacheKey.js.map +1 -1
  49. package/build/browser/observable/internal/CacheKeys.js +2 -2
  50. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  51. package/build/browser/observable/internal/{ChangedObjects.js → Changes.js} +20 -9
  52. package/build/browser/observable/internal/Changes.js.map +1 -0
  53. package/build/browser/observable/internal/Layer.js +3 -0
  54. package/build/browser/observable/internal/Layer.js.map +1 -1
  55. package/build/browser/observable/internal/ListQuery.js +411 -170
  56. package/build/browser/observable/internal/ListQuery.js.map +1 -1
  57. package/build/browser/observable/internal/ObjectQuery.js +32 -16
  58. package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
  59. package/build/browser/observable/internal/ObservableClientImpl.js +4 -12
  60. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  61. package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
  62. package/build/browser/observable/internal/OrderByCanonicalizer.js +73 -0
  63. package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -0
  64. package/build/browser/observable/internal/OrderByCanonicalizer.test.js +78 -0
  65. package/build/browser/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
  66. package/build/browser/observable/internal/Query.js +64 -31
  67. package/build/browser/observable/internal/Query.js.map +1 -1
  68. package/build/browser/observable/internal/RefCounts.js +7 -2
  69. package/build/browser/observable/internal/RefCounts.js.map +1 -1
  70. package/build/browser/observable/internal/SimpleWhereClause.js +2 -0
  71. package/build/browser/observable/internal/SimpleWhereClause.js.map +1 -0
  72. package/build/browser/observable/internal/Store.js +84 -267
  73. package/build/browser/observable/internal/Store.js.map +1 -1
  74. package/build/browser/observable/internal/Store.test.js +264 -247
  75. package/build/browser/observable/internal/Store.test.js.map +1 -1
  76. package/build/browser/observable/internal/WhereClauseCanonicalizer.js +11 -3
  77. package/build/browser/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
  78. package/build/browser/observable/internal/objectMatchesWhereClause.js.map +1 -1
  79. package/build/browser/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
  80. package/build/browser/observable/internal/testUtils.js +82 -18
  81. package/build/browser/observable/internal/testUtils.js.map +1 -1
  82. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  83. package/build/browser/queries/applyQuery.js +33 -1
  84. package/build/browser/queries/applyQuery.js.map +1 -1
  85. package/build/browser/queries/queries.test.js +26 -5
  86. package/build/browser/queries/queries.test.js.map +1 -1
  87. package/build/browser/util/UserAgent.js +1 -1
  88. package/build/browser/util/toDataValueQueries.js +17 -0
  89. package/build/browser/util/toDataValueQueries.js.map +1 -1
  90. package/build/cjs/{Client-C8K3E1vH.d.cts → Client-DBTcM9gB.d.cts} +1 -1
  91. package/build/cjs/{chunk-JPENHIJB.cjs → chunk-EY52J5Z4.cjs} +25 -15
  92. package/build/cjs/chunk-EY52J5Z4.cjs.map +1 -0
  93. package/build/cjs/{chunk-IU47QMYO.cjs → chunk-MCQVHD2F.cjs} +32 -28
  94. package/build/cjs/chunk-MCQVHD2F.cjs.map +1 -0
  95. package/build/cjs/chunk-T4NIFYZS.cjs +14 -0
  96. package/build/cjs/chunk-T4NIFYZS.cjs.map +1 -0
  97. package/build/cjs/index.cjs +154 -73
  98. package/build/cjs/index.cjs.map +1 -1
  99. package/build/cjs/index.d.cts +6 -4
  100. package/build/cjs/public/internal.cjs +6 -6
  101. package/build/cjs/public/internal.d.cts +1 -1
  102. package/build/cjs/public/unstable-do-not-use.cjs +683 -539
  103. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  104. package/build/cjs/public/unstable-do-not-use.d.cts +28 -27
  105. package/build/esm/Client.js.map +1 -1
  106. package/build/esm/createClient.js +11 -4
  107. package/build/esm/createClient.js.map +1 -1
  108. package/build/esm/createMinimalClient.js +2 -2
  109. package/build/esm/createMinimalClient.js.map +1 -1
  110. package/build/esm/index.js +1 -0
  111. package/build/esm/index.js.map +1 -1
  112. package/build/esm/object/SimpleOsdkProperties.js +2 -0
  113. package/build/esm/object/SimpleOsdkProperties.js.map +1 -0
  114. package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
  115. package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
  116. package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
  117. package/build/esm/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
  118. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
  119. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  120. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +10 -3
  121. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  122. package/build/esm/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
  123. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  124. package/build/esm/object/convertWireToOsdkObjects.js +12 -3
  125. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  126. package/build/esm/object/convertWireToOsdkObjects.test.js +7 -3
  127. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  128. package/build/esm/object/createObjectSpecifierFromPrimaryKey.js +20 -0
  129. package/build/esm/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
  130. package/build/esm/object/fetchPage.js +13 -1
  131. package/build/esm/object/fetchPage.js.map +1 -1
  132. package/build/esm/object/fetchPage.test.js +56 -2
  133. package/build/esm/object/fetchPage.test.js.map +1 -1
  134. package/build/esm/object/object.test.js +109 -0
  135. package/build/esm/object/object.test.js.map +1 -1
  136. package/build/esm/objectSet/InterfaceObjectSet.test.js +18 -2
  137. package/build/esm/objectSet/InterfaceObjectSet.test.js.map +1 -1
  138. package/build/esm/objectSet/ObjectSet.test.js +104 -100
  139. package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
  140. package/build/esm/objectSet/ObjectSetListenerWebsocket.js +18 -14
  141. package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  142. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
  143. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  144. package/build/esm/objectSet/createObjectSet.js.map +1 -1
  145. package/build/esm/observable/ListPayload.js.map +1 -1
  146. package/build/esm/observable/ObjectPayload.js.map +1 -1
  147. package/build/esm/observable/ObservableClient.js.map +1 -1
  148. package/build/esm/observable/internal/ActionApplication.js +29 -29
  149. package/build/esm/observable/internal/ActionApplication.js.map +1 -1
  150. package/build/esm/observable/internal/CacheKey.js +1 -1
  151. package/build/esm/observable/internal/CacheKey.js.map +1 -1
  152. package/build/esm/observable/internal/CacheKeys.js +2 -2
  153. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  154. package/build/esm/observable/internal/{ChangedObjects.js → Changes.js} +20 -9
  155. package/build/esm/observable/internal/Changes.js.map +1 -0
  156. package/build/esm/observable/internal/Layer.js +3 -0
  157. package/build/esm/observable/internal/Layer.js.map +1 -1
  158. package/build/esm/observable/internal/ListQuery.js +411 -170
  159. package/build/esm/observable/internal/ListQuery.js.map +1 -1
  160. package/build/esm/observable/internal/ObjectQuery.js +32 -16
  161. package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
  162. package/build/esm/observable/internal/ObservableClientImpl.js +4 -12
  163. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  164. package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
  165. package/build/esm/observable/internal/OrderByCanonicalizer.js +73 -0
  166. package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -0
  167. package/build/esm/observable/internal/OrderByCanonicalizer.test.js +78 -0
  168. package/build/esm/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
  169. package/build/esm/observable/internal/Query.js +64 -31
  170. package/build/esm/observable/internal/Query.js.map +1 -1
  171. package/build/esm/observable/internal/RefCounts.js +7 -2
  172. package/build/esm/observable/internal/RefCounts.js.map +1 -1
  173. package/build/esm/observable/internal/SimpleWhereClause.js +2 -0
  174. package/build/esm/observable/internal/SimpleWhereClause.js.map +1 -0
  175. package/build/esm/observable/internal/Store.js +84 -267
  176. package/build/esm/observable/internal/Store.js.map +1 -1
  177. package/build/esm/observable/internal/Store.test.js +264 -247
  178. package/build/esm/observable/internal/Store.test.js.map +1 -1
  179. package/build/esm/observable/internal/WhereClauseCanonicalizer.js +11 -3
  180. package/build/esm/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
  181. package/build/esm/observable/internal/objectMatchesWhereClause.js.map +1 -1
  182. package/build/esm/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
  183. package/build/esm/observable/internal/testUtils.js +82 -18
  184. package/build/esm/observable/internal/testUtils.js.map +1 -1
  185. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  186. package/build/esm/queries/applyQuery.js +33 -1
  187. package/build/esm/queries/applyQuery.js.map +1 -1
  188. package/build/esm/queries/queries.test.js +26 -5
  189. package/build/esm/queries/queries.test.js.map +1 -1
  190. package/build/esm/util/UserAgent.js +1 -1
  191. package/build/esm/util/toDataValueQueries.js +17 -0
  192. package/build/esm/util/toDataValueQueries.js.map +1 -1
  193. package/build/types/Client.d.ts +1 -1
  194. package/build/types/Client.d.ts.map +1 -1
  195. package/build/types/createClient.d.ts.map +1 -1
  196. package/build/types/index.d.ts +2 -1
  197. package/build/types/index.d.ts.map +1 -1
  198. package/build/types/object/SimpleOsdkProperties.d.ts +1 -0
  199. package/build/types/object/SimpleOsdkProperties.d.ts.map +1 -0
  200. package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts +1 -0
  201. package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts.map +1 -0
  202. package/build/types/object/convertWireToOsdkObjects.d.ts +8 -1
  203. package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
  204. package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts +2 -0
  205. package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts.map +1 -0
  206. package/build/types/object/object.test.d.ts.map +1 -1
  207. package/build/types/objectSet/ObjectSet.test.d.ts.map +1 -1
  208. package/build/types/observable/ListPayload.d.ts +5 -9
  209. package/build/types/observable/ListPayload.d.ts.map +1 -1
  210. package/build/types/observable/ObjectPayload.d.ts +4 -7
  211. package/build/types/observable/ObjectPayload.d.ts.map +1 -1
  212. package/build/types/observable/ObservableClient.d.ts +27 -11
  213. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  214. package/build/types/observable/internal/ActionApplication.d.ts.map +1 -1
  215. package/build/types/observable/internal/CacheKeys.d.ts +1 -1
  216. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  217. package/build/types/observable/internal/Changes.d.ts +15 -0
  218. package/build/types/observable/internal/Changes.d.ts.map +1 -0
  219. package/build/types/observable/internal/Layer.d.ts +1 -0
  220. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  221. package/build/types/observable/internal/ListQuery.d.ts +59 -14
  222. package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
  223. package/build/types/observable/internal/ObjectQuery.d.ts +5 -6
  224. package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
  225. package/build/types/observable/internal/OptimisticJob.d.ts +1 -1
  226. package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
  227. package/build/types/observable/internal/OrderByCanonicalizer.d.ts +12 -0
  228. package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -0
  229. package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts +1 -0
  230. package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts.map +1 -0
  231. package/build/types/observable/internal/Query.d.ts +39 -4
  232. package/build/types/observable/internal/Query.d.ts.map +1 -1
  233. package/build/types/observable/internal/RefCounts.d.ts.map +1 -1
  234. package/build/types/observable/internal/SimpleWhereClause.d.ts +2 -0
  235. package/build/types/observable/internal/SimpleWhereClause.d.ts.map +1 -0
  236. package/build/types/observable/internal/Store.d.ts +19 -43
  237. package/build/types/observable/internal/Store.d.ts.map +1 -1
  238. package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts +2 -1
  239. package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts.map +1 -1
  240. package/build/types/observable/internal/objectMatchesWhereClause.d.ts +4 -2
  241. package/build/types/observable/internal/objectMatchesWhereClause.d.ts.map +1 -1
  242. package/build/types/observable/internal/testUtils.d.ts +39 -9
  243. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  244. package/build/types/public/unstable-do-not-use.d.ts +1 -4
  245. package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
  246. package/build/types/queries/applyQuery.d.ts.map +1 -1
  247. package/package.json +13 -11
  248. package/build/browser/observable/internal/ChangedObjects.js.map +0 -1
  249. package/build/cjs/chunk-IU47QMYO.cjs.map +0 -1
  250. package/build/cjs/chunk-JPENHIJB.cjs.map +0 -1
  251. package/build/esm/observable/internal/ChangedObjects.js.map +0 -1
  252. package/build/types/observable/internal/ChangedObjects.d.ts +0 -11
  253. package/build/types/observable/internal/ChangedObjects.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Store.test.js","names":["$ontologyRid","createOffice","Employee","Todo","apiServer","chalk","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","vitest","createClient","createOptimisticId","runOptimisticJob","Store","applyCustomMatchers","createClientMockHelper","createDefer","createTestLogger","expectSingleListCallAndClear","expectSingleObjectCallAndClear","listPayloadContaining","mockListSubCallback","mockSingleSubCallback","objectPayloadContaining","waitForCall","defer","setConfig","fakeTimers","toFake","resetConfig","ANY_INIT_ENTRY","object","undefined","lastUpdated","status","fullTaskName","task","suite","name","x","console","log","bgRed","white","testStage","s","bgYellow","client","cache","employeesAsServerReturns","mutatedEmployees","listen","logger","fetchPage","data","$clone","fullName","slice","close","emp","getObject","$primaryKey","toBeUndefined","result","updateObject","toBe","toEqual","updatedEmpFromCache","not","subFn","observeObject","mode","optimisticId","removeLayer","updateList","objectType","where","orderBy","empSubFn","listSubFn","observeList","optimisticEmployee","toHaveBeenCalled","isOptimistic","truthUpdatedEmployee","useRealTimers","toHaveBeenCalledExactlyOnceWith","mockClear","staleEmp","invalidateObject","waitFor","useFakeTimers","subListFn","invalidateList","pInvalidateComplete","invalidateObjectType","resolvedList","subFn1","subFn2","likeEmployee50030","objectContaining","firstLoad","mock","lastCall","toBeGreaterThan","sub","unsubscribe","toHaveBeenCalledTimes","calls","listSub1","mockReset","runOnlyPendingTimers","employeeId","$gt","listSub","pageSize","fetchMore","toHaveBeenCalledWith","mockClient","store","mockFetchOneOnce","resolve","$apiName","todoSubFn","expectLoadingAndLoaded","loading","loaded","mockApplyActionOnce","addedObjects","primaryKey","text","actionPromise","applyAction","officeId","fauxObject","$objectType","$title","applyActionResult","optimisticUpdate","ctx","reject","rejects","toThrow","nextPk","fauxObjectA","fauxObjectB","fauxObjectC","noWhereNoOrderBy","noWhereOrderByText","subListUnordered","subListOrdered","optimisticallyMutatedA","pkForOptimistic","optimisticallyCreatedObjectD","id","mockObjectFactory2Once","removeOptimisticResult","b","createObject","createdObjectD","mockedApplyAction","modifiedObjectA","modifiedObjects","clientHelper","baseObjects","map","i","cacheKeys","obj","getCacheKey","layerIds","batch","write"],"sources":["Store.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Osdk } from \"@osdk/api\";\nimport {\n $ontologyRid,\n createOffice,\n Employee,\n Todo,\n} from \"@osdk/client.test.ontology\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport chalk from \"chalk\";\nimport type { Mock, Task } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n vitest,\n} from \"vitest\";\nimport { type Client } from \"../../Client.js\";\nimport { createClient } from \"../../createClient.js\";\nimport type { Unsubscribable } from \"../ObservableClient.js\";\nimport { createOptimisticId } from \"./OptimisticId.js\";\nimport { runOptimisticJob } from \"./OptimisticJob.js\";\nimport { Store } from \"./Store.js\";\nimport type { MockClientHelper } from \"./testUtils.js\";\nimport {\n applyCustomMatchers,\n createClientMockHelper,\n createDefer,\n createTestLogger,\n expectSingleListCallAndClear,\n expectSingleObjectCallAndClear,\n listPayloadContaining,\n mockListSubCallback,\n mockSingleSubCallback,\n objectPayloadContaining,\n waitForCall,\n} from \"./testUtils.js\";\n\nconst defer = createDefer();\n\nbeforeAll(() => {\n vi.setConfig({\n fakeTimers: {\n toFake: [\n \"setTimeout\",\n \"clearTimeout\",\n \"Date\",\n \"setInterval\",\n \"clearInterval\",\n ],\n },\n });\n});\nafterAll(() => {\n vi.resetConfig();\n});\n\nconst ANY_INIT_ENTRY = {\n // cacheKey: expect.any(Object),\n object: undefined,\n lastUpdated: 0,\n status: \"init\",\n};\n\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nfunction fullTaskName(task?: Task): string {\n return task ? `${fullTaskName(task.suite)} > ${task.name}` : \"\";\n}\n\nbeforeEach((x) => {\n console.log(\n chalk.bgRed(chalk.white(fullTaskName(x.task))),\n );\n});\n\n// helper method to make debugging tests easier\nfunction testStage(s: string) {\n console.log(chalk.bgYellow(`Test Stage: ${s}`));\n}\n\napplyCustomMatchers();\n\ndescribe(Store, () => {\n describe(\"with mock server\", () => {\n let client: Client;\n let cache: Store;\n\n let employeesAsServerReturns: Osdk.Instance<Employee>[];\n let mutatedEmployees: Osdk.Instance<Employee>[];\n\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\n \"https://stack.palantir.com\",\n $ontologyRid,\n async () => \"myAccessToken\",\n { logger: createTestLogger({}) },\n );\n\n employeesAsServerReturns = (await client(Employee).fetchPage()).data;\n mutatedEmployees = [\n employeesAsServerReturns[0],\n employeesAsServerReturns[1].$clone({\n fullName: \"foo\",\n }),\n ...employeesAsServerReturns.slice(2),\n ];\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n beforeEach(() => {\n cache = new Store(client);\n });\n\n afterEach(() => {\n cache = undefined!;\n });\n\n it(\"basic single object works\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // starts empty\n expect(\n cache.getObject(Employee, emp.$primaryKey),\n ).toBeUndefined();\n\n const result = cache.updateObject(Employee, emp);\n expect(emp).toBe(result);\n\n // getting the object now matches the result\n expect(cache.getObject(Employee, emp.$primaryKey)).toEqual(\n result,\n );\n\n const updatedEmpFromCache = cache.updateObject(\n Employee,\n emp.$clone({ fullName: \"new name\" }),\n );\n expect(updatedEmpFromCache).not.toBe(emp);\n\n // getting it again is the updated object\n expect(cache.getObject(Employee, emp.$primaryKey)).toEqual(\n updatedEmpFromCache,\n );\n });\n\n describe(\"optimistic updates\", () => {\n it(\"rolls back objects\", async () => {\n const emp = employeesAsServerReturns[0];\n cache.updateObject(Employee, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n const optimisticId = createOptimisticId();\n // update with an optimistic write\n cache.updateObject(Employee, emp.$clone({ fullName: \"new name\" }), {\n optimisticId,\n });\n expectSingleObjectCallAndClear(\n subFn,\n emp.$clone({ fullName: \"new name\" }),\n \"loaded\",\n );\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n });\n\n it(\"rolls back to an updated real value\", async () => {\n // pre-seed the cache with the \"real\" value\n cache.updateList({\n objectType: Employee,\n where: {},\n orderBy: {},\n }, employeesAsServerReturns);\n\n const emp = employeesAsServerReturns[0];\n\n const empSubFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n empSubFn,\n ),\n );\n\n expectSingleObjectCallAndClear(empSubFn, emp, \"loaded\");\n\n const listSubFn = mockListSubCallback();\n defer(\n cache.observeList({\n objectType: Employee,\n mode: \"offline\",\n }, listSubFn),\n );\n\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(listSubFn, employeesAsServerReturns);\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n const optimisticId = createOptimisticId();\n\n testStage(\"optimistic update\");\n expect(listSubFn).not.toHaveBeenCalled();\n\n // update with an optimistic write\n cache.updateObject(Employee, optimisticEmployee, {\n optimisticId,\n });\n\n testStage(\"after optimistic update\");\n\n // expect optimistic write\n expectSingleObjectCallAndClear(empSubFn, optimisticEmployee);\n\n // expect optimistic write to the list\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(\n listSubFn,\n [\n optimisticEmployee,\n ...employeesAsServerReturns.slice(1),\n ],\n {\n isOptimistic: true,\n status: \"loading\",\n },\n );\n\n // write the real update, via the earlier list definition\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n\n testStage(\"write real update\");\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [truthUpdatedEmployee],\n );\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n // see the object observation get updated\n expectSingleObjectCallAndClear(\n empSubFn,\n truthUpdatedEmployee,\n \"loaded\",\n );\n\n // see the list get updated\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(listSubFn, [truthUpdatedEmployee], {\n status: \"loaded\",\n isOptimistic: false,\n });\n\n vi.useRealTimers();\n });\n\n it(\"rolls back to an updated real value via list\", async () => {\n const emp = employeesAsServerReturns[0];\n cache.updateObject(Employee, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: emp,\n status: \"loaded\",\n }),\n );\n subFn.mockClear();\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n // update with an optimistic write\n const optimisticId = createOptimisticId();\n cache.updateObject(Employee, optimisticEmployee, {\n optimisticId,\n });\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: optimisticEmployee,\n }),\n );\n subFn.mockClear();\n\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n cache.updateObject(Employee, truthUpdatedEmployee);\n\n // we shouldn't expect an update because the top layer has a value\n expect(subFn).not.toHaveBeenCalled();\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: truthUpdatedEmployee,\n }),\n );\n });\n });\n\n describe(\".invalidateObject\", () => {\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateObject(Employee, staleEmp);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: staleEmp,\n status: \"loaded\",\n }),\n );\n subFn.mockClear();\n\n // invalidate\n void cache.invalidateObject(Employee, staleEmp.$primaryKey);\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: staleEmp,\n status: \"loading\",\n }),\n );\n subFn.mockClear();\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: emp,\n }),\n );\n });\n });\n\n describe(\".invalidateList\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [staleEmp],\n );\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(\n cache.observeList({\n objectType: Employee,\n mode: \"offline\",\n }, subListFn),\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loaded\" },\n );\n\n testStage(\"invalidate\");\n\n cache.invalidateList({ objectType: Employee });\n testStage(\"check invalidate\");\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loading\" },\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n employeesAsServerReturns,\n { status: \"loaded\" },\n );\n\n await waitForCall(subFn, 1);\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n });\n });\n\n describe(\".invalidateObjectType\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [staleEmp],\n );\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(\n cache.observeList({\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, subListFn),\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loaded\" },\n );\n\n testStage(\"invalidate\");\n\n const pInvalidateComplete = cache.invalidateObjectType(\n Employee,\n undefined,\n );\n\n await waitForCall(subListFn, 1);\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [staleEmp],\n status: \"loading\",\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subListFn).toHaveBeenCalled());\n expect(subListFn).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n }),\n );\n subListFn.mockClear();\n\n await vi.waitFor(() => expect(subFn).toHaveBeenCalled());\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loaded\",\n object: emp,\n }),\n );\n\n // we don't need this value to control the test but we want to make sure we don't have\n // any unhandled exceptions upon test completion\n await pInvalidateComplete;\n });\n });\n\n describe(\".observeObject (force)\", () => {\n const subFn1 = mockSingleSubCallback();\n const subFn2 = mockSingleSubCallback();\n\n beforeEach(async () => {\n subFn1.mockClear();\n subFn2.mockClear();\n });\n\n const likeEmployee50030 = expect.objectContaining({\n $primaryKey: 50030,\n fullName: \"John Doe\",\n });\n\n it(\"fetches and updates twice\", async () => {\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn1),\n );\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n );\n\n subFn1.mockClear();\n\n await vi.waitFor(() => expect(subFn1).toHaveBeenCalled());\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: likeEmployee50030,\n isOptimistic: false,\n }),\n );\n\n const firstLoad = subFn1.mock.lastCall?.[0]!;\n\n subFn1.mockClear();\n\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn2),\n );\n expect(subFn1).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ status: \"loading\" }),\n );\n subFn1.mockClear();\n\n // should be the earlier results\n expect(subFn2).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ status: \"loading\" }),\n );\n subFn2.mockClear();\n\n // both will be updated\n for (const s of [subFn1, subFn2]) {\n // wait for the result to come in\n await vi.waitFor(() => expect(s).toHaveBeenCalled());\n\n expect(s).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n ...firstLoad,\n lastUpdated: expect.toBeGreaterThan(firstLoad.lastUpdated),\n }),\n );\n\n s.mockClear();\n }\n });\n });\n\n describe(\".observeObject (offline)\", () => {\n const subFn = mockSingleSubCallback();\n let sub: Unsubscribable;\n\n beforeEach(() => {\n subFn.mockClear();\n\n sub = defer(\n cache.observeObject(Employee, 50030, { mode: \"offline\" }, subFn),\n );\n\n expect(subFn).toHaveBeenCalledExactlyOnceWith(objectPayloadContaining({\n status: \"init\",\n object: undefined,\n }));\n subFn.mockClear();\n });\n\n it(\"does basic observation and unsubscribe\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n cache.updateObject(Employee, emp);\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({ object: emp }),\n );\n subFn.mockClear();\n\n // force again\n cache.updateObject(Employee, emp.$clone({ fullName: \"new name\" }));\n expect(subFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: expect.objectContaining({ fullName: \"new name\" }),\n }),\n );\n subFn.mockClear();\n\n sub.unsubscribe();\n\n // force again but no subscription update\n cache.updateObject(\n Employee,\n emp.$clone({ fullName: \"new name 2\" }),\n );\n expect(subFn).not.toHaveBeenCalled();\n });\n\n it(\"observes with list update\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n cache.updateObject(Employee, emp.$clone({ fullName: \"not the name\" }));\n expect(subFn).toHaveBeenCalledTimes(1);\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n expect(subFn).toHaveBeenCalledTimes(2);\n\n expect(subFn.mock.calls[1][0]).toEqual(\n objectPayloadContaining({ object: emp }),\n );\n });\n });\n\n describe(\".observeList\", () => {\n const listSub1 = mockListSubCallback();\n\n beforeEach(() => {\n vi.useFakeTimers({});\n listSub1.mockReset();\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n describe(\"mode=force\", () => {\n it(\"initial load\", async () => {\n defer(\n cache.observeList(\n { objectType: Employee, where: {}, orderBy: {}, mode: \"force\" },\n listSub1,\n ),\n );\n vitest.runOnlyPendingTimers();\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n status: \"loading\",\n resolvedList: [],\n }),\n );\n listSub1.mockClear();\n\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n status: \"loaded\",\n }),\n );\n });\n\n it(\"subsequent load\", async () => {\n // Pre-seed with data the server doesn't return\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n mutatedEmployees,\n );\n\n defer(\n cache.observeList({\n objectType: Employee,\n mode: \"force\",\n }, listSub1),\n );\n\n await waitForCall(listSub1, 1);\n const firstLoad = listSub1.mock.calls[0][0]!;\n expectSingleListCallAndClear(listSub1, mutatedEmployees, {\n status: \"loading\",\n });\n\n await vi.waitFor(() => expect(listSub1).toHaveBeenCalled());\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns,\n status: \"loaded\",\n lastUpdated: expect.toBeGreaterThan(\n firstLoad.lastUpdated,\n ),\n }),\n );\n listSub1.mockClear();\n });\n });\n\n describe(\"mode = offline\", () => {\n it(\"updates with list updates\", async () => {\n defer(\n cache.observeList({\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, listSub1),\n );\n expect(listSub1).toHaveBeenCalledTimes(0);\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({ resolvedList: employeesAsServerReturns }),\n );\n listSub1.mockClear();\n\n // list is just now one object\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n [employeesAsServerReturns[0]],\n );\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: [employeesAsServerReturns[0]],\n }),\n );\n });\n\n it(\"updates with different list updates\", async () => {\n defer(\n cache.observeList({\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, listSub1),\n );\n\n expect(listSub1).toHaveBeenCalledTimes(0);\n\n cache.updateList(\n { objectType: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n vitest.runOnlyPendingTimers();\n\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({ resolvedList: employeesAsServerReturns }),\n );\n listSub1.mockClear();\n\n // new where === different list\n cache.updateList(\n {\n objectType: Employee,\n where: { employeeId: { $gt: 0 } },\n orderBy: {},\n },\n mutatedEmployees,\n );\n vitest.runOnlyPendingTimers();\n\n // original list updates still\n expect(listSub1).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: mutatedEmployees,\n }),\n );\n });\n });\n });\n\n describe(\".fetchMore\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"works in the solo case\", async () => {\n const listSub = mockListSubCallback();\n defer(cache.observeList(\n {\n objectType: Employee,\n where: {},\n orderBy: {},\n mode: \"force\",\n pageSize: 1,\n },\n listSub,\n ));\n\n expect(listSub).not.toHaveBeenCalled();\n await vi.waitFor(() => expect(listSub).toHaveBeenCalled());\n\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n status: \"loading\",\n }),\n );\n listSub.mockClear();\n await vi.waitFor(() => expect(listSub).toHaveBeenCalled());\n\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 1),\n status: \"loaded\",\n }),\n );\n const { fetchMore } = listSub.mock.calls[0][0]!;\n listSub.mockClear();\n\n void fetchMore();\n\n await vi.waitFor(() => expect(listSub).toHaveBeenCalledTimes(1));\n expect(listSub).toHaveBeenCalledExactlyOnceWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 1),\n status: \"loading\",\n }),\n );\n listSub.mockClear();\n\n await vi.waitFor(() => expect(listSub).toHaveBeenCalledTimes(1));\n expect(listSub).toHaveBeenCalledWith(\n listPayloadContaining({\n resolvedList: employeesAsServerReturns.slice(0, 2),\n status: \"loaded\",\n }),\n );\n });\n });\n });\n\n describe(\"with mock client\", () => {\n let client: Mock<Client> & Client;\n let mockClient: MockClientHelper;\n let store: Store;\n\n beforeEach(async () => {\n mockClient = createClientMockHelper();\n client = mockClient.client;\n store = new Store(client);\n });\n\n describe(\"actions\", () => {\n it(\"properly invalidates objects\", async () => {\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce().resolve({\n $apiName: \"Todo\",\n });\n\n const todoSubFn = mockSingleSubCallback();\n defer(store.observeObject(Todo, 0, {}, todoSubFn));\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n $primaryKey: 0,\n }),\n }),\n });\n\n // at this point we have an observation properly set up\n mockClient.mockApplyActionOnce().resolve({\n addedObjects: [{\n objectType: \"Todo\",\n primaryKey: 0,\n }],\n });\n\n // after we apply the action, the object is invalidated and gets re-requested\n\n mockClient.mockFetchOneOnce<Todo>().resolve({\n $apiName: \"Todo\",\n text: \"hello there kind sir\",\n });\n\n const actionPromise = store.applyAction(createOffice, {\n officeId: \"whatever\",\n });\n\n await actionPromise;\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n text: \"hello there kind sir\",\n }),\n }),\n });\n });\n\n it(\"rolls back optimistic updates on error\", async () => {\n const fauxObject = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: 0,\n $title: \"does not matter\",\n } as Osdk.Instance<Todo>;\n\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce<Todo>()\n .resolve(fauxObject);\n\n const todoSubFn = mockSingleSubCallback();\n defer(\n store.observeObject(Todo, 0, {}, todoSubFn),\n );\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n loaded: objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n });\n\n // at this point we have an observation properly set up\n const applyActionResult = mockClient.mockApplyActionOnce();\n\n const actionPromise = store.applyAction(createOffice, {\n officeId: \"whatever\",\n }, {\n optimisticUpdate: (ctx) => {\n ctx.updateObject({ ...fauxObject, text: \"optimistic\" });\n },\n });\n\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: {\n ...fauxObject,\n text: \"optimistic\",\n },\n status: \"loading\",\n isOptimistic: true,\n }),\n );\n todoSubFn.mockClear();\n\n // let the action error out\n applyActionResult.reject(\"an error thrown\");\n await expect(actionPromise).rejects.toThrow(\"an error thrown\");\n\n // back to the original object\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n );\n });\n });\n\n describe(\"orderBy\", () => {\n let nextPk = 0;\n const fauxObjectA = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: nextPk++,\n $title: \"a\",\n text: \"a\",\n } as Osdk.Instance<Todo>;\n\n const fauxObjectB = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: nextPk++,\n $title: \"b\",\n text: \"b\",\n } as Osdk.Instance<Todo>;\n\n const fauxObjectC = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: nextPk++,\n $title: \"c\",\n text: \"c\",\n } as Osdk.Instance<Todo>;\n\n const noWhereNoOrderBy = {\n objectType: Todo,\n where: {},\n orderBy: {},\n } as const;\n\n const noWhereOrderByText = {\n objectType: Todo,\n where: {},\n orderBy: {\n text: \"asc\",\n },\n } as const;\n\n const subListUnordered = mockListSubCallback();\n const subListOrdered = mockListSubCallback();\n\n beforeEach(() => {\n defer(\n store.observeList({\n ...noWhereNoOrderBy,\n mode: \"offline\",\n }, subListUnordered),\n );\n expect(subListUnordered).toHaveBeenCalledTimes(0);\n\n defer(\n store.observeList({\n ...noWhereOrderByText,\n mode: \"offline\",\n }, subListOrdered),\n );\n expect(subListOrdered).toHaveBeenCalledTimes(0);\n });\n\n it(\"invalidates the correct lists\", async () => {\n // for whatever reason, the first list is loaded as [B, A]\n store.updateList(\n noWhereNoOrderBy,\n [fauxObjectB, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n );\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n );\n\n // For whatever reason, object B is no longer in the first set (use your imagination)\n // but we have added a C before A. So the first list is [C, A]\n store.updateList(\n { objectType: Todo, where: {}, orderBy: {} },\n [fauxObjectC, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectC, fauxObjectA],\n );\n\n // Nothing told the system that B was deleted so we can presume it still exists\n // and therefore the second list is now [A, B, C]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB, fauxObjectC],\n );\n });\n\n it(\"produces proper results with optimistic updates and successful action\", async () => {\n const optimisticallyMutatedA = {\n ...fauxObjectA,\n text: \"optimistic\",\n };\n const pkForOptimistic = nextPk++;\n const optimisticallyCreatedObjectD = {\n \"$apiName\": \"Todo\",\n \"$objectType\": \"Todo\",\n \"$primaryKey\": pkForOptimistic,\n \"$title\": \"d\",\n \"text\": \"d\",\n id: pkForOptimistic,\n } as Osdk.Instance<Todo>;\n\n // for whatever reason, the first list is loaded as [B, A]\n store.updateList(\n noWhereNoOrderBy,\n [fauxObjectB, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n );\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n );\n\n testStage(\"Start\");\n\n // the optimistic job will call createObject which triggers the `objectFactory2` of the\n // cache context.\n mockClient.mockObjectFactory2Once().resolve([\n optimisticallyCreatedObjectD,\n ]);\n\n // Perform something optimistic.\n const removeOptimisticResult = runOptimisticJob(store, (b) => {\n b.createObject(Todo, pkForOptimistic, {\n id: pkForOptimistic,\n text: \"d\",\n });\n b.updateObject(optimisticallyMutatedA);\n });\n\n // The first list is now [B, A, optimistic]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [\n fauxObjectB,\n optimisticallyMutatedA, // same position, new values\n optimisticallyCreatedObjectD,\n ],\n { isOptimistic: true },\n );\n\n // the second list is now [A, B, optimistic]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [\n fauxObjectB,\n optimisticallyCreatedObjectD,\n optimisticallyMutatedA,\n ],\n { isOptimistic: true },\n );\n\n // Roll back the optimistic update\n await removeOptimisticResult();\n\n // The first list is now [B, A]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n { isOptimistic: false },\n );\n\n // the second list is now [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n { isOptimistic: false },\n );\n });\n // I think these are named backwards\n it(\"produces proper results with optimistic updates and rollback\", async () => {\n const pkForOptimistic = nextPk++;\n const optimisticallyCreatedObjectD = {\n \"$apiName\": \"Todo\",\n \"$objectType\": \"Todo\",\n \"$primaryKey\": pkForOptimistic,\n \"$title\": \"d\",\n \"text\": \"d\",\n id: pkForOptimistic,\n } as Osdk.Instance<Todo>;\n\n const optimisticallyMutatedA = {\n ...fauxObjectA,\n text: \"optimistic\",\n };\n\n testStage(\"Initial Setup\");\n\n // later we will \"create\" this object\n const createdObjectD = {\n \"$apiName\": \"Todo\",\n \"$objectType\": \"Todo\",\n \"$primaryKey\": 9000,\n \"$title\": \"d prime\",\n \"text\": \"d prime\",\n id: 9000,\n } as Osdk.Instance<Todo>;\n\n // for whatever reason, the first list is loaded as [B, A]\n store.updateList(\n noWhereNoOrderBy,\n [fauxObjectB, fauxObjectA],\n );\n\n await waitForCall(subListUnordered, 1);\n\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n fauxObjectA,\n ]);\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n expectSingleListCallAndClear(subListOrdered, [\n fauxObjectA,\n fauxObjectB,\n ]);\n\n testStage(\"Optimistic Creation\");\n\n // the optimistic job will call createObject which triggers the `objectFactory2` of the\n // cache context.\n\n mockClient.mockObjectFactory2Once().resolve([\n optimisticallyCreatedObjectD,\n ]);\n\n const mockedApplyAction = mockClient.mockApplyActionOnce();\n\n testStage(\"Apply Action\");\n\n const actionPromise = store.applyAction(\n createOffice,\n { officeId: \"5\" },\n {\n optimisticUpdate: (b) => {\n b.createObject(Todo, pkForOptimistic, {\n id: pkForOptimistic,\n text: \"d\",\n });\n b.updateObject(optimisticallyMutatedA);\n },\n },\n );\n\n testStage(\"Optimistic Updates\");\n\n // The first list is now [B, A, optimistic]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n optimisticallyMutatedA, // same position, new values\n optimisticallyCreatedObjectD,\n ], { isOptimistic: true });\n\n // the second list is now [A, B, optimistic]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(subListOrdered, [\n fauxObjectB,\n optimisticallyCreatedObjectD,\n optimisticallyMutatedA,\n ], { isOptimistic: true });\n\n testStage(\"Resolve Action\");\n\n const modifiedObjectA = {\n ...fauxObjectA,\n text: \"a prime\",\n };\n\n // The action will complete and then revalidate in order...\n mockClient.mockFetchOneOnce<Todo>(modifiedObjectA.$primaryKey)\n .resolve(modifiedObjectA);\n\n mockClient.mockFetchOneOnce<Todo>(createdObjectD.$primaryKey)\n .resolve(createdObjectD);\n\n // this order matters!\n // but now we don't need them because we just update lists instead of revalidate when we can\n // const plainList = mockClient.mockFetchPageOnce<Todo>();\n // const orderedList = mockClient.mockFetchPageOnce<Todo>();\n\n mockedApplyAction.resolve({\n addedObjects: [\n {\n objectType: \"Todo\",\n primaryKey: createdObjectD.id,\n },\n ],\n modifiedObjects: [\n {\n objectType: \"Todo\",\n primaryKey: fauxObjectA.$primaryKey,\n },\n ],\n });\n\n // plainList.resolve({\n // nextPageToken: undefined,\n // totalCount: \"4\",\n // data: [fauxObjectB, fauxObjectC, modifiedObjectA, createdObjectD],\n // });\n\n // orderedList.resolve({\n // nextPageToken: undefined,\n // totalCount: \"4\",\n // data: [modifiedObjectA, fauxObjectC, createdObjectD],\n // });\n\n await actionPromise;\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n // fauxObjectC,\n modifiedObjectA,\n createdObjectD,\n ], { isOptimistic: false });\n\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [modifiedObjectA, fauxObjectB, createdObjectD],\n { isOptimistic: false },\n );\n });\n });\n });\n\n describe(\"layers\", () => {\n it(\"properly remove\", () => {\n const clientHelper = createClientMockHelper();\n const store = new Store(clientHelper.client);\n\n const baseObjects = [1, 2].map((i) => ({\n $primaryKey: i,\n $objectType: \"Employee\",\n $apiName: \"Employee\",\n $title: `truth ${i}`,\n } as Osdk.Instance<Employee>));\n\n const cacheKeys = baseObjects.map((obj) =>\n store.getCacheKey(\"object\", \"Employee\", obj.$primaryKey)\n );\n\n // set the truth\n for (const obj of baseObjects) {\n store.updateObject(\"Employee\", obj);\n }\n\n // expect the truth\n for (const obj of baseObjects) {\n expect(store.getObject(\"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n\n const layerIds = [1, 2].map(createOptimisticId);\n\n // optimistically set the objects in their own layers\n for (let i = 0; i < 2; i++) {\n store.batch({ optimisticId: layerIds[i] }, (batch) => {\n batch.write(\n cacheKeys[i],\n {\n ...baseObjects[i],\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n },\n \"loading\",\n );\n });\n }\n\n // expect the optimistic values\n for (let i = 0; i < 2; i++) {\n expect(store.getObject(\"Employee\", baseObjects[i].$primaryKey)).toEqual(\n expect.objectContaining({\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n }),\n );\n }\n\n // remove the first layer\n store.removeLayer(layerIds[0]);\n\n // should have truth object 1 and optimistic object 2\n expect(store.getObject(\"Employee\", 1)).toEqual(\n expect.objectContaining({ $title: \"truth 1\" }),\n );\n expect(store.getObject(\"Employee\", 2)).toEqual(\n expect.objectContaining({ $title: \"optimistic 2\" }),\n );\n\n // remove the second layer\n store.removeLayer(layerIds[1]);\n\n // should have truth objects\n for (const obj of baseObjects) {\n expect(store.getObject(\"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Store.test.js","names":["$ontologyRid","createOffice","Employee","FooInterface","Todo","wireObjectTypeFullMetadataToSdkObjectMetadata","apiServer","stubData","chalk","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","vitest","createClient","createMinimalClient","createObjectSet","InterfaceDefinitions","createOptimisticId","runOptimisticJob","invalidateList","Store","applyCustomMatchers","createClientMockHelper","createDefer","createTestLogger","expectNoMoreCalls","expectSingleListCallAndClear","expectSingleObjectCallAndClear","getObject","mockListSubCallback","mockSingleSubCallback","objectPayloadContaining","updateList","updateObject","waitForCall","defer","logger","setConfig","fakeTimers","toFake","resetConfig","ANY_INIT_ENTRY","object","undefined","lastUpdated","status","fullTaskName","task","suite","name","x","console","log","bgRed","white","testStage","s","bgYellow","client","cache","employeesAsServerReturns","mutatedEmployees","listen","fetchPage","data","$clone","fullName","slice","close","emp","cacheKey","getCacheKey","$primaryKey","getValue","value","toBeUndefined","result","toBe","toEqual","updatedEmpFromCache","not","subFn","observeObject","mode","optimisticId","removeLayer","type","where","orderBy","empSubFn","listSubFn","observeList","optimisticEmployee","next","toHaveBeenCalled","isOptimistic","truthUpdatedEmployee","staleEmp","invalidateObject","useFakeTimers","useRealTimers","subListFn","invalidateListPromise","pInvalidateComplete","invalidateObjectType","subFn1","subFn2","complete","mockClear","error","likeEmployee50030","objectContaining","toHaveBeenCalledExactlyOnceWith","firstLoad","mock","lastCall","toBeGreaterThan","sub","unsubscribe","toHaveBeenCalledTimes","calls","listSub1","ifaceSub","mocked","mockReset","runOnlyPendingTimers","filter","o","employeeId","$gt","listSub","pageSize","fetchMore","mockClient","store","Error","mockFetchPageOnce","reject","mockFetchOneOnce","resolve","$apiName","todoSubFn","expectLoadingAndLoaded","loading","loaded","mockApplyActionOnce","addedObjects","objectType","primaryKey","text","applyAction","officeId","fauxObject","$objectType","$title","applyActionResult","actionPromise","optimisticUpdate","ctx","rejects","toThrow","ontologyProvider","getObjectDefinition","todoWithLinkTypes","getActionDefinition","getInterfaceDefinition","getQueryDefinition","minimalClient","ontologyRid","Promise","fetch","createObject","objectFactory2","apiName","$objectSpecifier","nextPk","fauxObjectA","id","fauxObjectB","fauxObjectC","noWhereNoOrderBy","noWhereOrderByText","subListUnordered","subListOrdered","optimisticallyMutatedA","pkForOptimistic","optimisticallyCreatedObjectD","mockObjectFactory2Once","removeOptimisticResult","b","createdObjectD","mockedApplyAction","modifiedObjectA","modifiedObjects","clientHelper","baseObjects","map","i","cacheKeys","obj","layerIds","batch","write"],"sources":["Store.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CompileTimeMetadata,\n ObjectTypeDefinition,\n Osdk,\n OsdkBase,\n} from \"@osdk/api\";\nimport {\n $ontologyRid,\n createOffice,\n Employee,\n FooInterface,\n Todo,\n} from \"@osdk/client.test.ontology\";\nimport { wireObjectTypeFullMetadataToSdkObjectMetadata } from \"@osdk/generator-converters\";\nimport { apiServer, stubData } from \"@osdk/shared.test\";\nimport chalk from \"chalk\";\nimport type { Mock, Task } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n vitest,\n} from \"vitest\";\nimport { type Client } from \"../../Client.js\";\nimport { createClient } from \"../../createClient.js\";\nimport { createMinimalClient } from \"../../createMinimalClient.js\";\n\nimport type { ObjectHolder } from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport { createObjectSet } from \"../../objectSet/createObjectSet.js\";\nimport type { OntologyProvider } from \"../../ontology/OntologyProvider.js\";\nimport { InterfaceDefinitions } from \"../../ontology/OntologyProvider.js\";\nimport type {\n ObserveListOptions,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport { createOptimisticId } from \"./OptimisticId.js\";\nimport { runOptimisticJob } from \"./OptimisticJob.js\";\nimport { invalidateList, Store } from \"./Store.js\";\nimport type { MockClientHelper } from \"./testUtils.js\";\nimport {\n applyCustomMatchers,\n createClientMockHelper,\n createDefer,\n createTestLogger,\n expectNoMoreCalls,\n expectSingleListCallAndClear,\n expectSingleObjectCallAndClear,\n getObject,\n mockListSubCallback,\n mockSingleSubCallback,\n objectPayloadContaining,\n updateList,\n updateObject,\n waitForCall,\n} from \"./testUtils.js\";\n\nconst defer = createDefer();\n\nconst logger = createTestLogger({});\n\nbeforeAll(() => {\n vi.setConfig({\n fakeTimers: {\n toFake: [\n \"setTimeout\",\n \"clearTimeout\",\n \"Date\",\n \"setInterval\",\n \"clearInterval\",\n ],\n },\n });\n});\nafterAll(() => {\n vi.resetConfig();\n});\n\nconst ANY_INIT_ENTRY = {\n // cacheKey: expect.any(Object),\n object: undefined,\n lastUpdated: 0,\n status: \"init\",\n};\n\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nfunction fullTaskName(task?: Task): string {\n return task ? `${fullTaskName(task.suite)} > ${task.name}` : \"\";\n}\n\nbeforeEach((x) => {\n console.log(\n chalk.bgRed(chalk.white(fullTaskName(x.task))),\n );\n});\n\n// helper method to make debugging tests easier\nfunction testStage(s: string) {\n console.log(chalk.bgYellow(`Test Stage: ${s}`));\n}\n\napplyCustomMatchers();\n\ndescribe(Store, () => {\n describe(\"with mock server\", () => {\n let client: Client;\n let cache: Store;\n\n let employeesAsServerReturns: Osdk.Instance<Employee>[];\n let mutatedEmployees: Osdk.Instance<Employee>[];\n\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\n \"https://stack.palantir.com\",\n $ontologyRid,\n async () => \"myAccessToken\",\n { logger },\n );\n\n employeesAsServerReturns = (await client(Employee).fetchPage()).data;\n mutatedEmployees = [\n employeesAsServerReturns[0],\n employeesAsServerReturns[1].$clone({\n fullName: \"foo\",\n }),\n ...employeesAsServerReturns.slice(2),\n ];\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n beforeEach(() => {\n cache = new Store(client);\n });\n\n afterEach(() => {\n cache = undefined!;\n });\n\n it(\"basic single object works\", async () => {\n const emp = employeesAsServerReturns[0];\n\n const cacheKey = cache.getCacheKey<ObjectCacheKey>(\n \"object\",\n \"Employee\",\n emp.$primaryKey,\n );\n\n // starts empty\n expect(\n cache.getValue(cacheKey)?.value,\n ).toBeUndefined();\n\n const result = updateObject(cache, emp);\n expect(emp).toBe(result);\n\n // getting the object now matches the result\n expect(cache.getValue(cacheKey)?.value).toEqual(\n result,\n );\n\n const updatedEmpFromCache = updateObject(\n cache,\n emp.$clone({ fullName: \"new name\" }),\n );\n expect(updatedEmpFromCache).not.toBe(emp);\n\n // getting it again is the updated object\n expect(cache.getValue(cacheKey)?.value).toEqual(\n updatedEmpFromCache,\n );\n });\n\n describe(\"optimistic updates\", () => {\n it(\"rolls back objects\", async () => {\n const emp = employeesAsServerReturns[0];\n updateObject(cache, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n const optimisticId = createOptimisticId();\n // update with an optimistic write\n updateObject(cache, emp.$clone({ fullName: \"new name\" }), {\n optimisticId,\n });\n expectSingleObjectCallAndClear(\n subFn,\n emp.$clone({ fullName: \"new name\" }),\n \"loaded\",\n );\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n });\n\n it(\"rolls back to an updated real value\", async () => {\n // pre-seed the cache with the \"real\" value\n updateList(cache, {\n type: Employee,\n where: {},\n orderBy: {},\n }, employeesAsServerReturns);\n\n const emp = employeesAsServerReturns[0];\n\n const empSubFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n empSubFn,\n ),\n );\n\n expectSingleObjectCallAndClear(empSubFn, emp, \"loaded\");\n\n const listSubFn = mockListSubCallback();\n defer(\n cache.observeList({\n type: Employee,\n mode: \"offline\",\n }, listSubFn),\n );\n\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(listSubFn, employeesAsServerReturns);\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n const optimisticId = createOptimisticId();\n\n testStage(\"optimistic update\");\n expect(listSubFn.next).not.toHaveBeenCalled();\n\n // update with an optimistic write\n updateObject(cache, optimisticEmployee, {\n optimisticId,\n });\n\n testStage(\"after optimistic update\");\n\n // expect optimistic write\n expectSingleObjectCallAndClear(empSubFn, optimisticEmployee);\n\n // expect optimistic write to the list\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(\n listSubFn,\n [\n optimisticEmployee,\n ...employeesAsServerReturns.slice(1),\n ],\n {\n isOptimistic: true,\n status: \"loading\",\n },\n );\n\n // write the real update, via the earlier list definition\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n\n testStage(\"write real update\");\n\n updateList(cache, { type: Employee, where: {}, orderBy: {} }, [\n truthUpdatedEmployee,\n ]);\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n // see the object observation get updated\n expectSingleObjectCallAndClear(\n empSubFn,\n truthUpdatedEmployee,\n \"loaded\",\n );\n\n // see the list get updated\n await waitForCall(listSubFn, 1);\n expectSingleListCallAndClear(listSubFn, [truthUpdatedEmployee], {\n status: \"loaded\",\n isOptimistic: false,\n });\n });\n\n it(\"rolls back to an updated real value via list\", async () => {\n const emp = employeesAsServerReturns[0];\n updateObject(cache, emp); // pre-seed the cache with the \"real\" value\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n const optimisticEmployee = emp.$clone({ fullName: \"new name\" });\n\n // update with an optimistic write\n const optimisticId = createOptimisticId();\n updateObject(cache, optimisticEmployee, {\n optimisticId,\n });\n expectSingleObjectCallAndClear(subFn, optimisticEmployee);\n\n const truthUpdatedEmployee = emp.$clone({\n fullName: \"real update\",\n });\n updateObject(cache, truthUpdatedEmployee);\n\n // we shouldn't expect an update because the top layer has a value\n expect(subFn.next).not.toHaveBeenCalled();\n\n // remove the optimistic write\n cache.removeLayer(optimisticId);\n\n expectSingleObjectCallAndClear(subFn, truthUpdatedEmployee);\n expectNoMoreCalls(subFn);\n });\n });\n\n describe(\".invalidateObject\", () => {\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n updateObject(cache, staleEmp);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n\n expectSingleObjectCallAndClear(subFn, staleEmp, \"loaded\");\n\n // invalidate\n void cache.invalidateObject(Employee, staleEmp.$primaryKey);\n\n await waitForCall(subFn);\n expectSingleObjectCallAndClear(subFn, staleEmp, \"loading\");\n\n await waitForCall(subFn);\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n expectNoMoreCalls(subFn);\n });\n });\n\n describe(\".invalidateList\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n updateList(cache, { type: Employee, where: {}, orderBy: {} }, [\n staleEmp,\n ]);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(\n cache.observeList({\n type: Employee,\n mode: \"offline\",\n }, subListFn),\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loaded\" },\n );\n\n testStage(\"invalidate\");\n\n const invalidateListPromise = invalidateList(cache, { type: Employee });\n testStage(\"check invalidate\");\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loading\" },\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n employeesAsServerReturns,\n { status: \"loaded\" },\n );\n\n await waitForCall(subFn, 1);\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n // don't leave promises dangling\n await invalidateListPromise;\n });\n });\n\n describe(\".invalidateObjectType\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"triggers an update\", async () => {\n const emp = employeesAsServerReturns[0];\n const staleEmp = emp.$clone({ fullName: \"stale\" });\n updateList(cache, { type: Employee, where: {}, orderBy: {} }, [\n staleEmp,\n ]);\n\n const subFn = mockSingleSubCallback();\n defer(\n cache.observeObject(\n Employee,\n emp.$primaryKey,\n { mode: \"offline\" },\n subFn,\n ),\n );\n expectSingleObjectCallAndClear(subFn, staleEmp);\n\n const subListFn = mockListSubCallback();\n defer(\n cache.observeList({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, subListFn),\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(\n subListFn,\n [staleEmp],\n { status: \"loaded\" },\n );\n\n testStage(\"invalidate\");\n\n const pInvalidateComplete = cache.invalidateObjectType(\n Employee,\n undefined,\n );\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(subListFn, [staleEmp], {\n status: \"loading\",\n });\n\n await waitForCall(subListFn, 1);\n expectSingleListCallAndClear(subListFn, employeesAsServerReturns);\n\n await waitForCall(subFn, 1);\n expectSingleObjectCallAndClear(subFn, emp, \"loaded\");\n\n // we don't need this value to control the test but we want to make sure we don't have\n // any unhandled exceptions upon test completion\n await pInvalidateComplete;\n });\n });\n\n describe(\".observeObject (force)\", () => {\n const subFn1 = mockSingleSubCallback();\n const subFn2 = mockSingleSubCallback();\n\n beforeEach(async () => {\n subFn1.complete.mockClear();\n subFn1.next.mockClear();\n subFn1.error.mockClear();\n\n subFn2.complete.mockClear();\n subFn2.next.mockClear();\n subFn2.error.mockClear();\n });\n\n const likeEmployee50030 = expect.objectContaining({\n $primaryKey: 50030,\n fullName: \"John Doe\",\n });\n\n it(\"fetches and updates twice\", async () => {\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn1),\n );\n\n expect(subFn1.next).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n );\n\n subFn1.next.mockClear();\n\n await waitForCall(subFn1);\n expect(subFn1.next).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: likeEmployee50030,\n isOptimistic: false,\n }),\n );\n\n const firstLoad = subFn1.next.mock.lastCall?.[0]!;\n\n subFn1.next.mockClear();\n\n defer(\n cache.observeObject(Employee, 50030, { mode: \"force\" }, subFn2),\n );\n expectSingleObjectCallAndClear(subFn1, likeEmployee50030, \"loading\");\n\n // should be the earlier results\n expectSingleObjectCallAndClear(subFn2, likeEmployee50030, \"loading\");\n\n // both will be updated\n for (const s of [subFn1, subFn2]) {\n // wait for the result to come in\n await waitForCall(s, 1);\n expect(s.next).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n ...firstLoad,\n lastUpdated: expect.toBeGreaterThan(firstLoad.lastUpdated),\n }),\n );\n\n s.next.mockClear();\n }\n });\n });\n\n describe(\".observeObject (offline)\", () => {\n const subFn = mockSingleSubCallback();\n let sub: Unsubscribable;\n\n beforeEach(() => {\n subFn.complete.mockClear();\n subFn.next.mockClear();\n subFn.error.mockClear();\n\n sub = defer(\n cache.observeObject(Employee, 50030, { mode: \"offline\" }, subFn),\n );\n\n expectSingleObjectCallAndClear(subFn, undefined!, \"init\");\n });\n\n it(\"does basic observation and unsubscribe\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n updateObject(cache, emp);\n expectSingleObjectCallAndClear(subFn, emp);\n\n // force again\n updateObject(cache, emp.$clone({ fullName: \"new name\" }));\n expectSingleObjectCallAndClear(\n subFn,\n emp.$clone({ fullName: \"new name\" }),\n );\n\n sub.unsubscribe();\n\n // force again but no subscription update\n updateObject(cache, emp.$clone({ fullName: \"new name 2\" }));\n expect(subFn.next).not.toHaveBeenCalled();\n });\n\n it(\"observes with list update\", async () => {\n const emp = employeesAsServerReturns[0];\n\n // force an update\n updateObject(cache, emp.$clone({ fullName: \"not the name\" }));\n expect(subFn.next).toHaveBeenCalledTimes(1);\n\n updateList(\n cache,\n { type: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n expect(subFn.next).toHaveBeenCalledTimes(2);\n\n expect(subFn.next.mock.calls[1][0]).toEqual(\n objectPayloadContaining({\n object: emp as unknown as ObjectHolder<typeof emp>,\n }),\n );\n });\n });\n\n describe(\".observeList\", () => {\n const listSub1 = mockListSubCallback();\n const ifaceSub = mockListSubCallback();\n\n beforeEach(() => {\n vi.useFakeTimers({});\n vi.mocked(listSub1.next).mockReset();\n vi.mocked(listSub1.error).mockReset();\n vi.mocked(listSub1.complete).mockReset();\n\n vi.mocked(ifaceSub.next).mockReset();\n vi.mocked(ifaceSub.error).mockReset();\n vi.mocked(ifaceSub.complete).mockReset();\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n describe(\"mode=force\", () => {\n it(\"initial load\", async () => {\n defer(\n cache.observeList({\n type: Employee,\n\n orderBy: {},\n mode: \"force\",\n }, listSub1),\n );\n\n defer(\n cache.observeList({\n type: FooInterface,\n\n orderBy: {},\n mode: \"force\",\n }, ifaceSub),\n );\n\n vitest.runOnlyPendingTimers();\n await waitForCall(listSub1);\n await waitForCall(ifaceSub);\n\n expectSingleListCallAndClear(\n listSub1,\n [],\n { status: \"loading\" },\n );\n\n expectSingleListCallAndClear(\n ifaceSub,\n [],\n { status: \"loading\" },\n );\n\n await waitForCall(listSub1);\n expectSingleListCallAndClear(\n listSub1,\n employeesAsServerReturns,\n {\n status: \"loaded\",\n },\n );\n\n await waitForCall(ifaceSub);\n expectSingleListCallAndClear(\n ifaceSub,\n employeesAsServerReturns.filter(o => o.$primaryKey === 50050),\n {\n status: \"loaded\",\n },\n );\n\n expectNoMoreCalls(listSub1);\n expectNoMoreCalls(ifaceSub);\n\n expect(listSub1.next).not.toHaveBeenCalled();\n expect(listSub1.error).not.toHaveBeenCalled();\n expect(ifaceSub.next).not.toHaveBeenCalled();\n expect(ifaceSub.error).not.toHaveBeenCalled();\n });\n\n it(\"subsequent load\", async () => {\n // Pre-seed with data the server doesn't return\n updateList(\n cache,\n { type: Employee, where: {}, orderBy: {} },\n mutatedEmployees,\n );\n\n defer(\n cache.observeList({\n type: Employee,\n mode: \"force\",\n }, listSub1),\n );\n\n await waitForCall(listSub1, 1);\n const firstLoad = listSub1.next.mock.calls[0][0]!;\n expectSingleListCallAndClear(listSub1, mutatedEmployees, {\n status: \"loading\",\n });\n\n await waitForCall(listSub1, 1);\n expectSingleListCallAndClear(listSub1, employeesAsServerReturns, {\n status: \"loaded\",\n lastUpdated: expect.toBeGreaterThan(\n firstLoad.lastUpdated,\n ),\n });\n });\n });\n\n describe(\"mode = offline\", () => {\n it(\"updates with list updates\", async () => {\n defer(\n cache.observeList({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, listSub1),\n );\n expect(listSub1.next).toHaveBeenCalledTimes(0);\n\n updateList(\n cache,\n { type: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n vitest.runOnlyPendingTimers();\n\n expectSingleListCallAndClear(listSub1, employeesAsServerReturns);\n\n // list is just now one object\n updateList(cache, { type: Employee, where: {}, orderBy: {} }, [\n employeesAsServerReturns[0],\n ]);\n vitest.runOnlyPendingTimers();\n\n expectSingleListCallAndClear(listSub1, [employeesAsServerReturns[0]]);\n });\n\n it(\"updates with different list updates\", async () => {\n defer(\n cache.observeList({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, listSub1),\n );\n\n expect(listSub1.next).toHaveBeenCalledTimes(0);\n\n updateList(\n cache,\n { type: Employee, where: {}, orderBy: {} },\n employeesAsServerReturns,\n );\n vitest.runOnlyPendingTimers();\n\n expectSingleListCallAndClear(listSub1, employeesAsServerReturns);\n\n // new where === different list\n updateList(cache, {\n type: Employee,\n where: { employeeId: { $gt: 0 } },\n orderBy: {},\n }, mutatedEmployees);\n vitest.runOnlyPendingTimers();\n\n // original list updates still\n expectSingleListCallAndClear(listSub1, mutatedEmployees);\n });\n });\n });\n\n describe(\".fetchMore\", () => {\n beforeEach(() => {\n vi.useFakeTimers({});\n });\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"works in the solo case\", async () => {\n const listSub = mockListSubCallback();\n defer(cache.observeList(\n {\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"force\",\n pageSize: 1,\n },\n listSub,\n ));\n\n expect(listSub.next).not.toHaveBeenCalled();\n\n await waitForCall(listSub, 1);\n expectSingleListCallAndClear(listSub, [], { status: \"loading\" });\n\n await waitForCall(listSub, 1);\n const { fetchMore } = listSub.next.mock.calls[0][0]!;\n expectSingleListCallAndClear(\n listSub,\n employeesAsServerReturns.slice(0, 1),\n { status: \"loaded\" },\n );\n\n void fetchMore();\n\n await waitForCall(listSub, 1);\n expectSingleListCallAndClear(\n listSub,\n employeesAsServerReturns.slice(0, 1),\n { status: \"loading\" },\n );\n\n await waitForCall(listSub, 1);\n expectSingleListCallAndClear(\n listSub,\n employeesAsServerReturns.slice(0, 2),\n { status: \"loaded\" },\n );\n });\n });\n });\n\n describe(\"with mock client\", () => {\n let client: Mock<Client> & Client;\n let mockClient: MockClientHelper;\n let store: Store;\n\n beforeEach(async () => {\n mockClient = createClientMockHelper();\n client = mockClient.client;\n store = new Store(client);\n });\n\n it(\"properly fires error handler for a list\", async () => {\n const error = new Error(\"A faux error\");\n mockClient.mockFetchPageOnce().reject(error);\n\n const sub = mockListSubCallback();\n\n store.observeList({\n type: Employee,\n where: {},\n orderBy: {},\n }, sub);\n\n await waitForCall(sub.error, 1);\n\n expect(sub.error).toHaveBeenCalled();\n expect(sub.next).not.toHaveBeenCalled();\n });\n\n describe(\"actions\", () => {\n it(\"properly invalidates objects\", async () => {\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce().resolve({\n $apiName: \"Todo\",\n $primaryKey: 0,\n });\n\n const todoSubFn = mockSingleSubCallback();\n defer(store.observeObject(Todo, 0, {}, todoSubFn));\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n $primaryKey: 0,\n }),\n }),\n });\n\n // at this point we have an observation properly set up\n mockClient.mockApplyActionOnce().resolve({\n addedObjects: [{\n objectType: \"Todo\",\n primaryKey: 0,\n }],\n });\n\n // after we apply the action, the object is invalidated and gets re-requested\n mockClient.mockFetchOneOnce<Todo>().resolve({\n $primaryKey: 0,\n $apiName: \"Todo\",\n text: \"hello there kind sir\",\n });\n\n await store.applyAction(createOffice, {\n officeId: \"whatever\",\n });\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n }),\n loaded: objectPayloadContaining({\n object: expect.objectContaining({\n text: \"hello there kind sir\",\n }),\n }),\n });\n });\n\n it(\"rolls back optimistic updates on error\", async () => {\n const fauxObject = {\n $apiName: \"Todo\",\n $objectType: \"Todo\",\n $primaryKey: 0,\n $title: \"does not matter\",\n } as Osdk.Instance<Todo> & ObjectHolder;\n\n // after the below `observeObject`, the cache will need to load from the server\n mockClient.mockFetchOneOnce<Todo>()\n .resolve(fauxObject);\n\n const todoSubFn = mockSingleSubCallback();\n defer(\n store.observeObject(Todo, 0, {}, todoSubFn),\n );\n\n await todoSubFn.expectLoadingAndLoaded({\n loading: objectPayloadContaining({\n status: \"loading\",\n object: undefined,\n isOptimistic: false,\n }),\n loaded: objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n });\n\n // at this point we have an observation properly set up\n const applyActionResult = mockClient.mockApplyActionOnce();\n\n const actionPromise = store.applyAction(createOffice, {\n officeId: \"whatever\",\n }, {\n optimisticUpdate: (ctx) => {\n ctx.updateObject({ ...fauxObject, text: \"optimistic\" });\n },\n });\n\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn.next).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: {\n ...fauxObject,\n text: \"optimistic\",\n },\n status: \"loading\",\n isOptimistic: true,\n }),\n );\n todoSubFn.next.mockClear();\n\n // let the action error out\n applyActionResult.reject(\"an error thrown\");\n await expect(actionPromise).rejects.toThrow(\"an error thrown\");\n\n // back to the original object\n await waitForCall(todoSubFn, 1);\n expect(todoSubFn.next).toHaveBeenCalledExactlyOnceWith(\n objectPayloadContaining({\n object: fauxObject,\n status: \"loaded\",\n isOptimistic: false,\n }),\n );\n });\n });\n\n describe(\"orderBy\", async () => {\n const ontologyProvider: OntologyProvider = {\n getObjectDefinition: async (apiName) => {\n return {\n ...wireObjectTypeFullMetadataToSdkObjectMetadata(\n stubData.todoWithLinkTypes,\n true,\n ),\n [InterfaceDefinitions]: {},\n };\n },\n getActionDefinition(apiName) {\n throw new Error(\"not implemented\");\n },\n getInterfaceDefinition(apiName) {\n throw new Error(\"not implemented\");\n },\n getQueryDefinition(apiName) {\n throw new Error(\"not implemented\");\n },\n };\n\n const minimalClient = createMinimalClient(\n { ontologyRid: \"ri.whatever\" },\n \"https://localhost:8080\",\n () => Promise.resolve(\"token\"),\n { logger },\n fetch,\n createObjectSet,\n (opts) => (client) => ontologyProvider,\n );\n\n async function createObject<\n X extends ObjectTypeDefinition,\n WeakSauce extends boolean = false,\n >(\n type: X,\n x:\n // & OntologyObjectV2\n & Omit<\n OsdkBase<WeakSauce extends true ? ObjectTypeDefinition : X>,\n \"$apiName\" | \"$objectType\" | \"$objectSpecifier\"\n >\n & CompileTimeMetadata<X>[\"props\"],\n ) {\n return (await minimalClient.objectFactory2(\n minimalClient,\n [{\n ...x,\n $apiName: type.apiName,\n $objectType: type.apiName,\n $objectSpecifier: `${type.apiName}:${x.$primaryKey}`,\n }],\n undefined,\n ))[0] as ObjectHolder & Osdk.Instance<X>;\n }\n\n let nextPk = 0;\n const fauxObjectA = await createObject(Todo, {\n $primaryKey: nextPk,\n $title: \"a\",\n id: nextPk,\n text: \"a\",\n });\n\n nextPk++;\n const fauxObjectB = await createObject(Todo, {\n $primaryKey: nextPk,\n $title: \"b\",\n id: nextPk,\n text: \"b\",\n });\n\n nextPk++;\n const fauxObjectC = await createObject(Todo, {\n $primaryKey: nextPk,\n $title: \"c\",\n id: nextPk,\n text: \"c\",\n });\n\n const noWhereNoOrderBy = {\n type: Todo,\n where: {},\n orderBy: {},\n } satisfies ObserveListOptions<Todo>;\n\n const noWhereOrderByText = {\n type: Todo,\n where: {},\n orderBy: {\n text: \"asc\",\n },\n } satisfies ObserveListOptions<Todo>;\n\n const subListUnordered = mockListSubCallback();\n const subListOrdered = mockListSubCallback();\n\n beforeEach(() => {\n defer(\n store.observeList({\n ...noWhereNoOrderBy,\n mode: \"offline\",\n }, subListUnordered),\n );\n expect(subListUnordered.next).toHaveBeenCalledTimes(0);\n\n defer(\n store.observeList({\n ...noWhereOrderByText,\n mode: \"offline\",\n }, subListOrdered),\n );\n expect(subListOrdered.next).toHaveBeenCalledTimes(0);\n });\n\n it(\"invalidates the correct lists\", async () => {\n // for whatever reason, the first list is loaded as [B, A]\n updateList(store, noWhereNoOrderBy, [fauxObjectB, fauxObjectA]);\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n );\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n );\n\n // For whatever reason, object B is no longer in the first set (use your imagination)\n // but we have added a C before A. So the first list is [C, A]\n updateList(store, { type: Todo, where: {}, orderBy: {} }, [\n fauxObjectC,\n fauxObjectA,\n ]);\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectC, fauxObjectA],\n );\n\n // Nothing told the system that B was deleted so we can presume it still exists\n // and therefore the second list is now [A, B, C]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB, fauxObjectC],\n );\n });\n\n it(\"produces proper results with optimistic updates and successful action\", async () => {\n const optimisticallyMutatedA = await createObject<Todo, true>(Todo, {\n ...fauxObjectA,\n text: \"optimistic\",\n });\n const pkForOptimistic = nextPk++;\n const optimisticallyCreatedObjectD = await createObject(Todo, {\n \"$primaryKey\": pkForOptimistic,\n \"$title\": \"d\",\n \"text\": \"d\",\n id: pkForOptimistic,\n });\n\n // for whatever reason, the first list is loaded as [B, A]\n updateList(store, noWhereNoOrderBy, [fauxObjectB, fauxObjectA]);\n\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n );\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n );\n\n testStage(\"Start\");\n\n // the optimistic job will call createObject which triggers the `objectFactory2` of the\n // cache context.\n mockClient.mockObjectFactory2Once().resolve([\n optimisticallyCreatedObjectD,\n ]);\n\n // Perform something optimistic.\n const removeOptimisticResult = runOptimisticJob(store, (b) => {\n b.createObject(Todo, pkForOptimistic, {\n id: pkForOptimistic,\n text: \"d\",\n });\n b.updateObject(optimisticallyMutatedA as Osdk.Instance<any>);\n });\n\n // The first list is now [B, A, optimistic]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [\n fauxObjectB,\n optimisticallyMutatedA, // same position, new values\n optimisticallyCreatedObjectD,\n ],\n { isOptimistic: true },\n );\n\n // the second list is now [A, B, optimistic]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [\n fauxObjectB,\n optimisticallyCreatedObjectD,\n optimisticallyMutatedA,\n ],\n { isOptimistic: true },\n );\n\n // Roll back the optimistic update\n await removeOptimisticResult();\n\n // The first list is now [B, A]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(\n subListUnordered,\n [fauxObjectB, fauxObjectA],\n { isOptimistic: false },\n );\n\n // the second list is now [A, B]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [fauxObjectA, fauxObjectB],\n { isOptimistic: false },\n );\n });\n // I think these are named backwards\n it(\"produces proper results with optimistic updates and rollback\", async () => {\n const pkForOptimistic = nextPk++;\n const optimisticallyCreatedObjectD = await createObject<Todo>(Todo, {\n \"$primaryKey\": pkForOptimistic,\n \"$title\": \"d\",\n \"text\": \"d\",\n id: pkForOptimistic,\n });\n\n const optimisticallyMutatedA = await createObject<Todo, true>(Todo, {\n ...fauxObjectA,\n text: \"optimistic\",\n });\n\n testStage(\"Initial Setup\");\n\n // later we will \"create\" this object\n const createdObjectD = await createObject<Todo>(Todo, {\n \"$primaryKey\": 9000,\n \"$title\": \"d prime\",\n \"text\": \"d prime\",\n id: 9000,\n });\n\n // for whatever reason, the first list is loaded as [B, A]\n updateList(store, noWhereNoOrderBy, [fauxObjectB, fauxObjectA]);\n\n await waitForCall(subListUnordered, 1);\n\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n fauxObjectA,\n ]);\n\n // The other list definitely matches on the where clause and we can insert\n // orderBy properly. So this is [A, B]\n expectSingleListCallAndClear(subListOrdered, [\n fauxObjectA,\n fauxObjectB,\n ]);\n\n testStage(\"Optimistic Creation\");\n\n // the optimistic job will call createObject which triggers the `objectFactory2` of the\n // cache context.\n\n mockClient.mockObjectFactory2Once().resolve([\n optimisticallyCreatedObjectD,\n ]);\n\n const mockedApplyAction = mockClient.mockApplyActionOnce();\n\n testStage(\"Apply Action\");\n\n const actionPromise = store.applyAction(\n createOffice,\n { officeId: \"5\" },\n {\n optimisticUpdate: (b) => {\n b.createObject(Todo, optimisticallyCreatedObjectD.$primaryKey, {\n id: optimisticallyCreatedObjectD.$primaryKey,\n text: \"d\",\n });\n b.updateObject(optimisticallyMutatedA);\n },\n },\n );\n\n testStage(\"Optimistic Updates\");\n\n // The first list is now [B, A, optimistic]\n await waitForCall(subListUnordered, 1);\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n optimisticallyMutatedA, // same position, new values\n optimisticallyCreatedObjectD,\n ], { isOptimistic: true });\n\n // the second list is now [B, optimistic, optimistic a]\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(subListOrdered, [\n fauxObjectB,\n optimisticallyCreatedObjectD,\n optimisticallyMutatedA,\n ], { isOptimistic: true });\n\n testStage(\"Resolve Action\");\n\n const modifiedObjectA = await createObject<Todo>(Todo, {\n ...fauxObjectA,\n text: \"a prime\",\n });\n\n // console.log(\"winner?\", modifiedObjectA.$as);\n // // throw \"hi\";\n // console.log(\"winner2?\", modifiedObjectA.$as(\"Todo\").$as);\n\n // The action will complete and then revalidate in order...\n mockClient.mockFetchOneOnce<Todo>(modifiedObjectA.$primaryKey)\n .resolve(modifiedObjectA);\n\n mockClient.mockFetchOneOnce<Todo>(createdObjectD.$primaryKey)\n .resolve(createdObjectD);\n\n // this order matters!\n // but now we don't need them because we just update lists instead of revalidate when we can\n // const plainList = mockClient.mockFetchPageOnce<Todo>();\n // const orderedList = mockClient.mockFetchPageOnce<Todo>();\n\n mockedApplyAction.resolve({\n addedObjects: [\n {\n objectType: \"Todo\",\n primaryKey: createdObjectD.id,\n },\n ],\n modifiedObjects: [\n {\n objectType: \"Todo\",\n primaryKey: fauxObjectA.$primaryKey,\n },\n ],\n });\n\n // plainList.resolve({\n // nextPageToken: undefined,\n // totalCount: \"4\",\n // data: [fauxObjectB, fauxObjectC, modifiedObjectA, createdObjectD],\n // });\n\n // orderedList.resolve({\n // nextPageToken: undefined,\n // totalCount: \"4\",\n // data: [modifiedObjectA, fauxObjectC, createdObjectD],\n // });\n\n await actionPromise;\n\n await waitForCall(subListUnordered, 1);\n console.log(\"=====\", subListUnordered.next.mock.calls[0][0]);\n expectSingleListCallAndClear(subListUnordered, [\n fauxObjectB,\n // fauxObjectC,\n modifiedObjectA,\n createdObjectD,\n ], { isOptimistic: false });\n\n await waitForCall(subListOrdered, 1);\n expectSingleListCallAndClear(\n subListOrdered,\n [modifiedObjectA, fauxObjectB, createdObjectD],\n { isOptimistic: false },\n );\n });\n });\n });\n\n describe(\"layers\", () => {\n it(\"properly remove\", () => {\n const clientHelper = createClientMockHelper();\n const store = new Store(clientHelper.client);\n\n const baseObjects = [1, 2].map((i) => ({\n $primaryKey: i,\n $objectType: \"Employee\",\n $apiName: \"Employee\",\n $title: `truth ${i}`,\n } as Osdk.Instance<Employee>));\n\n const cacheKeys = baseObjects.map((obj) =>\n store.getCacheKey(\"object\", \"Employee\", obj.$primaryKey)\n );\n\n // set the truth\n for (const obj of baseObjects) {\n updateObject(store, obj);\n }\n\n // expect the truth\n for (const obj of baseObjects) {\n expect(getObject(store, \"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n\n const layerIds = [1, 2].map(createOptimisticId);\n\n // optimistically set the objects in their own layers\n for (let i = 0; i < 2; i++) {\n store.batch({ optimisticId: layerIds[i] }, (batch) => {\n batch.write(\n cacheKeys[i],\n {\n ...baseObjects[i],\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n },\n \"loading\",\n );\n });\n }\n\n // expect the optimistic values\n for (let i = 0; i < 2; i++) {\n expect(getObject(store, \"Employee\", baseObjects[i].$primaryKey))\n .toEqual(\n expect.objectContaining({\n $title: `optimistic ${baseObjects[i].$primaryKey}`,\n }),\n );\n }\n\n // remove the first layer\n store.removeLayer(layerIds[0]);\n\n // should have truth object 1 and optimistic object 2\n expect(getObject(store, \"Employee\", 1)).toEqual(\n expect.objectContaining({ $title: \"truth 1\" }),\n );\n expect(getObject(store, \"Employee\", 2)).toEqual(\n expect.objectContaining({ $title: \"optimistic 2\" }),\n );\n\n // remove the second layer\n store.removeLayer(layerIds[1]);\n\n // should have truth objects\n for (const obj of baseObjects) {\n expect(getObject(store, \"Employee\", obj.$primaryKey)).toEqual(\n expect.objectContaining({ $title: `truth ${obj.$primaryKey}` }),\n );\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -18,6 +18,14 @@ import { Trie } from "@wry/trie";
18
18
  import deepEqual from "fast-deep-equal";
19
19
  import invariant from "tiny-invariant";
20
20
  export class WhereClauseCanonicalizer {
21
+ /**
22
+ * This is a shortcut cache for any WhereClause's that we have
23
+ * seen and already canonicalized. The theory behind this
24
+ * is that well behaving React applications will either `useMemo`
25
+ * their where clause, or store it in state or pass it through as
26
+ * props such that we are likely to get the same WhereClause
27
+ * object multiple times and we can skip unnecessary work.
28
+ */
21
29
  #cache = new WeakMap();
22
30
 
23
31
  /**
@@ -38,14 +46,14 @@ export class WhereClauseCanonicalizer {
38
46
  return this.#cache.get(where);
39
47
  }
40
48
  const keysSet = new Set();
41
- const tmpCanon = this.#toCanon(where, keysSet);
49
+ const calculatedCanon = this.#toCanon(where, keysSet);
42
50
  const cacheKey = this.#trie.lookupArray(Array.from(keysSet).sort());
43
51
  const lookupEntry = this.#existingOptions.get(cacheKey) ?? {
44
52
  options: []
45
53
  };
46
54
  this.#existingOptions.set(cacheKey, lookupEntry);
47
- const canon = lookupEntry.options.find(ref => deepEqual(ref.deref(), tmpCanon))?.deref() ?? tmpCanon;
48
- if (canon === tmpCanon) {
55
+ const canon = lookupEntry.options.find(ref => deepEqual(ref.deref(), calculatedCanon))?.deref() ?? calculatedCanon;
56
+ if (canon === calculatedCanon) {
49
57
  // This means no existing options were found
50
58
  lookupEntry.options.push(new WeakRef(canon));
51
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WhereClauseCanonicalizer.js","names":["Trie","deepEqual","invariant","WhereClauseCanonicalizer","cache","WeakMap","trie","existingOptions","Map","canonicalize","where","has","get","keysSet","Set","tmpCanon","toCanon","cacheKey","lookupArray","Array","from","sort","lookupEntry","options","set","canon","find","ref","deref","push","WeakRef","#toCanon","process","env","NODE_ENV","isArray","$and","Object","keys","length","fromEntries","entries","a","b","localeCompare","map","k","v","add","x"],"sources":["WhereClauseCanonicalizer.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 { ObjectOrInterfaceDefinition, WhereClause } from \"@osdk/api\";\nimport { Trie } from \"@wry/trie\";\nimport deepEqual from \"fast-deep-equal\";\nimport invariant from \"tiny-invariant\";\nimport type { Canonical } from \"./Canonical.js\";\n\nexport class WhereClauseCanonicalizer {\n #cache = new WeakMap<WhereClause<any>, Canonical<WhereClause<any>>>();\n\n /**\n * This is a trie that stores the sorted collapsed keys of a where clause to\n * the cache key for canonicalized options. In theory this keeps the number of\n * deepEqual comparisons down to a minimum but its probably overkill.\n */\n #trie = new Trie<object>();\n\n /**\n * This is a cache from the cacheKey provided by `this.#trie` to the potential\n * canonicalized options.\n */\n #existingOptions: Map<object, {\n options: WeakRef<Canonical<WhereClause<any>>>[];\n }> = new Map();\n\n public canonicalize<T extends ObjectOrInterfaceDefinition>(\n where: WhereClause<T>,\n ): Canonical<WhereClause<T>> {\n // fastest shortcut\n if (this.#cache.has(where)) {\n return this.#cache.get(where)! as Canonical<WhereClause<T>>;\n }\n\n const keysSet = new Set<string>();\n const tmpCanon = this.#toCanon(where, keysSet);\n const cacheKey = this.#trie.lookupArray(Array.from(keysSet).sort());\n const lookupEntry = this.#existingOptions.get(cacheKey)\n ?? { options: [] as WeakRef<Canonical<WhereClause<T>>>[] };\n this.#existingOptions.set(cacheKey, lookupEntry);\n\n const canon =\n lookupEntry.options.find((ref) => deepEqual(ref.deref(), tmpCanon))\n ?.deref()\n ?? tmpCanon;\n\n if (canon === tmpCanon) {\n // This means no existing options were found\n lookupEntry.options.push(new WeakRef(canon));\n }\n\n this.#cache.set(where, canon);\n return canon as Canonical<WhereClause<T>>;\n }\n\n #toCanon = <T extends ObjectOrInterfaceDefinition>(\n where: WhereClause<T>,\n set: Set<string> = new Set<string>(),\n ): Canonical<WhereClause<T>> => {\n if (\"$and\" in where) {\n if (process.env.NODE_ENV !== \"production\") {\n invariant(Array.isArray(where.$and), \"expected $and to be an array\");\n invariant(\n Object.keys(where).length === 1,\n \"expected only $and to be present\",\n );\n }\n if ((where as { $and: WhereClause<T>[] }).$and.length === 0) {\n // empty $and is a no-op\n return {} as Canonical<WhereClause<T>>;\n }\n if ((where as { $and: WhereClause<T>[] }).$and.length === 1) {\n return this.#toCanon(\n (where as { $and: WhereClause<T>[] }).$and[0],\n set,\n );\n }\n }\n // This is incomplete for all the cases possible but it gets us started\n\n return Object.fromEntries(\n Object.entries(where)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => {\n set.add(k);\n if (k === \"$and\" || k === \"$or\") {\n return [k, (v as Array<any>).map(x => this.#toCanon(x, set))];\n }\n if (k !== \"$not\" && typeof v === \"object\" && \"$eq\" in v) {\n return [k, v[\"$eq\"]];\n }\n return [k, v];\n }),\n ) as Canonical<WhereClause<T>>;\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"WhereClauseCanonicalizer.js","names":["Trie","deepEqual","invariant","WhereClauseCanonicalizer","cache","WeakMap","trie","existingOptions","Map","canonicalize","where","has","get","keysSet","Set","calculatedCanon","toCanon","cacheKey","lookupArray","Array","from","sort","lookupEntry","options","set","canon","find","ref","deref","push","WeakRef","#toCanon","process","env","NODE_ENV","isArray","$and","Object","keys","length","fromEntries","entries","a","b","localeCompare","map","k","v","add","x"],"sources":["WhereClauseCanonicalizer.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 { ObjectOrInterfaceDefinition, WhereClause } from \"@osdk/api\";\nimport { Trie } from \"@wry/trie\";\nimport deepEqual from \"fast-deep-equal\";\nimport invariant from \"tiny-invariant\";\nimport type { Canonical } from \"./Canonical.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\n\nexport class WhereClauseCanonicalizer {\n /**\n * This is a shortcut cache for any WhereClause's that we have\n * seen and already canonicalized. The theory behind this\n * is that well behaving React applications will either `useMemo`\n * their where clause, or store it in state or pass it through as\n * props such that we are likely to get the same WhereClause\n * object multiple times and we can skip unnecessary work.\n */\n #cache = new WeakMap<\n WhereClause<any> | SimpleWhereClause,\n Canonical<SimpleWhereClause>\n >();\n\n /**\n * This is a trie that stores the sorted collapsed keys of a where clause to\n * the cache key for canonicalized options. In theory this keeps the number of\n * deepEqual comparisons down to a minimum but its probably overkill.\n */\n #trie = new Trie<object>();\n\n /**\n * This is a cache from the cacheKey provided by `this.#trie` to the potential\n * canonicalized options.\n */\n #existingOptions: Map<object, {\n options: WeakRef<Canonical<SimpleWhereClause>>[];\n }> = new Map();\n\n public canonicalize<T extends ObjectOrInterfaceDefinition>(\n where: WhereClause<T> | SimpleWhereClause,\n ): Canonical<SimpleWhereClause> {\n // fastest shortcut\n if (this.#cache.has(where)) {\n return this.#cache.get(where)!;\n }\n\n const keysSet = new Set<string>();\n const calculatedCanon = this.#toCanon(where, keysSet);\n const cacheKey = this.#trie.lookupArray(Array.from(keysSet).sort());\n const lookupEntry = this.#existingOptions.get(cacheKey)\n ?? { options: [] as WeakRef<Canonical<SimpleWhereClause>>[] };\n this.#existingOptions.set(cacheKey, lookupEntry);\n\n const canon =\n lookupEntry.options.find((ref) => deepEqual(ref.deref(), calculatedCanon))\n ?.deref()\n ?? calculatedCanon;\n\n if (canon === calculatedCanon) {\n // This means no existing options were found\n lookupEntry.options.push(new WeakRef(canon));\n }\n\n this.#cache.set(where, canon);\n return canon;\n }\n\n #toCanon = <T extends ObjectOrInterfaceDefinition>(\n where: WhereClause<T> | SimpleWhereClause,\n set: Set<string> = new Set<string>(),\n ): Canonical<SimpleWhereClause> => {\n if (\"$and\" in where) {\n if (process.env.NODE_ENV !== \"production\") {\n invariant(Array.isArray(where.$and), \"expected $and to be an array\");\n invariant(\n Object.keys(where).length === 1,\n \"expected only $and to be present\",\n );\n }\n if ((where as { $and: SimpleWhereClause[] }).$and.length === 0) {\n // empty $and is a no-op\n return {} as Canonical<SimpleWhereClause>;\n }\n if ((where as { $and: SimpleWhereClause[] }).$and.length === 1) {\n return this.#toCanon(\n (where as { $and: SimpleWhereClause[] }).$and[0],\n set,\n );\n }\n }\n // This is incomplete for all the cases possible but it gets us started\n\n return Object.fromEntries(\n Object.entries(where)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => {\n set.add(k);\n if (k === \"$and\" || k === \"$or\") {\n return [k, (v as Array<any>).map(x => this.#toCanon(x, set))];\n }\n if (k !== \"$not\" && typeof v === \"object\" && \"$eq\" in v) {\n return [k, v[\"$eq\"]];\n }\n return [k, v];\n }),\n ) as Canonical<SimpleWhereClause>;\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"objectMatchesWhereClause.js","names":["deepEqual","invariant","is$and","whereClause","process","env","NODE_ENV","Array","isArray","$and","Object","keys","length","is$or","$or","is$not","objectSortaMatchesWhereClause","o","strict","every","w","some","$not","entries","key","filter","realValue","f","expected","$in","includes","startsWith"],"sources":["objectMatchesWhereClause.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 ObjectTypeDefinition,\n Osdk,\n PossibleWhereClauseFilters,\n WhereClause,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport invariant from \"tiny-invariant\";\n\nfunction is$and(\n whereClause: WhereClause<ObjectTypeDefinition>,\n): whereClause is { $and: WhereClause<ObjectTypeDefinition>[] } {\n if (process.env.NODE_ENV !== \"production\") {\n if (\"$and\" in whereClause) {\n invariant(\n Array.isArray(whereClause.$and),\n \"expected $and to be an array\",\n );\n invariant(\n Object.keys(whereClause).length === 1,\n \"expected only $and to be present\",\n );\n }\n }\n return \"$and\" in whereClause;\n}\n\nfunction is$or(\n whereClause: WhereClause<ObjectTypeDefinition>,\n): whereClause is { $or: WhereClause<ObjectTypeDefinition>[] } {\n if (process.env.NODE_ENV !== \"production\") {\n if (\"$or\" in whereClause) {\n invariant(\n Array.isArray(whereClause.$or),\n \"expected $or to be an array\",\n );\n invariant(\n Object.keys(whereClause).length === 1,\n \"expected only $or to be present\",\n );\n }\n }\n return \"$or\" in whereClause;\n}\n\nfunction is$not(\n whereClause: WhereClause<ObjectTypeDefinition>,\n): whereClause is { $not: WhereClause<ObjectTypeDefinition> } {\n if (process.env.NODE_ENV !== \"production\") {\n if (\"$not\" in whereClause) {\n invariant(\n Object.keys(whereClause).length === 1,\n \"expected only $not to be present\",\n );\n }\n }\n\n return \"$not\" in whereClause;\n}\n\nexport function objectSortaMatchesWhereClause(\n o: Osdk.Instance<ObjectTypeDefinition>,\n whereClause: WhereClause<ObjectTypeDefinition>,\n strict: boolean,\n): boolean {\n if (deepEqual({}, whereClause)) {\n return true;\n }\n\n if (is$and(whereClause)) {\n return whereClause.$and.every(w =>\n objectSortaMatchesWhereClause(o, w, strict)\n );\n }\n if (is$or(whereClause)) {\n return whereClause.$or.some(w =>\n objectSortaMatchesWhereClause(o, w, strict)\n );\n }\n if (is$not(whereClause)) {\n return !objectSortaMatchesWhereClause(o, whereClause.$not, strict);\n }\n\n return Object.entries(whereClause).every(([key, filter]) => {\n if (typeof filter === \"object\") {\n const realValue = o[key as keyof typeof o];\n const [f] = Object.keys(filter) as Array<PossibleWhereClauseFilters>;\n const expected = (filter as any)[f];\n switch (f) {\n case \"$eq\":\n return realValue === expected;\n case \"$gt\":\n return realValue > expected;\n case \"$lt\":\n return realValue < expected;\n case \"$gte\":\n return realValue >= expected;\n case \"$lte\":\n return realValue <= expected;\n case \"$ne\":\n return realValue !== expected;\n case \"$in\":\n return expected.$in.includes(realValue);\n case \"$isNull\":\n return realValue == null;\n case \"$startsWith\":\n return realValue.startsWith(\n expected,\n );\n case \"$contains\":\n case \"$containsAllTerms\":\n case \"$containsAllTermsInOrder\":\n case \"$containsAnyTerm\":\n case \"$intersects\":\n case \"$within\":\n // for these we will strictly say no and loosely say yes\n // so that they don't change things now but may if reloaded\n return !strict;\n\n default:\n // same thing here as the above cases but we will catch the\n // exhaustive check in dev\n if (process.env.NODE_ENV !== \"production\") {\n const exhaustive: never = f;\n invariant(false, `Unknown where filter ${f}`);\n }\n return !strict;\n }\n }\n\n // console.log(\"AAAA\", key in o, o[key], filter);\n if (key in o) {\n if (o[key as keyof typeof o] === filter) {\n return true;\n }\n }\n return false;\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"objectMatchesWhereClause.js","names":["deepEqual","invariant","is$and","whereClause","process","env","NODE_ENV","Array","isArray","$and","Object","keys","length","is$or","$or","is$not","objectSortaMatchesWhereClause","o","strict","every","w","some","$not","entries","key","filter","realValue","f","expected","$in","includes","startsWith"],"sources":["objectMatchesWhereClause.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 { PossibleWhereClauseFilters } from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport invariant from \"tiny-invariant\";\nimport type { InterfaceHolder } from \"../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport type { ObjectHolder } from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\n\nfunction is$and(\n whereClause: SimpleWhereClause,\n): whereClause is { $and: SimpleWhereClause[] } {\n if (process.env.NODE_ENV !== \"production\") {\n if (\"$and\" in whereClause) {\n invariant(\n Array.isArray(whereClause.$and),\n \"expected $and to be an array\",\n );\n invariant(\n Object.keys(whereClause).length === 1,\n \"expected only $and to be present\",\n );\n }\n }\n return \"$and\" in whereClause;\n}\n\nfunction is$or(\n whereClause: SimpleWhereClause,\n): whereClause is { $or: SimpleWhereClause[] } {\n if (process.env.NODE_ENV !== \"production\") {\n if (\"$or\" in whereClause) {\n invariant(\n Array.isArray(whereClause.$or),\n \"expected $or to be an array\",\n );\n invariant(\n Object.keys(whereClause).length === 1,\n \"expected only $or to be present\",\n );\n }\n }\n return \"$or\" in whereClause;\n}\n\nfunction is$not(\n whereClause: SimpleWhereClause,\n): whereClause is { $not: SimpleWhereClause } {\n if (process.env.NODE_ENV !== \"production\") {\n if (\"$not\" in whereClause) {\n invariant(\n Object.keys(whereClause).length === 1,\n \"expected only $not to be present\",\n );\n }\n }\n\n return \"$not\" in whereClause;\n}\n\nexport function objectSortaMatchesWhereClause(\n o: ObjectHolder | InterfaceHolder,\n whereClause: SimpleWhereClause,\n strict: boolean,\n): boolean {\n if (deepEqual({}, whereClause)) {\n return true;\n }\n\n if (is$and(whereClause)) {\n return whereClause.$and.every(w =>\n objectSortaMatchesWhereClause(o, w, strict)\n );\n }\n if (is$or(whereClause)) {\n return whereClause.$or.some(w =>\n objectSortaMatchesWhereClause(o, w, strict)\n );\n }\n if (is$not(whereClause)) {\n return !objectSortaMatchesWhereClause(o, whereClause.$not, strict);\n }\n\n return Object.entries(whereClause).every(([key, filter]) => {\n if (typeof filter === \"object\") {\n const realValue: any = o[key as keyof typeof o];\n const [f] = Object.keys(filter) as Array<PossibleWhereClauseFilters>;\n const expected = (filter as any)[f];\n switch (f) {\n case \"$eq\":\n return realValue === expected;\n case \"$gt\":\n return realValue > expected;\n case \"$lt\":\n return realValue < expected;\n case \"$gte\":\n return realValue >= expected;\n case \"$lte\":\n return realValue <= expected;\n case \"$ne\":\n return realValue !== expected;\n case \"$in\":\n return expected.$in.includes(realValue);\n case \"$isNull\":\n return realValue == null;\n case \"$startsWith\":\n return realValue.startsWith(\n expected,\n );\n case \"$contains\":\n case \"$containsAllTerms\":\n case \"$containsAllTermsInOrder\":\n case \"$containsAnyTerm\":\n case \"$intersects\":\n case \"$within\":\n // for these we will strictly say no and loosely say yes\n // so that they don't change things now but may if reloaded\n return !strict;\n\n default:\n // same thing here as the above cases but we will catch the\n // exhaustive check in dev\n if (process.env.NODE_ENV !== \"production\") {\n const exhaustive: never = f;\n invariant(false, `Unknown where filter ${f}`);\n }\n return !strict;\n }\n }\n\n // console.log(\"AAAA\", key in o, o[key], filter);\n if (key in o) {\n if (o[key as keyof typeof o] === filter) {\n return true;\n }\n }\n return false;\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"objectMatchesWhereClause.test.js","names":["describe","expect","expectTypeOf","it","objectSortaMatchesWhereClause","fauxObject","attachment","undefined","attachment2","attachmentArray","boolean","booleanArray","byte","byteArray","date","dateArray","dateTime","Date","toISOString","dateTimeArray","decimal","decimalArray","double","doubleArray","float","floatArray","geoPoint","type","coordinates","geoPointArray","geoShape","geoShapeArray","id","integer","integerArray","long","longArray","mediaReference","short","shortArray","string","stringArray","objects","whereClauses","booleanTrue","stringStartsWithHi","$startsWith","stringStartsWithBye","mediaReferenceIsNull","$isNull","mediaReferenceNotIsNull","$not","geopointIntersects","$intersects","$bbox","empty","stringStartsWithHiAndBye","$and","stringStartsWithHiOrBye","$or","whereStrictAndNot","whereStrictOrNot","push","cases","toEqualTypeOf","each","instanceName","whereClauseName","strictExpected","nonStrictExpected","instance","whereClause","toBeDefined","toBe"],"sources":["objectMatchesWhereClause.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Osdk, WhereClause } from \"@osdk/api\";\nimport type { objectTypeWithAllPropertyTypes } from \"@osdk/client.test.ontology\";\nimport { describe, expect, expectTypeOf, it } from \"vitest\";\nimport { objectSortaMatchesWhereClause } from \"./objectMatchesWhereClause.js\";\n\nconst fauxObject: Osdk.Instance<objectTypeWithAllPropertyTypes> = {\n attachment: undefined,\n attachment2: undefined,\n attachmentArray: [],\n boolean: true,\n booleanArray: [],\n byte: 5,\n byteArray: [],\n date: \"2024-01-01\",\n dateArray: [],\n dateTime: new Date().toISOString(),\n dateTimeArray: [],\n decimal: \"5.3\",\n decimalArray: [],\n double: 5.5,\n doubleArray: [],\n float: 5.6,\n floatArray: [],\n geoPoint: {\n type: \"Point\",\n coordinates: [5, 5],\n },\n geoPointArray: [],\n geoShape: undefined,\n geoShapeArray: [],\n id: 5,\n integer: 6,\n integerArray: [],\n long: \"5\",\n longArray: [],\n mediaReference: undefined,\n short: 5,\n shortArray: [],\n string: \"Hi there\",\n stringArray: [],\n} satisfies objectTypeWithAllPropertyTypes.Props as unknown as Osdk.Instance<\n objectTypeWithAllPropertyTypes\n>;\n\nconst objects = {\n fauxObject,\n};\n\nconst whereClauses = {\n booleanTrue: {\n boolean: true,\n },\n stringStartsWithHi: {\n string: {\n $startsWith: \"Hi\",\n },\n },\n stringStartsWithBye: {\n string: {\n $startsWith: \"Bye\",\n },\n },\n mediaReferenceIsNull: {\n mediaReference: { $isNull: true },\n },\n mediaReferenceNotIsNull: {\n $not: {\n mediaReference: { $isNull: true },\n },\n },\n geopointIntersects: {\n geoPoint: {\n $intersects: {\n $bbox: [5, 3, 3, 2],\n },\n },\n },\n empty: {},\n stringStartsWithHiAndBye: {\n $and: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n stringStartsWithHiOrBye: {\n $or: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n whereStrictAndNot: {\n $and: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n whereStrictOrNot: {\n $or: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n} satisfies Record<\n string,\n WhereClause<objectTypeWithAllPropertyTypes>\n>;\n\nwhereClauses.stringStartsWithHiAndBye.$and.push(\n whereClauses.stringStartsWithHi,\n whereClauses.stringStartsWithBye,\n);\n\nwhereClauses.stringStartsWithHiOrBye.$or.push(\n whereClauses.stringStartsWithHi,\n whereClauses.stringStartsWithBye,\n);\n\nwhereClauses.whereStrictAndNot.$and.push(\n whereClauses.stringStartsWithHi,\n whereClauses.geopointIntersects,\n);\n\nwhereClauses.whereStrictOrNot.$or.push(\n whereClauses.stringStartsWithHi,\n whereClauses.geopointIntersects,\n);\n\nconst cases = [\n [\"fauxObject\", \"empty\", true, true],\n [\"fauxObject\", \"booleanTrue\", true, true],\n [\"fauxObject\", \"stringStartsWithHi\", true, true],\n [\"fauxObject\", \"stringStartsWithBye\", false, false],\n [\"fauxObject\", \"mediaReferenceIsNull\", true, true],\n [\"fauxObject\", \"mediaReferenceNotIsNull\", false, false],\n [\"fauxObject\", \"geopointIntersects\", false, true],\n [\"fauxObject\", \"stringStartsWithHiAndBye\", false, false],\n [\"fauxObject\", \"stringStartsWithHiOrBye\", true, true],\n [\"fauxObject\", \"whereStrictAndNot\", false, true],\n [\"fauxObject\", \"whereStrictOrNot\", true, true],\n] satisfies Array<\n [keyof typeof objects, keyof typeof whereClauses, boolean, boolean]\n>;\n\ntype usedWhereClauses = typeof cases[number][1];\ntype unusedWhereClauses = Exclude<keyof typeof whereClauses, usedWhereClauses>;\nexpectTypeOf<never>().toEqualTypeOf<unusedWhereClauses>;\n\ndescribe(objectSortaMatchesWhereClause, () => {\n it.each<[keyof typeof objects, keyof typeof whereClauses, boolean, boolean]>(\n cases,\n )(\n \"%s | %s ==> { strict: %s, loose: %s }\",\n (instanceName, whereClauseName, strictExpected, nonStrictExpected) => {\n const instance = objects[instanceName];\n const whereClause = whereClauses[whereClauseName] as WhereClause<\n objectTypeWithAllPropertyTypes\n >;\n expect(instance).toBeDefined();\n expect(whereClause).toBeDefined();\n expect(objectSortaMatchesWhereClause(instance, whereClause, true)).toBe(\n strictExpected,\n );\n\n expect(objectSortaMatchesWhereClause(instance, whereClause, false))\n .toBe(nonStrictExpected);\n },\n );\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"objectMatchesWhereClause.test.js","names":["describe","expect","expectTypeOf","it","objectSortaMatchesWhereClause","fauxObject","attachment","undefined","attachment2","attachmentArray","boolean","booleanArray","byte","byteArray","date","dateArray","dateTime","Date","toISOString","dateTimeArray","decimal","decimalArray","double","doubleArray","float","floatArray","geoPoint","type","coordinates","geoPointArray","geoShape","geoShapeArray","id","integer","integerArray","long","longArray","mediaReference","short","shortArray","string","stringArray","objects","whereClauses","booleanTrue","stringStartsWithHi","$startsWith","stringStartsWithBye","mediaReferenceIsNull","$isNull","mediaReferenceNotIsNull","$not","geopointIntersects","$intersects","$bbox","empty","stringStartsWithHiAndBye","$and","stringStartsWithHiOrBye","$or","whereStrictAndNot","whereStrictOrNot","push","cases","toEqualTypeOf","each","instanceName","whereClauseName","strictExpected","nonStrictExpected","instance","whereClause","toBeDefined","toBe"],"sources":["objectMatchesWhereClause.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Osdk, WhereClause } from \"@osdk/api\";\nimport type { objectTypeWithAllPropertyTypes } from \"@osdk/client.test.ontology\";\nimport { describe, expect, expectTypeOf, it } from \"vitest\";\nimport type { ObjectHolder } from \"../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport { objectSortaMatchesWhereClause } from \"./objectMatchesWhereClause.js\";\n\nconst fauxObject: Osdk.Instance<objectTypeWithAllPropertyTypes> = {\n attachment: undefined,\n attachment2: undefined,\n attachmentArray: [],\n boolean: true,\n booleanArray: [],\n byte: 5,\n byteArray: [],\n date: \"2024-01-01\",\n dateArray: [],\n dateTime: new Date().toISOString(),\n dateTimeArray: [],\n decimal: \"5.3\",\n decimalArray: [],\n double: 5.5,\n doubleArray: [],\n float: 5.6,\n floatArray: [],\n geoPoint: {\n type: \"Point\",\n coordinates: [5, 5],\n },\n geoPointArray: [],\n geoShape: undefined,\n geoShapeArray: [],\n id: 5,\n integer: 6,\n integerArray: [],\n long: \"5\",\n longArray: [],\n mediaReference: undefined,\n short: 5,\n shortArray: [],\n string: \"Hi there\",\n stringArray: [],\n} satisfies objectTypeWithAllPropertyTypes.Props as unknown as Osdk.Instance<\n objectTypeWithAllPropertyTypes\n>;\n\nconst objects = {\n fauxObject,\n};\n\nconst whereClauses = {\n booleanTrue: {\n boolean: true,\n },\n stringStartsWithHi: {\n string: {\n $startsWith: \"Hi\",\n },\n },\n stringStartsWithBye: {\n string: {\n $startsWith: \"Bye\",\n },\n },\n mediaReferenceIsNull: {\n mediaReference: { $isNull: true },\n },\n mediaReferenceNotIsNull: {\n $not: {\n mediaReference: { $isNull: true },\n },\n },\n geopointIntersects: {\n geoPoint: {\n $intersects: {\n $bbox: [5, 3, 3, 2],\n },\n },\n },\n empty: {},\n stringStartsWithHiAndBye: {\n $and: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n stringStartsWithHiOrBye: {\n $or: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n whereStrictAndNot: {\n $and: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n whereStrictOrNot: {\n $or: [] as WhereClause<objectTypeWithAllPropertyTypes>[],\n },\n} satisfies Record<\n string,\n WhereClause<objectTypeWithAllPropertyTypes>\n>;\n\nwhereClauses.stringStartsWithHiAndBye.$and.push(\n whereClauses.stringStartsWithHi,\n whereClauses.stringStartsWithBye,\n);\n\nwhereClauses.stringStartsWithHiOrBye.$or.push(\n whereClauses.stringStartsWithHi,\n whereClauses.stringStartsWithBye,\n);\n\nwhereClauses.whereStrictAndNot.$and.push(\n whereClauses.stringStartsWithHi,\n whereClauses.geopointIntersects,\n);\n\nwhereClauses.whereStrictOrNot.$or.push(\n whereClauses.stringStartsWithHi,\n whereClauses.geopointIntersects,\n);\n\nconst cases = [\n [\"fauxObject\", \"empty\", true, true],\n [\"fauxObject\", \"booleanTrue\", true, true],\n [\"fauxObject\", \"stringStartsWithHi\", true, true],\n [\"fauxObject\", \"stringStartsWithBye\", false, false],\n [\"fauxObject\", \"mediaReferenceIsNull\", true, true],\n [\"fauxObject\", \"mediaReferenceNotIsNull\", false, false],\n [\"fauxObject\", \"geopointIntersects\", false, true],\n [\"fauxObject\", \"stringStartsWithHiAndBye\", false, false],\n [\"fauxObject\", \"stringStartsWithHiOrBye\", true, true],\n [\"fauxObject\", \"whereStrictAndNot\", false, true],\n [\"fauxObject\", \"whereStrictOrNot\", true, true],\n] satisfies Array<\n [keyof typeof objects, keyof typeof whereClauses, boolean, boolean]\n>;\n\ntype usedWhereClauses = typeof cases[number][1];\ntype unusedWhereClauses = Exclude<keyof typeof whereClauses, usedWhereClauses>;\nexpectTypeOf<never>().toEqualTypeOf<unusedWhereClauses>;\n\ndescribe(objectSortaMatchesWhereClause, () => {\n it.each<[keyof typeof objects, keyof typeof whereClauses, boolean, boolean]>(\n cases,\n )(\n \"%s | %s ==> { strict: %s, loose: %s }\",\n (instanceName, whereClauseName, strictExpected, nonStrictExpected) => {\n const instance = objects[instanceName] as unknown as ObjectHolder<\n typeof objects[typeof instanceName]\n >;\n const whereClause = whereClauses[whereClauseName] as WhereClause<\n objectTypeWithAllPropertyTypes\n >;\n expect(instance).toBeDefined();\n expect(whereClause).toBeDefined();\n expect(objectSortaMatchesWhereClause(instance, whereClause, true)).toBe(\n strictExpected,\n );\n\n expect(objectSortaMatchesWhereClause(instance, whereClause, false))\n .toBe(nonStrictExpected);\n },\n );\n});\n"],"mappings":"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","ignoreList":[]}