@dxos/echo 0.8.4-main.66e292d → 0.8.4-main.69d29f4

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 (459) hide show
  1. package/README.md +1 -2
  2. package/dist/lib/browser/Annotation.mjs +33 -0
  3. package/dist/lib/browser/Annotation.mjs.map +7 -0
  4. package/dist/lib/browser/Database.mjs +18 -0
  5. package/dist/lib/browser/Database.mjs.map +7 -0
  6. package/dist/lib/browser/Entity.mjs +52 -0
  7. package/dist/lib/browser/Entity.mjs.map +7 -0
  8. package/dist/lib/browser/Err.mjs +11 -0
  9. package/dist/lib/browser/Err.mjs.map +7 -0
  10. package/dist/lib/browser/Filter.mjs +62 -0
  11. package/dist/lib/browser/Filter.mjs.map +7 -0
  12. package/dist/lib/browser/Format.mjs +67 -0
  13. package/dist/lib/browser/Format.mjs.map +7 -0
  14. package/dist/lib/browser/JsonSchema.mjs +20 -0
  15. package/dist/lib/browser/JsonSchema.mjs.map +7 -0
  16. package/dist/lib/browser/Key.mjs +13 -0
  17. package/dist/lib/browser/Key.mjs.map +7 -0
  18. package/dist/lib/browser/Obj.mjs +91 -0
  19. package/dist/lib/browser/Obj.mjs.map +7 -0
  20. package/dist/lib/browser/Order.mjs +13 -0
  21. package/dist/lib/browser/Order.mjs.map +7 -0
  22. package/dist/lib/browser/Query.mjs +27 -0
  23. package/dist/lib/browser/Query.mjs.map +7 -0
  24. package/dist/lib/browser/QueryResult.mjs +3 -0
  25. package/dist/lib/browser/QueryResult.mjs.map +7 -0
  26. package/dist/lib/browser/Ref.mjs +23 -0
  27. package/dist/lib/browser/Ref.mjs.map +7 -0
  28. package/dist/lib/browser/Relation.mjs +85 -0
  29. package/dist/lib/browser/Relation.mjs.map +7 -0
  30. package/dist/lib/browser/SchemaRegistry.mjs +3 -0
  31. package/dist/lib/browser/SchemaRegistry.mjs.map +7 -0
  32. package/dist/lib/browser/Tag.mjs +26 -0
  33. package/dist/lib/browser/Tag.mjs.map +7 -0
  34. package/dist/lib/browser/Type.mjs +48 -0
  35. package/dist/lib/browser/Type.mjs.map +7 -0
  36. package/dist/lib/browser/chunk-2RMVRVOB.mjs +250 -0
  37. package/dist/lib/browser/chunk-2RMVRVOB.mjs.map +7 -0
  38. package/dist/lib/browser/chunk-5RDNDPMX.mjs +74 -0
  39. package/dist/lib/browser/chunk-5RDNDPMX.mjs.map +7 -0
  40. package/dist/lib/browser/chunk-73M2G455.mjs +98 -0
  41. package/dist/lib/browser/chunk-73M2G455.mjs.map +7 -0
  42. package/dist/lib/browser/chunk-7STIBCP7.mjs +133 -0
  43. package/dist/lib/browser/chunk-7STIBCP7.mjs.map +7 -0
  44. package/dist/lib/browser/chunk-AFGYYVVQ.mjs +57 -0
  45. package/dist/lib/browser/chunk-AFGYYVVQ.mjs.map +7 -0
  46. package/dist/lib/browser/chunk-BC6R4CAF.mjs +24 -0
  47. package/dist/lib/browser/chunk-BC6R4CAF.mjs.map +7 -0
  48. package/dist/lib/browser/chunk-BPYFLHWO.mjs +158 -0
  49. package/dist/lib/browser/chunk-BPYFLHWO.mjs.map +7 -0
  50. package/dist/lib/browser/chunk-CBPFF3ZO.mjs +204 -0
  51. package/dist/lib/browser/chunk-CBPFF3ZO.mjs.map +7 -0
  52. package/dist/lib/browser/chunk-CGS2ULMK.mjs +11 -0
  53. package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +7 -0
  54. package/dist/lib/browser/chunk-CJ5YELTO.mjs +39 -0
  55. package/dist/lib/browser/chunk-CJ5YELTO.mjs.map +7 -0
  56. package/dist/lib/browser/chunk-FPOISFQK.mjs +40 -0
  57. package/dist/lib/browser/chunk-FPOISFQK.mjs.map +7 -0
  58. package/dist/lib/browser/chunk-INHXFXY5.mjs +22 -0
  59. package/dist/lib/browser/chunk-INHXFXY5.mjs.map +7 -0
  60. package/dist/lib/browser/chunk-IXVWLTG7.mjs +9 -0
  61. package/dist/lib/browser/chunk-IXVWLTG7.mjs.map +7 -0
  62. package/dist/lib/browser/chunk-JMKVF2YQ.mjs +43 -0
  63. package/dist/lib/browser/chunk-JMKVF2YQ.mjs.map +7 -0
  64. package/dist/lib/browser/chunk-L4RXUJHJ.mjs +143 -0
  65. package/dist/lib/browser/chunk-L4RXUJHJ.mjs.map +7 -0
  66. package/dist/lib/browser/chunk-MYCCGG2T.mjs +15 -0
  67. package/dist/lib/browser/chunk-MYCCGG2T.mjs.map +7 -0
  68. package/dist/lib/browser/{chunk-7GH6RXJ3.mjs → chunk-PAM4KEXE.mjs} +2005 -1841
  69. package/dist/lib/browser/chunk-PAM4KEXE.mjs.map +7 -0
  70. package/dist/lib/browser/chunk-QIWDIPLR.mjs +41 -0
  71. package/dist/lib/browser/chunk-QIWDIPLR.mjs.map +7 -0
  72. package/dist/lib/browser/chunk-R3S54KRI.mjs +403 -0
  73. package/dist/lib/browser/chunk-R3S54KRI.mjs.map +7 -0
  74. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs +283 -0
  75. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs.map +7 -0
  76. package/dist/lib/browser/chunk-TPIL3G6Y.mjs +288 -0
  77. package/dist/lib/browser/chunk-TPIL3G6Y.mjs.map +7 -0
  78. package/dist/lib/browser/chunk-YKTSSMDS.mjs +69 -0
  79. package/dist/lib/browser/chunk-YKTSSMDS.mjs.map +7 -0
  80. package/dist/lib/browser/chunk-ZHXZGIXD.mjs +9 -0
  81. package/dist/lib/browser/chunk-ZHXZGIXD.mjs.map +7 -0
  82. package/dist/lib/browser/index.mjs +65 -25
  83. package/dist/lib/browser/internal/index.mjs +213 -92
  84. package/dist/lib/browser/meta.json +1 -1
  85. package/dist/lib/browser/testing/index.mjs +80 -41
  86. package/dist/lib/browser/testing/index.mjs.map +3 -3
  87. package/dist/lib/node-esm/Annotation.mjs +33 -0
  88. package/dist/lib/node-esm/Annotation.mjs.map +7 -0
  89. package/dist/lib/node-esm/Database.mjs +18 -0
  90. package/dist/lib/node-esm/Database.mjs.map +7 -0
  91. package/dist/lib/node-esm/Entity.mjs +52 -0
  92. package/dist/lib/node-esm/Entity.mjs.map +7 -0
  93. package/dist/lib/node-esm/Err.mjs +11 -0
  94. package/dist/lib/node-esm/Err.mjs.map +7 -0
  95. package/dist/lib/node-esm/Filter.mjs +62 -0
  96. package/dist/lib/node-esm/Filter.mjs.map +7 -0
  97. package/dist/lib/node-esm/Format.mjs +67 -0
  98. package/dist/lib/node-esm/Format.mjs.map +7 -0
  99. package/dist/lib/node-esm/JsonSchema.mjs +20 -0
  100. package/dist/lib/node-esm/JsonSchema.mjs.map +7 -0
  101. package/dist/lib/node-esm/Key.mjs +13 -0
  102. package/dist/lib/node-esm/Key.mjs.map +7 -0
  103. package/dist/lib/node-esm/Obj.mjs +91 -0
  104. package/dist/lib/node-esm/Obj.mjs.map +7 -0
  105. package/dist/lib/node-esm/Order.mjs +13 -0
  106. package/dist/lib/node-esm/Order.mjs.map +7 -0
  107. package/dist/lib/node-esm/Query.mjs +27 -0
  108. package/dist/lib/node-esm/Query.mjs.map +7 -0
  109. package/dist/lib/node-esm/QueryResult.mjs +3 -0
  110. package/dist/lib/node-esm/QueryResult.mjs.map +7 -0
  111. package/dist/lib/node-esm/Ref.mjs +23 -0
  112. package/dist/lib/node-esm/Ref.mjs.map +7 -0
  113. package/dist/lib/node-esm/Relation.mjs +85 -0
  114. package/dist/lib/node-esm/Relation.mjs.map +7 -0
  115. package/dist/lib/node-esm/SchemaRegistry.mjs +3 -0
  116. package/dist/lib/node-esm/SchemaRegistry.mjs.map +7 -0
  117. package/dist/lib/node-esm/Tag.mjs +26 -0
  118. package/dist/lib/node-esm/Tag.mjs.map +7 -0
  119. package/dist/lib/node-esm/Type.mjs +48 -0
  120. package/dist/lib/node-esm/Type.mjs.map +7 -0
  121. package/dist/lib/node-esm/chunk-2RIFBW3A.mjs +250 -0
  122. package/dist/lib/node-esm/chunk-2RIFBW3A.mjs.map +7 -0
  123. package/dist/lib/node-esm/chunk-5CB2ZW74.mjs +57 -0
  124. package/dist/lib/node-esm/chunk-5CB2ZW74.mjs.map +7 -0
  125. package/dist/lib/node-esm/{chunk-M4B6BMD2.mjs → chunk-5U5F4AWK.mjs} +2005 -1841
  126. package/dist/lib/node-esm/chunk-5U5F4AWK.mjs.map +7 -0
  127. package/dist/lib/node-esm/chunk-AJEMYSIR.mjs +22 -0
  128. package/dist/lib/node-esm/chunk-AJEMYSIR.mjs.map +7 -0
  129. package/dist/lib/node-esm/chunk-BKYE5IW6.mjs +158 -0
  130. package/dist/lib/node-esm/chunk-BKYE5IW6.mjs.map +7 -0
  131. package/dist/lib/node-esm/chunk-BYOD7EVP.mjs +98 -0
  132. package/dist/lib/node-esm/chunk-BYOD7EVP.mjs.map +7 -0
  133. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs +133 -0
  134. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs.map +7 -0
  135. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  136. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  137. package/dist/lib/node-esm/chunk-K37NA7PO.mjs +43 -0
  138. package/dist/lib/node-esm/chunk-K37NA7PO.mjs.map +7 -0
  139. package/dist/lib/node-esm/chunk-LIXUCQJM.mjs +41 -0
  140. package/dist/lib/node-esm/chunk-LIXUCQJM.mjs.map +7 -0
  141. package/dist/lib/node-esm/chunk-MOLNWFNL.mjs +9 -0
  142. package/dist/lib/node-esm/chunk-MOLNWFNL.mjs.map +7 -0
  143. package/dist/lib/node-esm/chunk-MOWUEW5P.mjs +15 -0
  144. package/dist/lib/node-esm/chunk-MOWUEW5P.mjs.map +7 -0
  145. package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs +40 -0
  146. package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs.map +7 -0
  147. package/dist/lib/node-esm/chunk-OZEDKT4R.mjs +204 -0
  148. package/dist/lib/node-esm/chunk-OZEDKT4R.mjs.map +7 -0
  149. package/dist/lib/node-esm/chunk-PW3VCWL5.mjs +24 -0
  150. package/dist/lib/node-esm/chunk-PW3VCWL5.mjs.map +7 -0
  151. package/dist/lib/node-esm/chunk-TSTKBFST.mjs +403 -0
  152. package/dist/lib/node-esm/chunk-TSTKBFST.mjs.map +7 -0
  153. package/dist/lib/node-esm/chunk-UKGVOINP.mjs +9 -0
  154. package/dist/lib/node-esm/chunk-UKGVOINP.mjs.map +7 -0
  155. package/dist/lib/node-esm/chunk-UV63HEHQ.mjs +143 -0
  156. package/dist/lib/node-esm/chunk-UV63HEHQ.mjs.map +7 -0
  157. package/dist/lib/node-esm/chunk-WXLVPCRJ.mjs +288 -0
  158. package/dist/lib/node-esm/chunk-WXLVPCRJ.mjs.map +7 -0
  159. package/dist/lib/node-esm/chunk-WZ6YBELW.mjs +74 -0
  160. package/dist/lib/node-esm/chunk-WZ6YBELW.mjs.map +7 -0
  161. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs +69 -0
  162. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs.map +7 -0
  163. package/dist/lib/node-esm/chunk-YOLH5KS4.mjs +283 -0
  164. package/dist/lib/node-esm/chunk-YOLH5KS4.mjs.map +7 -0
  165. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs +39 -0
  166. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs.map +7 -0
  167. package/dist/lib/node-esm/index.mjs +65 -25
  168. package/dist/lib/node-esm/internal/index.mjs +213 -92
  169. package/dist/lib/node-esm/meta.json +1 -1
  170. package/dist/lib/node-esm/testing/index.mjs +80 -41
  171. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  172. package/dist/types/src/Annotation.d.ts +1 -1
  173. package/dist/types/src/Annotation.d.ts.map +1 -1
  174. package/dist/types/src/Database.d.ts +117 -60
  175. package/dist/types/src/Database.d.ts.map +1 -1
  176. package/dist/types/src/Entity.d.ts +111 -5
  177. package/dist/types/src/Entity.d.ts.map +1 -1
  178. package/dist/types/src/Entity.test.d.ts +2 -0
  179. package/dist/types/src/Entity.test.d.ts.map +1 -0
  180. package/dist/types/src/{errors.d.ts → Err.d.ts} +13 -17
  181. package/dist/types/src/Err.d.ts.map +1 -0
  182. package/dist/types/src/Filter.d.ts +120 -0
  183. package/dist/types/src/Filter.d.ts.map +1 -0
  184. package/dist/types/src/Format.d.ts.map +1 -1
  185. package/dist/types/src/Hypergraph.d.ts +60 -0
  186. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  187. package/dist/types/src/Obj.d.ts +268 -76
  188. package/dist/types/src/Obj.d.ts.map +1 -1
  189. package/dist/types/src/Obj.test.d.ts +2 -0
  190. package/dist/types/src/Obj.test.d.ts.map +1 -0
  191. package/dist/types/src/Order.d.ts +16 -0
  192. package/dist/types/src/Order.d.ts.map +1 -0
  193. package/dist/types/src/{query/query.d.ts → Query.d.ts} +53 -50
  194. package/dist/types/src/Query.d.ts.map +1 -0
  195. package/dist/types/src/Query.test.d.ts +2 -0
  196. package/dist/types/src/Query.test.d.ts.map +1 -0
  197. package/dist/types/src/QueryResult.d.ts +80 -0
  198. package/dist/types/src/QueryResult.d.ts.map +1 -0
  199. package/dist/types/src/Ref.d.ts +9 -7
  200. package/dist/types/src/Ref.d.ts.map +1 -1
  201. package/dist/types/src/Relation.d.ts +235 -18
  202. package/dist/types/src/Relation.d.ts.map +1 -1
  203. package/dist/types/src/Relation.test.d.ts +2 -0
  204. package/dist/types/src/Relation.test.d.ts.map +1 -0
  205. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  206. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  207. package/dist/types/src/Tag.d.ts +6 -6
  208. package/dist/types/src/Tag.d.ts.map +1 -1
  209. package/dist/types/src/Type.d.ts +213 -50
  210. package/dist/types/src/Type.d.ts.map +1 -1
  211. package/dist/types/src/Type.test.d.ts +2 -0
  212. package/dist/types/src/Type.test.d.ts.map +1 -0
  213. package/dist/types/src/index.d.ts +8 -2
  214. package/dist/types/src/index.d.ts.map +1 -1
  215. package/dist/types/src/internal/annotations/annotations.d.ts +23 -27
  216. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -1
  217. package/dist/types/src/internal/annotations/util.d.ts +1 -0
  218. package/dist/types/src/internal/annotations/util.d.ts.map +1 -1
  219. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  220. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  221. package/dist/types/src/internal/api/entity.d.ts +13 -0
  222. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  223. package/dist/types/src/internal/api/index.d.ts +15 -0
  224. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  225. package/dist/types/src/internal/api/meta.d.ts +42 -0
  226. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  227. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  228. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  229. package/dist/types/src/internal/api/version.d.ts +42 -0
  230. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  231. package/dist/types/src/internal/entities/entity.d.ts +13 -3
  232. package/dist/types/src/internal/entities/entity.d.ts.map +1 -1
  233. package/dist/types/src/internal/entities/index.d.ts +1 -1
  234. package/dist/types/src/internal/entities/index.d.ts.map +1 -1
  235. package/dist/types/src/internal/entities/model.d.ts +14 -7
  236. package/dist/types/src/internal/entities/model.d.ts.map +1 -1
  237. package/dist/types/src/internal/entities/object.d.ts +8 -1
  238. package/dist/types/src/internal/entities/object.d.ts.map +1 -1
  239. package/dist/types/src/internal/entities/relation.d.ts +8 -1
  240. package/dist/types/src/internal/entities/relation.d.ts.map +1 -1
  241. package/dist/types/src/internal/formats/format.d.ts +4 -4
  242. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  243. package/dist/types/src/internal/formats/select.d.ts +6 -4
  244. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  245. package/dist/types/src/internal/formats/string.d.ts +4 -0
  246. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  247. package/dist/types/src/internal/formats/types.d.ts +6 -2
  248. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  249. package/dist/types/src/internal/index.d.ts +2 -1
  250. package/dist/types/src/internal/index.d.ts.map +1 -1
  251. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  252. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  253. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  254. package/dist/types/src/internal/json-schema/json-schema.d.ts +2 -1
  255. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -1
  256. package/dist/types/src/internal/object/clone.d.ts +8 -0
  257. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  258. package/dist/types/src/internal/object/create-object.d.ts +1 -1
  259. package/dist/types/src/internal/object/index.d.ts +3 -0
  260. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  261. package/dist/types/src/internal/object/json-serializer.d.ts +13 -7
  262. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  263. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  264. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  265. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  266. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  267. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  268. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  269. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  270. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  271. package/dist/types/src/internal/object/typed-object.d.ts +7 -13
  272. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  273. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  274. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  275. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  276. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  277. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  278. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  279. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  280. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  281. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  282. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  283. package/dist/types/src/internal/proxy/index.d.ts +11 -0
  284. package/dist/types/src/internal/proxy/index.d.ts.map +1 -1
  285. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  286. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  287. package/dist/types/src/internal/proxy/make-object.d.ts +2 -4
  288. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -1
  289. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  290. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  291. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  292. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  293. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  294. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  295. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  296. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  297. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  298. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  299. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  300. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  301. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  302. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  303. package/dist/types/src/internal/proxy/typed-handler.d.ts +14 -11
  304. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  305. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  306. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  307. package/dist/types/src/internal/ref/ref.d.ts +16 -7
  308. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  309. package/dist/types/src/internal/schema/compose.d.ts +2 -1
  310. package/dist/types/src/internal/schema/compose.d.ts.map +1 -1
  311. package/dist/types/src/internal/schema/echo-schema.d.ts +15 -3
  312. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  313. package/dist/types/src/internal/schema/index.d.ts +0 -2
  314. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  315. package/dist/types/src/internal/schema/persistent-schema.d.ts +9 -7
  316. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -1
  317. package/dist/types/src/internal/types/base.d.ts +5 -16
  318. package/dist/types/src/internal/types/base.d.ts.map +1 -1
  319. package/dist/types/src/internal/types/entity.d.ts +27 -2
  320. package/dist/types/src/internal/types/entity.d.ts.map +1 -1
  321. package/dist/types/src/internal/types/meta.d.ts +6 -14
  322. package/dist/types/src/internal/types/meta.d.ts.map +1 -1
  323. package/dist/types/src/testing/test-schema.d.ts +141 -175
  324. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  325. package/dist/types/src/testing/util.d.ts +6 -1
  326. package/dist/types/src/testing/util.d.ts.map +1 -1
  327. package/dist/types/tsconfig.tsbuildinfo +1 -1
  328. package/package.json +130 -23
  329. package/src/Annotation.ts +5 -4
  330. package/src/Database.ts +229 -82
  331. package/src/Entity.test.ts +22 -0
  332. package/src/Entity.ts +173 -7
  333. package/src/{errors.ts → Err.ts} +2 -2
  334. package/src/Filter.ts +376 -0
  335. package/src/Format.ts +0 -2
  336. package/src/Hypergraph.ts +74 -0
  337. package/src/Obj.test.ts +386 -0
  338. package/src/Obj.ts +338 -250
  339. package/src/{query/order.ts → Order.ts} +19 -9
  340. package/src/{query/query.test.ts → Query.test.ts} +180 -49
  341. package/src/{query/query.ts → Query.ts} +115 -122
  342. package/src/QueryResult.ts +106 -0
  343. package/src/Ref.ts +20 -3
  344. package/src/Relation.test.ts +82 -0
  345. package/src/Relation.ts +364 -27
  346. package/src/SchemaRegistry.ts +105 -0
  347. package/src/Tag.ts +1 -1
  348. package/src/Type.test.ts +52 -0
  349. package/src/Type.ts +322 -88
  350. package/src/index.ts +9 -5
  351. package/src/internal/README.md +36 -17
  352. package/src/internal/annotations/annotations.test.ts +6 -6
  353. package/src/internal/annotations/annotations.ts +73 -76
  354. package/src/internal/annotations/util.ts +2 -0
  355. package/src/internal/api/annotations.ts +60 -0
  356. package/src/internal/api/entity.ts +29 -0
  357. package/src/internal/api/index.ts +19 -0
  358. package/src/internal/api/meta.ts +88 -0
  359. package/src/internal/api/sorting.ts +53 -0
  360. package/src/internal/api/version.ts +96 -0
  361. package/src/internal/entities/entity.ts +36 -19
  362. package/src/internal/entities/index.ts +1 -1
  363. package/src/internal/entities/model.ts +17 -12
  364. package/src/internal/entities/object.ts +21 -8
  365. package/src/internal/entities/relation.ts +23 -7
  366. package/src/internal/formats/format.test.ts +1 -1
  367. package/src/internal/formats/format.ts +7 -8
  368. package/src/internal/formats/object.ts +2 -2
  369. package/src/internal/formats/select.ts +6 -4
  370. package/src/internal/formats/string.ts +5 -0
  371. package/src/internal/formats/types.ts +9 -3
  372. package/src/internal/index.ts +2 -1
  373. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  374. package/src/internal/json-schema/json-schema-type.ts +31 -32
  375. package/src/internal/json-schema/json-schema.test.ts +19 -17
  376. package/src/internal/json-schema/json-schema.ts +14 -10
  377. package/src/internal/object/clone.ts +48 -0
  378. package/src/internal/object/create-object.ts +2 -2
  379. package/src/internal/object/index.ts +3 -0
  380. package/src/internal/object/inspect.ts +3 -3
  381. package/src/internal/object/json-serializer.test.ts +6 -2
  382. package/src/internal/object/json-serializer.ts +28 -70
  383. package/src/internal/object/schema-validator.test.ts +3 -7
  384. package/src/internal/object/schema-validator.ts +2 -238
  385. package/src/internal/object/set-value.test.ts +281 -0
  386. package/src/internal/object/set-value.ts +165 -0
  387. package/src/internal/object/snapshot.ts +70 -0
  388. package/src/internal/object/typed-object.test.ts +11 -11
  389. package/src/internal/object/typed-object.ts +8 -72
  390. package/src/internal/proxy/change-context.ts +138 -0
  391. package/src/internal/proxy/change.test.ts +519 -0
  392. package/src/internal/proxy/define-hidden-property.ts +14 -0
  393. package/src/internal/proxy/errors.ts +42 -0
  394. package/src/internal/proxy/event-batch.ts +44 -0
  395. package/src/internal/proxy/handler.test.ts +30 -80
  396. package/src/internal/proxy/index.ts +11 -0
  397. package/src/internal/proxy/json-serializer.ts +87 -0
  398. package/src/internal/proxy/make-object.ts +33 -50
  399. package/src/internal/proxy/ownership.ts +253 -0
  400. package/src/internal/proxy/proxy-types.ts +23 -0
  401. package/src/internal/proxy/proxy-utils.ts +150 -0
  402. package/src/internal/proxy/reactive-array.ts +71 -0
  403. package/src/internal/proxy/reactive.ts +69 -0
  404. package/src/internal/proxy/schema-validator.ts +244 -0
  405. package/src/internal/proxy/schema.test.ts +23 -15
  406. package/src/internal/proxy/symbols.ts +7 -0
  407. package/src/internal/proxy/typed-handler.test.ts +247 -35
  408. package/src/internal/proxy/typed-handler.ts +265 -56
  409. package/src/internal/proxy/typed-object.test.ts +37 -26
  410. package/src/internal/ref/ref-array.ts +4 -4
  411. package/src/internal/ref/ref.test.ts +1 -1
  412. package/src/internal/ref/ref.ts +64 -40
  413. package/src/internal/schema/compose.test.ts +3 -3
  414. package/src/internal/schema/compose.ts +13 -9
  415. package/src/internal/schema/echo-schema.ts +49 -11
  416. package/src/internal/schema/index.ts +0 -2
  417. package/src/internal/schema/persistent-schema.ts +3 -4
  418. package/src/internal/types/base.ts +6 -21
  419. package/src/internal/types/entity.ts +35 -4
  420. package/src/internal/types/meta.ts +13 -24
  421. package/src/testing/api.test.ts +31 -5
  422. package/src/testing/test-schema.ts +55 -30
  423. package/src/testing/util.ts +22 -15
  424. package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +0 -7
  425. package/dist/lib/browser/chunk-E4UTVJNF.mjs +0 -1111
  426. package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +0 -7
  427. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +0 -1111
  428. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +0 -7
  429. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +0 -7
  430. package/dist/types/src/errors.d.ts.map +0 -1
  431. package/dist/types/src/internal/entities/expando.d.ts +0 -16
  432. package/dist/types/src/internal/entities/expando.d.ts.map +0 -1
  433. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  434. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  435. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  436. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  437. package/dist/types/src/query/filter.d.ts +0 -167
  438. package/dist/types/src/query/filter.d.ts.map +0 -1
  439. package/dist/types/src/query/index.d.ts +0 -5
  440. package/dist/types/src/query/index.d.ts.map +0 -1
  441. package/dist/types/src/query/order.d.ts +0 -12
  442. package/dist/types/src/query/order.d.ts.map +0 -1
  443. package/dist/types/src/query/query.d.ts.map +0 -1
  444. package/dist/types/src/query/query.test.d.ts +0 -2
  445. package/dist/types/src/query/query.test.d.ts.map +0 -1
  446. package/dist/types/src/query/testing.d.ts +0 -51
  447. package/dist/types/src/query/testing.d.ts.map +0 -1
  448. package/dist/types/src/query/types.d.ts +0 -17
  449. package/dist/types/src/query/types.d.ts.map +0 -1
  450. package/dist/types/src/query/util.d.ts +0 -8
  451. package/dist/types/src/query/util.d.ts.map +0 -1
  452. package/src/internal/entities/expando.ts +0 -23
  453. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  454. package/src/internal/schema/snapshot.ts +0 -25
  455. package/src/query/filter.ts +0 -455
  456. package/src/query/index.ts +0 -9
  457. package/src/query/testing.ts +0 -64
  458. package/src/query/types.ts +0 -23
  459. package/src/query/util.ts +0 -25
