jazz-tools 0.18.38 → 0.19.0

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 (302) hide show
  1. package/.svelte-kit/__package__/jazz.class.svelte.d.ts +8 -8
  2. package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
  3. package/.svelte-kit/__package__/jazz.class.svelte.js +39 -14
  4. package/.svelte-kit/__package__/media/image.svelte +6 -5
  5. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
  6. package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.d.ts +2 -0
  7. package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.d.ts.map +1 -0
  8. package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.js +19 -0
  9. package/.svelte-kit/__package__/tests/CoState.svelte.test-d.d.ts +2 -0
  10. package/.svelte-kit/__package__/tests/CoState.svelte.test-d.d.ts.map +1 -0
  11. package/.svelte-kit/__package__/tests/CoState.svelte.test-d.js +16 -0
  12. package/.svelte-kit/__package__/tests/CoState.svelte.test.d.ts +2 -0
  13. package/.svelte-kit/__package__/tests/CoState.svelte.test.d.ts.map +1 -0
  14. package/.svelte-kit/__package__/tests/CoState.svelte.test.js +42 -0
  15. package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte +23 -0
  16. package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte.d.ts +12 -0
  17. package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte.d.ts.map +1 -0
  18. package/.turbo/turbo-build.log +57 -57
  19. package/CHANGELOG.md +22 -0
  20. package/dist/better-auth/database-adapter/index.js +14 -11
  21. package/dist/better-auth/database-adapter/index.js.map +1 -1
  22. package/dist/better-auth/database-adapter/repository/generic.d.ts +1 -1
  23. package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -1
  24. package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -1
  25. package/dist/{chunk-OSQ7S47Q.js → chunk-P3YLNFN4.js} +504 -232
  26. package/dist/chunk-P3YLNFN4.js.map +1 -0
  27. package/dist/index.js +14 -6
  28. package/dist/index.js.map +1 -1
  29. package/dist/media/{chunk-K6GCHLQU.js → chunk-3LKBM3G3.js} +23 -15
  30. package/dist/media/chunk-3LKBM3G3.js.map +1 -0
  31. package/dist/media/create-image/browser.d.ts +2 -2
  32. package/dist/media/create-image/react-native.d.ts +2 -2
  33. package/dist/media/create-image/server.d.ts +2 -2
  34. package/dist/media/create-image-factory.d.ts +2 -2
  35. package/dist/media/index.browser.js +1 -1
  36. package/dist/media/index.js +1 -1
  37. package/dist/media/index.native.js +1 -1
  38. package/dist/media/index.server.js +1 -1
  39. package/dist/media/utils.d.ts.map +1 -1
  40. package/dist/react/hooks.d.ts +1 -1
  41. package/dist/react/hooks.d.ts.map +1 -1
  42. package/dist/react/index.d.ts +1 -1
  43. package/dist/react/index.d.ts.map +1 -1
  44. package/dist/react/index.js +31 -15
  45. package/dist/react/index.js.map +1 -1
  46. package/dist/react/media/image.d.ts.map +1 -1
  47. package/dist/react-core/hooks.d.ts +126 -224
  48. package/dist/react-core/hooks.d.ts.map +1 -1
  49. package/dist/react-core/index.js +65 -63
  50. package/dist/react-core/index.js.map +1 -1
  51. package/dist/react-core/subscription-provider.d.ts.map +1 -1
  52. package/dist/react-core/tests/createCoValueSubscriptionContext.test.d.ts +2 -0
  53. package/dist/react-core/tests/createCoValueSubscriptionContext.test.d.ts.map +1 -0
  54. package/dist/react-core/tests/useAccount.selector.test.d.ts +2 -0
  55. package/dist/react-core/tests/useAccount.selector.test.d.ts.map +1 -0
  56. package/dist/react-core/tests/useCoState.selector.test.d.ts +2 -0
  57. package/dist/react-core/tests/useCoState.selector.test.d.ts.map +1 -0
  58. package/dist/react-native-core/hooks.d.ts +1 -1
  59. package/dist/react-native-core/hooks.d.ts.map +1 -1
  60. package/dist/react-native-core/index.js +7 -5
  61. package/dist/react-native-core/index.js.map +1 -1
  62. package/dist/react-native-core/media/image.d.ts.map +1 -1
  63. package/dist/svelte/jazz.class.svelte.d.ts +8 -8
  64. package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
  65. package/dist/svelte/jazz.class.svelte.js +39 -14
  66. package/dist/svelte/media/image.svelte +6 -5
  67. package/dist/svelte/media/image.svelte.d.ts.map +1 -1
  68. package/dist/svelte/tests/AccountCoState.svelte.test-d.d.ts +2 -0
  69. package/dist/svelte/tests/AccountCoState.svelte.test-d.d.ts.map +1 -0
  70. package/dist/svelte/tests/AccountCoState.svelte.test-d.js +19 -0
  71. package/dist/svelte/tests/CoState.svelte.test-d.d.ts +2 -0
  72. package/dist/svelte/tests/CoState.svelte.test-d.d.ts.map +1 -0
  73. package/dist/svelte/tests/CoState.svelte.test-d.js +16 -0
  74. package/dist/svelte/tests/CoState.svelte.test.d.ts +2 -0
  75. package/dist/svelte/tests/CoState.svelte.test.d.ts.map +1 -0
  76. package/dist/svelte/tests/CoState.svelte.test.js +42 -0
  77. package/dist/svelte/tests/TestCoStateWrapper.svelte +23 -0
  78. package/dist/svelte/tests/TestCoStateWrapper.svelte.d.ts +12 -0
  79. package/dist/svelte/tests/TestCoStateWrapper.svelte.d.ts.map +1 -0
  80. package/dist/testing.js +3 -1
  81. package/dist/testing.js.map +1 -1
  82. package/dist/tools/coValues/CoValueBase.d.ts +4 -1
  83. package/dist/tools/coValues/CoValueBase.d.ts.map +1 -1
  84. package/dist/tools/coValues/account.d.ts +6 -6
  85. package/dist/tools/coValues/account.d.ts.map +1 -1
  86. package/dist/tools/coValues/coFeed.d.ts +5 -5
  87. package/dist/tools/coValues/coFeed.d.ts.map +1 -1
  88. package/dist/tools/coValues/coList.d.ts +9 -8
  89. package/dist/tools/coValues/coList.d.ts.map +1 -1
  90. package/dist/tools/coValues/coMap.d.ts +17 -17
  91. package/dist/tools/coValues/coMap.d.ts.map +1 -1
  92. package/dist/tools/coValues/coPlainText.d.ts +3 -3
  93. package/dist/tools/coValues/coPlainText.d.ts.map +1 -1
  94. package/dist/tools/coValues/coVector.d.ts +3 -3
  95. package/dist/tools/coValues/coVector.d.ts.map +1 -1
  96. package/dist/tools/coValues/deepLoading.d.ts +66 -36
  97. package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
  98. package/dist/tools/coValues/extensions/imageDef.d.ts +1 -1
  99. package/dist/tools/coValues/extensions/imageDef.d.ts.map +1 -1
  100. package/dist/tools/coValues/group.d.ts +2 -2
  101. package/dist/tools/coValues/group.d.ts.map +1 -1
  102. package/dist/tools/coValues/inbox.d.ts.map +1 -1
  103. package/dist/tools/coValues/interfaces.d.ts +14 -6
  104. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  105. package/dist/tools/coValues/request.d.ts.map +1 -1
  106. package/dist/tools/coValues/schemaUnion.d.ts +2 -2
  107. package/dist/tools/coValues/schemaUnion.d.ts.map +1 -1
  108. package/dist/tools/exports.d.ts +3 -3
  109. package/dist/tools/exports.d.ts.map +1 -1
  110. package/dist/tools/implementation/refs.d.ts +3 -3
  111. package/dist/tools/implementation/refs.d.ts.map +1 -1
  112. package/dist/tools/implementation/schema.d.ts +2 -2
  113. package/dist/tools/implementation/schema.d.ts.map +1 -1
  114. package/dist/tools/implementation/schemaUtils.d.ts +8 -0
  115. package/dist/tools/implementation/schemaUtils.d.ts.map +1 -1
  116. package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts.map +1 -1
  117. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +33 -18
  118. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
  119. package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +5 -4
  120. package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
  121. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +23 -12
  122. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
  123. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +29 -18
  124. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
  125. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +39 -22
  126. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
  127. package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts +1 -0
  128. package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts.map +1 -1
  129. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +30 -19
  130. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
  131. package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts +5 -0
  132. package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts.map +1 -1
  133. package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts +6 -5
  134. package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts.map +1 -1
  135. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +3 -2
  136. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
  137. package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts +3 -2
  138. package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts.map +1 -1
  139. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +3 -2
  140. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
  141. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +3 -2
  142. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
  143. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +3 -0
  144. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
  145. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts +22 -0
  146. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -0
  147. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts +4 -0
  148. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts.map +1 -1
  149. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.d.ts +9 -0
  150. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -0
  151. package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
  152. package/dist/tools/implementation/zodSchema/zodSchema.d.ts +7 -6
  153. package/dist/tools/implementation/zodSchema/zodSchema.d.ts.map +1 -1
  154. package/dist/tools/internal.d.ts +3 -3
  155. package/dist/tools/internal.d.ts.map +1 -1
  156. package/dist/tools/lib/utils.d.ts +14 -0
  157. package/dist/tools/lib/utils.d.ts.map +1 -0
  158. package/dist/tools/lib/utils.test.d.ts +2 -0
  159. package/dist/tools/lib/utils.test.d.ts.map +1 -0
  160. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +3 -2
  161. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
  162. package/dist/tools/subscribe/JazzError.d.ts +4 -3
  163. package/dist/tools/subscribe/JazzError.d.ts.map +1 -1
  164. package/dist/tools/subscribe/SubscriptionScope.d.ts +6 -5
  165. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  166. package/dist/tools/subscribe/index.d.ts.map +1 -1
  167. package/dist/tools/subscribe/types.d.ts +23 -3
  168. package/dist/tools/subscribe/types.d.ts.map +1 -1
  169. package/dist/tools/subscribe/utils.d.ts.map +1 -1
  170. package/dist/tools/testing.d.ts +3 -2
  171. package/dist/tools/testing.d.ts.map +1 -1
  172. package/dist/tools/tests/schema.resolved.test.d.ts +2 -0
  173. package/dist/tools/tests/schema.resolved.test.d.ts.map +1 -0
  174. package/dist/tools/tests/utils.d.ts +2 -1
  175. package/dist/tools/tests/utils.d.ts.map +1 -1
  176. package/package.json +4 -4
  177. package/src/better-auth/database-adapter/index.ts +2 -2
  178. package/src/better-auth/database-adapter/repository/account.ts +3 -3
  179. package/src/better-auth/database-adapter/repository/generic.ts +9 -6
  180. package/src/better-auth/database-adapter/repository/user.ts +6 -2
  181. package/src/better-auth/database-adapter/schema.ts +1 -1
  182. package/src/better-auth/database-adapter/tests/index.test.ts +3 -4
  183. package/src/inspector/tests/viewer/history-view.test.tsx +6 -2
  184. package/src/media/utils.test.ts +5 -0
  185. package/src/media/utils.ts +25 -16
  186. package/src/react/hooks.tsx +2 -2
  187. package/src/react/index.ts +2 -2
  188. package/src/react/media/image.tsx +10 -2
  189. package/src/react/tests/useAcceptInvite.test.ts +3 -1
  190. package/src/react-core/hooks.ts +226 -304
  191. package/src/react-core/subscription-provider.tsx +14 -7
  192. package/src/react-core/tests/createCoValueSubscriptionContext.test.tsx +233 -0
  193. package/src/react-core/tests/subscription.bench.tsx +32 -15
  194. package/src/react-core/tests/{useAccountWithSelector.test.ts → useAccount.selector.test.ts} +72 -24
  195. package/src/react-core/tests/useAccount.test.ts +92 -106
  196. package/src/react-core/tests/{useCoStateWithSelector.test.ts → useCoState.selector.test.ts} +23 -8
  197. package/src/react-core/tests/useCoState.test.ts +173 -49
  198. package/src/react-core/tests/useInboxSender.test.ts +3 -1
  199. package/src/react-core/tests/usePassPhraseAuth.test.ts +11 -82
  200. package/src/react-core/tests/useSubscriptionSelector.test.ts +48 -14
  201. package/src/react-native-core/hooks.tsx +2 -2
  202. package/src/react-native-core/media/image.tsx +3 -1
  203. package/src/svelte/jazz.class.svelte.ts +103 -27
  204. package/src/svelte/media/image.svelte +6 -5
  205. package/src/svelte/tests/AccountCoState.svelte.test-d.ts +23 -0
  206. package/src/svelte/tests/CoState.svelte.test-d.ts +20 -0
  207. package/src/svelte/tests/CoState.svelte.test.ts +57 -0
  208. package/src/svelte/tests/TestCoStateWrapper.svelte +23 -0
  209. package/src/tools/coValues/CoValueBase.ts +12 -0
  210. package/src/tools/coValues/account.ts +17 -12
  211. package/src/tools/coValues/coFeed.ts +38 -15
  212. package/src/tools/coValues/coList.ts +16 -11
  213. package/src/tools/coValues/coMap.ts +15 -14
  214. package/src/tools/coValues/coPlainText.ts +6 -3
  215. package/src/tools/coValues/coVector.ts +6 -5
  216. package/src/tools/coValues/deepLoading.ts +98 -51
  217. package/src/tools/coValues/group.ts +3 -2
  218. package/src/tools/coValues/inbox.ts +11 -10
  219. package/src/tools/coValues/interfaces.ts +49 -27
  220. package/src/tools/coValues/request.ts +8 -6
  221. package/src/tools/coValues/schemaUnion.ts +2 -1
  222. package/src/tools/exports.ts +11 -1
  223. package/src/tools/implementation/refs.ts +19 -13
  224. package/src/tools/implementation/schema.ts +5 -4
  225. package/src/tools/implementation/schemaUtils.ts +15 -0
  226. package/src/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.ts +4 -4
  227. package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +131 -95
  228. package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +19 -9
  229. package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +73 -22
  230. package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +86 -28
  231. package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +204 -148
  232. package/src/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.ts +1 -0
  233. package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +71 -27
  234. package/src/tools/implementation/zodSchema/schemaTypes/CoValueSchema.ts +7 -0
  235. package/src/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.ts +8 -6
  236. package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +4 -1
  237. package/src/tools/implementation/zodSchema/schemaTypes/GroupSchema.ts +4 -1
  238. package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +4 -1
  239. package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +4 -1
  240. package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +3 -0
  241. package/src/tools/implementation/zodSchema/typeConverters/{InstanceOfSchemaCoValuesNullable.ts → InstanceOfSchemaCoValuesMaybeLoaded.ts} +47 -39
  242. package/src/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.ts +4 -0
  243. package/src/tools/implementation/zodSchema/typeConverters/{InstanceOrPrimitiveOfSchemaCoValuesNullable.ts → InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.ts} +7 -3
  244. package/src/tools/implementation/zodSchema/zodSchema.ts +15 -7
  245. package/src/tools/internal.ts +3 -3
  246. package/src/tools/lib/utils.test.ts +56 -0
  247. package/src/tools/lib/utils.ts +32 -0
  248. package/src/tools/subscribe/CoValueCoreSubscription.ts +13 -8
  249. package/src/tools/subscribe/JazzError.ts +8 -2
  250. package/src/tools/subscribe/SubscriptionScope.ts +55 -44
  251. package/src/tools/subscribe/index.ts +12 -4
  252. package/src/tools/subscribe/types.ts +36 -2
  253. package/src/tools/subscribe/utils.ts +2 -1
  254. package/src/tools/testing.ts +5 -0
  255. package/src/tools/tests/CoValueCoreSubscription.test.ts +10 -4
  256. package/src/tools/tests/ContextManager.test.ts +12 -5
  257. package/src/tools/tests/account.test.ts +22 -12
  258. package/src/tools/tests/coDiscriminatedUnion.test.ts +8 -4
  259. package/src/tools/tests/coFeed.branch.test.ts +48 -32
  260. package/src/tools/tests/coFeed.test-d.ts +17 -10
  261. package/src/tools/tests/coFeed.test.ts +52 -30
  262. package/src/tools/tests/coList.branch.test.ts +21 -21
  263. package/src/tools/tests/coList.test-d.ts +39 -23
  264. package/src/tools/tests/coList.test.ts +51 -25
  265. package/src/tools/tests/coList.unique.test.ts +34 -29
  266. package/src/tools/tests/coMap.branch.test.ts +20 -21
  267. package/src/tools/tests/coMap.record.test-d.ts +28 -26
  268. package/src/tools/tests/coMap.record.test.ts +30 -20
  269. package/src/tools/tests/coMap.test-d.ts +31 -29
  270. package/src/tools/tests/coMap.test.ts +67 -40
  271. package/src/tools/tests/coMap.unique.test.ts +25 -24
  272. package/src/tools/tests/coVector.test.ts +29 -15
  273. package/src/tools/tests/createContext.test.ts +5 -3
  274. package/src/tools/tests/deepLoading.test.ts +314 -117
  275. package/src/tools/tests/exportImport.test.ts +16 -15
  276. package/src/tools/tests/groupsAndAccounts.test.ts +39 -16
  277. package/src/tools/tests/inbox.test.ts +3 -1
  278. package/src/tools/tests/load.test.ts +29 -23
  279. package/src/tools/tests/patterns/quest.test.ts +3 -2
  280. package/src/tools/tests/patterns/requestToJoin.test.ts +17 -17
  281. package/src/tools/tests/request.test.ts +12 -2
  282. package/src/tools/tests/schema.resolved.test.ts +723 -0
  283. package/src/tools/tests/schemaUnion.test.ts +7 -3
  284. package/src/tools/tests/subscribe.test.ts +39 -21
  285. package/src/tools/tests/testing.test.ts +3 -2
  286. package/src/tools/tests/utils.ts +15 -2
  287. package/dist/chunk-OSQ7S47Q.js.map +0 -1
  288. package/dist/media/chunk-K6GCHLQU.js.map +0 -1
  289. package/dist/react-core/tests/useAccountWithSelector.test.d.ts +0 -2
  290. package/dist/react-core/tests/useAccountWithSelector.test.d.ts.map +0 -1
  291. package/dist/react-core/tests/useCoStateWithSelector.test.d.ts +0 -2
  292. package/dist/react-core/tests/useCoStateWithSelector.test.d.ts.map +0 -1
  293. package/dist/tools/implementation/errors.d.ts +0 -2
  294. package/dist/tools/implementation/errors.d.ts.map +0 -1
  295. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts +0 -19
  296. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts.map +0 -1
  297. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts +0 -5
  298. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts.map +0 -1
  299. package/dist/tools/lib/id.d.ts +0 -2
  300. package/dist/tools/lib/id.d.ts.map +0 -1
  301. package/src/tools/implementation/errors.ts +0 -1
  302. package/src/tools/lib/id.ts +0 -3
