@dxos/echo 0.8.4-main.7ace549 → 0.8.4-main.937b3ca

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 (450) 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-22JMFST2.mjs +24 -0
  37. package/dist/lib/browser/chunk-22JMFST2.mjs.map +7 -0
  38. package/dist/lib/browser/chunk-2SBB7OWV.mjs +250 -0
  39. package/dist/lib/browser/chunk-2SBB7OWV.mjs.map +7 -0
  40. package/dist/lib/browser/chunk-6L5HHUVU.mjs +158 -0
  41. package/dist/lib/browser/chunk-6L5HHUVU.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-7GH6RXJ3.mjs → chunk-BJPE6CIC.mjs} +1999 -1835
  45. package/dist/lib/browser/chunk-BJPE6CIC.mjs.map +7 -0
  46. package/dist/lib/browser/chunk-CGS2ULMK.mjs +11 -0
  47. package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +7 -0
  48. package/dist/lib/browser/chunk-CJ5YELTO.mjs +39 -0
  49. package/dist/lib/browser/chunk-CJ5YELTO.mjs.map +7 -0
  50. package/dist/lib/browser/chunk-FPOISFQK.mjs +40 -0
  51. package/dist/lib/browser/chunk-FPOISFQK.mjs.map +7 -0
  52. package/dist/lib/browser/chunk-FRDT7RA4.mjs +403 -0
  53. package/dist/lib/browser/chunk-FRDT7RA4.mjs.map +7 -0
  54. package/dist/lib/browser/chunk-INHXFXY5.mjs +22 -0
  55. package/dist/lib/browser/chunk-INHXFXY5.mjs.map +7 -0
  56. package/dist/lib/browser/chunk-IXVWLTG7.mjs +9 -0
  57. package/dist/lib/browser/chunk-IXVWLTG7.mjs.map +7 -0
  58. package/dist/lib/browser/chunk-JMKVF2YQ.mjs +43 -0
  59. package/dist/lib/browser/chunk-JMKVF2YQ.mjs.map +7 -0
  60. package/dist/lib/browser/chunk-KQQGVHFN.mjs +143 -0
  61. package/dist/lib/browser/chunk-KQQGVHFN.mjs.map +7 -0
  62. package/dist/lib/browser/chunk-MYCCGG2T.mjs +15 -0
  63. package/dist/lib/browser/chunk-MYCCGG2T.mjs.map +7 -0
  64. package/dist/lib/browser/chunk-NOPVNWPT.mjs +204 -0
  65. package/dist/lib/browser/chunk-NOPVNWPT.mjs.map +7 -0
  66. package/dist/lib/browser/chunk-PQZW3S6L.mjs +74 -0
  67. package/dist/lib/browser/chunk-PQZW3S6L.mjs.map +7 -0
  68. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs +283 -0
  69. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs.map +7 -0
  70. package/dist/lib/browser/chunk-U2J7TA7K.mjs +57 -0
  71. package/dist/lib/browser/chunk-U2J7TA7K.mjs.map +7 -0
  72. package/dist/lib/browser/chunk-W5D2GWAW.mjs +98 -0
  73. package/dist/lib/browser/chunk-W5D2GWAW.mjs.map +7 -0
  74. package/dist/lib/browser/chunk-XDIUHAAX.mjs +41 -0
  75. package/dist/lib/browser/chunk-XDIUHAAX.mjs.map +7 -0
  76. package/dist/lib/browser/chunk-YKTSSMDS.mjs +69 -0
  77. package/dist/lib/browser/chunk-YKTSSMDS.mjs.map +7 -0
  78. package/dist/lib/browser/chunk-ZAGAOZVY.mjs +288 -0
  79. package/dist/lib/browser/chunk-ZAGAOZVY.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-4PNXQA64.mjs +250 -0
  122. package/dist/lib/node-esm/chunk-4PNXQA64.mjs.map +7 -0
  123. package/dist/lib/node-esm/chunk-5OBN7GZW.mjs +158 -0
  124. package/dist/lib/node-esm/chunk-5OBN7GZW.mjs.map +7 -0
  125. package/dist/lib/node-esm/chunk-AJEMYSIR.mjs +22 -0
  126. package/dist/lib/node-esm/chunk-AJEMYSIR.mjs.map +7 -0
  127. package/dist/lib/node-esm/chunk-ANLVLWME.mjs +98 -0
  128. package/dist/lib/node-esm/chunk-ANLVLWME.mjs.map +7 -0
  129. package/dist/lib/node-esm/chunk-DMR7OAFK.mjs +57 -0
  130. package/dist/lib/node-esm/chunk-DMR7OAFK.mjs.map +7 -0
  131. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs +133 -0
  132. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs.map +7 -0
  133. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  134. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  135. package/dist/lib/node-esm/chunk-ILMLLM4R.mjs +204 -0
  136. package/dist/lib/node-esm/chunk-ILMLLM4R.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-M4B6BMD2.mjs → chunk-LT3H4JOX.mjs} +1999 -1835
  140. package/dist/lib/node-esm/chunk-LT3H4JOX.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-NRN3ZW2T.mjs +143 -0
  148. package/dist/lib/node-esm/chunk-NRN3ZW2T.mjs.map +7 -0
  149. package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs +41 -0
  150. package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs.map +7 -0
  151. package/dist/lib/node-esm/chunk-QYR67VBV.mjs +288 -0
  152. package/dist/lib/node-esm/chunk-QYR67VBV.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-W6QIEBTQ.mjs +403 -0
  156. package/dist/lib/node-esm/chunk-W6QIEBTQ.mjs.map +7 -0
  157. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs +69 -0
  158. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs.map +7 -0
  159. package/dist/lib/node-esm/chunk-Y75VU7LB.mjs +74 -0
  160. package/dist/lib/node-esm/chunk-Y75VU7LB.mjs.map +7 -0
  161. package/dist/lib/node-esm/chunk-YOLH5KS4.mjs +283 -0
  162. package/dist/lib/node-esm/chunk-YOLH5KS4.mjs.map +7 -0
  163. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs +39 -0
  164. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs.map +7 -0
  165. package/dist/lib/node-esm/chunk-ZBB67AKD.mjs +24 -0
  166. package/dist/lib/node-esm/chunk-ZBB67AKD.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 +5 -3
  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.d.ts.map +1 -1
  252. package/dist/types/src/internal/object/clone.d.ts +8 -0
  253. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  254. package/dist/types/src/internal/object/create-object.d.ts +1 -1
  255. package/dist/types/src/internal/object/index.d.ts +3 -0
  256. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  257. package/dist/types/src/internal/object/json-serializer.d.ts +13 -7
  258. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  259. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  260. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  261. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  262. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  263. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  264. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  265. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  266. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  267. package/dist/types/src/internal/object/typed-object.d.ts +7 -13
  268. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  269. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  270. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  271. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  272. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  273. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  274. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  275. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  276. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  277. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  278. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  279. package/dist/types/src/internal/proxy/index.d.ts +11 -0
  280. package/dist/types/src/internal/proxy/index.d.ts.map +1 -1
  281. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  282. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  283. package/dist/types/src/internal/proxy/make-object.d.ts +2 -4
  284. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -1
  285. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  286. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  287. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  288. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  289. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  290. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  291. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  292. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  293. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  294. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  295. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  296. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  297. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  298. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  299. package/dist/types/src/internal/proxy/typed-handler.d.ts +14 -11
  300. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  301. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  302. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  303. package/dist/types/src/internal/ref/ref.d.ts +14 -6
  304. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  305. package/dist/types/src/internal/schema/compose.d.ts.map +1 -1
  306. package/dist/types/src/internal/schema/echo-schema.d.ts +15 -3
  307. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  308. package/dist/types/src/internal/schema/index.d.ts +0 -2
  309. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  310. package/dist/types/src/internal/schema/persistent-schema.d.ts +9 -7
  311. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -1
  312. package/dist/types/src/internal/types/base.d.ts +5 -16
  313. package/dist/types/src/internal/types/base.d.ts.map +1 -1
  314. package/dist/types/src/internal/types/entity.d.ts +27 -2
  315. package/dist/types/src/internal/types/entity.d.ts.map +1 -1
  316. package/dist/types/src/internal/types/meta.d.ts +1 -9
  317. package/dist/types/src/internal/types/meta.d.ts.map +1 -1
  318. package/dist/types/src/testing/test-schema.d.ts +141 -175
  319. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  320. package/dist/types/src/testing/util.d.ts +6 -1
  321. package/dist/types/src/testing/util.d.ts.map +1 -1
  322. package/dist/types/tsconfig.tsbuildinfo +1 -1
  323. package/package.json +130 -23
  324. package/src/Annotation.ts +5 -4
  325. package/src/Database.ts +229 -82
  326. package/src/Entity.test.ts +22 -0
  327. package/src/Entity.ts +173 -7
  328. package/src/{errors.ts → Err.ts} +2 -2
  329. package/src/Filter.ts +376 -0
  330. package/src/Format.ts +0 -2
  331. package/src/Hypergraph.ts +74 -0
  332. package/src/Obj.test.ts +386 -0
  333. package/src/Obj.ts +338 -250
  334. package/src/{query/order.ts → Order.ts} +19 -9
  335. package/src/{query/query.test.ts → Query.test.ts} +180 -49
  336. package/src/{query/query.ts → Query.ts} +115 -122
  337. package/src/QueryResult.ts +106 -0
  338. package/src/Ref.ts +20 -3
  339. package/src/Relation.test.ts +82 -0
  340. package/src/Relation.ts +364 -27
  341. package/src/SchemaRegistry.ts +105 -0
  342. package/src/Tag.ts +1 -1
  343. package/src/Type.test.ts +52 -0
  344. package/src/Type.ts +322 -88
  345. package/src/index.ts +9 -5
  346. package/src/internal/README.md +36 -17
  347. package/src/internal/annotations/annotations.test.ts +6 -6
  348. package/src/internal/annotations/annotations.ts +73 -76
  349. package/src/internal/annotations/util.ts +2 -0
  350. package/src/internal/api/annotations.ts +60 -0
  351. package/src/internal/api/entity.ts +29 -0
  352. package/src/internal/api/index.ts +19 -0
  353. package/src/internal/api/meta.ts +88 -0
  354. package/src/internal/api/sorting.ts +53 -0
  355. package/src/internal/api/version.ts +96 -0
  356. package/src/internal/entities/entity.ts +36 -19
  357. package/src/internal/entities/index.ts +1 -1
  358. package/src/internal/entities/model.ts +17 -12
  359. package/src/internal/entities/object.ts +20 -5
  360. package/src/internal/entities/relation.ts +22 -4
  361. package/src/internal/formats/format.ts +7 -8
  362. package/src/internal/formats/object.ts +2 -2
  363. package/src/internal/formats/select.ts +5 -3
  364. package/src/internal/formats/string.ts +5 -0
  365. package/src/internal/formats/types.ts +9 -3
  366. package/src/internal/index.ts +2 -1
  367. package/src/internal/json-schema/json-schema-type.ts +1 -1
  368. package/src/internal/json-schema/json-schema.test.ts +19 -17
  369. package/src/internal/json-schema/json-schema.ts +4 -4
  370. package/src/internal/object/clone.ts +48 -0
  371. package/src/internal/object/create-object.ts +2 -2
  372. package/src/internal/object/index.ts +3 -0
  373. package/src/internal/object/inspect.ts +3 -3
  374. package/src/internal/object/json-serializer.test.ts +4 -1
  375. package/src/internal/object/json-serializer.ts +28 -70
  376. package/src/internal/object/schema-validator.ts +2 -238
  377. package/src/internal/object/set-value.test.ts +281 -0
  378. package/src/internal/object/set-value.ts +165 -0
  379. package/src/internal/object/snapshot.ts +70 -0
  380. package/src/internal/object/typed-object.test.ts +11 -11
  381. package/src/internal/object/typed-object.ts +8 -72
  382. package/src/internal/proxy/change-context.ts +138 -0
  383. package/src/internal/proxy/change.test.ts +519 -0
  384. package/src/internal/proxy/define-hidden-property.ts +14 -0
  385. package/src/internal/proxy/errors.ts +42 -0
  386. package/src/internal/proxy/event-batch.ts +44 -0
  387. package/src/internal/proxy/handler.test.ts +30 -80
  388. package/src/internal/proxy/index.ts +11 -0
  389. package/src/internal/proxy/json-serializer.ts +87 -0
  390. package/src/internal/proxy/make-object.ts +33 -50
  391. package/src/internal/proxy/ownership.ts +253 -0
  392. package/src/internal/proxy/proxy-types.ts +23 -0
  393. package/src/internal/proxy/proxy-utils.ts +150 -0
  394. package/src/internal/proxy/reactive-array.ts +71 -0
  395. package/src/internal/proxy/reactive.ts +69 -0
  396. package/src/internal/proxy/schema-validator.ts +244 -0
  397. package/src/internal/proxy/schema.test.ts +23 -15
  398. package/src/internal/proxy/symbols.ts +7 -0
  399. package/src/internal/proxy/typed-handler.test.ts +251 -35
  400. package/src/internal/proxy/typed-handler.ts +265 -56
  401. package/src/internal/proxy/typed-object.test.ts +26 -15
  402. package/src/internal/ref/ref-array.ts +4 -4
  403. package/src/internal/ref/ref.ts +62 -39
  404. package/src/internal/schema/compose.test.ts +3 -3
  405. package/src/internal/schema/compose.ts +1 -2
  406. package/src/internal/schema/echo-schema.ts +49 -11
  407. package/src/internal/schema/index.ts +0 -2
  408. package/src/internal/schema/persistent-schema.ts +3 -4
  409. package/src/internal/types/base.ts +6 -21
  410. package/src/internal/types/entity.ts +35 -4
  411. package/src/internal/types/meta.ts +1 -11
  412. package/src/testing/api.test.ts +31 -5
  413. package/src/testing/test-schema.ts +55 -30
  414. package/src/testing/util.ts +22 -15
  415. package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +0 -7
  416. package/dist/lib/browser/chunk-E4UTVJNF.mjs +0 -1111
  417. package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +0 -7
  418. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +0 -1111
  419. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +0 -7
  420. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +0 -7
  421. package/dist/types/src/errors.d.ts.map +0 -1
  422. package/dist/types/src/internal/entities/expando.d.ts +0 -16
  423. package/dist/types/src/internal/entities/expando.d.ts.map +0 -1
  424. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  425. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  426. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  427. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  428. package/dist/types/src/query/filter.d.ts +0 -167
  429. package/dist/types/src/query/filter.d.ts.map +0 -1
  430. package/dist/types/src/query/index.d.ts +0 -5
  431. package/dist/types/src/query/index.d.ts.map +0 -1
  432. package/dist/types/src/query/order.d.ts +0 -12
  433. package/dist/types/src/query/order.d.ts.map +0 -1
  434. package/dist/types/src/query/query.d.ts.map +0 -1
  435. package/dist/types/src/query/query.test.d.ts +0 -2
  436. package/dist/types/src/query/query.test.d.ts.map +0 -1
  437. package/dist/types/src/query/testing.d.ts +0 -51
  438. package/dist/types/src/query/testing.d.ts.map +0 -1
  439. package/dist/types/src/query/types.d.ts +0 -17
  440. package/dist/types/src/query/types.d.ts.map +0 -1
  441. package/dist/types/src/query/util.d.ts +0 -8
  442. package/dist/types/src/query/util.d.ts.map +0 -1
  443. package/src/internal/entities/expando.ts +0 -23
  444. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  445. package/src/internal/schema/snapshot.ts +0 -25
  446. package/src/query/filter.ts +0 -455
  447. package/src/query/index.ts +0 -9
  448. package/src/query/testing.ts +0 -64
  449. package/src/query/types.ts +0 -23
  450. package/src/query/util.ts +0 -25