package/src/Obj.ts CHANGED
@@ -5,71 +5,117 @@
5
5
  import * as Function from 'effect/Function';
6
6
  import * as Schema from 'effect/Schema';
7
7
 
8
- import { type ForeignKey } from '@dxos/echo-protocol';
9
- import { assertArgument, invariant } from '@dxos/invariant';
8
+ import type { ForeignKey } from '@dxos/echo-protocol';
9
+ import { createJsonPath, getValue as getValue$ } from '@dxos/effect';
10
+ import { assertArgument } from '@dxos/invariant';
10
11
  import { type DXN, ObjectId } from '@dxos/keys';
11
- import { getSnapshot as getSnapshot$ } from '@dxos/live-object';
12
- import { assumeType, deepMapValues } from '@dxos/util';
12
+ import { assumeType } from '@dxos/util';
13
13
 
14
+ import type * as Database from './Database';
14
15
  import * as Entity from './Entity';
15
16
  import {
16
- type AnyEchoObject,
17
+ type ObjectJSON as APIJSON,
18
+ type AnyEntity,
17
19
  type AnyProperties,
20
+ type Comparator as ApiComparator,
21
+ type Meta as ApiMeta,
22
+ type ReadonlyMeta as ApiReadonlyMeta,
23
+ type EntityVersion as ApiVersion,
24
+ type ChangeCallback,
18
25
  type InternalObjectProps,
26
+ type KindId,
19
27
  MetaId,
20
- type ObjectJSON,
28
+ type Mutable,
21
29
  type ObjectMeta,
22
- ObjectVersionId,
30
+ type SnapshotKindId,
31
+ type VersionCompareResult,
23
32
  VersionTypeId,
33
+ addTag as addTag$,
34
+ change as change$,
35
+ clone as clone$,
36
+ compareVersions,
37
+ decodeVersion,
38
+ deleteKeys as deleteKeys$,
39
+ encodeVersion,
40
+ getDXN as getDXN$,
41
+ getDatabase as getDatabase$,
24
42
  getDescription as getDescription$,
43
+ getKeys as getKeys$,
25
44
  getLabel as getLabel$,
26
- getMeta as getMeta$,
27
- getObjectDXN,
45
+ getMetaChecked as getMeta$,
28
46
  getSchema as getSchema$,
29
- getSchemaTypename,
47
+ getSnapshot as getSnapshot$,
30
48
  getTypeAnnotation,
31
49
  getTypeDXN as getTypeDXN$,
50
+ getTypename as getTypename$,
32
51
  isDeleted as isDeleted$,
33
52
  isInstanceOf,
53
+ isVersion,
34
54
  makeObject,
35
55
  objectFromJSON,
36
- objectToJSON,
56
+ removeTag as removeTag$,
37
57
  setDescription as setDescription$,
38
58
  setLabel as setLabel$,
59
+ setValue as setValue$,
60
+ sort as sort$,
61
+ sortByLabel as sortByLabel$,
62
+ sortByTypename as sortByTypename$,
63
+ subscribe as subscribe$,
64
+ objectToJSON as toJSON$,
65
+ version as version$,
66
+ versionValid,
39
67
  } from './internal';
