@dxos/echo 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced

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 (540) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -8
  3. package/dist/lib/neutral/Annotation.mjs +39 -0
  4. package/dist/lib/neutral/Database.mjs +49 -0
  5. package/dist/lib/neutral/Entity.mjs +61 -0
  6. package/dist/lib/neutral/Entity.mjs.map +7 -0
  7. package/dist/lib/neutral/Err.mjs +12 -0
  8. package/dist/lib/neutral/Err.mjs.map +7 -0
  9. package/dist/lib/neutral/Extension.mjs +18 -0
  10. package/dist/lib/neutral/Extension.mjs.map +7 -0
  11. package/dist/lib/neutral/Feed.mjs +52 -0
  12. package/dist/lib/neutral/Feed.mjs.map +7 -0
  13. package/dist/lib/neutral/Filter.mjs +74 -0
  14. package/dist/lib/neutral/Filter.mjs.map +7 -0
  15. package/dist/lib/neutral/Format.mjs +66 -0
  16. package/dist/lib/neutral/Format.mjs.map +7 -0
  17. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  18. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  19. package/dist/lib/neutral/Key.mjs +12 -0
  20. package/dist/lib/neutral/Key.mjs.map +7 -0
  21. package/dist/lib/neutral/Migration.mjs +17 -0
  22. package/dist/lib/neutral/Migration.mjs.map +7 -0
  23. package/dist/lib/neutral/Obj.mjs +113 -0
  24. package/dist/lib/neutral/Obj.mjs.map +7 -0
  25. package/dist/lib/neutral/Order.mjs +12 -0
  26. package/dist/lib/neutral/Order.mjs.map +7 -0
  27. package/dist/lib/neutral/Query.mjs +38 -0
  28. package/dist/lib/neutral/Query.mjs.map +7 -0
  29. package/dist/lib/neutral/QueryResult.mjs +2 -0
  30. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  31. package/dist/lib/neutral/Ref.mjs +26 -0
  32. package/dist/lib/neutral/Ref.mjs.map +7 -0
  33. package/dist/lib/neutral/Relation.mjs +94 -0
  34. package/dist/lib/neutral/Relation.mjs.map +7 -0
  35. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  36. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  37. package/dist/lib/neutral/Tag.mjs +29 -0
  38. package/dist/lib/neutral/Tag.mjs.map +7 -0
  39. package/dist/lib/neutral/Type.mjs +37 -0
  40. package/dist/lib/neutral/Type.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-44HT3MEC.mjs +73 -0
  42. package/dist/lib/neutral/chunk-44HT3MEC.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-4A2GS5LQ.mjs +125 -0
  44. package/dist/lib/neutral/chunk-4A2GS5LQ.mjs.map +7 -0
  45. package/dist/lib/neutral/chunk-5SL5LDLD.mjs +47 -0
  46. package/dist/lib/neutral/chunk-5SL5LDLD.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-7RVZT53K.mjs +21 -0
  48. package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +7 -0
  49. package/dist/lib/neutral/chunk-APHSOTIX.mjs +34 -0
  50. package/dist/lib/neutral/chunk-APHSOTIX.mjs.map +7 -0
  51. package/dist/lib/neutral/chunk-B2P7IVG3.mjs +206 -0
  52. package/dist/lib/neutral/chunk-B2P7IVG3.mjs.map +7 -0
  53. package/dist/lib/neutral/chunk-BICZKPQG.mjs +7 -0
  54. package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +7 -0
  55. package/dist/lib/neutral/chunk-BMB7IHGB.mjs +346 -0
  56. package/dist/lib/neutral/chunk-BMB7IHGB.mjs.map +7 -0
  57. package/dist/lib/neutral/chunk-BUBEC474.mjs +56 -0
  58. package/dist/lib/neutral/chunk-BUBEC474.mjs.map +7 -0
  59. package/dist/lib/neutral/chunk-C4PSESGN.mjs +81 -0
  60. package/dist/lib/neutral/chunk-C4PSESGN.mjs.map +7 -0
  61. package/dist/lib/neutral/chunk-FIWO2FZK.mjs +36 -0
  62. package/dist/lib/neutral/chunk-FIWO2FZK.mjs.map +7 -0
  63. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  64. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  65. package/dist/lib/neutral/chunk-HKETO4L4.mjs +365 -0
  66. package/dist/lib/neutral/chunk-HKETO4L4.mjs.map +7 -0
  67. package/dist/lib/neutral/chunk-I2DARWPX.mjs +128 -0
  68. package/dist/lib/neutral/chunk-I2DARWPX.mjs.map +7 -0
  69. package/dist/lib/neutral/chunk-IVSI7QO6.mjs +136 -0
  70. package/dist/lib/neutral/chunk-IVSI7QO6.mjs.map +7 -0
  71. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  72. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  73. package/dist/lib/neutral/chunk-MLS7U7AT.mjs +734 -0
  74. package/dist/lib/neutral/chunk-MLS7U7AT.mjs.map +7 -0
  75. package/dist/lib/neutral/chunk-N4B7FHQT.mjs +67 -0
  76. package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +7 -0
  77. package/dist/lib/neutral/chunk-N7VOEPSV.mjs +48 -0
  78. package/dist/lib/neutral/chunk-N7VOEPSV.mjs.map +7 -0
  79. package/dist/lib/neutral/chunk-QRZ2I3ZM.mjs +27 -0
  80. package/dist/lib/neutral/chunk-QRZ2I3ZM.mjs.map +7 -0
  81. package/dist/lib/neutral/chunk-TNBK56IN.mjs +350 -0
  82. package/dist/lib/neutral/chunk-TNBK56IN.mjs.map +7 -0
  83. package/dist/lib/neutral/chunk-TRPZU2HV.mjs +402 -0
  84. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
  85. package/dist/lib/neutral/chunk-TTCSATUD.mjs +42 -0
  86. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  87. package/dist/lib/neutral/chunk-V72DY6LU.mjs +7 -0
  88. package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +7 -0
  89. package/dist/lib/neutral/chunk-VW42HESL.mjs +320 -0
  90. package/dist/lib/neutral/chunk-VW42HESL.mjs.map +7 -0
  91. package/dist/lib/neutral/chunk-X3356HPV.mjs +421 -0
  92. package/dist/lib/neutral/chunk-X3356HPV.mjs.map +7 -0
  93. package/dist/lib/neutral/chunk-XEXM5HWQ.mjs +270 -0
  94. package/dist/lib/neutral/chunk-XEXM5HWQ.mjs.map +7 -0
  95. package/dist/lib/neutral/chunk-Z5GKP74O.mjs +2464 -0
  96. package/dist/lib/neutral/chunk-Z5GKP74O.mjs.map +7 -0
  97. package/dist/lib/neutral/chunk-ZISMEVKD.mjs +51 -0
  98. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
  99. package/dist/lib/neutral/index.mjs +107 -0
  100. package/dist/lib/neutral/index.mjs.map +7 -0
  101. package/dist/lib/neutral/internal/index.mjs +476 -0
  102. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  103. package/dist/lib/neutral/meta.json +1 -0
  104. package/dist/lib/neutral/testing/index.mjs +429 -0
  105. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  106. package/dist/types/src/Annotation.d.ts +24 -0
  107. package/dist/types/src/Annotation.d.ts.map +1 -0
  108. package/dist/types/src/Collection.d.ts +16 -0
  109. package/dist/types/src/Collection.d.ts.map +1 -0
  110. package/dist/types/src/Database.d.ts +201 -0
  111. package/dist/types/src/Database.d.ts.map +1 -0
  112. package/dist/types/src/Dataset.d.ts +19 -0
  113. package/dist/types/src/Dataset.d.ts.map +1 -0
  114. package/dist/types/src/Entity.d.ts +174 -0
  115. package/dist/types/src/Entity.d.ts.map +1 -0
  116. package/dist/types/src/Entity.test.d.ts +2 -0
  117. package/dist/types/src/Entity.test.d.ts.map +1 -0
  118. package/dist/types/src/Err.d.ts +107 -0
  119. package/dist/types/src/Err.d.ts.map +1 -0
  120. package/dist/types/src/Extension.d.ts +80 -0
  121. package/dist/types/src/Extension.d.ts.map +1 -0
  122. package/dist/types/src/Extension.test.d.ts +2 -0
  123. package/dist/types/src/Extension.test.d.ts.map +1 -0
  124. package/dist/types/src/Feed.d.ts +206 -0
  125. package/dist/types/src/Feed.d.ts.map +1 -0
  126. package/dist/types/src/Filter.d.ts +170 -0
  127. package/dist/types/src/Filter.d.ts.map +1 -0
  128. package/dist/types/src/Filter.test.d.ts +2 -0
  129. package/dist/types/src/Filter.test.d.ts.map +1 -0
  130. package/dist/types/src/Format.d.ts +4 -0
  131. package/dist/types/src/Format.d.ts.map +1 -0
  132. package/dist/types/src/Hypergraph.d.ts +65 -0
  133. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  134. package/dist/types/src/Json.d.ts +33 -0
  135. package/dist/types/src/Json.d.ts.map +1 -0
  136. package/dist/types/src/Json.test.d.ts +2 -0
  137. package/dist/types/src/Json.test.d.ts.map +1 -0
  138. package/dist/types/src/JsonSchema.d.ts +16 -0
  139. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  140. package/dist/types/src/Key.d.ts +1 -0
  141. package/dist/types/src/Key.d.ts.map +1 -1
  142. package/dist/types/src/Migration.d.ts +69 -0
  143. package/dist/types/src/Migration.d.ts.map +1 -0
  144. package/dist/types/src/Obj.d.ts +474 -35
  145. package/dist/types/src/Obj.d.ts.map +1 -1
  146. package/dist/types/src/Obj.test.d.ts +2 -0
  147. package/dist/types/src/Obj.test.d.ts.map +1 -0
  148. package/dist/types/src/Order.d.ts +16 -0
  149. package/dist/types/src/Order.d.ts.map +1 -0
  150. package/dist/types/src/Query.d.ts +213 -0
  151. package/dist/types/src/Query.d.ts.map +1 -0
  152. package/dist/types/src/Query.test.d.ts +2 -0
  153. package/dist/types/src/Query.test.d.ts.map +1 -0
  154. package/dist/types/src/QueryResult.d.ts +80 -0
  155. package/dist/types/src/QueryResult.d.ts.map +1 -0
  156. package/dist/types/src/Ref.d.ts +62 -11
  157. package/dist/types/src/Ref.d.ts.map +1 -1
  158. package/dist/types/src/Relation.d.ts +290 -21
  159. package/dist/types/src/Relation.d.ts.map +1 -1
  160. package/dist/types/src/Relation.test.d.ts +2 -0
  161. package/dist/types/src/Relation.test.d.ts.map +1 -0
  162. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  163. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  164. package/dist/types/src/Tag.d.ts +18 -0
  165. package/dist/types/src/Tag.d.ts.map +1 -0
  166. package/dist/types/src/Type.d.ts +123 -100
  167. package/dist/types/src/Type.d.ts.map +1 -1
  168. package/dist/types/src/Type.test.d.ts +2 -0
  169. package/dist/types/src/Type.test.d.ts.map +1 -0
  170. package/dist/types/src/View.d.ts +68 -0
  171. package/dist/types/src/View.d.ts.map +1 -0
  172. package/dist/types/src/exemplars.test.d.ts +2 -0
  173. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  174. package/dist/types/src/hierarchy.test.d.ts +2 -0
  175. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  176. package/dist/types/src/index.d.ts +22 -3
  177. package/dist/types/src/index.d.ts.map +1 -1
  178. package/dist/types/src/internal/Annotation/annotations.d.ts +240 -0
  179. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  180. package/dist/types/src/internal/Annotation/annotations.test.d.ts +2 -0
  181. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  182. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  183. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  184. package/dist/types/src/internal/Annotation/sorting.d.ts +24 -0
  185. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  186. package/dist/types/src/internal/Annotation/util.d.ts +39 -0
  187. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  188. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  189. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  190. package/dist/types/src/internal/Entity/entity.d.ts +20 -0
  191. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  192. package/dist/types/src/internal/Entity/index.d.ts +8 -0
  193. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  194. package/dist/types/src/internal/Entity/model.d.ts +57 -0
  195. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  196. package/dist/types/src/internal/Entity/object.d.ts +18 -0
  197. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  198. package/dist/types/src/internal/Entity/relation.d.ts +35 -0
  199. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  200. package/dist/types/src/internal/Entity/util.d.ts +2 -0
  201. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  202. package/dist/types/src/internal/Entity/version.d.ts +42 -0
  203. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  204. package/dist/types/src/internal/Format/date.d.ts +63 -0
  205. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  206. package/dist/types/src/internal/Format/date.test.d.ts +2 -0
  207. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  208. package/dist/types/src/internal/Format/format.d.ts +32 -0
  209. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  210. package/dist/types/src/internal/Format/format.test.d.ts +2 -0
  211. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  212. package/dist/types/src/internal/Format/index.d.ts +8 -0
  213. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  214. package/dist/types/src/internal/Format/number.d.ts +31 -0
  215. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  216. package/dist/types/src/internal/Format/object.d.ts +35 -0
  217. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  218. package/dist/types/src/internal/Format/select.d.ts +13 -0
  219. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  220. package/dist/types/src/internal/Format/string.d.ts +42 -0
  221. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  222. package/dist/types/src/internal/Format/types.d.ts +72 -0
  223. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  224. package/dist/types/src/internal/JsonSchema/annotations.d.ts +19 -0
  225. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  226. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts +2 -0
  227. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  228. package/dist/types/src/internal/JsonSchema/index.d.ts +5 -0
  229. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  230. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts +7 -0
  231. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  232. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +351 -0
  233. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  234. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +30 -0
  235. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  236. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts +2 -0
  237. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  238. package/dist/types/src/internal/Obj/clone.d.ts +8 -0
  239. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  240. package/dist/types/src/internal/Obj/common.d.ts +18 -0
  241. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  242. package/dist/types/src/internal/Obj/create-object.d.ts +39 -0
  243. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  244. package/dist/types/src/internal/Obj/create-object.test.d.ts +2 -0
  245. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  246. package/dist/types/src/internal/Obj/deleted.d.ts +6 -0
  247. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  248. package/dist/types/src/internal/Obj/ids.d.ts +6 -0
  249. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  250. package/dist/types/src/internal/Obj/index.d.ts +11 -0
  251. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  252. package/dist/types/src/internal/Obj/inspect.d.ts +2 -0
  253. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  254. package/dist/types/src/internal/Obj/json-serializer.d.ts +45 -0
  255. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  256. package/dist/types/src/internal/Obj/json-serializer.test.d.ts +2 -0
  257. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  258. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  259. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  260. package/dist/types/src/internal/Obj/schema-validator.test.d.ts +2 -0
  261. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  262. package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
  263. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  264. package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
  265. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  266. package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
  267. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  268. package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
  269. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  270. package/dist/types/src/internal/Obj/typed-object.test.d.ts +2 -0
  271. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  272. package/dist/types/src/internal/Query.d.ts +10 -0
  273. package/dist/types/src/internal/Query.d.ts.map +1 -0
  274. package/dist/types/src/internal/Ref/index.d.ts +3 -0
  275. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  276. package/dist/types/src/internal/Ref/ref-array.d.ts +21 -0
  277. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  278. package/dist/types/src/internal/Ref/ref.d.ts +244 -0
  279. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  280. package/dist/types/src/internal/Ref/ref.test.d.ts +2 -0
  281. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  282. package/dist/types/src/internal/Type/compose.d.ts +7 -0
  283. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  284. package/dist/types/src/internal/Type/compose.test.d.ts +2 -0
  285. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  286. package/dist/types/src/internal/Type/echo-schema.d.ts +181 -0
  287. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  288. package/dist/types/src/internal/Type/index.d.ts +4 -0
  289. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  290. package/dist/types/src/internal/Type/manipulation.d.ts +10 -0
  291. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  292. package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
  293. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  294. package/dist/types/src/internal/common/api/index.d.ts +11 -0
  295. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  296. package/dist/types/src/internal/common/api/meta.d.ts +42 -0
  297. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  298. package/dist/types/src/internal/common/index.d.ts +4 -0
  299. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  300. package/dist/types/src/internal/common/proxy/change-context.d.ts +55 -0
  301. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  302. package/dist/types/src/internal/common/proxy/change.test.d.ts +2 -0
  303. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  304. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts +5 -0
  305. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  306. package/dist/types/src/internal/common/proxy/errors.d.ts +19 -0
  307. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  308. package/dist/types/src/internal/common/proxy/event-batch.d.ts +10 -0
  309. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  310. package/dist/types/src/internal/common/proxy/handler.test.d.ts +2 -0
  311. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  312. package/dist/types/src/internal/common/proxy/index.d.ts +14 -0
  313. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  314. package/dist/types/src/internal/common/proxy/json-serializer.d.ts +6 -0
  315. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  316. package/dist/types/src/internal/common/proxy/make-object.d.ts +14 -0
  317. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  318. package/dist/types/src/internal/common/proxy/ownership.d.ts +57 -0
  319. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  320. package/dist/types/src/internal/common/proxy/proxy-types.d.ts +18 -0
  321. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  322. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +47 -0
  323. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  324. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +8 -0
  325. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  326. package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
  327. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
  328. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  329. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  330. package/dist/types/src/internal/common/proxy/schema-validator.d.ts +15 -0
  331. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  332. package/dist/types/src/internal/common/proxy/schema.test.d.ts +2 -0
  333. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  334. package/dist/types/src/internal/common/proxy/symbols.d.ts +3 -0
  335. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  336. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +48 -0
  337. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  338. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts +2 -0
  339. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  340. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts +2 -0
  341. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  342. package/dist/types/src/internal/common/types/base.d.ts +27 -0
  343. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  344. package/dist/types/src/internal/common/types/entity.d.ts +37 -0
  345. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  346. package/dist/types/src/internal/common/types/index.d.ts +7 -0
  347. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  348. package/dist/types/src/internal/common/types/meta.d.ts +43 -0
  349. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  350. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  351. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  352. package/dist/types/src/internal/common/types/typename.d.ts +21 -0
  353. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  354. package/dist/types/src/internal/common/types/version.d.ts +15 -0
  355. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  356. package/dist/types/src/internal/index.d.ts +11 -0
  357. package/dist/types/src/internal/index.d.ts.map +1 -0
  358. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  359. package/dist/types/src/testing/index.d.ts +3 -1
  360. package/dist/types/src/testing/index.d.ts.map +1 -1
  361. package/dist/types/src/testing/test-data.d.ts +18 -0
  362. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  363. package/dist/types/src/testing/test-schema.d.ts +304 -0
  364. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  365. package/dist/types/src/testing/util.d.ts +21 -0
  366. package/dist/types/src/testing/util.d.ts.map +1 -0
  367. package/dist/types/tsconfig.tsbuildinfo +1 -1
  368. package/package.json +123 -54
  369. package/src/Annotation.ts +49 -0
  370. package/src/Collection.ts +37 -0
  371. package/src/Database.ts +352 -0
  372. package/src/Dataset.ts +26 -0
  373. package/src/Entity.test.ts +22 -0
  374. package/src/Entity.ts +243 -0
  375. package/src/Err.ts +40 -0
  376. package/src/Extension.test.ts +235 -0
  377. package/src/Extension.ts +122 -0
  378. package/src/Feed.ts +335 -0
  379. package/src/Filter.test.ts +90 -0
  380. package/src/Filter.ts +485 -0
  381. package/src/Format.ts +9 -0
  382. package/src/Hypergraph.ts +79 -0
  383. package/src/Json.test.ts +175 -0
  384. package/src/Json.ts +102 -0
  385. package/src/JsonSchema.ts +26 -0
  386. package/src/Key.ts +3 -0
  387. package/src/Migration.ts +106 -0
  388. package/src/Obj.test.ts +539 -0
  389. package/src/Obj.ts +769 -79
  390. package/src/Order.ts +46 -0
  391. package/src/Query.test.ts +822 -0
  392. package/src/Query.ts +572 -0
  393. package/src/QueryResult.ts +106 -0
  394. package/src/Ref.ts +80 -9
  395. package/src/Relation.test.ts +88 -0
  396. package/src/Relation.ts +455 -54
  397. package/src/SchemaRegistry.ts +106 -0
  398. package/src/Tag.ts +41 -0
  399. package/src/Type.test.ts +52 -0
  400. package/src/Type.ts +168 -153
  401. package/src/View.ts +107 -0
  402. package/src/exemplars.test.ts +21 -0
  403. package/src/hierarchy.test.ts +33 -0
  404. package/src/index.ts +25 -4
  405. package/src/internal/Annotation/annotations.test.ts +145 -0
  406. package/src/internal/Annotation/annotations.ts +590 -0
  407. package/src/internal/Annotation/index.ts +7 -0
  408. package/src/internal/Annotation/sorting.ts +51 -0
  409. package/src/internal/Annotation/util.ts +85 -0
  410. package/src/internal/Entity/api.ts +30 -0
  411. package/src/internal/Entity/entity.ts +128 -0
  412. package/src/internal/Entity/index.ts +11 -0
  413. package/src/internal/Entity/model.ts +111 -0
  414. package/src/internal/Entity/object.ts +57 -0
  415. package/src/internal/Entity/relation.ts +154 -0
  416. package/src/internal/Entity/util.ts +33 -0
  417. package/src/internal/Entity/version.ts +96 -0
  418. package/src/internal/Format/date.test.ts +55 -0
  419. package/src/internal/Format/date.ts +217 -0
  420. package/src/internal/Format/format.test.ts +76 -0
  421. package/src/internal/Format/format.ts +54 -0
  422. package/src/internal/Format/index.ts +12 -0
  423. package/src/internal/Format/number.ts +89 -0
  424. package/src/internal/Format/object.ts +80 -0
  425. package/src/internal/Format/select.ts +18 -0
  426. package/src/internal/Format/string.ts +81 -0
  427. package/src/internal/Format/types.ts +186 -0
  428. package/src/internal/JsonSchema/annotations.ts +50 -0
  429. package/src/internal/JsonSchema/effect-schema.test.ts +143 -0
  430. package/src/internal/JsonSchema/index.ts +8 -0
  431. package/src/internal/JsonSchema/json-schema-normalize.ts +111 -0
  432. package/src/internal/JsonSchema/json-schema-type.ts +403 -0
  433. package/src/internal/JsonSchema/json-schema.test.ts +860 -0
  434. package/src/internal/JsonSchema/json-schema.ts +533 -0
  435. package/src/internal/Obj/clone.ts +48 -0
  436. package/src/internal/Obj/common.ts +75 -0
  437. package/src/internal/Obj/create-object.test.ts +114 -0
  438. package/src/internal/Obj/create-object.ts +94 -0
  439. package/src/internal/Obj/deleted.ts +19 -0
  440. package/src/internal/Obj/ids.ts +12 -0
  441. package/src/internal/Obj/index.ts +14 -0
  442. package/src/internal/Obj/inspect.ts +46 -0
  443. package/src/internal/Obj/json-serializer.test.ts +165 -0
  444. package/src/internal/Obj/json-serializer.ts +237 -0
  445. package/src/internal/Obj/schema-validator.test.ts +182 -0
  446. package/src/internal/Obj/schema-validator.ts +6 -0
  447. package/src/internal/Obj/set-value.test.ts +281 -0
  448. package/src/internal/Obj/set-value.ts +165 -0
  449. package/src/internal/Obj/snapshot.ts +105 -0
  450. package/src/internal/Obj/typed-object.test.ts +34 -0
  451. package/src/internal/Obj/typed-object.ts +30 -0
  452. package/src/internal/Query.ts +156 -0
  453. package/src/internal/Ref/index.ts +6 -0
  454. package/src/internal/Ref/ref-array.ts +38 -0
  455. package/src/internal/Ref/ref.test.ts +100 -0
  456. package/src/internal/Ref/ref.ts +589 -0
  457. package/src/internal/Type/compose.test.ts +41 -0
  458. package/src/internal/Type/compose.ts +41 -0
  459. package/src/internal/Type/echo-schema.ts +423 -0
  460. package/src/internal/Type/index.ts +7 -0
  461. package/src/internal/Type/manipulation.ts +92 -0
  462. package/src/internal/Type/persistent-schema.ts +33 -0
  463. package/src/internal/common/README.md +102 -0
  464. package/src/internal/common/api/index.ts +15 -0
  465. package/src/internal/common/api/meta.ts +88 -0
  466. package/src/internal/common/index.ts +7 -0
  467. package/src/internal/common/proxy/change-context.ts +138 -0
  468. package/src/internal/common/proxy/change.test.ts +519 -0
  469. package/src/internal/common/proxy/define-hidden-property.ts +14 -0
  470. package/src/internal/common/proxy/errors.ts +42 -0
  471. package/src/internal/common/proxy/event-batch.ts +44 -0
  472. package/src/internal/common/proxy/handler.test.ts +121 -0
  473. package/src/internal/common/proxy/index.ts +17 -0
  474. package/src/internal/common/proxy/json-serializer.ts +93 -0
  475. package/src/internal/common/proxy/make-object.ts +105 -0
  476. package/src/internal/common/proxy/ownership.ts +252 -0
  477. package/src/internal/common/proxy/proxy-types.ts +23 -0
  478. package/src/internal/common/proxy/proxy-utils.ts +150 -0
  479. package/src/internal/common/proxy/reactive-array.ts +71 -0
  480. package/src/internal/common/proxy/reactive.test.ts +54 -0
  481. package/src/internal/common/proxy/reactive.ts +77 -0
  482. package/src/internal/common/proxy/schema-validator.ts +244 -0
  483. package/src/internal/common/proxy/schema.test.ts +145 -0
  484. package/src/internal/common/proxy/symbols.ts +7 -0
  485. package/src/internal/common/proxy/typed-handler.test.ts +313 -0
  486. package/src/internal/common/proxy/typed-handler.ts +447 -0
  487. package/src/internal/common/proxy/typed-object.test.ts +115 -0
  488. package/src/internal/common/types/base.ts +43 -0
  489. package/src/internal/common/types/entity.ts +54 -0
  490. package/src/internal/common/types/index.ts +10 -0
  491. package/src/internal/common/types/meta.ts +79 -0
  492. package/src/internal/common/types/model-symbols.ts +69 -0
  493. package/src/internal/common/types/typename.ts +55 -0
  494. package/src/internal/common/types/version.ts +19 -0
  495. package/src/internal/index.ts +17 -0
  496. package/src/testing/api.test.ts +125 -0
  497. package/src/testing/index.ts +3 -1
  498. package/src/testing/test-data.ts +189 -0
  499. package/src/testing/test-schema.ts +240 -0
  500. package/src/testing/util.ts +85 -0
  501. package/dist/lib/browser/chunk-SVSJEELN.mjs +0 -619
  502. package/dist/lib/browser/chunk-SVSJEELN.mjs.map +0 -7
  503. package/dist/lib/browser/index.mjs +0 -22
  504. package/dist/lib/browser/meta.json +0 -1
  505. package/dist/lib/browser/testing/index.mjs +0 -70
  506. package/dist/lib/browser/testing/index.mjs.map +0 -7
  507. package/dist/lib/node-esm/chunk-53HXWYR6.mjs +0 -619
  508. package/dist/lib/node-esm/chunk-53HXWYR6.mjs.map +0 -7
  509. package/dist/lib/node-esm/index.mjs +0 -22
  510. package/dist/lib/node-esm/meta.json +0 -1
  511. package/dist/lib/node-esm/testing/index.mjs +0 -70
  512. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  513. package/dist/types/src/experimental/database.d.ts +0 -8
  514. package/dist/types/src/experimental/database.d.ts.map +0 -1
  515. package/dist/types/src/experimental/index.d.ts +0 -1
  516. package/dist/types/src/experimental/index.d.ts.map +0 -1
  517. package/dist/types/src/experimental/queue.d.ts +0 -8
  518. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  519. package/dist/types/src/experimental/space.d.ts +0 -8
  520. package/dist/types/src/experimental/space.d.ts.map +0 -1
  521. package/dist/types/src/query/dsl.d.ts +0 -218
  522. package/dist/types/src/query/dsl.d.ts.map +0 -1
  523. package/dist/types/src/query/dsl.test.d.ts +0 -2
  524. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  525. package/dist/types/src/query/index.d.ts +0 -2
  526. package/dist/types/src/query/index.d.ts.map +0 -1
  527. package/dist/types/src/testing/types.d.ts +0 -113
  528. package/dist/types/src/testing/types.d.ts.map +0 -1
  529. package/src/experimental/database.ts +0 -11
  530. package/src/experimental/index.ts +0 -7
  531. package/src/experimental/queue.ts +0 -11
  532. package/src/experimental/space.ts +0 -11
  533. package/src/query/dsl.test.ts +0 -323
  534. package/src/query/dsl.ts +0 -646
  535. package/src/query/index.ts +0 -5
  536. package/src/test/api.test.ts +0 -173
  537. package/src/testing/types.ts +0 -91
  538. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  539. /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
  540. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