@@ -9,9 +9,19 @@ import {
9
9
  isControlledAccount,
10
10
  z,
11
11
  } from "../index.js";
12
- import { Account, Loaded, co, randomSessionProvider } from "../internal.js";
12
+ import {
13
+ Account,
14
+ CoList,
15
+ Loaded,
16
+ MaybeLoaded,
17
+ NotLoaded,
18
+ co,
19
+ randomSessionProvider,
20
+ CoValueLoadingState,
21
+ NotLoadedCoValueState,
22
+ } from "../internal.js";
13
23
  import { createJazzTestAccount, linkAccounts } from "../testing.js";
14
- import { waitFor } from "./utils.js";
24
+ import { assertLoaded, waitFor } from "./utils.js";
15
25
 
16
26
  const Crypto = await WasmCrypto.create();
17
27
  const { connectedPeers } = cojsonInternals;
@@ -83,11 +93,16 @@ describe("Deep loading with depth arg", async () => {
83
93
 
84
94
  test("load without resolve", async () => {
85
95
  const map1 = await TestMap.load(map.$jazz.id, { loadAs: meOnSecondPeer });
86
- expectTypeOf(map1).branded.toEqualTypeOf<Loaded<typeof TestMap> | null>();
87
96
 
88
- assert(map1, "map1 is null");
97
+ type ExpectedType = MaybeLoaded<Loaded<typeof TestMap>>;
98
+ function matches(value: ExpectedType) {
99
+ return value;
100
+ }
101
+ matches(map1);
102
+
103
+ assertLoaded(map1);
89
104
 
90
- expect(map1.list).toBe(null);
105
+ expect(map1.list.$jazz.loadingState).toBe(CoValueLoadingState.LOADING);
91
106
  });
92
107
 
93
108
  test("load with resolve { list: true }", async () => {
@@ -95,15 +110,18 @@ describe("Deep loading with depth arg", async () => {
95
110
  loadAs: meOnSecondPeer,
96
111
  resolve: { list: true },
97
112
  });
98
- expectTypeOf(map2).branded.toEqualTypeOf<
99
- | (Loaded<typeof TestMap> & {
100
- readonly list: Loaded<typeof TestList>;
101
- })
102
- | null
103
- >();
104
- assert(map2, "map2 is null");
105
- expect(map2.list).toBeTruthy();
106
- expect(map2.list[0]).toBe(null);
113
+ type ExpectedType = MaybeLoaded<
114
+ Loaded<typeof TestMap> & {
115
+ readonly list: Loaded<typeof TestList>;
116
+ }
117
+ >;
118
+ function matches(value: ExpectedType) {
119
+ return value;
120
+ }
121
+ matches(map2);
122
+ assertLoaded(map2);
123
+ assertLoaded(map2.list);
124
+ expect(map2.list[0]?.$jazz.loadingState).toBe(CoValueLoadingState.LOADING);
107
125
  });
108
126
 
109
127
  test("load with resolve { list: { $each: true } }", async () => {
@@ -111,16 +129,21 @@ describe("Deep loading with depth arg", async () => {
111
129
  loadAs: meOnSecondPeer,
112
130
  resolve: { list: { $each: true } },
113
131
  });
114
- expectTypeOf(map3).toEqualTypeOf<
115
- | (Loaded<typeof TestMap> & {
116
- readonly list: Loaded<typeof TestList> &
117
- ReadonlyArray<Loaded<typeof InnerMap>>;
118
- })
119
- | null
120
- >();
121
- assert(map3, "map3 is null");
122
- expect(map3.list[0]).toBeTruthy();
123
- expect(map3.list[0]?.stream).toBe(null);
132
+ type ExpectedType = MaybeLoaded<
133
+ Loaded<typeof TestMap> & {
134
+ readonly list: Loaded<typeof TestList> &
135
+ ReadonlyArray<Loaded<typeof InnerMap>>;
136
+ }
137
+ >;
138
+ function matches(value: ExpectedType) {
139
+ return value;
140
+ }
141
+ matches(map3);
142
+ assertLoaded(map3);
143
+ assert(map3.list[0]);
144
+ expect(map3.list[0].stream.$jazz.loadingState).toBe(
145
+ CoValueLoadingState.LOADING,
146
+ );
124
147
  });
125
148
 
126
149
  test("load with resolve { optionalRef: true }", async () => {
@@ -128,14 +151,16 @@ describe("Deep loading with depth arg", async () => {
128
151
  loadAs: meOnSecondPeer,
129
152
  resolve: { optionalRef: true } as const,
130
153
  });
131
- expectTypeOf(map3a).branded.toEqualTypeOf<
132
- | (Loaded<typeof TestMap> & {
133
- readonly optionalRef: Loaded<typeof InnermostMap> | undefined;
134
- })
135
- | null
136
- >();
137
- assert(map3a, "map3a is null");
138
- expect(map3a).toBeTruthy();
154
+ type ExpectedType = MaybeLoaded<
155
+ Loaded<typeof TestMap> & {
156
+ readonly optionalRef: Loaded<typeof InnermostMap> | undefined;
157
+ }
158
+ >;
159
+ function matches(value: ExpectedType) {
160
+ return value;
161
+ }
162
+ matches(map3a);
163
+ assertLoaded(map3a);
139
164
  });
140
165
 
141
166
  test("load with resolve { list: { $each: { stream: true } } }", async () => {
@@ -143,21 +168,26 @@ describe("Deep loading with depth arg", async () => {
143
168
  loadAs: meOnSecondPeer,
144
169
  resolve: { list: { $each: { stream: true } } },
145
170
  });
146
- expectTypeOf(map4).toEqualTypeOf<
147
- | (Loaded<typeof TestMap> & {
148
- readonly list: Loaded<typeof TestList> &
149
- ReadonlyArray<
150
- Loaded<typeof InnerMap> & {
151
- readonly stream: Loaded<typeof TestFeed>;
152
- }
153
- >;
154
- })
155
- | null
156
- >();
157
- assert(map4, "map4 is null");
171
+ type ExpectedType = MaybeLoaded<
172
+ Loaded<typeof TestMap> & {
173
+ readonly list: Loaded<typeof TestList> &
174
+ ReadonlyArray<
175
+ Loaded<typeof InnerMap> & {
176
+ readonly stream: Loaded<typeof TestFeed>;
177
+ }
178
+ >;
179
+ }
180
+ >;
181
+ function matches(value: ExpectedType) {
182
+ return value;
183
+ }
184
+ matches(map4);
185
+ assertLoaded(map4);
158
186
  expect(map4.list[0]?.stream).toBeTruthy();
159
187
  expect(map4.list[0]?.stream?.perAccount[me.$jazz.id]).toBeTruthy();
160
- expect(map4.list[0]?.stream?.byMe?.value).toBe(null);
188
+ expect(map4.list[0]?.stream?.byMe?.value.$jazz.loadingState).toBe(
189
+ CoValueLoadingState.LOADING,
190
+ );
161
191
  });
162
192
 
163
193
  test("load with resolve { list: { $each: { stream: { $each: true } } } }", async () => {
@@ -165,28 +195,31 @@ describe("Deep loading with depth arg", async () => {
165
195
  loadAs: meOnSecondPeer,
166
196
  resolve: { list: { $each: { stream: { $each: true } } } },
167
197
  });
168
- type ExpectedMap5 =
169
- | (Loaded<typeof TestMap> & {
170
- readonly list: Loaded<typeof TestList> &
171
- ReadonlyArray<
172
- Loaded<typeof InnerMap> & {
173
- readonly stream: Loaded<typeof TestFeed> & {
174
- byMe?: { value: Loaded<typeof InnermostMap> };
175
- inCurrentSession?: { value: Loaded<typeof InnermostMap> };
176
- perSession: {
177
- [sessionID: SessionID]: {
178
- value: Loaded<typeof InnermostMap>;
179
- };
198
+ type ExpectedMap5 = MaybeLoaded<
199
+ Loaded<typeof TestMap> & {
200
+ readonly list: Loaded<typeof TestList> &
201
+ ReadonlyArray<
202
+ Loaded<typeof InnerMap> & {
203
+ readonly stream: Loaded<typeof TestFeed> & {
204
+ byMe?: { value: Loaded<typeof InnermostMap> };
205
+ inCurrentSession?: { value: Loaded<typeof InnermostMap> };
206
+ perSession: {
207
+ [sessionID: SessionID]: {
208
+ value: Loaded<typeof InnermostMap>;
180
209
  };
181
- } & {
182
- [key: ID<Account>]: { value: Loaded<typeof InnermostMap> };
183
210
  };
184
- }
185
- >;
186
- })
187
- | null;
188
- expectTypeOf(map5).toEqualTypeOf<ExpectedMap5>();
189
- assert(map5, "map5 is null");
211
+ } & {
212
+ [key: ID<Account>]: { value: Loaded<typeof InnermostMap> };
213
+ };
214
+ }
215
+ >;
216
+ }
217
+ >;
218
+ function matches(value: ExpectedMap5) {
219
+ return value;
220
+ }
221
+ matches(map5);
222
+ assertLoaded(map5);
190
223
 
191
224
  expect(map5.list[0]?.stream?.perAccount[me.$jazz.id]?.value).toBeTruthy();
192
225
  expect(map5.list[0]?.stream?.byMe?.value).toBeTruthy();
@@ -311,16 +344,17 @@ test("Deep loading a record-like coMap", async () => {
311
344
  $each: { list: { $each: true } },
312
345
  },
313
346
  });
314
- expectTypeOf(recordLoaded).toEqualTypeOf<
315
- | (Loaded<typeof RecordLike> & {
347
+ expectTypeOf(recordLoaded).branded.toEqualTypeOf<
348
+ MaybeLoaded<
349
+ Loaded<typeof RecordLike> & {
316
350
  readonly [key: string]: Loaded<typeof TestMap> & {
317
351
  readonly list: Loaded<typeof TestList> &
318
352
  ReadonlyArray<Loaded<typeof InnerMap>>;
319
353
  };
320
- })
321
- | null
354
+ }
355
+ >
322
356
  >();
323
- assert(recordLoaded, "recordLoaded is null");
357
+ assertLoaded(recordLoaded);
324
358
  expect(recordLoaded.key1?.list).not.toBe(null);
325
359
  expect(recordLoaded.key1?.list).toBeTruthy();
326
360
  expect(recordLoaded.key2?.list).not.toBe(null);
@@ -461,7 +495,9 @@ describe("Deep loading with unauthorized account", async () => {
461
495
 
462
496
  const mapOnAlice = await TestMap.load(map.$jazz.id, { loadAs: alice });
463
497
 
464
- expect(mapOnAlice).toBe(null);
498
+ expect(mapOnAlice.$jazz.loadingState).toBe(
499
+ CoValueLoadingState.UNAUTHORIZED,
500
+ );
465
501
 
466
502
  expect(errorSpy).toHaveBeenCalledWith(
467
503
  `The current user (${alice.$jazz.id}) is not authorized to access this value from ${map.$jazz.id}`,
@@ -483,7 +519,9 @@ describe("Deep loading with unauthorized account", async () => {
483
519
  loadAs: alice,
484
520
  });
485
521
 
486
- expect(mapWithListOnAlice).toBe(null);
522
+ expect(mapWithListOnAlice.$jazz.loadingState).toBe(
523
+ CoValueLoadingState.UNAUTHORIZED,
524
+ );
487
525
 
488
526
  expect(errorSpy).toHaveBeenCalledWith(
489
527
  `The current user (${alice.$jazz.id}) is not authorized to access this value from ${map.$jazz.id} on path list`,
@@ -517,7 +555,9 @@ describe("Deep loading with unauthorized account", async () => {
517
555
  loadAs: alice,
518
556
  });
519
557
 
520
- expect(mapOnAlice).toBe(null);
558
+ expect(mapOnAlice.$jazz.loadingState).toBe(
559
+ CoValueLoadingState.UNAUTHORIZED,
560
+ );
521
561
 
522
562
  expect(errorSpy).toHaveBeenCalledWith(
523
563
  `The current user (${alice.$jazz.id}) is not authorized to access this value from ${map.$jazz.id} on path list.0`,
@@ -541,11 +581,9 @@ describe("Deep loading with unauthorized account", async () => {
541
581
  loadAs: alice,
542
582
  resolve: { optionalRef: true } as const,
543
583
  });
544
- expect(mapOnAlice).toBe(null);
545
-
546
- expect(mapOnAlice?.optionalRef).toBe(undefined);
547
- expect(mapOnAlice?.optionalRef?.value).toBe(undefined);
548
-
584
+ expect(mapOnAlice.$jazz.loadingState).toBe(
585
+ CoValueLoadingState.UNAUTHORIZED,
586
+ );
549
587
  expect(errorSpy).toHaveBeenCalledWith(
550
588
  `The current user (${alice.$jazz.id}) is not authorized to access this value from ${map.$jazz.id} on path optionalRef`,
551
589
  );
@@ -567,16 +605,17 @@ describe("Deep loading with unauthorized account", async () => {
567
605
  resolve: { list: true } as const,
568
606
  });
569
607
 
570
- assert(mapOnAlice, "Alice isn't able to load the map");
608
+ assertLoaded(mapOnAlice);
571
609
 
572
- const result = await new Promise((resolve) => {
573
- const unsub = mapOnAlice.$jazz.subscribe((value) => {
574
- resolve(value.optionalRef);
575
- unsub();
610
+ const result: MaybeLoaded<Loaded<typeof InnermostMap>> | undefined =
611
+ await new Promise((resolve) => {
612
+ const unsub = mapOnAlice.$jazz.subscribe((value) => {
613
+ resolve(value.optionalRef);
614
+ unsub();
615
+ });
576
616
  });
577
- });
578
617
 
579
- expect(result).toBe(null);
618
+ expect(result?.$jazz.loadingState).toBe(CoValueLoadingState.UNAUTHORIZED);
580
619
  });
581
620
 
582
621
  test("unaccessible stream", async () => {
@@ -603,7 +642,9 @@ describe("Deep loading with unauthorized account", async () => {
603
642
  loadAs: alice,
604
643
  });
605
644
 
606
- expect(mapOnAlice).toBe(null);
645
+ expect(mapOnAlice.$jazz.loadingState).toBe(
646
+ CoValueLoadingState.UNAUTHORIZED,
647
+ );
607
648
 
608
649
  expect(errorSpy).toHaveBeenCalledWith(
609
650
  `The current user (${alice.$jazz.id}) is not authorized to access this value from ${map.$jazz.id} on path list.0.stream`,
@@ -639,7 +680,9 @@ describe("Deep loading with unauthorized account", async () => {
639
680
  loadAs: alice,
640
681
  });
641
682
 
642
- expect(mapOnAlice).toBe(null);
683
+ expect(mapOnAlice.$jazz.loadingState).toBe(
684
+ CoValueLoadingState.UNAUTHORIZED,
685
+ );
643
686
 
644
687
  expect(errorSpy).toHaveBeenCalledWith(
645
688
  `The current user (${alice.$jazz.id}) is not authorized to access this value from ${map.$jazz.id} on path list.0.stream.${value.$jazz.id}`,
@@ -691,14 +734,18 @@ describe("Deep loading with unauthorized account", async () => {
691
734
  );
692
735
 
693
736
  const friendsOnAlice = await Friends.load(map.$jazz.id, {
694
- resolve: { $each: { $onError: null } },
737
+ resolve: { $each: { $onError: "catch" } },
695
738
  loadAs: alice,
696
739
  });
697
740
 
698
- assert(friendsOnAlice, "friendsOnAlice is null");
741
+ assertLoaded(friendsOnAlice);
699
742
 
700
- expect(friendsOnAlice.jane).toBeNull();
701
- expect(friendsOnAlice.alice).not.toBeNull();
743
+ expect(friendsOnAlice.jane?.$jazz.loadingState).toBe(
744
+ CoValueLoadingState.UNAUTHORIZED,
745
+ );
746
+ assert(friendsOnAlice.alice);
747
+ assertLoaded(friendsOnAlice.alice);
748
+ expect(friendsOnAlice.alice.name).toBe("Alice");
702
749
  });
703
750
 
704
751
  test("unaccessible nested record element with $onError", async () => {
@@ -727,14 +774,18 @@ describe("Deep loading with unauthorized account", async () => {
727
774
  );
728
775
 
729
776
  const user = await User.load(map.$jazz.id, {
730
- resolve: { friends: { $each: { $onError: null } } },
777
+ resolve: { friends: { $each: { $onError: "catch" } } },
731
778
  loadAs: alice,
732
779
  });
733
780
 
734
- assert(user, "user is null");
781
+ assertLoaded(user);
735
782
 
736
- expect(user.friends.jane).toBeNull();
737
- expect(user.friends.alice).not.toBeNull();
783
+ expect(user.friends.jane?.$jazz.loadingState).toBe(
784
+ CoValueLoadingState.UNAUTHORIZED,
785
+ );
786
+ assert(user.friends.alice);
787
+ assertLoaded(user.friends.alice);
788
+ expect(user.friends.alice.name).toBe("Alice");
738
789
  });
739
790
 
740
791
  test("unaccessible element down the chain with $onError on a record", async () => {
@@ -778,14 +829,20 @@ describe("Deep loading with unauthorized account", async () => {
778
829
  );
779
830
 
780
831
  const user = await User.load(map.$jazz.id, {
781
- resolve: { friends: { $each: { dog: true, $onError: null } } },
832
+ resolve: { friends: { $each: { dog: true, $onError: "catch" } } },
782
833
  loadAs: alice,
783
834
  });
784
835
 
785
- assert(user);
836
+ assertLoaded(user);
786
837
 
787
- expect(user.friends.jane).toBeNull(); // jane is null because her dog is inaccessible
788
- expect(user.friends.alice?.dog).not.toBeNull(); // alice is not null because we have read access to her and her dog
838
+ // jane is not loaded because her dog is inaccessible
839
+ expect(user.friends.jane?.$jazz.loadingState).toBe(
840
+ CoValueLoadingState.UNAUTHORIZED,
841
+ );
842
+ // alice is loaded because we have read access to her and her dog
843
+ assert(user.friends.alice);
844
+ assertLoaded(user.friends.alice);
845
+ expect(user.friends.alice.dog.name).toBe("Giggino");
789
846
  });
790
847
 
791
848
  test("unaccessible list element with $onError and $each with depth", async () => {
@@ -795,7 +852,7 @@ describe("Deep loading with unauthorized account", async () => {
795
852
  return co.optional(Friends);
796
853
  },
797
854
  });
798
- const Friends: co.List<typeof Person> = co.list(Person); // TODO: annoying that we have to annotate
855
+ const Friends = co.list(Person);
799
856
 
800
857
  const list = Friends.create(
801
858
  [
@@ -826,17 +883,19 @@ describe("Deep loading with unauthorized account", async () => {
826
883
  // The error List -> Jane -> Bob should be propagated to the list element Jane
827
884
  // and we should have [null, Alice]
828
885
  const listOnAlice = await Friends.load(list.$jazz.id, {
829
- resolve: { $each: { friends: { $each: true }, $onError: null } },
886
+ resolve: { $each: { friends: { $each: true }, $onError: "catch" } },
830
887
  loadAs: alice,
831
888
  });
832
889
 
833
- assert(listOnAlice, "listOnAlice is null");
890
+ assertLoaded(listOnAlice);
834
891
 
835
- expect(listOnAlice[0]).toBeNull();
836
- expect(listOnAlice[1]).not.toBeNull();
837
- expect(listOnAlice[1]?.name).toBe("Alice");
838
- expect(listOnAlice[1]?.friends).not.toBeNull();
839
- expect(listOnAlice[1]?.friends?.[0]?.name).toBe("Bob");
892
+ expect(listOnAlice[0]?.$jazz.loadingState).toBe(
893
+ CoValueLoadingState.UNAUTHORIZED,
894
+ );
895
+ assert(listOnAlice[1]);
896
+ assertLoaded(listOnAlice[1]);
897
+ expect(listOnAlice[1].name).toBe("Alice");
898
+ expect(listOnAlice[1].friends?.[0]?.name).toBe("Bob");
840
899
  expect(listOnAlice).toHaveLength(2);
841
900
  });
842
901
 
@@ -855,14 +914,18 @@ describe("Deep loading with unauthorized account", async () => {
855
914
  );
856
915
 
857
916
  const friendsOnAlice = await Friend.load(map.$jazz.id, {
858
- resolve: { $each: { $onError: null } },
917
+ resolve: { $each: { $onError: "catch" } },
859
918
  loadAs: alice,
860
919
  });
861
920
 
862
- assert(friendsOnAlice, "friendsOnAlice is null");
921
+ assertLoaded(friendsOnAlice);
863
922
 
864
- expect(friendsOnAlice.jane).toBeNull();
865
- expect(friendsOnAlice.alice).not.toBeNull();
923
+ expect(friendsOnAlice.jane?.$jazz.loadingState).toBe(
924
+ CoValueLoadingState.UNAUTHORIZED,
925
+ );
926
+ assert(friendsOnAlice.alice);
927
+ assertLoaded(friendsOnAlice.alice);
928
+ expect(friendsOnAlice.alice.name).toBe("Alice");
866
929
  });
867
930
 
868
931
  test("unaccessible ref catched with $onError", async () => {
@@ -906,14 +969,21 @@ describe("Deep loading with unauthorized account", async () => {
906
969
  );
907
970
 
908
971
  const user = await User.load(map.$jazz.id, {
909
- resolve: { friends: { $each: { dog: { $onError: null } } } },
972
+ resolve: { friends: { $each: { dog: { $onError: "catch" } } } },
910
973
  loadAs: alice,
911
974
  });
912
975
 
913
- assert(user);
976
+ assertLoaded(user);
914
977
 
915
- expect(user.friends.jane?.dog).toBeNull(); // jane is null because her dog is inaccessible
916
- expect(user.friends.alice?.dog?.name).toBe("Giggino"); // alice is not null because we have read access to her and her dog
978
+ // jane's dog is not loaded because it is inaccessible
979
+ expect(user.friends.jane?.dog.$jazz.loadingState).toBe(
980
+ CoValueLoadingState.UNAUTHORIZED,
981
+ );
982
+ // we have read access to alice and her dog
983
+ const aliceDog = user.friends.alice?.dog;
984
+ assert(aliceDog);
985
+ assertLoaded(aliceDog);
986
+ expect(aliceDog.name).toBe("Giggino");
917
987
  });
918
988
 
919
989
  test("using $onError on the resolve root", async () => {
@@ -923,11 +993,55 @@ describe("Deep loading with unauthorized account", async () => {
923
993
 
924
994
  const map = Person.create({ name: "John" }, onlyBob);
925
995
  const user = await Person.load(map.$jazz.id, {
926
- resolve: { $onError: null },
996
+ resolve: { $onError: "catch" },
927
997
  loadAs: alice,
928
998
  });
929
999
 
930
- expect(user).toBeNull();
1000
+ expect(user.$jazz.loadingState).toBe(CoValueLoadingState.UNAUTHORIZED);
1001
+ });
1002
+
1003
+ test("using $onError on a plain text value", async () => {
1004
+ const Person = co.map({
1005
+ name: co.plainText(),
1006
+ });
1007
+
1008
+ const person = Person.create(
1009
+ { name: Person.shape.name.create("John", onlyBob) },
1010
+ group,
1011
+ );
1012
+
1013
+ const loadedPerson = await Person.load(person.$jazz.id, {
1014
+ resolve: { name: { $onError: "catch" } },
1015
+ loadAs: alice,
1016
+ });
1017
+
1018
+ expect(loadedPerson.$isLoaded).toBe(true);
1019
+ assertLoaded(loadedPerson);
1020
+ expect(loadedPerson.name.$jazz.loadingState).toBe(
1021
+ CoValueLoadingState.UNAUTHORIZED,
1022
+ );
1023
+ });
1024
+
1025
+ test("using $onError on a file stream", async () => {
1026
+ const Person = co.map({
1027
+ avatar: co.fileStream(),
1028
+ });
1029
+
1030
+ const person = Person.create(
1031
+ { avatar: Person.shape.avatar.create(onlyBob) },
1032
+ group,
1033
+ );
1034
+
1035
+ const loadedPerson = await Person.load(person.$jazz.id, {
1036
+ resolve: { avatar: { $onError: "catch" } },
1037
+ loadAs: alice,
1038
+ });
1039
+
1040
+ expect(loadedPerson.$isLoaded).toBe(true);
1041
+ assertLoaded(loadedPerson);
1042
+ expect(loadedPerson.avatar.$jazz.loadingState).toBe(
1043
+ CoValueLoadingState.UNAUTHORIZED,
1044
+ );
931
1045
  });
932
1046
  });
933
1047
 
@@ -1058,3 +1172,86 @@ test("should not throw when calling ensureLoaded a record with a deleted ref", a
1058
1172
 
1059
1173
  unsub();
1060
1174
  });
1175
+
1176
+ // This was a regression that ocurred when we migrated `DeeplyLoaded` to use explicit loading states.
1177
+ // Keeping this test to prevent it from happening again.
1178
+ test("deep loaded CoList nested inside another CoValue can be iterated over", async () => {
1179
+ const TestMap = co.map({ list: co.list(z.number()) });
1180
+
1181
+ const me = await Account.create({
1182
+ creationProps: { name: "Hermes Puggington" },
1183
+ crypto: Crypto,
1184
+ });
1185
+
1186
+ const map = TestMap.create({ list: [1, 2, 3] }, { owner: me });
1187
+
1188
+ const loadedMap = await TestMap.load(map.$jazz.id, {
1189
+ resolve: {
1190
+ list: true,
1191
+ },
1192
+ loadAs: me,
1193
+ });
1194
+ assertLoaded(loadedMap);
1195
+
1196
+ const list = loadedMap.list;
1197
+
1198
+ let expectedValue = 1;
1199
+ // @ts-expect-error - https://github.com/microsoft/TypeScript/issues/62621
1200
+ for (const item of list) {
1201
+ expect(item).toEqual(expectedValue);
1202
+ expectedValue++;
1203
+ }
1204
+ });
1205
+
1206
+ describe("$isLoaded", async () => {
1207
+ const me = await Account.create({
1208
+ creationProps: { name: "Hermes Puggington" },
1209
+ crypto: Crypto,
1210
+ });
1211
+
1212
+ const map = TestMap.create({ list: [] }, { owner: me });
1213
+
1214
+ test("$isLoaded narrows MaybeLoaded to loaded CoValue", async () => {
1215
+ const maybeLoadedMap = await TestMap.load(map.$jazz.id, {
1216
+ loadAs: me,
1217
+ });
1218
+
1219
+ expect(maybeLoadedMap.$isLoaded).toBe(true);
1220
+ if (maybeLoadedMap.$isLoaded) {
1221
+ expect(maybeLoadedMap.$jazz.loadingState).toBe(
1222
+ CoValueLoadingState.LOADED,
1223
+ );
1224
+ expect(maybeLoadedMap.$jazz.id).toBe(map.$jazz.id);
1225
+ expect(maybeLoadedMap.list).toEqual([]);
1226
+ } else {
1227
+ expectTypeOf(
1228
+ maybeLoadedMap.$jazz.loadingState,
1229
+ ).toEqualTypeOf<NotLoadedCoValueState>();
1230
+ }
1231
+ });
1232
+
1233
+ test("$isLoaded narrows MaybeLoaded to not loaded CoValue", async () => {
1234
+ const otherAccount = await Account.create({
1235
+ creationProps: { name: "Other Account" },
1236
+ crypto: Crypto,
1237
+ });
1238
+ const unloadedMap: MaybeLoaded<Loaded<typeof TestMap>> = await TestMap.load(
1239
+ map.$jazz.id,
1240
+ { loadAs: otherAccount },
1241
+ );
1242
+
1243
+ expect(unloadedMap.$isLoaded).toBe(false);
1244
+ if (!unloadedMap.$isLoaded) {
1245
+ expect(unloadedMap.$jazz.loadingState).toBe(
1246
+ CoValueLoadingState.UNAVAILABLE,
1247
+ );
1248
+ expect(unloadedMap.$jazz.id).toBe(map.$jazz.id);
1249
+ // @ts-expect-error - list should not be accessible on NotLoaded
1250
+ unloadedMap.list;
1251
+ } else {
1252
+ expectTypeOf(unloadedMap.$jazz.loadingState).toEqualTypeOf<
1253
+ typeof CoValueLoadingState.LOADED
1254
+ >();
1255
+ }
1256
+ });
1257
+ });