40
- import * as Ref from './Ref';
41
- import * as Type from './Type';
68
+ import type * as Ref from './Ref';
69
+ import type * as Type from './Type';
42
70
 
43
71
  /**
44
72
  * Base type for all ECHO objects.
45
- * @private
46
73
  */
47
- interface BaseObj extends AnyEchoObject, Entity.OfKind<typeof Entity.Kind.Object> {}
74
+ interface BaseObj extends AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
48
75
 
49
76
  /**
50
- * Base type for all Obj objects.
77
+ * Object type with specific properties.
51
78
  */
52
- export interface Any extends BaseObj {}
53
-
54
- export const Any = Schema.Struct({}).pipe(
55
- Type.Obj({
56
- typename: 'dxos.org/type/Any',
57
- version: '0.1.0',
58
- }),
59
- );
79
+ export type Obj<Props> = BaseObj & Props;
60
80
 
61
81
  /**
62
- * Object type with specific properties.
82
+ * Object with no known properties beyond id and kind.
83
+ * Use this when the object's schema/properties are not known.
84
+ * For objects with arbitrary properties, use `Obj.AnyProps`.
85
+ *
86
+ * NOTE: This is a TypeScript type only, not a schema.
87
+ * To validate that a value is an ECHO object, use `Schema.is(Type.Obj)`.
63
88
  */