@@ -0,0 +1,165 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Match from 'effect/Match';
6
+ import * as Option from 'effect/Option';
7
+ import * as SchemaAST from 'effect/SchemaAST';
8
+
9
+ import {
10
+ type SchemaProperty,
11
+ getArrayElementType,
12
+ getBaseType,
13
+ getProperties,
14
+ isArrayType,
15
+ isNestedType,
16
+ } from '@dxos/effect';
17
+ import { invariant } from '@dxos/invariant';
18
+
19
+ import { type Mutable } from '../common/proxy';
20
+ import { getSchema } from '../common/types';
21
+
22
+ /**
23
+ * Set a deeply nested property on an object.
24
+ * Must be called within an Obj.update or Relation.update callback.
25
+ */
26
+ export const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {
27
+ invariant(path.length > 0, 'Path must not be empty');
28
+
29
+ const schema = getSchema(obj);
30
+ invariant(schema != null, 'Object must have a schema');
31
+
32
+ let parent = obj;
33
+ let currentAST: SchemaAST.AST | undefined = schema.ast;
34
+
35
+ // Navigate to the parent of the target property.
36
+ for (let i = 0; i < path.length - 1; i++) {
37
+ const part = path[i];
38
+ const key = typeof part === 'number' ? part : String(part);
39
+ if (parent[key] === undefined) {
40
+ const propertyAST = getPropertyAST(currentAST, String(part));
41
+ const shouldBeArray = propertyAST ? isArrayType(propertyAST) : false;
42
+
43
+ if (shouldBeArray) {
44
+ // Create array.
45
+ parent[key] = [];
46
+ } else {
47
+ // TODO(wittjosiah): Is there a better way to handle this than creating an object with defaults?
48
+ // Perhaps properties on objects should be optional by default?
49
+ // Create object with defaults for required fields.
50
+ const objWithDefaults = createObjectWithDefaults(propertyAST);
51
+ parent[key] = objWithDefaults;
52
+ }
53
+ }
54
+
55
+ parent = parent[key];
56
+ currentAST = getPropertyAST(currentAST, String(part));
57
+ }
58
+
59
+ const finalKey = path[path.length - 1];
60
+ parent[finalKey] = value;
61
+
62
+ return value;
63
+ };
64
+
65
+ /**
66
+ * Helper to get the AST of a nested property.
67
+ * @param ast - Current schema AST.
68
+ * @param propertyName - Name of the property to get.
69
+ * @returns The AST of the nested property, or undefined if not found.
70
+ */
71
+ const getPropertyAST = (ast: SchemaAST.AST | undefined, propertyName: string): SchemaAST.AST | undefined => {
72
+ if (!ast) {
73
+ return undefined;
74
+ }
75
+
76
+ if (isNestedType(ast)) {
77
+ const properties = getProperties(ast);
78
+ const property = properties.find((p) => p.name.toString() === propertyName);
79
+ if (property) {
80
+ return getBaseType(property).type;
81
+ }
82
+ }
83
+
84
+ if (isArrayType(ast)) {
85
+ const elementType = getArrayElementType(ast);
86
+ return elementType;
87
+ }
88
+
89
+ return undefined;
90
+ };
91
+
92
+ /**
93
+ * Get all required properties from a schema AST.
94
+ * A property is required if it's not optional.
95
+ *
96
+ * @param ast - Schema AST to inspect.
97
+ * @returns Array of required properties with their types.
98
+ */
99
+ const getRequiredProperties = (ast: SchemaAST.AST | undefined): SchemaProperty[] => {
100
+ if (!ast) {
101
+ return [];
102
+ }
103
+
104
+ // Only objects/structs have properties with optional/required distinction.
105
+ if (!isNestedType(ast)) {
106
+ return [];
107
+ }
108
+
109
+ const properties = getProperties(ast);
110
+
111
+ // Filter to only required properties (where isOptional === false).
112
+ return properties.filter((p) => !p.isOptional);
113
+ };
114
+
115
+ /**
116
+ * Get the default value for a primitive type.
117
+ * Returns undefined for non-primitive or unsupported types.
118
+ *
119
+ * @param ast - Type AST.
120
+ * @returns Default value for the type, or undefined.
121
+ */
122
+ const getDefaultValueForType = (ast: SchemaAST.AST | undefined): any => {
123
+ if (!ast) {
124
+ return undefined;
125
+ }
126
+
127
+ const defaultValue = SchemaAST.getDefaultAnnotation(ast);
128
+ if (Option.isSome(defaultValue)) {
129
+ return defaultValue.value;
130
+ }
131
+
132
+ return Match.value(ast).pipe(
133
+ Match.when({ _tag: 'StringKeyword' }, () => ''),
134
+ Match.when({ _tag: 'NumberKeyword' }, () => 0),
135
+ Match.when({ _tag: 'BooleanKeyword' }, () => false),
136
+ Match.orElse(() => undefined),
137
+ );
138
+ };
139
+
140
+ /**
141
+ * Create an object with default values for all required properties.
142
+ * Handles primitive types (String, Number, Boolean) and recursively initializes required nested objects.
143
+ *
144
+ * @param ast - Schema AST describing the object structure.
145
+ * @returns Object with required fields populated with defaults.
146
+ */
147
+ const createObjectWithDefaults = (ast: SchemaAST.AST | undefined): any => {
148
+ if (!ast) {
149
+ return {};
150
+ }
151
+
152
+ const requiredProps = getRequiredProperties(ast);
153
+ const obj: any = {};
154
+
155
+ for (const prop of requiredProps) {
156
+ const defaultValue = getDefaultValueForType(prop.type);
157
+ if (defaultValue !== undefined) {
158
+ obj[prop.name] = defaultValue;
159
+ } else if (isNestedType(prop.type)) {
160
+ obj[prop.name] = createObjectWithDefaults(prop.type);
161
+ }
162
+ }
163
+
164
+ return obj;
165
+ };
@@ -0,0 +1,105 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { assertArgument } from '@dxos/invariant';
6
+ import { deepMapValues } from '@dxos/util';
7
+
8
+ import {
9
+ KindId,
10
+ MetaId,
11
+ ObjectDatabaseId,
12
+ ObjectDeletedId,
13
+ RelationSourceDXNId,
14
+ RelationSourceId,
15
+ RelationTargetDXNId,
16
+ RelationTargetId,
17
+ SchemaId,
18
+ SelfDXNId,
19
+ SnapshotKindId,
20
+ TypeId,
21
+ } from '../common/types';
22
+
23
+ /**
24
+ * Copy a Symbol-keyed property from source to target if it has a defined value.
25
+ * Handles both plain objects (symbol in source) and proxies where get returns a value
26
+ * but has/in returns false (e.g. ObjectDatabaseId on echo-db proxies).
27
+ * Optional transform clones or mutates the value before assignment (e.g. for MetaId).
28
+ */
29
+ const copySymbolProperty = (
30
+ source: any,
31
+ target: any,
32
+ symbol: symbol,
33
+ transform?: (value: unknown) => unknown,
34
+ ): void => {
35
+ let value: unknown;
36
+ // Echo-db proxy getters (e.g. RelationSourceId, RelationTargetId) can throw in certain states.
37
+ try {
38
+ value = source[symbol];
39
+ } catch {
40
+ return;
41
+ }
42
+ if (value !== undefined) {
43
+ const finalValue = transform ? transform(value) : value;
44
+ Object.defineProperty(target, symbol, {
45
+ value: finalValue,
46
+ writable: false,
47
+ enumerable: false,
48
+ configurable: false,
49
+ });
50
+ }
51
+ };
52
+
53
+ /**
54
+ * Returns an immutable snapshot of the reactive object.
55
+ * The snapshot is branded with SnapshotKindId (not KindId).
56
+ */
57
+ export const getSnapshot = <T extends object>(obj: T): T => {
58
+ assertArgument(typeof obj === 'object' && obj !== null && KindId in obj, 'obj', 'must be an entity');
59
+
60
+ const snapshot = deepMapValues(obj, (value, recurse) => {
61
+ // Do not recurse on references (but do recurse on arrays).
62
+ if (
63
+ typeof value === 'object' &&
64
+ value !== null &&
65
+ Object.getPrototypeOf(value) !== Object.prototype &&
66
+ !Array.isArray(value)
67
+ ) {
68
+ return value;
69
+ }
70
+
71
+ return recurse(value);
72
+ }) as any;
73
+
74
+ // Add SnapshotKindId brand based on original KindId.
75
+ if (obj != null && typeof obj === 'object' && KindId in obj) {
76
+ snapshot[SnapshotKindId] = (obj as any)[KindId];
77
+ }
78
+
79
+ // Preserve Symbol-keyed properties that are important for type introspection.
80
+ // These are not copied by deepMapValues since Object.keys() doesn't include symbols.
81
+ const source = obj as any;
82
+
83
+ // Type introspection symbols.
84
+ copySymbolProperty(source, snapshot, TypeId);
85
+ copySymbolProperty(source, snapshot, SchemaId);
86
+ copySymbolProperty(source, snapshot, SelfDXNId);
87
+
88
+ // Database reference (required for Obj.getDatabase to work on snapshots).
89
+ copySymbolProperty(source, snapshot, ObjectDatabaseId);
90
+ copySymbolProperty(source, snapshot, ObjectDeletedId);
91
+
92
+ // Metadata symbol. Copy arrays so the snapshot is not affected by mutations to the live meta's keys/tags.
93
+ copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({
94
+ keys: [...(meta?.keys ?? [])],
95
+ tags: [...(meta?.tags ?? [])],
96
+ }));
97
+
98
+ // Relation endpoint symbols.
99
+ copySymbolProperty(source, snapshot, RelationSourceDXNId);
100
+ copySymbolProperty(source, snapshot, RelationTargetDXNId);
101
+ copySymbolProperty(source, snapshot, RelationSourceId);
102
+ copySymbolProperty(source, snapshot, RelationTargetId);
103
+
104
+ return Object.freeze(snapshot) as T;
105
+ };
@@ -0,0 +1,34 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+ import { describe, expect, test } from 'vitest';
8
+
9
+ import { EchoObjectSchema } from '../Entity';
10
+
11
+ const Organization = Schema.Struct({
12
+ name: Schema.String,
13
+ }).pipe(
14
+ EchoObjectSchema({
15
+ typename: 'com.example.type.organization',
16
+ version: '0.1.0',
17
+ }),
18
+ );
19
+
20
+ interface Organization extends Schema.Schema.Type<typeof Organization> {}
21
+
22
+ describe('EchoObjectSchema DSL', () => {
23
+ test('type is a valid schema', async () => {
24
+ expect(Schema.isSchema(Organization)).to.be.true;
25
+ });
26
+
27
+ test('static typename accessor', async () => {
28
+ expect(Organization.typename).to.eq('com.example.type.organization');
29
+ });
30
+
31
+ test('expect schema', async () => {
32
+ expect(SchemaAST.isTypeLiteral(Organization.ast)).to.be.true;
33
+ });
34
+ });
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import type * as Schema from 'effect/Schema';
6
+
7
+ import { type TypeMeta } from '../Annotation';
8
+ import { type AnyEntity } from '../common/types';
9
+
10
+ /**
11
+ * Definition for an object type that can be stored in an ECHO database.
12
+ * Implements effect schema to define object properties.
13
+ * Has a typename and version.
14
+ *
15
+ * In contrast to {@link EchoSchema} this definition is not recorded in the database.
16
+ *
17
+ * @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
18
+ */
19
+ export interface TypedObject<A = any, I = any> extends TypeMeta, Schema.Schema<A, I> {}
20
+
21
+ /**
22
+ * Typed object that could be used as a prototype in class definitions.
23
+ * This is an internal API type.
24
+ *
25
+ * @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
26
+ */
27
+ export interface TypedObjectPrototype<A = any, I = any> extends TypedObject<A, I> {
28
+ /** Type constructor. */
29
+ new (): AnyEntity & A;
30
+ }
@@ -0,0 +1,156 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type QueryAST } from '@dxos/echo-protocol';
6
+
7
+ /**
8
+ * Returns a human-readable string representation of a Filter AST.
9
+ */
10
+ export const prettyFilter = (filter: QueryAST.Filter): string => {
11
+ switch (filter.type) {
12
+ case 'object': {
13
+ // A type-less object filter with only a meta-key constraint is `Filter.key(...)`.
14
+ if (
15
+ filter.typename === null &&
16
+ (filter.id === undefined || filter.id.length === 0) &&
17
+ Object.keys(filter.props).length === 0 &&
18
+ (filter.foreignKeys === undefined || filter.foreignKeys.length === 0) &&
19
+ filter.metaKey !== undefined
20
+ ) {
21
+ return filter.metaVersion !== undefined
22
+ ? `Filter.key(${JSON.stringify(filter.metaKey)}, { version: ${JSON.stringify(filter.metaVersion)} })`
23
+ : `Filter.key(${JSON.stringify(filter.metaKey)})`;
24
+ }
25
+ const parts: string[] = [];
26
+ if (filter.typename !== null) {
27
+ parts.push(String(filter.typename));
28
+ }
29
+ if (filter.id !== undefined && filter.id.length > 0) {
30
+ parts.push(`id: [${filter.id.join(', ')}]`);
31
+ }
32
+ const propEntries = Object.entries(filter.props);
33
+ if (propEntries.length > 0) {
34
+ const propsStr = propEntries.map(([k, v]) => `${k}: ${prettyFilter(v)}`).join(', ');
35
+ parts.push(`{ ${propsStr} }`);
36
+ }
37
+ if (filter.foreignKeys !== undefined && filter.foreignKeys.length > 0) {
38
+ parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(', ')}]`);
39
+ }
40
+ if (filter.metaKey !== undefined) {
41
+ parts.push(
42
+ filter.metaVersion !== undefined
43
+ ? `metaKey: ${JSON.stringify(filter.metaKey)} (${filter.metaVersion})`
44
+ : `metaKey: ${JSON.stringify(filter.metaKey)}`,
45
+ );
46
+ }
47
+ return parts.length > 0 ? `Filter.type(${parts.join(', ')})` : 'Filter.everything()';
48
+ }
49
+ case 'compare':
50
+ return `Filter.${filter.operator}(${JSON.stringify(filter.value)})`;
51
+ case 'in':
52
+ return `Filter.in([${filter.values.map((v) => JSON.stringify(v)).join(', ')}])`;
53
+ case 'contains':
54
+ return `Filter.contains(${JSON.stringify(filter.value)})`;
55
+ case 'tag':
56
+ return `Filter.tag(${JSON.stringify(filter.tag)})`;
57
+ case 'range':
58
+ return `Filter.range(${JSON.stringify(filter.from)}, ${JSON.stringify(filter.to)})`;
59
+ case 'text-search':
60
+ return filter.searchKind
61
+ ? `Filter.textSearch(${JSON.stringify(filter.text)}, ${JSON.stringify(filter.searchKind)})`
62
+ : `Filter.textSearch(${JSON.stringify(filter.text)})`;
63
+ case 'timestamp':
64
+ return `Filter.${filter.field}.${filter.operator}(${filter.value})`;
65
+ case 'child-of':
66
+ return `Filter.childOf([${filter.parents.map((p) => JSON.stringify(p)).join(', ')}], { transitive: ${filter.transitive} })`;
67
+ case 'not':
68
+ return `Filter.not(${prettyFilter(filter.filter)})`;
69
+ case 'and':
70
+ return `Filter.and(${filter.filters.map(prettyFilter).join(', ')})`;
71
+ case 'or':
72
+ return `Filter.or(${filter.filters.map(prettyFilter).join(', ')})`;
73
+ }
74
+ };
75
+
76
+ /**
77
+ * Returns a human-readable string representation of a Query AST.
78
+ */
79
+ export const prettyQuery = (query: QueryAST.Query): string => {
80
+ switch (query.type) {
81
+ case 'select':
82
+ return `Query.select(${prettyFilter(query.filter)})`;
83
+ case 'filter':
84
+ return `${prettyQuery(query.selection)}.select(${prettyFilter(query.filter)})`;
85
+ case 'reference-traversal':
86
+ return `${prettyQuery(query.anchor)}.reference(${JSON.stringify(query.property)})`;
87
+ case 'incoming-references': {
88
+ const args: string[] = [];
89
+ if (query.typename !== null) {
90
+ args.push(String(query.typename));
91
+ }
92
+ if (query.property !== null) {
93
+ args.push(JSON.stringify(query.property));
94
+ }
95
+ return `${prettyQuery(query.anchor)}.referencedBy(${args.join(', ')})`;
96
+ }
97
+ case 'relation': {
98
+ const method =
99
+ query.direction === 'outgoing' ? 'sourceOf' : query.direction === 'incoming' ? 'targetOf' : 'relationOf';
100
+ const filterStr = query.filter !== undefined ? prettyFilter(query.filter) : '';
101
+ return `${prettyQuery(query.anchor)}.${method}(${filterStr})`;
102
+ }
103
+ case 'relation-traversal':
104
+ return `${prettyQuery(query.anchor)}.${query.direction}()`;
105
+ case 'hierarchy-traversal':
106
+ return query.direction === 'to-parent'
107
+ ? `${prettyQuery(query.anchor)}.parent()`
108
+ : `${prettyQuery(query.anchor)}.children()`;
109
+ case 'union':
110
+ return `Query.all(${query.queries.map(prettyQuery).join(', ')})`;
111
+ case 'set-difference':
112
+ return `Query.without(${prettyQuery(query.source)}, ${prettyQuery(query.exclude)})`;
113
+ case 'order': {
114
+ const orders = query.order.map((o) => {
115
+ if (o.kind === 'natural') {
116
+ return 'Order.natural()';
117
+ } else if (o.kind === 'rank') {
118
+ return `Order.rank(${JSON.stringify(o.direction)})`;
119
+ } else {
120
+ return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;
121
+ }
122
+ });
123
+ return `${prettyQuery(query.query)}.orderBy(${orders.join(', ')})`;
124
+ }
125
+ case 'options': {
126
+ const opts = query.options;
127
+ const parts: string[] = [];
128
+ if (opts.deleted !== undefined) {
129
+ parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);
130
+ }
131
+ if (opts.debugLabel !== undefined) {
132
+ parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);
133
+ }
134
+ return `${prettyQuery(query.query)}.options({ ${parts.join(', ')} })`;
135
+ }
136
+ case 'from': {
137
+ if (query.from._tag === 'scope') {
138
+ const scope = query.from.scope;
139
+ const parts: string[] = [];
140
+ if (scope.spaceIds !== undefined) {
141
+ parts.push(`spaceIds: [${scope.spaceIds.map((s) => JSON.stringify(s)).join(', ')}]`);
142
+ }
143
+ if (scope.feeds !== undefined) {
144
+ parts.push(`feeds: [${scope.feeds.map(String).join(', ')}]`);
145
+ }
146
+ if (scope.allFeedsFromSpaces !== undefined) {
147
+ parts.push(`allFeedsFromSpaces: ${scope.allFeedsFromSpaces}`);
148
+ }
149
+ return `${prettyQuery(query.query)}.from({ ${parts.join(', ')} })`;
150
+ }
151
+ return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;
152
+ }
153
+ case 'limit':
154
+ return `${prettyQuery(query.query)}.limit(${query.limit})`;
155
+ }
156
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './ref';
6
+ export * from './ref-array';
@@ -0,0 +1,38 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type ObjectId } from '@dxos/keys';
6
+ import { isNonNullable } from '@dxos/util';
7
+
8
+ import { type AnyEntity } from '../common/types';
9
+ import { Ref } from './ref';
10
+
11
+ /**
12
+ * Helper functions for working with arrays of refs.
13
+ */
14
+ export const RefArray = Object.freeze({
15
+ /**
16
+ * @returns all resolved targets.
17
+ */
18
+ targets: <T extends AnyEntity>(refs: readonly Ref<T>[]): T[] => {
19
+ return refs.map((ref) => ref.target).filter(isNonNullable);
20
+ },
21
+
22
+ /**
23
+ * Load all referenced objects.
24
+ */
25
+ loadAll: <T extends AnyEntity>(refs: readonly Ref<T>[]): Promise<T[]> => {
26
+ return Promise.all(refs.map((ref) => ref.load()));
27
+ },
28
+
29
+ /**
30
+ * Removes the ref with the given id.
31
+ */
32
+ removeById: (refs: Ref<AnyEntity>[], id: ObjectId) => {
33
+ const index = refs.findIndex(Ref.hasObjectId(id));
34
+ if (index >= 0) {
35
+ refs.splice(index, 1);
36
+ }
37
+ },
38
+ });
@@ -0,0 +1,100 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { describe, expect, test } from 'vitest';
7
+
8
+ import { DXN, ObjectId } from '@dxos/keys';
9
+
10
+ import { EchoObjectSchema, getObjectDXN } from '../Entity';
11
+ import { createObject } from '../Obj';
12
+ import { Ref, getReferenceAst } from './ref';
13
+
14
+ const Task = Schema.Struct({
15
+ title: Schema.optional(Schema.String),
16
+ }).pipe(
17
+ EchoObjectSchema({
18
+ typename: 'com.example.type.task',
19
+ version: '0.1.0',
20
+ }),
21
+ );
22
+
23
+ type Task = Schema.Schema.Type<typeof Task>;
24
+
25
+ const Contact = Schema.Struct({
26
+ name: Schema.String,
27
+ email: Schema.optional(Schema.String),
28
+ tasks: Schema.Array(Ref(Task)),
29
+ }).pipe(
30
+ EchoObjectSchema({
31
+ typename: 'com.example.type.person',
32
+ version: '0.1.0',
33
+ }),
34
+ );
35
+
36
+ type Contact = Schema.Schema.Type<typeof Contact>;
37
+
38
+ describe('Ref', () => {
39
+ test('Schema is', () => {
40
+ Ref(Contact).pipe(Schema.is)(Ref.fromDXN(DXN.parse(`dxn:echo:@:${ObjectId.random()}`)));
41
+ });
42
+
43
+ test('ref ast', () => {
44
+ const ref = Ref(Task);
45
+ expect(ref.ast._tag).toEqual('Declaration');
46
+ const refAst = getReferenceAst(ref.ast);
47
+ expect(refAst).toEqual({ typename: Task.typename, version: Task.version });
48
+ });
49
+
50
+ // TODO(dmaretskyi): Figure out how to expose this in the API.
51
+ test.skip('encode with inlined target', () => {
52
+ const task = createObject(Task, { title: 'Fix bugs' });
53
+ const contact = createObject(Contact, { name: 'John Doe', tasks: [Ref.make(task)] });
54
+
55
+ const json = JSON.parse(JSON.stringify(contact));
56
+ expect(json).toEqual({
57
+ id: contact.id,
58
+ '@type': `dxn:type:${Contact.typename}:${Contact.version}`,
59
+ '@meta': {
60
+ keys: [],
61
+ },
62
+ name: 'John Doe',
63
+ tasks: [
64
+ {
65
+ '/': getObjectDXN(task as any)!.toString(),
66
+ target: JSON.parse(JSON.stringify(task)),
67
+ },
68
+ ],
69
+ });
70
+ });
71
+
72
+ test('encode without inlining target', () => {
73
+ const task = createObject(Task, { title: 'Fix bugs' });
74
+ const contact = createObject(Contact, { name: 'John Doe', tasks: [Ref.make(task).noInline()] });
75
+
76
+ const json = JSON.parse(JSON.stringify(contact));
77
+ expect(json).toEqual({
78
+ id: contact.id,
79
+ '@type': `dxn:type:${Contact.typename}:${Contact.version}`,
80
+ '@meta': {
81
+ keys: [],
82
+ },
83
+ name: 'John Doe',
84
+ tasks: [{ '/': getObjectDXN(task)!.toString() }],
85
+ });
86
+ });
87
+
88
+ test('decode object', () => {
89
+ const id = ObjectId.random();
90
+ const contactData = {
91
+ id: ObjectId.random(),
92
+ name: 'John Doe',
93
+ tasks: [{ '/': `dxn:echo:@:${id}` }],
94
+ };
95
+
96
+ const contact = Contact.pipe(Schema.decodeUnknownSync)(contactData);
97
+ expect(Ref.isRef(contact.tasks[0])).toEqual(true);
98
+ expect(contact.tasks[0].dxn.toString()).toEqual(`dxn:echo:@:${id}`);
99
+ });
100
+ });