@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
@@ -7,7 +7,7 @@ import * as Option from 'effect/Option';
7
7
  import * as Schema from 'effect/Schema';
8
8
  import * as SchemaAST from 'effect/SchemaAST';
9
9
 
10
- import { Reference } from '@dxos/echo-protocol';
10
+ import { raise } from '@dxos/debug';
11
11
  import { type JsonPath, getField } from '@dxos/effect';
12
12
  import { assertArgument, invariant } from '@dxos/invariant';
13
13
  import { DXN } from '@dxos/keys';
@@ -29,6 +29,10 @@ export const FIELD_PATH_ANNOTATION = 'path';
29
29
  // TODO(burdon): Field, vs. path vs. property.
30
30
  export const FieldPath = (path: string) => PropertyMeta(FIELD_PATH_ANNOTATION, path);
31
31
 
32
+ //
33
+ // Type
34
+ //
35
+
32
36
  /**
33
37
  * ECHO identifier (for a stored schema).
34
38
  * Must be a `dxn:echo:` URI.
@@ -41,16 +45,56 @@ export const getTypeIdentifierAnnotation = (schema: Schema.Schema.All) =>
41
45
  Option.getOrElse(() => undefined),
42
46
  )(schema.ast);
43
47
 
48
+ /**
49
+ * @returns DXN of the schema.
50
+ *
51
+ * For non-stored schema returns `dxn:type:`.
52
+ * For stored schema returns `dxn:echo:`.
53
+ */
54
+ export const getSchemaDXN = (schema: Schema.Schema.All): DXN | undefined => {
55
+ assertArgument(Schema.isSchema(schema), 'schema', 'invalid schema');
56
+ const id = getTypeIdentifierAnnotation(schema);
57
+ if (id) {
58
+ return DXN.parse(id);
59
+ }
60
+
61
+ // TODO(dmaretskyi): Add support for dynamic schema.
62
+ const objectAnnotation = getTypeAnnotation(schema);
63
+ if (!objectAnnotation) {
64
+ return undefined;
65
+ }
66
+
67
+ return DXN.fromTypenameAndVersion(objectAnnotation.typename, objectAnnotation.version);
68
+ };
69
+
70
+ /**
71
+ * @param input schema or a typename string.
72
+ * @return type DXN.
73
+ */
74
+ export const getTypeDXNFromSpecifier = (input: Schema.Schema.All | string): DXN => {
75
+ if (Schema.isSchema(input)) {
76
+ return getSchemaDXN(input) ?? raise(new TypeError('Schema has no DXN'));
77
+ } else {
78
+ assertArgument(typeof input === 'string', 'input');
79
+ assertArgument(!input.startsWith('dxn:'), 'input');
80
+ return DXN.fromTypename(input);
81
+ }
82
+ };
83
+
84
+ //
85
+ // TypeAnnotation
86
+ //
87
+
44
88
  /**
45
89
  * Fully qualified globally unique typename.
46
- * Example: `dxos.org/type/Person`
90
+ * Example: `dxos.org/type/Message`
47
91
  */
48
92
  // TODO(burdon): Reconcile with short DXN format.
49
- // TODO(burdon): Change type => schema throughout.
93
+ // TODO(burdon): Change "/type" => "/schema" throughout.
50
94
  export const TypenameSchema = Schema.String.pipe(Schema.pattern(/^[a-zA-Z]\w+\.[a-zA-Z]\w{1,}\/[\w/_-]+$/)).annotations(
51
95
  {
52
96
  description: 'Fully qualified globally unique typename',
53
- example: 'dxos.org/type/Person',
97
+ example: 'dxos.org/type/Message',
54
98
  },
55
99
  );
56
100
 