64
- export type Obj<Props> = BaseObj & Props;
89
+ export interface Unknown extends BaseObj {}
65
90
 
66
91
  /**
67
92
  * Object with arbitrary properties.
68
93
  *
69
- * NOTE: Due to how typescript works, this type is not assignable to a specific schema type.
94
+ * NOTE: Due to how TypeScript works, this type is not assignable to a specific schema type.
70
95
  * In that case, use `Obj.instanceOf` to check if an object is of a specific type.
96
+ *
97
+ * Prefer using `Obj.Unknown` when you don't need to access arbitrary properties.
98
+ */
99
+ export interface Any extends BaseObj, AnyProperties {}
100
+
101
+ /**
102
+ * Base type for snapshot objects (has SnapshotKindId instead of KindId).
103
+ */
104
+ interface BaseSnapshot extends AnyEntity {
105
+ readonly [SnapshotKindId]: typeof Entity.Kind.Object;
106
+ readonly id: ObjectId;
107
+ }
108
+
109
+ /**
110
+ * Immutable snapshot of an ECHO object.
111
+ * Branded with SnapshotKindId (not KindId).
112
+ * Property values are frozen at the time the snapshot was created.
113
+ * Returned by getSnapshot() and hooks like useObject().
114
+ *
115
+ * Snapshots are structurally identical to reactive objects but have a different brand,
116
+ * making them distinguishable at the TypeScript level. Neither is assignable to the other.
71
117
  */