@@ -7,14 +7,12 @@ import type * as Schema from 'effect/Schema';
7
7
 
8
8
  import { type QueryAST } from '@dxos/echo-protocol';
9
9
 
10
- import type * as Ref from '../Ref';
11
- import type * as Type from '../Type';
10
+ import * as Filter from './Filter';
11
+ import { getTypeDXNFromSpecifier } from './internal';
12
+ import type * as Order from './Order';
13
+ import type * as Ref from './Ref';
14
+ import type * as Type$ from './Type';
12
15
 
13
- import { Filter, FilterClass } from './filter';
14
- import { type Order } from './order';
15
- import { getTypeDXNFromSpecifier } from './util';
16
-
17
- // TODO(burdon): Query namespace (and move Filter, Order into Query namespace).
18
16
  // TODO(dmaretskyi): Split up into interfaces for objects and relations so they can have separate verbs.
19
17
  // TODO(dmaretskyi): Undirected relation traversals.
20
18
  // TODO(wittjosiah): Make Filter & Query pipeable.
@@ -37,7 +35,7 @@ export interface Query<T> {
37
35
  * @param filter - Filter to select the objects.
38
36
  * @returns Query for the selected objects.
39
37
  */
40
- select(filter: Filter<T>): Query<T>;
38
+ select(filter: Filter.Filter<T>): Query<T>;
41
39
  select(props: Filter.Props<T>): Query<T>;
42
40
 
43
41
  /**
@@ -48,17 +46,17 @@ export interface Query<T> {
48
46
  reference<K extends RefPropKey<T>>(
49
47
  key: K,
50
48
  ): Query<
51
- T[K] extends Ref.Any
49
+ T[K] extends Ref.Unknown
52
50
  ? Ref.Target<T[K]>
53
- : T[K] extends Ref.Any | undefined
51
+ : T[K] extends Ref.Unknown | undefined
54
52
  ? Ref.Target<Exclude<T[K], undefined>>
55
53
  : never
56
54
  >;
57
55
 
58
56
  /**
59
57
  * Find objects referencing this object.
60
- * @param target - Schema of the referencing object.
61
- * @param key - Property path inside the referencing object that is a reference.
58
+ * @param target - Schema of the referencing object. If not provided, matches any type.
59
+ * @param key - Property path inside the referencing object that is a reference. If not provided, matches any property.
62
60
  * @returns Query for the referencing objects.
63
61
  */
64
62
  // TODO(dmaretskyi): any way to enforce `Ref.Target<Schema.Schema.Type<S>[key]> == T`?
@@ -67,6 +65,8 @@ export interface Query<T> {
67
65
  target: S | string,
68
66
  key: RefPropKey<Schema.Schema.Type<S>>,
69
67
  ): Query<Schema.Schema.Type<S>>;
68
+ referencedBy<S extends Schema.Schema.All>(target: S | string): Query<Schema.Schema.Type<S>>;
69
+ referencedBy(): Query<any>;
70
70
 
71
71
  /**
72
72
  * Find relations where this object is the source.
@@ -94,13 +94,13 @@ export interface Query<T> {
94
94
  * For a query for relations, get the source objects.
95
95
  * @returns Query for the source objects.
96
96
  */
97
- source(): Query<Type.Relation.Source<T>>;
97
+ source(): Query<Type$.Relation.Source<T>>;
98
98
 
99
99
  /**
100
100
  * For a query for relations, get the target objects.
101
101
  * @returns Query for the target objects.
102
102
  */
103
- target(): Query<Type.Relation.Target<T>>;
103
+ target(): Query<Type$.Relation.Target<T>>;
104
104
 
105
105
  /**
106
106
  * Order the query results.
@@ -108,114 +108,33 @@ export interface Query<T> {
108
108
  * @param order - Order to sort the results.
109
109
  * @returns Query for the ordered results.
110
110
  */
111
- orderBy(...order: EffectArray.NonEmptyArray<Order<T>>): Query<T>;
112
-
113
- /**
114
- * Add options to a query.
115
- */
116
- options(options: QueryAST.QueryOptions): Query<T>;
117
- }
118
-
119
- interface QueryAPI {
120
- is(value: unknown): value is Query.Any;
121
-
122
- /** Construct a query from an ast. */
123
- fromAst(ast: QueryAST.Query): Query<any>;
124
-
125
- /**
126
- * Select objects based on a filter.
127
- * @param filter - Filter to select the objects.
128
- * @returns Query for the selected objects.
129
- */
130
- select<F extends Filter.Any>(filter: F): Query<Filter.Type<F>>;
131
-
132
- /**
133
- * Query for objects of a given schema.
134
- * @param schema - Schema of the objects.
135
- * @param predicates - Predicates to filter the objects.
136
- * @returns Query for the objects.
137
- *
138
- * Shorthand for: `Query.select(Filter.type(schema, predicates))`.
139
- */
140
- type<S extends Schema.Schema.All>(
141
- schema: S | string,
142
- predicates?: Filter.Props<Schema.Schema.Type<S>>,
143
- ): Query<Schema.Schema.Type<S>>;
111
+ orderBy(...order: EffectArray.NonEmptyArray<Order.Order<T>>): Query<T>;
144
112
 
145
113
  /**
146
- * Combine results of multiple queries.
147
- * @param queries - Queries to combine.
148
- * @returns Query for the combined results.
114
+ * Limit the number of results.
115
+ * @param limit - Maximum number of results to return.
116
+ * @returns Query for the limited results.
149
117
  */
150
- // TODO(dmaretskyi): Rename to `combine` or `union`.
151
- all<T>(...queries: Query<T>[]): Query<T>;
118
+ limit(limit: number): Query<T>;
152
119
 
153
120
  /**
154
- * Subtract one query from another.
155
- * @param source - Query to subtract from.
156
- * @param exclude - Query to subtract.
157
- * @returns Query for the results of the source query minus the results of the exclude query.
121
+ * Add options to a query.
158
122
  */
159
- without<T>(source: Query<T>, exclude: Query<T>): Query<T>;
160
- }
161
-
162
- export declare namespace Query {
163
- export type Any = Query<any>;
164
-
165
- export type Type<Q extends Any> = Q extends Query<infer T> ? T : never;
123
+ options(options: QueryAST.QueryOptions): Query<T>;
166
124
  }
