@dxos/echo 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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 (539) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +49 -0
  4. package/dist/lib/neutral/Entity.mjs +61 -0
  5. package/dist/lib/neutral/Entity.mjs.map +7 -0
  6. package/dist/lib/neutral/Err.mjs +12 -0
  7. package/dist/lib/neutral/Err.mjs.map +7 -0
  8. package/dist/lib/neutral/Extension.mjs +18 -0
  9. package/dist/lib/neutral/Extension.mjs.map +7 -0
  10. package/dist/lib/neutral/Feed.mjs +50 -0
  11. package/dist/lib/neutral/Feed.mjs.map +7 -0
  12. package/dist/lib/neutral/Filter.mjs +72 -0
  13. package/dist/lib/neutral/Filter.mjs.map +7 -0
  14. package/dist/lib/neutral/Format.mjs +66 -0
  15. package/dist/lib/neutral/Format.mjs.map +7 -0
  16. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  17. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  18. package/dist/lib/neutral/Key.mjs +12 -0
  19. package/dist/lib/neutral/Key.mjs.map +7 -0
  20. package/dist/lib/neutral/Migration.mjs +17 -0
  21. package/dist/lib/neutral/Migration.mjs.map +7 -0
  22. package/dist/lib/neutral/Obj.mjs +113 -0
  23. package/dist/lib/neutral/Obj.mjs.map +7 -0
  24. package/dist/lib/neutral/Order.mjs +12 -0
  25. package/dist/lib/neutral/Order.mjs.map +7 -0
  26. package/dist/lib/neutral/Query.mjs +38 -0
  27. package/dist/lib/neutral/Query.mjs.map +7 -0
  28. package/dist/lib/neutral/QueryResult.mjs +2 -0
  29. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  30. package/dist/lib/neutral/Ref.mjs +24 -0
  31. package/dist/lib/neutral/Ref.mjs.map +7 -0
  32. package/dist/lib/neutral/Relation.mjs +94 -0
  33. package/dist/lib/neutral/Relation.mjs.map +7 -0
  34. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  35. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  36. package/dist/lib/neutral/Tag.mjs +29 -0
  37. package/dist/lib/neutral/Tag.mjs.map +7 -0
  38. package/dist/lib/neutral/Type.mjs +37 -0
  39. package/dist/lib/neutral/Type.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-2T22UGGN.mjs +206 -0
  41. package/dist/lib/neutral/chunk-2T22UGGN.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-44HT3MEC.mjs +73 -0
  43. package/dist/lib/neutral/chunk-44HT3MEC.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-6VC3FI5E.mjs +125 -0
  45. package/dist/lib/neutral/chunk-6VC3FI5E.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-7JFW72MX.mjs +132 -0
  47. package/dist/lib/neutral/chunk-7JFW72MX.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-7RVZT53K.mjs +21 -0
  49. package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-BICZKPQG.mjs +7 -0
  51. package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs +36 -0
  53. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-DUNXPKAC.mjs +56 -0
  55. package/dist/lib/neutral/chunk-DUNXPKAC.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-FAW7PJRO.mjs +34 -0
  57. package/dist/lib/neutral/chunk-FAW7PJRO.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-FAYW32CW.mjs +27 -0
  59. package/dist/lib/neutral/chunk-FAYW32CW.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  61. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-I2MFJ76N.mjs +354 -0
  63. package/dist/lib/neutral/chunk-I2MFJ76N.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  65. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-JALF2CVV.mjs +345 -0
  67. package/dist/lib/neutral/chunk-JALF2CVV.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs +128 -0
  69. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-LOTZLYHB.mjs +420 -0
  71. package/dist/lib/neutral/chunk-LOTZLYHB.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-N4B7FHQT.mjs +67 -0
  73. package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-NKXEKBP5.mjs +81 -0
  75. package/dist/lib/neutral/chunk-NKXEKBP5.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-NSMLBSFS.mjs +270 -0
  77. package/dist/lib/neutral/chunk-NSMLBSFS.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-QBIGOSRF.mjs +45 -0
  79. package/dist/lib/neutral/chunk-QBIGOSRF.mjs.map +7 -0
  80. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs +734 -0
  81. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs.map +7 -0
  82. package/dist/lib/neutral/chunk-QEVM3JUP.mjs +318 -0
  83. package/dist/lib/neutral/chunk-QEVM3JUP.mjs.map +7 -0
  84. package/dist/lib/neutral/chunk-REP7WWAQ.mjs +346 -0
  85. package/dist/lib/neutral/chunk-REP7WWAQ.mjs.map +7 -0
  86. package/dist/lib/neutral/chunk-TRPZU2HV.mjs +402 -0
  87. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
  88. package/dist/lib/neutral/chunk-TTCSATUD.mjs +42 -0
  89. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  90. package/dist/lib/neutral/chunk-TW76K7H5.mjs +45 -0
  91. package/dist/lib/neutral/chunk-TW76K7H5.mjs.map +7 -0
  92. package/dist/lib/neutral/chunk-UYJYDSD7.mjs +2436 -0
  93. package/dist/lib/neutral/chunk-UYJYDSD7.mjs.map +7 -0
  94. package/dist/lib/neutral/chunk-V72DY6LU.mjs +7 -0
  95. package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +7 -0
  96. package/dist/lib/neutral/chunk-ZISMEVKD.mjs +51 -0
  97. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
  98. package/dist/lib/neutral/index.mjs +107 -0
  99. package/dist/lib/neutral/index.mjs.map +7 -0
  100. package/dist/lib/neutral/internal/index.mjs +474 -0
  101. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  102. package/dist/lib/neutral/meta.json +1 -0
  103. package/dist/lib/neutral/testing/index.mjs +375 -0
  104. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  105. package/dist/types/src/Annotation.d.ts +24 -0
  106. package/dist/types/src/Annotation.d.ts.map +1 -0
  107. package/dist/types/src/Collection.d.ts +16 -0
  108. package/dist/types/src/Collection.d.ts.map +1 -0
  109. package/dist/types/src/Database.d.ts +201 -0
  110. package/dist/types/src/Database.d.ts.map +1 -0
  111. package/dist/types/src/Dataset.d.ts +19 -0
  112. package/dist/types/src/Dataset.d.ts.map +1 -0
  113. package/dist/types/src/Entity.d.ts +174 -0
  114. package/dist/types/src/Entity.d.ts.map +1 -0
  115. package/dist/types/src/Entity.test.d.ts +2 -0
  116. package/dist/types/src/Entity.test.d.ts.map +1 -0
  117. package/dist/types/src/Err.d.ts +107 -0
  118. package/dist/types/src/Err.d.ts.map +1 -0
  119. package/dist/types/src/Extension.d.ts +80 -0
  120. package/dist/types/src/Extension.d.ts.map +1 -0
  121. package/dist/types/src/Extension.test.d.ts +2 -0
  122. package/dist/types/src/Extension.test.d.ts.map +1 -0
  123. package/dist/types/src/Feed.d.ts +182 -0
  124. package/dist/types/src/Feed.d.ts.map +1 -0
  125. package/dist/types/src/Filter.d.ts +149 -0
  126. package/dist/types/src/Filter.d.ts.map +1 -0
  127. package/dist/types/src/Filter.test.d.ts +2 -0
  128. package/dist/types/src/Filter.test.d.ts.map +1 -0
  129. package/dist/types/src/Format.d.ts +4 -0
  130. package/dist/types/src/Format.d.ts.map +1 -0
  131. package/dist/types/src/Hypergraph.d.ts +65 -0
  132. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  133. package/dist/types/src/Json.d.ts +33 -0
  134. package/dist/types/src/Json.d.ts.map +1 -0
  135. package/dist/types/src/Json.test.d.ts +2 -0
  136. package/dist/types/src/Json.test.d.ts.map +1 -0
  137. package/dist/types/src/JsonSchema.d.ts +16 -0
  138. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  139. package/dist/types/src/Key.d.ts +1 -0
  140. package/dist/types/src/Key.d.ts.map +1 -1
  141. package/dist/types/src/Migration.d.ts +57 -0
  142. package/dist/types/src/Migration.d.ts.map +1 -0
  143. package/dist/types/src/Obj.d.ts +442 -98
  144. package/dist/types/src/Obj.d.ts.map +1 -1
  145. package/dist/types/src/Obj.test.d.ts +2 -0
  146. package/dist/types/src/Obj.test.d.ts.map +1 -0
  147. package/dist/types/src/Order.d.ts +16 -0
  148. package/dist/types/src/Order.d.ts.map +1 -0
  149. package/dist/types/src/Query.d.ts +213 -0
  150. package/dist/types/src/Query.d.ts.map +1 -0
  151. package/dist/types/src/Query.test.d.ts +2 -0
  152. package/dist/types/src/Query.test.d.ts.map +1 -0
  153. package/dist/types/src/QueryResult.d.ts +80 -0
  154. package/dist/types/src/QueryResult.d.ts.map +1 -0
  155. package/dist/types/src/Ref.d.ts +61 -11
  156. package/dist/types/src/Ref.d.ts.map +1 -1
  157. package/dist/types/src/Relation.d.ts +288 -22
  158. package/dist/types/src/Relation.d.ts.map +1 -1
  159. package/dist/types/src/Relation.test.d.ts +2 -0
  160. package/dist/types/src/Relation.test.d.ts.map +1 -0
  161. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  162. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  163. package/dist/types/src/Tag.d.ts +18 -0
  164. package/dist/types/src/Tag.d.ts.map +1 -0
  165. package/dist/types/src/Type.d.ts +123 -100
  166. package/dist/types/src/Type.d.ts.map +1 -1
  167. package/dist/types/src/Type.test.d.ts +2 -0
  168. package/dist/types/src/Type.test.d.ts.map +1 -0
  169. package/dist/types/src/View.d.ts +68 -0
  170. package/dist/types/src/View.d.ts.map +1 -0
  171. package/dist/types/src/hierarchy.test.d.ts +2 -0
  172. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  173. package/dist/types/src/index.d.ts +22 -5
  174. package/dist/types/src/index.d.ts.map +1 -1
  175. package/dist/types/src/internal/Annotation/annotations.d.ts +231 -0
  176. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  177. package/dist/types/src/internal/Annotation/annotations.test.d.ts +2 -0
  178. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  179. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  180. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  181. package/dist/types/src/internal/Annotation/sorting.d.ts +24 -0
  182. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  183. package/dist/types/src/internal/Annotation/util.d.ts +39 -0
  184. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  185. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  186. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  187. package/dist/types/src/internal/Entity/entity.d.ts +20 -0
  188. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  189. package/dist/types/src/internal/Entity/index.d.ts +8 -0
  190. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  191. package/dist/types/src/internal/Entity/model.d.ts +55 -0
  192. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  193. package/dist/types/src/internal/Entity/object.d.ts +18 -0
  194. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  195. package/dist/types/src/internal/Entity/relation.d.ts +35 -0
  196. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  197. package/dist/types/src/internal/Entity/util.d.ts +2 -0
  198. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  199. package/dist/types/src/internal/Entity/version.d.ts +42 -0
  200. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  201. package/dist/types/src/internal/Format/date.d.ts +63 -0
  202. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  203. package/dist/types/src/internal/Format/date.test.d.ts +2 -0
  204. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  205. package/dist/types/src/internal/Format/format.d.ts +32 -0
  206. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  207. package/dist/types/src/internal/Format/format.test.d.ts +2 -0
  208. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  209. package/dist/types/src/internal/Format/index.d.ts +8 -0
  210. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  211. package/dist/types/src/internal/Format/number.d.ts +31 -0
  212. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  213. package/dist/types/src/internal/Format/object.d.ts +35 -0
  214. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  215. package/dist/types/src/internal/Format/select.d.ts +13 -0
  216. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  217. package/dist/types/src/internal/Format/string.d.ts +42 -0
  218. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  219. package/dist/types/src/internal/Format/types.d.ts +72 -0
  220. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  221. package/dist/types/src/internal/JsonSchema/annotations.d.ts +19 -0
  222. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  223. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts +2 -0
  224. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/JsonSchema/index.d.ts +5 -0
  226. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  227. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts +7 -0
  228. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  229. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +351 -0
  230. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  231. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +30 -0
  232. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  233. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts +2 -0
  234. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  235. package/dist/types/src/internal/Obj/clone.d.ts +8 -0
  236. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  237. package/dist/types/src/internal/Obj/common.d.ts +18 -0
  238. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  239. package/dist/types/src/internal/Obj/create-object.d.ts +39 -0
  240. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  241. package/dist/types/src/internal/Obj/create-object.test.d.ts +2 -0
  242. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  243. package/dist/types/src/internal/Obj/deleted.d.ts +6 -0
  244. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  245. package/dist/types/src/internal/Obj/ids.d.ts +6 -0
  246. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  247. package/dist/types/src/internal/Obj/index.d.ts +11 -0
  248. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  249. package/dist/types/src/internal/Obj/inspect.d.ts +2 -0
  250. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  251. package/dist/types/src/internal/Obj/json-serializer.d.ts +45 -0
  252. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  253. package/dist/types/src/internal/Obj/json-serializer.test.d.ts +2 -0
  254. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  255. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  256. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  257. package/dist/types/src/internal/Obj/schema-validator.test.d.ts +2 -0
  258. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
  260. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  261. package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
  262. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
  264. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  265. package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
  266. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  267. package/dist/types/src/internal/Obj/typed-object.test.d.ts +2 -0
  268. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  269. package/dist/types/src/internal/Query.d.ts +10 -0
  270. package/dist/types/src/internal/Query.d.ts.map +1 -0
  271. package/dist/types/src/internal/Ref/index.d.ts +3 -0
  272. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  273. package/dist/types/src/internal/Ref/ref-array.d.ts +21 -0
  274. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  275. package/dist/types/src/internal/Ref/ref.d.ts +244 -0
  276. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  277. package/dist/types/src/internal/Ref/ref.test.d.ts +2 -0
  278. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  279. package/dist/types/src/internal/Type/compose.d.ts +7 -0
  280. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  281. package/dist/types/src/internal/Type/compose.test.d.ts +2 -0
  282. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  283. package/dist/types/src/internal/Type/echo-schema.d.ts +181 -0
  284. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  285. package/dist/types/src/internal/Type/index.d.ts +4 -0
  286. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  287. package/dist/types/src/internal/Type/manipulation.d.ts +10 -0
  288. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  289. package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
  290. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  291. package/dist/types/src/internal/common/api/index.d.ts +11 -0
  292. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  293. package/dist/types/src/internal/common/api/meta.d.ts +42 -0
  294. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  295. package/dist/types/src/internal/common/index.d.ts +4 -0
  296. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  297. package/dist/types/src/internal/common/proxy/change-context.d.ts +55 -0
  298. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  299. package/dist/types/src/internal/common/proxy/change.test.d.ts +2 -0
  300. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  301. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts +5 -0
  302. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  303. package/dist/types/src/internal/common/proxy/errors.d.ts +19 -0
  304. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  305. package/dist/types/src/internal/common/proxy/event-batch.d.ts +10 -0
  306. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  307. package/dist/types/src/internal/common/proxy/handler.test.d.ts +2 -0
  308. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  309. package/dist/types/src/internal/common/proxy/index.d.ts +14 -0
  310. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  311. package/dist/types/src/internal/common/proxy/json-serializer.d.ts +6 -0
  312. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  313. package/dist/types/src/internal/common/proxy/make-object.d.ts +14 -0
  314. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  315. package/dist/types/src/internal/common/proxy/ownership.d.ts +57 -0
  316. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  317. package/dist/types/src/internal/common/proxy/proxy-types.d.ts +18 -0
  318. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  319. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +47 -0
  320. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  321. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +8 -0
  322. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  323. package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
  324. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
  325. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  326. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  327. package/dist/types/src/internal/common/proxy/schema-validator.d.ts +15 -0
  328. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  329. package/dist/types/src/internal/common/proxy/schema.test.d.ts +2 -0
  330. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  331. package/dist/types/src/internal/common/proxy/symbols.d.ts +3 -0
  332. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  333. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +48 -0
  334. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  335. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts +2 -0
  336. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  337. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts +2 -0
  338. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  339. package/dist/types/src/internal/common/types/base.d.ts +27 -0
  340. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  341. package/dist/types/src/internal/common/types/entity.d.ts +37 -0
  342. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  343. package/dist/types/src/internal/common/types/index.d.ts +7 -0
  344. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  345. package/dist/types/src/internal/common/types/meta.d.ts +33 -0
  346. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  347. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  348. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  349. package/dist/types/src/internal/common/types/typename.d.ts +21 -0
  350. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  351. package/dist/types/src/internal/common/types/version.d.ts +15 -0
  352. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  353. package/dist/types/src/internal/index.d.ts +11 -0
  354. package/dist/types/src/internal/index.d.ts.map +1 -0
  355. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  356. package/dist/types/src/testing/index.d.ts +3 -1
  357. package/dist/types/src/testing/index.d.ts.map +1 -1
  358. package/dist/types/src/testing/test-data.d.ts +18 -0
  359. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  360. package/dist/types/src/testing/test-schema.d.ts +304 -0
  361. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  362. package/dist/types/src/testing/util.d.ts +21 -0
  363. package/dist/types/src/testing/util.d.ts.map +1 -0
  364. package/dist/types/tsconfig.tsbuildinfo +1 -1
  365. package/package.json +119 -57
  366. package/src/Annotation.ts +48 -0
  367. package/src/Collection.ts +37 -0
  368. package/src/Database.ts +352 -0
  369. package/src/Dataset.ts +26 -0
  370. package/src/Entity.test.ts +22 -0
  371. package/src/Entity.ts +243 -0
  372. package/src/Err.ts +40 -0
  373. package/src/Extension.test.ts +235 -0
  374. package/src/Extension.ts +122 -0
  375. package/src/Feed.ts +304 -0
  376. package/src/Filter.test.ts +90 -0
  377. package/src/Filter.ts +454 -0
  378. package/src/Format.ts +9 -0
  379. package/src/Hypergraph.ts +79 -0
  380. package/src/Json.test.ts +175 -0
  381. package/src/Json.ts +102 -0
  382. package/src/JsonSchema.ts +26 -0
  383. package/src/Key.ts +3 -0
  384. package/src/Migration.ts +94 -0
  385. package/src/Obj.test.ts +539 -0
  386. package/src/Obj.ts +713 -244
  387. package/src/Order.ts +46 -0
  388. package/src/Query.test.ts +822 -0
  389. package/src/Query.ts +567 -0
  390. package/src/QueryResult.ts +106 -0
  391. package/src/Ref.ts +78 -9
  392. package/src/Relation.test.ts +88 -0
  393. package/src/Relation.ts +450 -60
  394. package/src/SchemaRegistry.ts +106 -0
  395. package/src/Tag.ts +41 -0
  396. package/src/Type.test.ts +52 -0
  397. package/src/Type.ts +168 -155
  398. package/src/View.ts +107 -0
  399. package/src/hierarchy.test.ts +33 -0
  400. package/src/index.ts +24 -6
  401. package/src/internal/Annotation/annotations.test.ts +145 -0
  402. package/src/internal/Annotation/annotations.ts +577 -0
  403. package/src/internal/Annotation/index.ts +7 -0
  404. package/src/internal/Annotation/sorting.ts +51 -0
  405. package/src/internal/Annotation/util.ts +85 -0
  406. package/src/internal/Entity/api.ts +30 -0
  407. package/src/internal/Entity/entity.ts +128 -0
  408. package/src/internal/Entity/index.ts +11 -0
  409. package/src/internal/Entity/model.ts +109 -0
  410. package/src/internal/Entity/object.ts +57 -0
  411. package/src/internal/Entity/relation.ts +154 -0
  412. package/src/internal/Entity/util.ts +33 -0
  413. package/src/internal/Entity/version.ts +96 -0
  414. package/src/internal/Format/date.test.ts +55 -0
  415. package/src/internal/Format/date.ts +217 -0
  416. package/src/internal/Format/format.test.ts +76 -0
  417. package/src/internal/Format/format.ts +54 -0
  418. package/src/internal/Format/index.ts +12 -0
  419. package/src/internal/Format/number.ts +89 -0
  420. package/src/internal/Format/object.ts +80 -0
  421. package/src/internal/Format/select.ts +18 -0
  422. package/src/internal/Format/string.ts +81 -0
  423. package/src/internal/Format/types.ts +186 -0
  424. package/src/internal/JsonSchema/annotations.ts +50 -0
  425. package/src/internal/JsonSchema/effect-schema.test.ts +143 -0
  426. package/src/internal/JsonSchema/index.ts +8 -0
  427. package/src/internal/JsonSchema/json-schema-normalize.ts +111 -0
  428. package/src/internal/JsonSchema/json-schema-type.ts +403 -0
  429. package/src/internal/JsonSchema/json-schema.test.ts +860 -0
  430. package/src/internal/JsonSchema/json-schema.ts +533 -0
  431. package/src/internal/Obj/clone.ts +48 -0
  432. package/src/internal/Obj/common.ts +75 -0
  433. package/src/internal/Obj/create-object.test.ts +114 -0
  434. package/src/internal/Obj/create-object.ts +94 -0
  435. package/src/internal/Obj/deleted.ts +19 -0
  436. package/src/internal/Obj/ids.ts +12 -0
  437. package/src/internal/Obj/index.ts +14 -0
  438. package/src/internal/Obj/inspect.ts +46 -0
  439. package/src/internal/Obj/json-serializer.test.ts +120 -0
  440. package/src/internal/Obj/json-serializer.ts +222 -0
  441. package/src/internal/Obj/schema-validator.test.ts +182 -0
  442. package/src/internal/Obj/schema-validator.ts +6 -0
  443. package/src/internal/Obj/set-value.test.ts +281 -0
  444. package/src/internal/Obj/set-value.ts +165 -0
  445. package/src/internal/Obj/snapshot.ts +105 -0
  446. package/src/internal/Obj/typed-object.test.ts +34 -0
  447. package/src/internal/Obj/typed-object.ts +30 -0
  448. package/src/internal/Query.ts +137 -0
  449. package/src/internal/Ref/index.ts +6 -0
  450. package/src/internal/Ref/ref-array.ts +38 -0
  451. package/src/internal/Ref/ref.test.ts +100 -0
  452. package/src/internal/Ref/ref.ts +589 -0
  453. package/src/internal/Type/compose.test.ts +41 -0
  454. package/src/internal/Type/compose.ts +41 -0
  455. package/src/internal/Type/echo-schema.ts +423 -0
  456. package/src/internal/Type/index.ts +7 -0
  457. package/src/internal/Type/manipulation.ts +92 -0
  458. package/src/internal/Type/persistent-schema.ts +33 -0
  459. package/src/internal/common/README.md +102 -0
  460. package/src/internal/common/api/index.ts +15 -0
  461. package/src/internal/common/api/meta.ts +88 -0
  462. package/src/internal/common/index.ts +7 -0
  463. package/src/internal/common/proxy/change-context.ts +138 -0
  464. package/src/internal/common/proxy/change.test.ts +519 -0
  465. package/src/internal/common/proxy/define-hidden-property.ts +14 -0
  466. package/src/internal/common/proxy/errors.ts +42 -0
  467. package/src/internal/common/proxy/event-batch.ts +44 -0
  468. package/src/internal/common/proxy/handler.test.ts +121 -0
  469. package/src/internal/common/proxy/index.ts +17 -0
  470. package/src/internal/common/proxy/json-serializer.ts +90 -0
  471. package/src/internal/common/proxy/make-object.ts +105 -0
  472. package/src/internal/common/proxy/ownership.ts +252 -0
  473. package/src/internal/common/proxy/proxy-types.ts +23 -0
  474. package/src/internal/common/proxy/proxy-utils.ts +150 -0
  475. package/src/internal/common/proxy/reactive-array.ts +71 -0
  476. package/src/internal/common/proxy/reactive.test.ts +54 -0
  477. package/src/internal/common/proxy/reactive.ts +77 -0
  478. package/src/internal/common/proxy/schema-validator.ts +244 -0
  479. package/src/internal/common/proxy/schema.test.ts +145 -0
  480. package/src/internal/common/proxy/symbols.ts +7 -0
  481. package/src/internal/common/proxy/typed-handler.test.ts +313 -0
  482. package/src/internal/common/proxy/typed-handler.ts +447 -0
  483. package/src/internal/common/proxy/typed-object.test.ts +115 -0
  484. package/src/internal/common/types/base.ts +43 -0
  485. package/src/internal/common/types/entity.ts +54 -0
  486. package/src/internal/common/types/index.ts +10 -0
  487. package/src/internal/common/types/meta.ts +67 -0
  488. package/src/internal/common/types/model-symbols.ts +69 -0
  489. package/src/internal/common/types/typename.ts +55 -0
  490. package/src/internal/common/types/version.ts +19 -0
  491. package/src/internal/index.ts +17 -0
  492. package/src/testing/api.test.ts +125 -0
  493. package/src/testing/index.ts +3 -1
  494. package/src/testing/test-data.ts +129 -0
  495. package/src/testing/test-schema.ts +240 -0
  496. package/src/testing/util.ts +85 -0
  497. package/dist/lib/browser/chunk-I4YEWYJA.mjs +0 -882
  498. package/dist/lib/browser/chunk-I4YEWYJA.mjs.map +0 -7
  499. package/dist/lib/browser/index.mjs +0 -30
  500. package/dist/lib/browser/meta.json +0 -1
  501. package/dist/lib/browser/testing/index.mjs +0 -70
  502. package/dist/lib/browser/testing/index.mjs.map +0 -7
  503. package/dist/lib/node-esm/chunk-AWWFAF75.mjs +0 -882
  504. package/dist/lib/node-esm/chunk-AWWFAF75.mjs.map +0 -7
  505. package/dist/lib/node-esm/index.mjs +0 -30
  506. package/dist/lib/node-esm/meta.json +0 -1
  507. package/dist/lib/node-esm/testing/index.mjs +0 -70
  508. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  509. package/dist/types/src/errors.d.ts +0 -72
  510. package/dist/types/src/errors.d.ts.map +0 -1
  511. package/dist/types/src/experimental/database.d.ts +0 -8
  512. package/dist/types/src/experimental/database.d.ts.map +0 -1
  513. package/dist/types/src/experimental/index.d.ts +0 -1
  514. package/dist/types/src/experimental/index.d.ts.map +0 -1
  515. package/dist/types/src/experimental/queue.d.ts +0 -8
  516. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  517. package/dist/types/src/experimental/space.d.ts +0 -8
  518. package/dist/types/src/experimental/space.d.ts.map +0 -1
  519. package/dist/types/src/query/dsl.d.ts +0 -245
  520. package/dist/types/src/query/dsl.d.ts.map +0 -1
  521. package/dist/types/src/query/dsl.test.d.ts +0 -2
  522. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  523. package/dist/types/src/query/index.d.ts +0 -2
  524. package/dist/types/src/query/index.d.ts.map +0 -1
  525. package/dist/types/src/testing/types.d.ts +0 -113
  526. package/dist/types/src/testing/types.d.ts.map +0 -1
  527. package/src/errors.ts +0 -18
  528. package/src/experimental/database.ts +0 -11
  529. package/src/experimental/index.ts +0 -7
  530. package/src/experimental/queue.ts +0 -11
  531. package/src/experimental/space.ts +0 -11
  532. package/src/query/dsl.test.ts +0 -362
  533. package/src/query/dsl.ts +0 -759
  534. package/src/query/index.ts +0 -5
  535. package/src/test/api.test.ts +0 -180
  536. package/src/testing/types.ts +0 -91
  537. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  538. /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
  539. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