72
- export interface AnyProps extends BaseObj, AnyProperties {}
118
+ export type Snapshot<T extends Unknown = Unknown> = Omit<T, KindId> & BaseSnapshot;
73
119
 
74
120
  const defaultMeta: ObjectMeta = {
75
121
  keys: [],
@@ -81,13 +127,16 @@ type Props<T = any> = {
81
127
  } & Type.Properties<T>;
82
128
 
83
129
  // TODO(burdon): Should we allow the caller to set the id?
84
- export type MakeProps<T extends Schema.Schema.AnyNoContext> = {
130
+ /**
131
+ * Props type for object creation with a given schema.
132
+ */
133
+ export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
85
134
  id?: ObjectId;
86
135
  [Meta]?: Partial<ObjectMeta>;
87
- } & NoInfer<Props<Schema.Schema.Type<T>>>;
136
+ } & NoInfer<Props<Schema.Schema.Type<S>>>;
88
137
 
89
138
  /**
90
- * Creates a new object of the given types.
139
+ * Creates a new echo object of the given schema.
91
140
  * @param schema - Object schema.
92
141
  * @param props - Object properties.
93
142
  * @param meta - Object metadata (deprecated) -- pass with Obj.Meta.
@@ -98,8 +147,16 @@ export type MakeProps<T extends Schema.Schema.AnyNoContext> = {
98
147
  * ```ts
99
148
  * const obj = Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' });
100
149
  * ```
150
+ *
151
+ * Note: Only accepts object schemas, not relation schemas. Use `Relation.make` for relations.
101
152
  */