167
125
 
168
- // TODO(dmaretskyi): Separate object instead of statics for better devex with type errors.
169
- class QueryClass implements Query<any> {
170
- private static variance: Query<any>['~Query'] = {} as Query<any>['~Query'];
126
+ export type Any = Query<any>;
171
127
 
172
- static is(value: unknown): value is Query<any> {
173
- return typeof value === 'object' && value !== null && '~Query' in value;
174
- }
175
-
176
- static fromAst(ast: QueryAST.Query): Query<any> {
177
- return new QueryClass(ast);
178
- }
128
+ export type Type<Q extends Any> = Q extends Query<infer T> ? T : never;
179
129
 
180
- static select<F extends Filter.Any>(filter: F): Query<Filter.Type<F>> {
181
- return new QueryClass({
182
- type: 'select',
183
- filter: filter.ast,
184
- });
185
- }
186
-
187
- static type(schema: Schema.Schema.All | string, predicates?: Filter.Props<unknown>): Query<any> {
188
- return new QueryClass({
189
- type: 'select',
190
- filter: FilterClass.type(schema, predicates).ast,
191
- });
192
- }
193
-
194
- static all(...queries: Query<any>[]): Query<any> {
195
- if (queries.length === 0) {
196
- throw new TypeError(
197
- 'Query.all combines results of multiple queries, to query all objects use Query.select(Filter.everything())',
198
- );
199
- }
200
- return new QueryClass({
201
- type: 'union',
202
- queries: queries.map((q) => q.ast),
203
- });
204
- }
205
-
206
- static without<T>(source: Query<T>, exclude: Query<T>): Query<T> {
207
- return new QueryClass({
208
- type: 'set-difference',
209
- source: source.ast,
210
- exclude: exclude.ast,
211
- });
212
- }
130
+ class QueryClass implements Any {
131
+ private static variance: Any['~Query'] = {} as Any['~Query'];
213
132
 
214
133
  constructor(public readonly ast: QueryAST.Query) {}
215
134
 
216
135
  '~Query' = QueryClass.variance;
217
136
 
218
- select(filter: Filter.Any | Filter.Props<any>): Query.Any {
137
+ select(filter: Filter.Any | Filter.Props<any>): Any {
219
138
  if (Filter.is(filter)) {
220
139
  return new QueryClass({
221
140
  type: 'filter',
@@ -226,12 +145,12 @@ class QueryClass implements Query<any> {
226
145
  return new QueryClass({
227
146
  type: 'filter',
228
147
  selection: this.ast,
229
- filter: FilterClass.props(filter).ast,
148
+ filter: Filter.props(filter).ast,
230
149
  });
231
150
  }
232
151
  }
233
152
 
234
- reference(key: string): Query.Any {
153
+ reference(key: string): Any {
235
154
  return new QueryClass({
236
155
  type: 'reference-traversal',
237
156
  anchor: this.ast,
@@ -239,35 +158,35 @@ class QueryClass implements Query<any> {
239
158
  });
240
159
  }
241
160
 
242
- referencedBy(target: Schema.Schema.All | string, key: string): Query.Any {
243
- const dxn = getTypeDXNFromSpecifier(target);
161
+ referencedBy(target?: Schema.Schema.All | string, key?: string): Any {
162
+ const dxn = target !== undefined ? getTypeDXNFromSpecifier(target) : null;
244
163
  return new QueryClass({
245
164
  type: 'incoming-references',
246
165
  anchor: this.ast,
247
- property: key,
248
- typename: dxn.toString(),
166
+ property: key ?? null,
167
+ typename: dxn?.toString() ?? null,
249
168
  });
250
169
  }
251
170
 
252
- sourceOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Query.Any {
171
+ sourceOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Any {
253
172
  return new QueryClass({
254
173
  type: 'relation',
255
174
  anchor: this.ast,
256
175
  direction: 'outgoing',
257
- filter: FilterClass.type(relation, predicates).ast,
176
+ filter: Filter.type(relation, predicates).ast,
258
177
  });
259
178
  }
260
179
 
261
- targetOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Query.Any {
180
+ targetOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Any {
262
181
  return new QueryClass({
263
182
  type: 'relation',
264
183
  anchor: this.ast,
265
184
  direction: 'incoming',
266
- filter: FilterClass.type(relation, predicates).ast,
185
+ filter: Filter.type(relation, predicates).ast,
267
186
  });
268
187
  }
269
188
 
270
- source(): Query.Any {
189
+ source(): Any {
271
190
  return new QueryClass({
272
191
  type: 'relation-traversal',
273
192
  anchor: this.ast,
@@ -275,7 +194,7 @@ class QueryClass implements Query<any> {
275
194
  });
276
195
  }
277
196
 
278
- target(): Query.Any {
197
+ target(): Any {
279
198
  return new QueryClass({
280
199
  type: 'relation-traversal',
281
200
  anchor: this.ast,
@@ -283,7 +202,7 @@ class QueryClass implements Query<any> {
283
202
  });
284
203
  }
285
204
 
286
- orderBy(...order: Order<any>[]): Query.Any {
205
+ orderBy(...order: Order.Order<any>[]): Any {
287
206
  return new QueryClass({
288
207
  type: 'order',
289
208
  query: this.ast,
@@ -291,7 +210,15 @@ class QueryClass implements Query<any> {
291
210
  });
292
211
  }
293
212
 
294
- options(options: QueryAST.QueryOptions): Query.Any {
213
+ limit(limit: number): Any {
214
+ return new QueryClass({
215
+ type: 'limit',
216
+ query: this.ast,
217
+ limit,
218
+ });
219
+ }
220
+
221
+ options(options: QueryAST.QueryOptions): Any {
295
222
  return new QueryClass({
296
223
  type: 'options',
297
224
  query: this.ast,
@@ -300,4 +227,70 @@ class QueryClass implements Query<any> {
300
227
  }
301
228
  }
302
229
 
303
- export const Query: QueryAPI = QueryClass;
230
+ export const is = (value: unknown): value is Any => {
231
+ return typeof value === 'object' && value !== null && '~Query' in value;
232
+ };
233
+
234
+ /** Construct a query from an ast. */
235
+ export const fromAst = (ast: QueryAST.Query): Any => {
236
+ return new QueryClass(ast);
237
+ };
238
+
239
+ /**
240
+ * Select objects based on a filter.
241
+ * @param filter - Filter to select the objects.
242
+ * @returns Query for the selected objects.
243
+ */
244
+ export const select = <F extends Filter.Any>(filter: F): Query<Filter.Type<F>> => {
245
+ return new QueryClass({
246
+ type: 'select',
247
+ filter: filter.ast,
248
+ });
249
+ };
250
+
251
+ /**
252
+ * Query for objects of a given schema.
253
+ * @param schema - Schema of the objects.
254
+ * @param predicates - Predicates to filter the objects.
255
+ * @returns Query for the objects.
256
+ *
257
+ * Shorthand for: `Query.select(Filter.type(schema, predicates))`.
258
+ */
259
+ export const type = (schema: Schema.Schema.All | string, predicates?: Filter.Props<unknown>): Any => {
260
+ return new QueryClass({
261
+ type: 'select',
262
+ filter: Filter.type(schema, predicates).ast,
263
+ });
264
+ };
265
+
266
+ /**
267
+ * Combine results of multiple queries.
268
+ * @param queries - Queries to combine.
269
+ * @returns Query for the combined results.
270
+ */
271
+ // TODO(dmaretskyi): Rename to `combine` or `union`.
272
+ export const all = (...queries: Any[]): Any => {
273
+ if (queries.length === 0) {
274
+ throw new TypeError(
275
+ 'Query.all combines results of multiple queries, to query all objects use Query.select(Filter.everything())',
276
+ );
277
+ }
278
+ return new QueryClass({
279
+ type: 'union',
280
+ queries: queries.map((q) => q.ast),
281
+ });
282
+ };
283
+
284
+ /**
285
+ * Subtract one query from another.
286
+ * @param source - Query to subtract from.
287
+ * @param exclude - Query to subtract.
288
+ * @returns Query for the results of the source query minus the results of the exclude query.
289
+ */
290
+ export const without = <T>(source: Query<T>, exclude: Query<T>): Query<T> => {
291
+ return new QueryClass({
292
+ type: 'set-difference',
293
+ source: source.ast,
294
+ exclude: exclude.ast,
295
+ });
296
+ };
@@ -0,0 +1,106 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type CleanupFn } from '@dxos/async';
6
+
7
+ import type * as Entity from './Entity';
8
+
9
+ /**
10
+ * Individual query result entry.
11
+ */
12
+ export type Entry<T> = {
13
+ id: string;
14
+
15
+ /**
16
+ * May not be present for remote results.
17
+ */
18
+ result?: T;
19
+
20
+ match?: {
21
+ // TODO(dmaretskyi): text positional info.
22
+
23
+ /**
24
+ * Higher means better match.
25
+ */
26
+ rank: number;
27
+ };
28
+
29
+ /**
30
+ * Query resolution metadata.
31
+ */
32
+ // TODO(dmaretskyi): Rename to meta?
33
+ resolution?: {
34
+ // TODO(dmaretskyi): Make this more generic.
35
+ source: 'remote' | 'local' | 'index';
36
+
37
+ /**
38
+ * Query resolution time in milliseconds.
39
+ */
40
+ time: number;
41
+ };
42
+ };
43
+
44
+ /**
45
+ * Invidual query result entry for a database Entity.
46
+ */
47
+ export type EntityEntry<T extends Entity.Unknown = Entity.Unknown> = Entry<T>;
48
+
49
+ export type RunOptions = {
50
+ timeout?: number;
51
+ };
52
+
53
+ export type SubscriptionOptions = {
54
+ /**
55
+ * Fire the callback immediately.
56
+ */
57
+ fire?: boolean;
58
+ };
59
+
60
+ // TODO(burdon): Should T be constrained to Entity.Any?
61
+ export interface QueryResult<T> {
62
+ /**
63
+ * Currently available results along with their match metadata.
64
+ */
65
+ readonly entries: Entry<T>[];
66
+
67
+ /**
68
+ * Currently available results.
69
+ */
70
+ readonly results: T[];
71
+
72
+ /**
73
+ * Returns all known results.
74
+ */
75
+ run(opts?: RunOptions): Promise<T[]>;
76
+
77
+ /**
78
+ * Returns all known results along with their match metadata.
79
+ */
80
+ runEntries(opts?: RunOptions): Promise<Entry<T>[]>;
81
+
82
+ /**
83
+ * Returns currently available results synchronously.
84
+ */
85
+ runSync(): T[];
86
+
87
+ /**
88
+ * Returns currently available results synchronously along with their match metadata.
89
+ */
90
+ runSyncEntries(): Entry<T>[];
91
+
92
+ /**
93
+ * Returns first result.
94
+ */
95
+ first(opts?: RunOptions): Promise<T>;
96
+
97
+ /**
98
+ * Returns first result if there is one.
99
+ */
100
+ firstOrUndefined(opts?: RunOptions): Promise<T | undefined>;
101
+
102
+ /**
103
+ * Subscribes to changes in query results.
104
+ */
105
+ subscribe(callback?: (query: QueryResult<T>) => void, opts?: SubscriptionOptions): CleanupFn;
106
+ }
package/src/Ref.ts CHANGED
@@ -2,27 +2,44 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import * as Option from 'effect/Option';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
5
8
  import { Ref as Ref$, RefArray, type RefResolver } from './internal';
9
+ import { getSchemaReference } from './internal';
10
+ import type * as JsonSchema from './JsonSchema';
6
11
  import type * as Obj from './Obj';
7
12
 
8
13
  export type Ref<T> = Ref$<T>;
9
- export type Any = Ref$<Obj.Any>;
14
+ export type Unknown = Ref$<Obj.Unknown>;
10
15
 
11
16
  export const Array = RefArray;
12
17
 
13
18
  /**
14
19
  * Extract reference target.
15
20
  */
16
- export type Target<R extends Any> = R extends Ref$<infer T> ? T : never;
21
+ export type Target<R extends Unknown> = R extends Ref$<infer T> ? T : never;
17
22
 
18
23
  /**
19
24
  * Reference resolver.
20
25
  */
21
26
  export type Resolver = RefResolver;
22
27
 
23
- export const isRef: (value: unknown) => value is Any = Ref$.isRef;
28
+ export const isRef: (value: unknown) => value is Unknown = Ref$.isRef;
24
29
 
25
30
  export const make = Ref$.make;
26
31
 
27
32
  // TODO(dmaretskyi): Consider just allowing `make` to accept DXN.
28
33
  export const fromDXN = Ref$.fromDXN;
34
+
35
+ // TODO(wittjosiah): Factor out?
36
+ export const isRefType = (ast: SchemaAST.AST): boolean => {
37
+ return SchemaAST.getAnnotation<JsonSchema.JsonSchema>(ast, SchemaAST.JSONSchemaAnnotationId).pipe(
38
+ Option.flatMap((jsonSchema) => ('$id' in jsonSchema ? Option.some(jsonSchema) : Option.none())),
39
+ Option.flatMap((jsonSchema) => {
40
+ const { typename } = getSchemaReference(jsonSchema) ?? {};
41
+ return typename ? Option.some(true) : Option.some(false);
42
+ }),
43
+ Option.getOrElse(() => false),
44
+ );
45
+ };
@@ -0,0 +1,82 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, test } from 'vitest';
6
+
7
+ import * as Entity from './Entity';
8
+ import { SnapshotKindId } from './internal';
9
+ import * as Obj from './Obj';
10
+ import * as Relation from './Relation';
11
+ import { TestSchema } from './testing';
12
+
13
+ describe('Relation', () => {
14
+ describe('Snapshot', () => {
15
+ test('getSnapshot returns an immutable snapshot with SnapshotKindId', ({ expect }) => {
16
+ const obj1 = Obj.make(TestSchema.Person, { name: 'Alice' });
17
+ const obj2 = Obj.make(TestSchema.Person, { name: 'Bob' });
18
+ const rel = Relation.make(TestSchema.HasManager, {
19
+ [Relation.Source]: obj1,
20
+ [Relation.Target]: obj2,
21
+ });
22
+ const snapshot = Relation.getSnapshot(rel);
23
+
24
+ // Snapshot has SnapshotKindId, not KindId.
25
+ expect(snapshot[SnapshotKindId]).toBe(Entity.Kind.Relation);
26
+ expect((snapshot as any)[Entity.KindId]).toBeUndefined();
27
+
28
+ // Snapshot has same id.
29
+ expect(snapshot.id).toBe(rel.id);
30
+ });
31
+
32
+ test('read-only helpers work with both reactive and snapshot', ({ expect }) => {
33
+ const obj1 = Obj.make(TestSchema.Person, { name: 'Alice' });
34
+ const obj2 = Obj.make(TestSchema.Person, { name: 'Bob' });
35
+ const rel = Relation.make(TestSchema.HasManager, {
36
+ [Relation.Source]: obj1,
37
+ [Relation.Target]: obj2,
38
+ });
39
+ const snapshot = Relation.getSnapshot(rel);
40
+
41
+ // getSourceDXN - works with both.
42
+ expect(Relation.getSourceDXN(rel)).toBeDefined();
43
+ expect(Relation.getSourceDXN(snapshot)).toBeDefined();
44
+
45
+ // getTargetDXN - works with both.
46
+ expect(Relation.getTargetDXN(rel)).toBeDefined();
47
+ expect(Relation.getTargetDXN(snapshot)).toBeDefined();
48
+
49
+ // getSource - works with both.
50
+ expect(Relation.getSource(rel)).toBeDefined();
51
+ expect(Relation.getSource(snapshot)).toBeDefined();
52
+
53
+ // getTarget - works with both.
54
+ expect(Relation.getTarget(rel)).toBeDefined();
55
+ expect(Relation.getTarget(snapshot)).toBeDefined();
56
+
57
+ // getDXN - works with both.
58
+ expect(Relation.getDXN(rel)).toBeDefined();
59
+ expect(Relation.getDXN(snapshot)).toBeDefined();
60
+
61
+ // getTypename - works with both.
62
+ expect(Relation.getTypename(rel)).toBe('example.com/type/HasManager');
63
+ expect(Relation.getTypename(snapshot)).toBe('example.com/type/HasManager');
64
+
65
+ // getMeta - works with both.
66
+ expect(Relation.getMeta(rel)).toBeDefined();
67
+ expect(Relation.getMeta(snapshot)).toBeDefined();
68
+
69
+ // isDeleted - works with both.
70
+ expect(Relation.isDeleted(rel)).toBe(false);
71
+ expect(Relation.isDeleted(snapshot)).toBe(false);
72
+
73
+ // version - works with both.
74
+ expect(Relation.version(rel)).toBeDefined();
75
+ expect(Relation.version(snapshot)).toBeDefined();
76
+
77
+ // toJSON - works with both.
78
+ expect(Relation.toJSON(rel)).toBeDefined();
79
+ expect(Relation.toJSON(snapshot)).toBeDefined();
80
+ });
81
+ });
82
+ });