@@ -0,0 +1,114 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { inspect } from 'util';
7
+ import { describe, expect, test } from 'vitest';
8
+
9
+ import { DXN } from '@dxos/keys';
10
+
11
+ import { Relation } from '../../index';
12
+ import { TestSchema } from '../../testing';
13
+ import { getSchemaDXN, getTypeDXN, isInstanceOf } from '../Annotation';
14
+ import { ATTR_META, ATTR_TYPE, getSchema } from '../common/types';
15
+ import { ATTR_RELATION_SOURCE, ATTR_RELATION_TARGET } from '../Entity';
16
+ import { createObject } from './create-object';
17
+ import { objectToJSON } from './json-serializer';
18
+
19
+ describe('create (static version)', () => {
20
+ test('defaults', ({ expect }) => {
21
+ const Contact = Schema.Struct({
22
+ name: Schema.String.pipe(
23
+ Schema.optional,
24
+ Schema.withConstructorDefault(() => 'Anonymous'),
25
+ ),
26
+ email: Schema.String.pipe(Schema.optional),
27
+ });
28
+
29
+ const obj = Contact.make({});
30
+ expect(obj.name).toBe('Anonymous');
31
+ });
32
+
33
+ test('create static object', () => {
34
+ const contact = createObject(TestSchema.Person, {
35
+ name: 'Bot',
36
+ email: 'bot@example.com',
37
+ });
38
+
39
+ expect(contact.id).toBeDefined();
40
+ expect(contact.name).toBe('Bot');
41
+ expect(contact.email).toBe('bot@example.com');
42
+ expect((contact as any)['@type']).toBeUndefined();
43
+ expect(getTypeDXN(contact)?.toString()).toBe(getSchemaDXN(TestSchema.Person)!.toString());
44
+ expect(isInstanceOf(TestSchema.Person, contact)).toBe(true);
45
+ });
46
+
47
+ test('JSON encoding', () => {
48
+ const contact = createObject(TestSchema.Person, {
49
+ name: 'Bot',
50
+ email: 'bot@example.com',
51
+ });
52
+
53
+ const json = JSON.parse(JSON.stringify(contact));
54
+ expect(json).toEqual({
55
+ id: contact.id,
56
+ '@type': DXN.fromTypenameAndVersion(TestSchema.Person.typename, TestSchema.Person.version).toString(),
57
+ '@meta': {
58
+ keys: [],
59
+ },
60
+ name: 'Bot',
61
+ email: 'bot@example.com',
62
+ });
63
+ expect(objectToJSON(contact)).toStrictEqual(json);
64
+ });
65
+
66
+ test('JSON encoding with relation', () => {
67
+ const person1 = createObject(TestSchema.Person, {
68
+ name: 'Alice',
69
+ email: 'alice@example.com',
70
+ });
71
+ const person2 = createObject(TestSchema.Person, {
72
+ name: 'Bob',
73
+ email: 'bob@example.com',
74
+ });
75
+
76
+ const manager = createObject(TestSchema.HasManager, {
77
+ [Relation.Source]: person1 as any,
78
+ [Relation.Target]: person2 as any,
79
+ });
80
+
81
+ const json = JSON.parse(JSON.stringify(manager));
82
+ expect(json).toEqual({
83
+ id: manager.id,
84
+ [ATTR_TYPE]: DXN.fromTypenameAndVersion(TestSchema.HasManager.typename, TestSchema.HasManager.version).toString(),
85
+ [ATTR_RELATION_SOURCE]: DXN.fromLocalObjectId(person1.id).toString(),
86
+ [ATTR_RELATION_TARGET]: DXN.fromLocalObjectId(person2.id).toString(),
87
+ [ATTR_META]: {
88
+ keys: [],
89
+ },
90
+ });
91
+ });
92
+
93
+ test('getSchema', () => {
94
+ const contact = createObject(TestSchema.Person, {
95
+ name: 'Bot',
96
+ email: 'bot@example.com',
97
+ });
98
+
99
+ expect(getSchema(contact)).toBe(TestSchema.Person);
100
+ });
101
+
102
+ test('inspect', () => {
103
+ const contact = createObject(TestSchema.Person, {
104
+ name: 'Bot',
105
+ email: 'bot@example.com',
106
+ });
107
+
108
+ const text = inspect(contact);
109
+ expect(text).toContain('Bot');
110
+ expect(text).toContain('bot@example.com');
111
+ expect(text).toContain('com.example.type.person');
112
+ expect(text).toContain('0.1.0');
113
+ });
114
+ });
@@ -0,0 +1,94 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type * as Schema from 'effect/Schema';
6
+
7
+ import { raise } from '@dxos/debug';
8
+ import { assertArgument, failedInvariant } from '@dxos/invariant';
9
+ import { ObjectId } from '@dxos/keys';
10
+
11
+ import { getSchemaDXN, getTypeAnnotation, setTypename } from '../Annotation';
12
+ import { defineHiddenProperty } from '../common/proxy';
13
+ import { EntityKind, KindId, MetaId, setSchema } from '../common/types';
14
+ import {
15
+ RelationSourceDXNId,
16
+ RelationSourceId,
17
+ RelationTargetDXNId,
18
+ RelationTargetId,
19
+ assertObjectModel,
20
+ getObjectDXN,
21
+ } from '../Entity';
22
+ import { attachedTypedObjectInspector } from './inspect';
23
+ import { attachTypedJsonSerializer } from './json-serializer';
24
+
25
+ export type CreateObjectProps<T> = T extends { id: string } ? Omit<T, 'id' | KindId> & { id?: string } : T;
26
+
27
+ /**
28
+ * Creates a new object instance from a schema and data, without signal reactivity.
29
+ * This static version creates plain JavaScript objects that are not reactive/observable.
30
+ * For reactive objects that automatically update UI when changed, use the regular live() function.
31
+ *
32
+ * @param schema - The Effect schema that defines the object's structure and type, piped into EchoObjectSchema
33
+ * @param data - The data to initialize the object with. The id and @type fields are handled automatically.
34
+ * @returns A new non-reactive object instance conforming to the schema
35
+ * @throws {Error} If the schema is not an object schema
36
+ * @throws {TypeError} If data contains an @type field
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const Contact = Schema.Struct({
41
+ * name: Schema.String,
42
+ * email: Schema.String,
43
+ * }).pipe(Type.object({
44
+ * typename: 'com.example.type.person',
45
+ * version: '0.1.0',
46
+ * }))
47
+ *
48
+ * const contact = createObject(Contact, {
49
+ * name: "John",
50
+ * email: "john@example.com",
51
+ * })
52
+ * ```
53
+ */
54
+ // TODO(burdon): Make internal.
55
+ export const createObject = <S extends Schema.Schema.AnyNoContext>(
56
+ schema: S,
57
+ props: CreateObjectProps<Schema.Schema.Type<S>>,
58
+ ): CreateObjectProps<Schema.Schema.Type<S>> & { id: string; [KindId]: EntityKind } => {
59
+ const annotation = getTypeAnnotation(schema);
60
+ if (!annotation) {
61
+ throw new Error('Schema is not an ECHO schema');
62
+ }
63
+ assertArgument(!('@type' in props), 'data', '@type is not allowed');
64
+ assertArgument(!(RelationSourceDXNId in props), 'data', 'Relation source DXN is not allowed in the constructor');
65
+ assertArgument(!(RelationTargetDXNId in props), 'data', 'Relation target DXN is not allowed in the constructor');
66
+ assertArgument(
67
+ RelationSourceId in props === RelationTargetId in props,
68
+ 'data',
69
+ 'Relation source and target must be provided together',
70
+ );
71
+
72
+ // Raw object.
73
+ const obj = { ...props, id: props.id ?? ObjectId.random() };
74
+
75
+ // Metadata.
76
+ const kind = RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
77
+ defineHiddenProperty(obj, KindId, kind);
78
+ defineHiddenProperty(obj, MetaId, { keys: [] });
79
+ setSchema(obj, schema);
80
+ setTypename(obj, getSchemaDXN(schema) ?? failedInvariant('Missing schema DXN'));
81
+ attachTypedJsonSerializer(obj);
82
+ attachedTypedObjectInspector(obj);
83
+
84
+ // Relation.
85
+ if (kind === EntityKind.Relation) {
86
+ const sourceDXN = getObjectDXN(props[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));
87
+ const targetDXN = getObjectDXN(props[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));
88
+ defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
89
+ defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
90
+ }
91
+
92
+ assertObjectModel(obj);
93
+ return obj;
94
+ };
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type AnyProperties } from '../common/types';
6
+ import { ObjectDeletedId } from '../Entity';
7
+
8
+ /**
9
+ * @returns `true` if the object has been marked as deleted.
10
+ */
11
+ export const isDeleted = (obj: AnyProperties): boolean => {
12
+ if ((obj as any)[ObjectDeletedId] === undefined) {
13
+ // TODO(dmaretskyi): Return to prior behavior of throwing.
14
+ // throw new Error('Object does not support deletion marker');
15
+ return false;
16
+ }
17
+
18
+ return (obj as any)[ObjectDeletedId] ?? false;
19
+ };
@@ -0,0 +1,12 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { DXN, ObjectId, QueueSubspaceTags, SpaceId } from '@dxos/keys';
6
+
7
+ /**
8
+ * @deprecated Use `db.queues.create()`
9
+ */
10
+ // TODO(burdon): Move to @dxos/keys.
11
+ export const createQueueDXN = (spaceId = SpaceId.random(), queueId = ObjectId.random()) =>
12
+ new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId, queueId]);
@@ -0,0 +1,14 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './common';
6
+ export * from './create-object';
7
+ export * from './deleted';
8
+ export * from './ids';
9
+ export * from './json-serializer';
10
+ export * from './schema-validator';
11
+ export * from './set-value';
12
+ export * from './snapshot';
13
+ export * from './typed-object';
14
+ export * from './clone';
@@ -0,0 +1,46 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type { InspectOptionsStylized, inspect as inspectFn } from 'node:util';
6
+
7
+ import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
8
+
9
+ import { getTypeDXN } from '../Annotation';
10
+ import { ATTR_META, ATTR_TYPE, type AnyEntity, MetaId } from '../common/types';
11
+
12
+ /*
13
+ * @internal
14
+ */
15
+ export const attachedTypedObjectInspector = (obj: any) => {
16
+ const descriptor = Object.getOwnPropertyDescriptor(obj, inspectCustom);
17
+ if (descriptor) {
18
+ return;
19
+ }
20
+
21
+ Object.defineProperty(obj, inspectCustom, {
22
+ value: typedObjectInspectFunction,
23
+ writable: false,
24
+ enumerable: false,
25
+ configurable: true,
26
+ });
27
+ };
28
+
29
+ // NOTE: KEEP as function.
30
+ const typedObjectInspectFunction: CustomInspectFunction<AnyEntity> = function (
31
+ this: AnyEntity,
32
+ depth: number,
33
+ options: InspectOptionsStylized,
34
+ inspect: typeof inspectFn,
35
+ ) {
36
+ const { id, ...props } = this;
37
+ return inspect(
38
+ {
39
+ id,
40
+ [ATTR_TYPE]: getTypeDXN(this),
41
+ ...props,
42
+ [ATTR_META]: (this as any)[MetaId], // TODO(dmaretskyi): Couldn't use getMeta since that throw's if the object has no meta.
43
+ },
44
+ options,
45
+ );
46
+ };
@@ -0,0 +1,120 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import { DXN } from '@dxos/keys';
8
+
9
+ import * as Obj from '../../Obj';
10
+ import { TestSchema } from '../../testing';
11
+ import { getSchemaDXN, getSchemaTypename, getTypeDXN, getTypename } from '../Annotation';
12
+ import { getMetaChecked } from '../common/api';
13
+ import { makeObject } from '../common/proxy';
14
+ import { ATTR_TYPE, EntityKind, KindId, MetaId, TypeId, getSchema } from '../common/types';
15
+ import { RelationSourceId, RelationTargetId, getObjectDXN } from '../Entity';
16
+ import { Ref, StaticRefResolver } from '../Ref';
17
+ import { createObject } from './create-object';
18
+ import { objectFromJSON, objectToJSON } from './json-serializer';
19
+
20
+ describe('Object JSON serializer', () => {
21
+ test('should serialize and deserialize object', async () => {
22
+ const contact = makeObject(TestSchema.Person, { name: 'Alice' });
23
+ Obj.update(contact, (contact) => {
24
+ getMetaChecked(contact).keys.push({ id: '12345', source: 'example.com' });
25
+ });
26
+
27
+ const task = createObject(TestSchema.Task, {
28
+ title: 'Fix the tests',
29
+ assignee: Ref.make(contact),
30
+ });
31
+
32
+ const contactJson = objectToJSON(contact);
33
+ const taskJson = objectToJSON(task);
34
+
35
+ expect(contactJson.id).toBe(contact.id);
36
+ expect(contactJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Person)!.toString());
37
+ expect(contactJson.name).toEqual('Alice');
38
+
39
+ expect(taskJson.id).toBe(task.id);
40
+ expect(taskJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Task)!.toString());
41
+ expect(taskJson.title).toEqual('Fix the tests');
42
+ expect(taskJson.assignee).toEqual({ '/': DXN.fromLocalObjectId(contact.id).toString() });
43
+
44
+ const refResolver = new StaticRefResolver()
45
+ .addSchema(TestSchema.Person)
46
+ .addSchema(TestSchema.Task)
47
+ .addObject(contact)
48
+ .addObject(task);
49
+
50
+ const contactFromJson = (await objectFromJSON(contactJson, { refResolver })) as TestSchema.Person;
51
+ const taskFromJson = (await objectFromJSON(taskJson, { refResolver })) as TestSchema.Task;
52
+
53
+ expect(contactFromJson.id).toBe(contact.id);
54
+ expect(contactFromJson.name).toBe('Alice');
55
+ expect((contactFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Person));
56
+ expect((contactFromJson as any)[KindId]).toBe(EntityKind.Object);
57
+ expect((contactFromJson as any)[RelationSourceId]).toBeUndefined();
58
+ expect((contactFromJson as any)[RelationTargetId]).toBeUndefined();
59
+ expect((contactFromJson as any)[MetaId]).toEqual({
60
+ keys: [
61
+ {
62
+ id: '12345',
63
+ source: 'example.com',
64
+ },
65
+ ],
66
+ });
67
+ expect(getTypeDXN(contactFromJson)?.toString()).toBe(getSchemaDXN(TestSchema.Person)!.toString());
68
+ expect(getTypename(contactFromJson)).toBe(getSchemaTypename(TestSchema.Person));
69
+ expect(getObjectDXN(contactFromJson)?.toString()).toEqual(getObjectDXN(contact)?.toString());
70
+ expect(getSchema(contactFromJson)).toEqual(TestSchema.Person);
71
+
72
+ expect(taskFromJson.id).toBe(task.id);
73
+ expect(taskFromJson.title).toBe('Fix the tests');
74
+ expect(taskFromJson.assignee!.dxn).toEqual(DXN.fromLocalObjectId(contact.id));
75
+ expect(taskFromJson.assignee!.target).toEqual(contact);
76
+ expect(await taskFromJson.assignee!.load()).toEqual(contact);
77
+ expect((taskFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Task));
78
+ expect((taskFromJson as any)[KindId]).toBe(EntityKind.Object);
79
+ expect((taskFromJson as any)[RelationSourceId]).toBeUndefined();
80
+ expect((taskFromJson as any)[RelationTargetId]).toBeUndefined();
81
+ expect((taskFromJson as any)[MetaId]).toEqual({ keys: [] });
82
+ expect(getSchema(taskFromJson)).toEqual(TestSchema.Task);
83
+ });
84
+
85
+ test('serialize with unresolved schema', async () => {
86
+ const contact = createObject(TestSchema.Person, { name: 'Alice' });
87
+ const contactJson = objectToJSON(contact);
88
+ const contactFromJson: any = await objectFromJSON(contactJson);
89
+
90
+ expect(contactFromJson.id).toBe(contact.id);
91
+ expect(contactFromJson.name).toBe('Alice');
92
+ expect(getSchema(contactFromJson)).toBeUndefined();
93
+ expect(getTypename(contactFromJson)).toEqual(getSchemaTypename(TestSchema.Person));
94
+ expect(getObjectDXN(contactFromJson)).toEqual(getObjectDXN(contact));
95
+ expect(getTypeDXN(contactFromJson)).toEqual(getSchemaDXN(TestSchema.Person));
96
+ });
97
+
98
+ test('deserializes expando without leaking internal json keys', async () => {
99
+ const expando = Obj.make(TestSchema.Expando, { message: 'local-only' });
100
+ const expandoJson = objectToJSON(expando);
101
+
102
+ const refResolver = new StaticRefResolver().addSchema(TestSchema.Expando);
103
+ const expandoFromJson = (await objectFromJSON(expandoJson, { refResolver })) as TestSchema.Expando;
104
+
105
+ expect(expandoFromJson.id).toBe(expando.id);
106
+ expect(expandoFromJson.message).toBe('local-only');
107
+ expect((expandoFromJson as any)[ATTR_TYPE]).toBeUndefined();
108
+ });
109
+
110
+ test('deserializes expando without schema resolver and without leaking internal json keys', async () => {
111
+ const expando = Obj.make(TestSchema.Expando, { message: 'local-only' });
112
+ const expandoJson = objectToJSON(expando);
113
+
114
+ const expandoFromJson = (await objectFromJSON(expandoJson)) as TestSchema.Expando;
115
+
116
+ expect(expandoFromJson.id).toBe(expando.id);
117
+ expect(expandoFromJson.message).toBe('local-only');
118
+ expect((expandoFromJson as any)[ATTR_TYPE]).toBeUndefined();
119
+ });
120
+ });
@@ -0,0 +1,222 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { raise } from '@dxos/debug';
8
+ import { type EncodedReference, ObjectStructure, isEncodedReference } from '@dxos/echo-protocol';
9
+ import { assertArgument, invariant } from '@dxos/invariant';
10
+ import { DXN, ObjectId } from '@dxos/keys';
11
+ import { assumeType, deepMapValues, visitValues } from '@dxos/util';
12
+
13
+ import type * as Database from '../../Database';
14
+ import type * as Obj from '../../Obj';
15
+ import { getTypeDXN, setTypename } from '../Annotation';
16
+ import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';
17
+ import {
18
+ ATTR_META,
19
+ ATTR_PARENT,
20
+ ATTR_TYPE,
21
+ type AnyEntity,
22
+ EntityKind,
23
+ KindId,
24
+ MetaId,
25
+ ObjectMetaSchema,
26
+ ParentId,
27
+ setSchema,
28
+ } from '../common/types';
29
+ import {
30
+ ATTR_DELETED,
31
+ ATTR_RELATION_SOURCE,
32
+ ATTR_RELATION_TARGET,
33
+ ATTR_SELF_DXN,
34
+ ObjectDatabaseId,
35
+ type ObjectJSON,
36
+ RelationSourceDXNId,
37
+ RelationSourceId,
38
+ RelationTargetDXNId,
39
+ RelationTargetId,
40
+ SelfDXNId,
41
+ assertObjectModel,
42
+ } from '../Entity';
43
+ import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../Ref';
44
+
45
+ // Re-export for backward compatibility.
46
+ export { attachTypedJsonSerializer };
47
+
48
+ type DeepReplaceRef<T> =
49
+ T extends Ref<any>
50
+ ? EncodedReference
51
+ : T extends object
52
+ ? {
53
+ [K in keyof T]: DeepReplaceRef<T[K]>;
54
+ }
55
+ : T;
56
+
57
+ type SerializedObject<T extends { id: string }> = {
58
+ [K in keyof T]: DeepReplaceRef<T[K]>;
59
+ } & ObjectJSON;
60
+
61
+ /**
62
+ * Converts object to it's JSON representation.
63
+ */
64
+ export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {
65
+ const typename = getTypeDXN(obj)?.toString();
66
+ invariant(typename && typeof typename === 'string');
67
+ return typedJsonSerializer.call(obj);
68
+ };
69
+
70
+ /**
71
+ * Creates an object from it's json representation.
72
+ * Performs schema validation.
73
+ * References and schema will be resolvable if the `refResolver` is provided.
74
+ * The function need to be async to support resolving the schema as well as the relation endpoints.
75
+ *
76
+ * @param jsonData - JSON representation of the object.
77
+ * @param options.refResolver - Resolver for references.
78
+ * @param options.dxn - Override object DXN.
79
+ * @param options.database - Database to associate with the object.
80
+ */
81
+ export const objectFromJSON = async (
82
+ jsonData: unknown,
83
+ {
84
+ refResolver,
85
+ dxn,
86
+ database,
87
+ parent,
88
+ }: { refResolver?: RefResolver; dxn?: DXN; database?: Database.Database; parent?: Obj.Unknown } = {},
89
+ ): Promise<AnyEntity> => {
90
+ assumeType<ObjectJSON>(jsonData);
91
+ assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');
92
+ assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');
93
+ assertArgument(typeof jsonData.id === 'string', 'jsonData.id', 'expected object to have an id');
94
+
95
+ const type = DXN.parse(jsonData[ATTR_TYPE]);
96
+ const schema = await refResolver?.resolveSchema(type);
97
+ invariant(schema === undefined || Schema.isSchema(schema));
98
+ const decodedInput = stripInternalJsonKeys(jsonData);
99
+
100
+ let obj: any;
101
+ if (schema != null) {
102
+ obj = await schema.pipe(Schema.decodeUnknownPromise)(decodedInput);
103
+ if (refResolver) {
104
+ setRefResolverOnData(obj, refResolver);
105
+ }
106
+ } else {
107
+ obj = decodeGeneric(decodedInput, { refResolver });
108
+ }
109
+
110
+ invariant(ObjectId.isValid(obj.id), 'Invalid object id');
111
+ setTypename(obj, type);
112
+ if (schema) {
113
+ setSchema(obj, schema);
114
+ }
115
+
116
+ const isRelation =
117
+ typeof jsonData[ATTR_RELATION_SOURCE] === 'string' || typeof jsonData[ATTR_RELATION_TARGET] === 'string';
118
+ if (isRelation) {
119
+ const sourceDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source')));
120
+ const targetDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target')));
121
+
122
+ const source = (await refResolver?.resolve(sourceDxn)) as AnyEntity | undefined;
123
+ const target = (await refResolver?.resolve(targetDxn)) as AnyEntity | undefined;
124
+
125
+ defineHiddenProperty(obj, KindId, EntityKind.Relation);
126
+ defineHiddenProperty(obj, RelationSourceDXNId, sourceDxn);
127
+ defineHiddenProperty(obj, RelationTargetDXNId, targetDxn);
128
+ defineHiddenProperty(obj, RelationSourceId, source);
129
+ defineHiddenProperty(obj, RelationTargetId, target);
130
+ } else {
131
+ defineHiddenProperty(obj, KindId, EntityKind.Object);
132
+ }
133
+
134
+ if (typeof jsonData[ATTR_META] === 'object') {
135
+ const meta = await ObjectMetaSchema.pipe(Schema.decodeUnknownPromise)(jsonData[ATTR_META]);
136
+ invariant(Array.isArray(meta.keys));
137
+ defineHiddenProperty(obj, MetaId, meta);
138
+ } else {
139
+ defineHiddenProperty(obj, MetaId, {
140
+ keys: [],
141
+ });
142
+ }
143
+
144
+ if (jsonData[ATTR_PARENT]) {
145
+ const parentDxn = DXN.parse(jsonData[ATTR_PARENT]);
146
+ const resolvedParent = (await refResolver?.resolve(parentDxn)) as Obj.Unknown | undefined;
147
+ defineHiddenProperty(obj, ParentId, resolvedParent);
148
+ } else if (parent) {
149
+ defineHiddenProperty(obj, ParentId, parent);
150
+ }
151
+
152
+ if (dxn) {
153
+ defineHiddenProperty(obj, SelfDXNId, dxn);
154
+ }
155
+
156
+ if (database) {
157
+ defineHiddenProperty(obj, ObjectDatabaseId, database);
158
+ }
159
+
160
+ assertObjectModel(obj);
161
+ invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');
162
+ invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
163
+ invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');
164
+ invariant((obj as any)[ATTR_SELF_DXN] === undefined, 'Invalid object model');
165
+ invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');
166
+ invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');
167
+ return obj;
168
+ };
169
+
170
+ const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {
171
+ const props = stripInternalJsonKeys(jsonData);
172
+
173
+ return deepMapValues(props, (value, visitor) => {
174
+ if (isEncodedReference(value)) {
175
+ return refFromEncodedReference(value, options.refResolver);
176
+ }
177
+
178
+ return visitor(value);
179
+ });
180
+ };
181
+
182
+ const stripInternalJsonKeys = (jsonData: unknown) => {
183
+ const {
184
+ [ATTR_TYPE]: _type,
185
+ [ATTR_META]: _meta,
186
+ [ATTR_DELETED]: _deleted,
187
+ [ATTR_SELF_DXN]: _selfDxn,
188
+ [ATTR_RELATION_SOURCE]: _relationSource,
189
+ [ATTR_RELATION_TARGET]: _relationTarget,
190
+ ...props
191
+ } = jsonData as any;
192
+
193
+ return props;
194
+ };
195
+
196
+ export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) => {
197
+ const visitor = (value: unknown) => {
198
+ if (Ref.isRef(value)) {
199
+ setRefResolver(value, refResolver);
200
+ } else {
201
+ visitValues(value, visitor);
202
+ }
203
+ };
204
+
205
+ visitor(obj);
206
+ };
207
+
208
+ /**
209
+ * Convert ObjectStructure to JSON data for indexing.
210
+ * Different from {@link objectToJSON} as it takes the internal {@link ObjectStructure} representation directly
211
+ */
212
+ export const objectStructureToJson = (objectId: string, structure: ObjectStructure): Obj.JSON => {
213
+ return {
214
+ ...structure.data,
215
+ id: objectId,
216
+ [ATTR_TYPE]: (ObjectStructure.getTypeReference(structure)?.['/'] ?? '') as DXN.String,
217
+ [ATTR_DELETED]: ObjectStructure.isDeleted(structure),
218
+ [ATTR_PARENT]: ObjectStructure.getParent(structure)?.['/'] as DXN.String | undefined,
219
+ [ATTR_RELATION_SOURCE]: ObjectStructure.getRelationSource(structure)?.['/'] as DXN.String | undefined,
220
+ [ATTR_RELATION_TARGET]: ObjectStructure.getRelationTarget(structure)?.['/'] as DXN.String | undefined,
221
+ };
222
+ };