@@ -82,9 +126,6 @@ export const TypeAnnotation = Schema.extend(
82
126
  TypeMeta,
83
127
  Schema.Struct({
84
128
  kind: Schema.Enums(EntityKind),
85
- // kind: Schema.Enums(EntityKind),
86
- // typename: Typename,
87
- // version: VersionSchema,
88
129
 
89
130
  /**
90
131
  * If this is a relation, the schema of the source object.
@@ -102,8 +143,6 @@ export const TypeAnnotation = Schema.extend(
102
143
 
103
144
  export interface TypeAnnotation extends Schema.Schema.Type<typeof TypeAnnotation> {}
104
145
 
105
- // export type TypeMeta = Pick<TypeAnnotation, 'typename' | 'version'>;
106
-
107
146
  /**
108
147
  * @returns {@link TypeAnnotation} from a schema.
109
148
  * Schema must have been created with {@link TypedObject} or {@link TypedLink} or manually assigned an appropriate annotation.
@@ -228,6 +267,10 @@ export const isInstanceOf = <Schema extends Schema.Schema.AnyNoContext>(
228
267
  return typeDXN.type === typename;
229
268
  };
230
269
 
270
+ //
271
+ // PropertyMeta
272
+ //
273
+
231
274
  /**
232
275
  * PropertyMeta (metadata for dynamic schema properties).
233
276
  * For user-defined annotations.
@@ -261,18 +304,16 @@ export const getPropertyMetaAnnotation = <T>(prop: SchemaAST.PropertySignature,
261
304
  Option.getOrElse(() => undefined),
262
305
  );
263
306
 
307
+ //
308
+ // Reference
309
+ //
310
+
264
311
  /**
265
312
  * Schema reference.
266
313
  */
267
314
  export const ReferenceAnnotationId = Symbol.for('@dxos/schema/annotation/Reference');
268
-
269
315
  export type ReferenceAnnotationValue = TypeAnnotation;
270
-
271
- export const getReferenceAnnotation = (schema: Schema.Schema.AnyNoContext) =>
272
- Function.pipe(
273
- SchemaAST.getAnnotation<ReferenceAnnotationValue>(ReferenceAnnotationId)(schema.ast),
274
- Option.getOrElse(() => undefined),
275
- );
316
+ export const ReferenceAnnotation = createAnnotationHelper<ReferenceAnnotationValue>(ReferenceAnnotationId);
276
317
 
277
318
  /**
278
319
  * SchemaMeta.
@@ -295,9 +336,13 @@ export const LabelAnnotation = createAnnotationHelper<string[]>(LabelAnnotationI
295
336
 
296
337
  /**
297
338
  * Returns the label for a given object based on {@link LabelAnnotationId}.
339
+ * Lower-level version that requires explicit schema parameter.
298
340
  */
299
341
  // TODO(burdon): Convert to JsonPath?
300
- export const getLabel = <S extends Schema.Schema.Any>(schema: S, object: Schema.Schema.Type<S>): string | undefined => {
342
+ export const getLabelWithSchema = <S extends Schema.Schema.Any>(
343
+ schema: S,
344
+ object: Schema.Schema.Type<S>,
345
+ ): string | undefined => {
301
346
  const annotation = LabelAnnotation.get(schema).pipe(Option.getOrElse(() => ['name']));
302
347
  for (const accessor of annotation) {
303
348
  assertArgument(
@@ -325,8 +370,13 @@ export const getLabel = <S extends Schema.Schema.Any>(schema: S, object: Schema.
325
370
 
326
371
  /**
327
372
  * Sets the label for a given object based on {@link LabelAnnotationId}.
373
+ * Lower-level version that requires explicit schema parameter.
328
374
  */
329
- export const setLabel = <S extends Schema.Schema.Any>(schema: S, object: Schema.Schema.Type<S>, label: string) => {
375
+ export const setLabelWithSchema = <S extends Schema.Schema.Any>(
376
+ schema: S,
377
+ object: Schema.Schema.Type<S>,
378
+ label: string,
379
+ ) => {
330
380
  const annotation = LabelAnnotation.get(schema).pipe(
331
381
  Option.map((field) => field[0]),
332
382
  Option.getOrElse(() => 'name'),
@@ -342,10 +392,11 @@ export const DescriptionAnnotationId = Symbol.for('@dxos/schema/annotation/Descr
342
392
  export const DescriptionAnnotation = createAnnotationHelper<string>(DescriptionAnnotationId);
343
393
 
344
394
  /**
345
- * Returns the label for a given object based on {@link LabelAnnotationId}.
395
+ * Returns the description for a given object based on {@link DescriptionAnnotationId}.
396
+ * Lower-level version that requires explicit schema parameter.
346
397
  */
347
398
  // TODO(burdon): Convert to JsonPath?
348
- export const getDescription = <S extends Schema.Schema.Any>(
399
+ export const getDescriptionWithSchema = <S extends Schema.Schema.Any>(
349
400
  schema: S,
350
401
  object: Schema.Schema.Type<S>,
351
402
  ): string | undefined => {
@@ -369,8 +420,9 @@ export const getDescription = <S extends Schema.Schema.Any>(
369
420
 
370
421
  /**
371
422
  * Sets the description for a given object based on {@link DescriptionAnnotationId}.
423
+ * Lower-level version that requires explicit schema parameter.
372
424
  */
373
- export const setDescription = <S extends Schema.Schema.Any>(
425
+ export const setDescriptionWithSchema = <S extends Schema.Schema.Any>(
374
426
  schema: S,
375
427
  object: Schema.Schema.Type<S>,
376
428
  description: string,
@@ -406,58 +458,3 @@ export type GeneratorAnnotationValue =
406
458
  };
407
459
 
408
460
  export const GeneratorAnnotation = createAnnotationHelper<GeneratorAnnotationValue>(GeneratorAnnotationId);
409
-
410
- /**
411
- * @returns DXN of the schema.
412
- *
413
- * For non-stored schema returns `dxn:type:`.
414
- * For stored schema returns `dxn:echo:`.
415
- */
416
- export const getSchemaDXN = (schema: Schema.Schema.All): DXN | undefined => {
417
- assertArgument(Schema.isSchema(schema), 'schema', 'invalid schema');
418
-
419
- const id = getTypeIdentifierAnnotation(schema);
420
- if (id) {
421
- return DXN.parse(id);
422
- }
423
-
424
- // TODO(dmaretskyi): Add support for dynamic schema.
425
- const objectAnnotation = getTypeAnnotation(schema);
426
- if (!objectAnnotation) {
427
- return undefined;
428
- }
429
-
430
- return DXN.fromTypenameAndVersion(objectAnnotation.typename, objectAnnotation.version);
431
- };
432
-
433
- /**
434
- * Returns a reference that will be used to point to a schema.
435
- * @deprecated Use {@link getSchemaDXN} instead.
436
- */
437
- export const getTypeReference = (schema: Schema.Schema.All | undefined): Reference | undefined => {
438
- if (!schema) {
439
- return undefined;
440
- }
441
-
442
- const schemaDXN = getSchemaDXN(schema);
443
- if (!schemaDXN) {
444
- return undefined;
445
- }
446
- return Reference.fromDXN(schemaDXN);
447
- };
448
-
449
- /**
450
- * Returns a reference that will be used to point to a schema.
451
- * @throws If it is not possible to reference this schema.
452
- *
453
- * @deprecated Use {@link getSchemaDXN} instead.
454
- */
455
- export const requireTypeReference = (schema: Schema.Schema.AnyNoContext): Reference => {
456
- const typeReference = getTypeReference(schema);
457
- if (typeReference == null) {
458
- // TODO(burdon): Catalog user-facing errors (this is too verbose).
459
- throw new Error('Schema must be defined via TypedObject.');
460
- }
461
-
462
- return typeReference;
463
- };
@@ -13,12 +13,14 @@ import { EntityKind } from '../types';
13
13
 
14
14
  export interface AnnotationHelper<T> {
15
15
  get: (schema: Schema.Schema.Any) => Option.Option<T>;
16
+ getFromAst: (ast: SchemaAST.AST) => Option.Option<T>;
16
17
  set: (value: T) => <S extends Schema.Schema.Any>(schema: S) => S;
17
18
  }
18
19
 
19
20
  export const createAnnotationHelper = <T>(id: symbol): AnnotationHelper<T> => {
20
21
  return {
21
22
  get: (schema) => SchemaAST.getAnnotation(schema.ast, id),
23
+ getFromAst: (ast) => SchemaAST.getAnnotation(ast, id),
22
24
  set:
23
25
  (value) =>
24
26
  <S extends Schema.Schema.Any>(schema: S) =>
@@ -0,0 +1,60 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Common annotation helpers shared by Obj and Relation modules.
7
+ */
8
+
9
+ import {
10
+ getDescriptionWithSchema,
11
+ getLabelWithSchema,
12
+ setDescriptionWithSchema,
13
+ setLabelWithSchema,
14
+ } from '../annotations';
15
+ import { type Mutable } from '../proxy';
16
+ import { type AnyProperties, getSchema as getSchema$ } from '../types';
17
+
18
+ /**
19
+ * Get the label of an entity.
20
+ * Accepts both reactive entities and snapshots.
21
+ */
22
+ export const getLabel = (entity: AnyProperties): string | undefined => {
23
+ const schema = getSchema$(entity);
24
+ if (schema != null) {
25
+ return getLabelWithSchema(schema, entity);
26
+ }
27
+ };
28
+
29
+ /**
30
+ * Set the label of an entity.
31
+ * Must be called within an Obj.change or Relation.change callback.
32
+ */
33
+ export const setLabel = (entity: Mutable<AnyProperties>, label: string) => {
34
+ const schema = getSchema$(entity);
35
+ if (schema != null) {
36
+ setLabelWithSchema(schema, entity, label);
37
+ }
38
+ };
39
+
40
+ /**
41
+ * Get the description of an entity.
42
+ * Accepts both reactive entities and snapshots.
43
+ */
44
+ export const getDescription = (entity: AnyProperties): string | undefined => {
45
+ const schema = getSchema$(entity);
46
+ if (schema != null) {
47
+ return getDescriptionWithSchema(schema, entity);
48
+ }
49
+ };
50
+
51
+ /**
52
+ * Set the description of an entity.
53
+ * Must be called within an Obj.change or Relation.change callback.
54
+ */
55
+ export const setDescription = (entity: Mutable<AnyProperties>, description: string) => {
56
+ const schema = getSchema$(entity);
57
+ if (schema != null) {
58
+ setDescriptionWithSchema(schema, entity, description);
59
+ }
60
+ };
@@ -0,0 +1,29 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { invariant } from '@dxos/invariant';
6
+ import { type DXN } from '@dxos/keys';
7
+ import { assumeType } from '@dxos/util';
8
+
9
+ import { type InternalObjectProps, ObjectDatabaseId, getObjectDXN } from '../entities';
10
+ import type { AnyEntity } from '../types';
11
+
12
+ /**
13
+ * Get the DXN of an entity.
14
+ * Accepts both reactive entities and snapshots.
15
+ */
16
+ export const getDXN = (entity: AnyEntity): DXN => {
17
+ const dxn = getObjectDXN(entity);
18
+ invariant(dxn != null, 'Invalid entity.');
19
+ return dxn;
20
+ };
21
+
22
+ /**
23
+ * Get the database the entity belongs to.
24
+ * Accepts both reactive entities and snapshots.
25
+ */
26
+ export const getDatabase = (entity: AnyEntity): any | undefined => {
27
+ assumeType<InternalObjectProps>(entity);
28
+ return entity[ObjectDatabaseId];
29
+ };
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Shared API helpers for Obj and Relation modules.
7
+ * These implementations use generic Entity types.
8
+ * Obj and Relation modules re-export with strongly-typed signatures.
9
+ *
10
+ * TODO(wittjosiah): Could this become the new "internal" where we slowly refactor
11
+ * existing internal modules into here? This would provide a cleaner boundary
12
+ * and prevent external packages from using internals directly.
13
+ */
14
+
15
+ export * from './annotations';
16
+ export * from './entity';
17
+ export * from './meta';
18
+ export * from './sorting';
19
+ export * from './version';
@@ -0,0 +1,88 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type { ForeignKey } from '@dxos/echo-protocol';
6
+ import { assertArgument, invariant } from '@dxos/invariant';
7
+ import type { DeepReadonly } from '@dxos/util';
8
+
9
+ import { type Mutable } from '../proxy';
10
+ import { type AnyProperties, type ObjectMeta, getMeta as getMeta$ } from '../types';
11
+
12
+ /**
13
+ * Deeply read-only version of ObjectMeta.
14
+ */
15
+ export type ReadonlyMeta = DeepReadonly<ObjectMeta>;
16
+
17
+ /**
18
+ * Mutable meta type received in meta mutation callbacks.
19
+ */
20
+ export type Meta = Mutable<ObjectMeta>;
21
+
22
+ /**
23
+ * Get the metadata for an entity with validation.
24
+ * Returns mutable meta when passed a mutable entity (inside change callback).
25
+ * Returns read-only meta when passed a regular entity or snapshot.
26
+ *
27
+ * TODO(burdon): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
28
+ */
29
+ export function getMetaChecked(entity: Mutable<AnyProperties>): Meta;
30
+ export function getMetaChecked(entity: AnyProperties): ReadonlyMeta;
31
+ export function getMetaChecked(entity: AnyProperties): Meta | ReadonlyMeta {
32
+ assertArgument(entity, 'entity', 'Should be an entity.');
33
+ const meta = getMeta$(entity);
34
+ invariant(meta != null, 'Invalid entity.');
35
+ return meta;
36
+ }
37
+
38
+ /**
39
+ * @returns Foreign keys for the entity from the specified source.
40
+ * Accepts both reactive entities and snapshots.
41
+ */
42
+ export const getKeys = (entity: AnyProperties, source: string): ForeignKey[] => {
43
+ assertArgument(entity, 'entity', 'Should be an entity.');
44
+ const meta = getMetaChecked(entity);
45
+ invariant(meta != null, 'Invalid entity.');
46
+ return meta.keys.filter((key) => key.source === source);
47
+ };
48
+
49
+ /**
50
+ * Delete all keys from the entity for the specified source.
51
+ * Must be called within an Obj.change or Relation.change callback.
52
+ */
53
+ export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
54
+ const meta = getMetaChecked(entity);
55
+ for (let i = 0; i < meta.keys.length; i++) {
56
+ if (meta.keys[i].source === source) {
57
+ meta.keys.splice(i, 1);
58
+ i--;
59
+ }
60
+ }
61
+ };
62
+
63
+ /**
64
+ * Add a tag to the entity.
65
+ * Must be called within an Obj.change or Relation.change callback.
66
+ */
67
+ export const addTag = (entity: Mutable<AnyProperties>, tag: string) => {
68
+ const meta = getMetaChecked(entity);
69
+ meta.tags ??= [];
70
+ meta.tags.push(tag);
71
+ };
72
+
73
+ /**
74
+ * Remove a tag from the entity.
75
+ * Must be called within an Obj.change or Relation.change callback.
76
+ */
77
+ export const removeTag = (entity: Mutable<AnyProperties>, tag: string) => {
78
+ const meta = getMetaChecked(entity);
79
+ if (!meta.tags) {
80
+ return;
81
+ }
82
+ for (let i = 0; i < meta.tags.length; i++) {
83
+ if (meta.tags[i] === tag) {
84
+ meta.tags.splice(i, 1);
85
+ i--;
86
+ }
87
+ }
88
+ };
@@ -0,0 +1,53 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { getTypename } from '../annotations';
6
+ import type { AnyEntity } from '../types';
7
+
8
+ import { getLabel } from './annotations';
9
+
10
+ /**
11
+ * String comparison helper for sorting.
12
+ */
13
+ export const compare = (a?: string, b?: string): number => {
14
+ if (a == null) {
15
+ return b == null ? 0 : 1;
16
+ }
17
+ if (b == null) {
18
+ return -1;
19
+ }
20
+ return a.localeCompare(b);
21
+ };
22
+
23
+ /**
24
+ * Comparator function type for sorting entities.
25
+ * Accepts both reactive entities and snapshots.
26
+ */
27
+ export type Comparator<T extends AnyEntity = AnyEntity> = (a: T, b: T) => number;
28
+
29
+ /**
30
+ * Sort entities by label.
31
+ */
32
+ export const sortByLabel: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getLabel(a), getLabel(b));
33
+
34
+ /**
35
+ * Sort entities by typename.
36
+ */
37
+ export const sortByTypename: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getTypename(a), getTypename(b));
38
+
39
+ /**
40
+ * Compose multiple comparators into one.
41
+ * Applies comparators in order until one returns non-zero.
42
+ */
43
+ export const sort = <T extends AnyEntity>(...comparators: Comparator<T>[]): Comparator<T> => {
44
+ return (a: T, b: T) => {
45
+ for (const comparator of comparators) {
46
+ const result = comparator(a, b);
47
+ if (result !== 0) {
48
+ return result;
49
+ }
50
+ }
51
+ return 0;
52
+ };
53
+ };
@@ -0,0 +1,96 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { assertArgument } from '@dxos/invariant';
6
+
7
+ import { ObjectVersionId } from '../entities';
8
+ import { type AnyEntity, VersionTypeId } from '../types';
9
+
10
+ /**
11
+ * Represent entity version.
12
+ * May be backed by Automerge.
13
+ * Entities with no history are not versioned.
14
+ * Named EntityVersion to avoid conflict with types/version.ts.
15
+ */
16
+ export interface EntityVersion {
17
+ [VersionTypeId]: {};
18
+
19
+ /**
20
+ * Whether the entity is versioned.
21
+ */
22
+ versioned: boolean;
23
+
24
+ /**
25
+ * Automerge heads.
26
+ */
27
+ automergeHeads?: string[];
28
+ }
29
+
30
+ const unversioned: EntityVersion = {
31
+ [VersionTypeId]: {},
32
+ versioned: false,
33
+ };
34
+
35
+ /**
36
+ * Checks that `obj` is a version object.
37
+ */
38
+ export const isVersion = (entity: unknown): entity is EntityVersion => {
39
+ return entity != null && typeof entity === 'object' && VersionTypeId in entity;
40
+ };
41
+
42
+ /**
43
+ * Returns the version of an entity.
44
+ * Accepts both reactive entities and snapshots.
45
+ */
46
+ export const version = (entity: AnyEntity): EntityVersion => {
47
+ const ver = (entity as any)[ObjectVersionId];
48
+ if (ver === undefined) {
49
+ return unversioned;
50
+ }
51
+ return ver;
52
+ };
53
+
54
+ /**
55
+ * Checks that `version` is a valid version object.
56
+ */
57
+ export const versionValid = (ver: EntityVersion): boolean => {
58
+ assertArgument(isVersion(ver), 'version', 'Invalid version object');
59
+ return !!ver.versioned;
60
+ };
61
+
62
+ export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
63
+
64
+ /**
65
+ * Compares two versions.
66
+ * @param version1
67
+ * @param version2
68
+ * @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
69
+ */
70
+ export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
71
+ assertArgument(isVersion(version1), 'version1', 'Invalid version object');
72
+ assertArgument(isVersion(version2), 'version2', 'Invalid version object');
73
+
74
+ if (!versionValid(version1) || !versionValid(version2)) {
75
+ return 'unversioned';
76
+ }
77
+
78
+ if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
79
+ return 'different';
80
+ }
81
+ if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
82
+ return 'different';
83
+ }
84
+
85
+ return 'equal';
86
+ };
87
+
88
+ export const encodeVersion = (ver: EntityVersion): string => {
89
+ return JSON.stringify(ver);
90
+ };
91
+
92
+ export const decodeVersion = (ver: string): EntityVersion => {
93
+ const parsed = JSON.parse(ver);
94
+ parsed[VersionTypeId] = {};
95
+ return parsed;
96
+ };