102
- export const make = <S extends Schema.Schema.AnyNoContext>(
153
+ export const make: {
154
+ <S extends Type.Obj.Any>(schema: S, props: MakeProps<S>): Obj<Schema.Schema.Type<S>>;
155
+ /**
156
+ * @deprecated Pass meta as in the example: `Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' })`.
157
+ */
158
+ <S extends Type.Obj.Any>(schema: S, props: MakeProps<S>, meta: Partial<ObjectMeta>): Obj<Schema.Schema.Type<S>>;
159
+ } = <S extends Type.Obj.Any>(
103
160
  schema: S,
104
161
  props: MakeProps<S>,
105
162
  meta?: Partial<ObjectMeta>,
@@ -124,19 +181,31 @@ export const make = <S extends Schema.Schema.AnyNoContext>(
124
181
  /**
125
182
  * Determine if object is an ECHO object.
126
183
  */
127
- export const isObject = (obj: unknown): obj is Any => {
184
+ export const isObject = (obj: unknown): obj is Unknown => {
128
185
  assumeType<InternalObjectProps>(obj);
129
186
  return typeof obj === 'object' && obj !== null && obj[Entity.KindId] === Entity.Kind.Object;
130
187
  };
131
188
 
189
+ /**
190
+ * Subscribe to object updates.
191
+ * The callback is called synchronously when the object is modified.
192
+ * Only accepts reactive objects (not snapshots).
193
+ * @returns Unsubscribe function.
194
+ */
195
+ export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
196
+ return subscribe$(obj, callback);
197
+ };
198
+
132
199
  //
133
200
  // Snapshot
134
201
  //
135
202
 
136
203
  /**
137
204
  * Returns an immutable snapshot of an object.
205
+ * The snapshot is branded with SnapshotKindId instead of KindId,
206
+ * making it distinguishable from the reactive object at the type level.
138
207
  */
139
- export const getSnapshot: <T extends Any>(obj: Obj<T>) => T = getSnapshot$;
208
+ export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = getSnapshot$ as any;
140
209
 
141
210
  export type CloneOptions = {
142
211
  /**
@@ -144,6 +213,12 @@ export type CloneOptions = {
144
213
  * @default false
145
214
  */
146
215
  retainId?: boolean;
216
+
217
+ /**
218
+ * Recursively clone referenced objects.
219
+ * @default false
220
+ */
221
+ deep?: boolean;
147
222
  };
148
223
 
149
224
  /**
@@ -151,31 +226,107 @@ export type CloneOptions = {
151
226
  * This does not clone referenced objects, only the properties in the object.
152
227
  * @returns A new object with the same schema and properties.
153
228
  */
154
- export const clone = <T extends Any>(obj: T, opts?: CloneOptions): T => {
155
- const { id, ...data } = obj;
156
- const schema = getSchema$(obj);
157
- invariant(schema != null, 'Object should have a schema');
158
- const props: any = deepMapValues(data, (value, recurse) => {
159
- if (Ref.isRef(value)) {
160
- return value;
161
- }
162
- return recurse(value);
163
- });
229
+ export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clone$;
164
230
 
165
- if (opts?.retainId) {
166
- props.id = id;
167
- }
168
- const meta = getMeta(obj);
169
- props[MetaId] = deepMapValues(meta, (value, recurse) => {
170
- if (Ref.isRef(value)) {
171
- return value;
172
- }
173
- return recurse(value);
174
- });
231
+ //
232
+ // Change
233
+ //
234
+
235
+ /**
236
+ * Makes all properties mutable recursively.
237
+ * Used to provide a mutable view of an object within `Obj.change`.
238
+ */
239
+ export type { Mutable };
240
+
241
+ /**
242
+ * Perform mutations on an echo object within a controlled context.
243
+ *
244
+ * All mutations within the callback are batched and trigger a single notification
245
+ * when the callback completes. Direct mutations outside of `Obj.change` will throw
246
+ * an error for echo objects.
247
+ *
248
+ * This function also works with nested objects within echo objects (e.g., Template structs)
249
+ * that are reactive at runtime.
250
+ *
251
+ * @param obj - The echo object to mutate. Use `Relation.change` for relations.
252
+ * @param callback - The callback that performs mutations on the object.
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * const person = Obj.make(Person, { name: 'John', age: 25 });
257
+ *
258
+ * // Mutate within Obj.change
259
+ * Obj.change(person, (p) => {
260
+ * p.name = 'Jane';
261
+ * p.age = 30;
262
+ * });
263
+ * // ONE notification fires here
264
+ *
265
+ * // Direct mutation throws
266
+ * person.name = 'Bob'; // Error: Cannot modify outside Obj.change()
267
+ * ```
268
+ *
269
+ * Note: Only accepts objects. Use `Relation.change` for relations.
270
+ */
271
+ export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>): void => {
272
+ change$(obj, callback);
273
+ };
175
274
 
176
- return make(schema as Type.Obj.Any, props);
275
+ /**
276
+ * Get a deeply nested property from an object.
277
+ *
278
+ * Similar to lodash.get and getDeep from @dxos/util.
279
+ * This is the complementary function to setValue.
280
+ * Accepts both reactive objects and snapshots.
281
+ *
282
+ * @param obj - The ECHO object to get the property from.
283
+ * @param path - Path to the property (array of keys).
284
+ * @returns The value at the path, or undefined if not found.
285
+ *
286
+ * @example
287
+ * ```ts
288
+ * const person = Obj.make(Person, {
289
+ * name: 'John',
290
+ * addresses: [{ street: '123 Main St' }]
291
+ * });
292
+ *
293
+ * Obj.getValue(person, ['addresses', 0, 'street']); // '123 Main St'
294
+ * Obj.getValue(person, ['addresses', 1, 'street']); // undefined
295
+ * ```
296
+ */
297
+ export const getValue = (obj: Unknown | Snapshot, path: readonly (string | number)[]): any => {
298
+ return getValue$(obj, createJsonPath(path));
177
299
  };
178
300
 
301
+ /**
302
+ * Set a deeply nested property on an object, using the object's schema to determine
303
+ * whether to initialize nested data as an empty object or array.
304
+ *
305
+ * Similar to lodash.set and setDeep from @dxos/util, but schema-aware.
306
+ * Must be called within an `Obj.change` callback.
307
+ *
308
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
309
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
310
+ *
311
+ * @param obj - The mutable ECHO object to set the property on.
312
+ * @param path - Path to the property (array of keys).
313
+ * @param value - Value to set.
314
+ * @returns The value that was set.
315
+ *
316
+ * @example
317
+ * ```ts
318
+ * const person = Obj.make(Person, { name: 'John' });
319
+ * // Person schema has: addresses: Schema.Array(Address)
320
+ * Obj.change(person, (p) => {
321
+ * Obj.setValue(p, ['addresses', 0, 'street'], '123 Main St');
322
+ * });
323
+ * // Creates: person.addresses = [{ street: '123 Main St' }]
324
+ * ```
325
+ */
326
+ // TODO(wittjosiah): Compute possible path values + type value based on generic object type.
327
+ export const setValue: (obj: Mutable<Unknown>, path: readonly (string | number)[], value: any) => void =
328
+ setValue$ as any;
329
+
179
330
  //
180
331
  // Type
181
332
  //
@@ -207,38 +358,45 @@ export const instanceOf: {
207
358
  }) as any;
208
359
 
209
360
  // TODO(dmaretskyi): Allow returning undefined.
210
- export const getDXN = (entity: Entity.Unknown): DXN => {
361
+ /**
362
+ * Get the DXN of the object.
363
+ * Accepts both reactive objects and snapshots.
364
+ */
365
+ export const getDXN = (entity: Unknown | Snapshot): DXN => {
211
366
  assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
212
- const dxn = getObjectDXN(entity);
213
- invariant(dxn != null, 'Invalid object.');
214
- return dxn;
367
+ return getDXN$(entity);
215
368
  };
216
369
 
217
370
  /**
218
371
  * @returns The DXN of the object's type.
219
372
  * @example dxn:example.com/type/Person:1.0.0
220
373
  */
221
- // TODO(burdon): Must define and return type for expando.
222
- export const getTypeDXN = getTypeDXN$;
374
+ // TODO(wittjosiah): Narrow types.
375
+ export const getTypeDXN: (obj: unknown | undefined) => DXN | undefined = getTypeDXN$ as any;
223
376
 
224
377
  /**
225
378
  * Get the schema of the object.
379
+ * Returns the branded ECHO schema used to create the object.
226
380
  */
227
- export const getSchema = getSchema$;
381
+ // TODO(wittjosiah): Narrow types.
382
+ export const getSchema: (obj: unknown | undefined) => Type.Entity.Any | undefined = getSchema$ as any;
228
383
 
229
384
  /**
230
385
  * @returns The typename of the object's type.
386
+ * Accepts both reactive objects and snapshots.
231
387
  * @example `example.com/type/Person`
232
388
  */
233
- export const getTypename = (entity: Entity.Unknown): string | undefined => {
234
- const schema = getSchema$(entity);
235
- if (schema == null) {
236
- // Try to extract typename from DXN.
237
- return getTypeDXN$(entity)?.asTypeDXN()?.type;
238
- }
389
+ export const getTypename = (entity: Unknown | Snapshot): string | undefined => getTypename$(entity);
239
390
 
240
- return getSchemaTypename(schema);
241
- };
391
+ //
392
+ // Database
393
+ //
394
+
395
+ /**
396
+ * Get the database the object belongs to.
397
+ * Accepts both reactive objects and snapshots.
398
+ */
399
+ export const getDatabase = (entity: Unknown | Snapshot): Database.Database | undefined => getDatabase$(entity);
242
400
 
243
401
  //
244
402
  // Meta
@@ -246,98 +404,121 @@ export const getTypename = (entity: Entity.Unknown): string | undefined => {
246
404
 
247
405
  export const Meta: unique symbol = MetaId as any;
248
406
 
407
+ /**
408
+ * Deeply read-only version of ObjectMeta.
409
+ * Prevents mutation at all nesting levels (e.g., `meta.keys.push()` is a TypeScript error).
410
+ */
411
+ export type ReadonlyMeta = ApiReadonlyMeta;
412
+
413
+ /**
414
+ * Mutable meta type returned by `Obj.getMeta` inside an `Obj.change` callback.
415
+ */
416
+ export type Meta = ApiMeta;
417
+
249
418
  // TODO(burdon): Narrow type.
250
419
  // TODO(dmaretskyi): Allow returning undefined.
251
- export const getMeta = (entity: AnyProperties): ObjectMeta => {
252
- const meta = getMeta$(entity);
253
- invariant(meta != null, 'Invalid object.');
254
- return meta;
255
- };
420
+ /**
421
+ * Get the metadata for an object.
422
+ * Returns mutable meta when passed a mutable object (inside `Obj.change` callback).
423
+ * Returns read-only meta when passed a regular object or snapshot.
424
+ *
425
+ * @example
426
+ * ```ts
427
+ * // Read-only access outside change callback
428
+ * const meta = Obj.getMeta(person); // ReadonlyMeta
429
+ *
430
+ * // Mutable access inside change callback
431
+ * Obj.change(person, (p) => {
432
+ * const meta = Obj.getMeta(p); // ObjectMeta (mutable)
433
+ * meta.tags ??= [];
434
+ * meta.tags.push('important');
435
+ * });
436
+ * ```
437
+ */
438
+ // TODO(wittjosiah): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
439
+ export function getMeta(entity: Mutable<Unknown>): Meta;
440
+ export function getMeta(entity: Unknown | Snapshot): ReadonlyMeta;
441
+ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | ReadonlyMeta {
442
+ return getMeta$(entity);
443
+ }
256
444
 
257
445
  /**
258
446
  * @returns Foreign keys for the object from the specified source.
447
+ * Accepts both reactive objects and snapshots.
259
448
  */
260
449
  export const getKeys: {
261
- (entity: Entity.Unknown, source: string): ForeignKey[];
262
- (source: string): (entity: Entity.Unknown) => ForeignKey[];
263
- } = Function.dual(2, (entity: Entity.Unknown, source?: string): ForeignKey[] => {
264
- const meta = getMeta(entity);
265
- invariant(meta != null, 'Invalid object.');
266
- return meta.keys.filter((key) => key.source === source);
267
- });
450
+ (entity: Unknown | Snapshot, source: string): ForeignKey[];
451
+ (source: string): (entity: Unknown | Snapshot) => ForeignKey[];
452
+ } = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => getKeys$(entity, source!));
268
453
 
269
454
  /**
270
455
  * Delete all keys from the object for the specified source.
271
- * @param entity
272
- * @param source
273
- */
274
- export const deleteKeys = (entity: Entity.Unknown, source: string) => {
275
- const meta = getMeta(entity);
276
- for (let i = 0; i < meta.keys.length; i++) {
277
- if (meta.keys[i].source === source) {
278
- meta.keys.splice(i, 1);
279
- i--;
280
- }
281
- }
282
- };
456
+ * Must be called within an `Obj.change` callback.
457
+ *
458
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
459
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
460
+ */
461
+ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => deleteKeys$(entity, source);
283
462
 
284
- export const addTag = (entity: Entity.Unknown, tag: string) => {
285
- const meta = getMeta(entity);
286
- meta.tags ??= [];
287
- meta.tags.push(tag);
288
- };
463
+ /**
464
+ * Add a tag to the object.
465
+ * Must be called within an `Obj.change` callback.
466
+ *
467
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
468
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
469
+ */
470
+ export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag$(entity, tag);
289
471
 
290
- export const removeTag = (entity: Entity.Unknown, tag: string) => {
291
- const meta = getMeta(entity);
292
- if (!meta.tags) {
293
- return;
294
- }
295
- for (let i = 0; i < meta.tags.length; i++) {
296
- if (meta.tags[i] === tag) {
297
- meta.tags.splice(i, 1);
298
- i--;
299
- }
300
- }
301
- };
472
+ /**
473
+ * Remove a tag from the object.
474
+ * Must be called within an `Obj.change` callback.
475
+ *
476
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
477
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
478
+ */
479
+ export const removeTag = (entity: Mutable<Unknown>, tag: string): void => removeTag$(entity, tag);
302
480
 
481
+ /**
482
+ * Check if the object is deleted.
483
+ * Accepts both reactive objects and snapshots.
484
+ */
303
485
  // TODO(dmaretskyi): Default to `false`.
304
- export const isDeleted = (entity: Entity.Unknown): boolean => {
305
- const deleted = isDeleted$(entity);
306
- invariant(typeof deleted === 'boolean', 'Invalid object.');
307
- return deleted;
308
- };
486
+ export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(entity);
309
487
 
310
488
  //
311
489
  // Annotations
312
490
  //
313
491
 
314
- export const getLabel = (entity: Entity.Unknown): string | undefined => {
315
- const schema = getSchema$(entity);
316
- if (schema != null) {
317
- return getLabel$(schema, entity);
318
- }
319
- };
492
+ /**
493
+ * Get the label of the object.
494
+ * Accepts both reactive objects and snapshots.
495
+ */
496
+ export const getLabel = (entity: Unknown | Snapshot): string | undefined => getLabel$(entity);
320
497
 
321
- export const setLabel = (entity: Entity.Unknown, label: string) => {
322
- const schema = getSchema$(entity);
323
- if (schema != null) {
324
- setLabel$(schema, entity, label);
325
- }
326
- };
498
+ /**
499
+ * Set the label of the object.
500
+ * Must be called within an `Obj.change` callback.
501
+ *
502
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
503
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
504
+ */
505
+ export const setLabel = (entity: Mutable<Unknown>, label: string): void => setLabel$(entity, label);
327
506
 
328
- export const getDescription = (entity: Entity.Unknown): string | undefined => {
329
- const schema = getSchema$(entity);
330
- if (schema != null) {
331
- return getDescription$(schema, entity);
332
- }
333
- };
507
+ /**
508
+ * Get the description of the object.
509
+ * Accepts both reactive objects and snapshots.
510
+ */
511
+ export const getDescription = (entity: Unknown | Snapshot): string | undefined => getDescription$(entity);
334
512
 
335
- export const setDescription = (entity: Entity.Unknown, description: string) => {
336
- const schema = getSchema$(entity);
337
- if (schema != null) {
338
- setDescription$(schema, entity, description);
339
- }
340
- };
513
+ /**
514
+ * Set the description of the object.
515
+ * Must be called within an `Obj.change` callback.
516
+ *
517
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
518
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
519
+ */
520
+ export const setDescription = (entity: Mutable<Unknown>, description: string): void =>
521
+ setDescription$(entity, description);
341
522
 
342
523
  //
343
524
  // JSON
@@ -346,14 +527,15 @@ export const setDescription = (entity: Entity.Unknown, description: string) => {
346
527
  /**
347
528
  * JSON representation of an object.
348
529
  */
349
- export type JSON = ObjectJSON;
530
+ export type JSON = APIJSON;
350
531
 
351
532
  /**
352
533
  * Converts object to its JSON representation.
534
+ * Accepts both reactive objects and snapshots.
353
535
  *
354
536
  * The same algorithm is used when calling the standard `JSON.stringify(obj)` function.
355
537
  */
356
- export const toJSON = (entity: Entity.Unknown): JSON => objectToJSON(entity);
538
+ export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
357
539
 
358
540
  /**
359
541
  * Creates an object from its json representation, performing schema validation.
@@ -364,135 +546,41 @@ export const toJSON = (entity: Entity.Unknown): JSON => objectToJSON(entity);
364
546
  * @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
365
547
  * @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
366
548
  */
367
- export const fromJSON: (json: unknown, options?: { refResolver?: Ref.Resolver; dxn?: DXN }) => Promise<Any> =
549
+ export const fromJSON: (json: unknown, options?: { refResolver?: Ref.Resolver; dxn?: DXN }) => Promise<Unknown> =
368
550
  objectFromJSON as any;
369
551
 
370
552
  //
371
553
  // Sorting
372
554
  //
373
555
 
374
- const compare = (a?: string, b?: string) => {
375
- if (a == null) {
376
- return b == null ? 0 : 1;
377
- }
378
-
379
- if (b == null) {
380
- return -1;
381
- }
556
+ /**
557
+ * Comparator function type for sorting objects.
558
+ * Accepts both reactive objects and snapshots.
559
+ */
560
+ export type Comparator = ApiComparator<Unknown | Snapshot>;
382
561
 
383
- return a.localeCompare(b);
384
- };
385
-
386
- export type Comparator = (a: Entity.Unknown, b: Entity.Unknown) => number;
387
-
388
- export const sortByLabel: Comparator = (a: Entity.Unknown, b: Entity.Unknown) => compare(getLabel(a), getLabel(b));
389
- export const sortByTypename: Comparator = (a: Entity.Unknown, b: Entity.Unknown) =>
390
- compare(getTypename(a), getTypename(b));
391
- export const sort = (...comparators: Comparator[]): Comparator => {
392
- return (a: Entity.Unknown, b: Entity.Unknown) => {
393
- for (const comparator of comparators) {
394
- const result = comparator(a, b);
395
- if (result !== 0) {
396
- return result;
397
- }
398
- }
399
-
400
- return 0;
401
- };
402
- };
562
+ export const sortByLabel: Comparator = sortByLabel$ as Comparator;
563
+ export const sortByTypename: Comparator = sortByTypename$ as Comparator;
564
+ export const sort = (...comparators: Comparator[]): Comparator => sort$(...comparators) as Comparator;
403
565
 
404
566
  //
405
567
  // Version
406
568
  //
407
569
 
408
- /**
409
- * Unique symbol for version type identification.
410
- */
411
570
  export { VersionTypeId };
571
+ export type { VersionCompareResult };
412
572
 
413
573
  /**
414
574
  * Represent object version.
415
575
  * May be backed by Automerge.
416
576
  * Objects with no history are not versioned.
417
577
  */
418
- export interface Version {
419
- [VersionTypeId]: {};
420
-
421
- /**
422
- * Whether the object is versioned.
423
- */
424
- versioned: boolean;
425
-
426
- /**
427
- * Automerge heads.
428
- */
429
- automergeHeads?: string[];
430
- }
578
+ export type Version = ApiVersion;
431
579
 
432
- const unversioned: Version = {
433
- [VersionTypeId]: {},
434
- versioned: false,
435
- };
436
-
437
- /**
438
- * Checks that `obj` is a version object.
439
- */
440
- export const isVersion = (entity: unknown): entity is Version => {
441
- return entity != null && typeof entity === 'object' && VersionTypeId in entity;
442
- };
580
+ export { isVersion, versionValid, compareVersions, encodeVersion, decodeVersion };
443
581
 
444
582
  /**
445
583
  * Returns the version of the object.
584
+ * Accepts both reactive objects and snapshots.
446
585
  */
447
- export const version = (entity: Entity.Unknown): Version => {
448
- const version = (entity as any)[ObjectVersionId];
449
- if (version === undefined) {
450
- return unversioned;
451
- }
452
-
453
- return version;
454
- };
455
-
456
- /**
457
- * Checks that `version` is a valid version object.
458
- */
459
- export const versionValid = (version: Version): boolean => {
460
- assertArgument(isVersion(version), 'version', 'Invalid version object');
461
- return !!version.versioned;
462
- };
463
-
464
- export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
465
-
466
- /**
467
- * Compares two versions.
468
- * @param version1
469
- * @param version2
470
- * @returns 'unversioned' if either object is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
471
- */
472
- export const compareVersions = (version1: Version, version2: Version): VersionCompareResult => {
473
- assertArgument(isVersion(version1), 'version1', 'Invalid version object');
474
- assertArgument(isVersion(version2), 'version2', 'Invalid version object');
475
-
476
- if (!versionValid(version1) || !versionValid(version2)) {
477
- return 'unversioned';
478
- }
479
-
480
- if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
481
- return 'different';
482
- }
483
- if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
484
- return 'different';
485
- }
486
-
487
- return 'equal';
488
- };
489
-
490
- export const encodeVersion = (version: Version): string => {
491
- return JSON.stringify(version);
492
- };
493
-
494
- export const decodeVersion = (version: string): Version => {
495
- const parsed = JSON.parse(version);
496
- parsed[VersionTypeId] = {};
497
- return parsed;
498
- };
586
+ export const version = (entity: Unknown | Snapshot): Version => version$(entity);