@dxos/echo 0.8.4-main.ef1bc66f44 → 0.8.4-main.effb148878

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 (602) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +9 -9
  3. package/dist/lib/neutral/Annotation.mjs +7 -3
  4. package/dist/lib/neutral/Database.mjs +8 -4
  5. package/dist/lib/neutral/Entity.mjs +35 -18
  6. package/dist/lib/neutral/Err.mjs +3 -1
  7. package/dist/lib/neutral/Extension.mjs +18 -0
  8. package/dist/lib/neutral/Extension.mjs.map +7 -0
  9. package/dist/lib/neutral/Feed.mjs +54 -0
  10. package/dist/lib/neutral/Feed.mjs.map +7 -0
  11. package/dist/lib/neutral/Filter.mjs +25 -12
  12. package/dist/lib/neutral/Format.mjs +23 -3
  13. package/dist/lib/neutral/JsonSchema.mjs +9 -9
  14. package/dist/lib/neutral/Key.mjs +7 -3
  15. package/dist/lib/neutral/Migration.mjs +18 -0
  16. package/dist/lib/neutral/Migration.mjs.map +7 -0
  17. package/dist/lib/neutral/Obj.mjs +41 -23
  18. package/dist/lib/neutral/Order.mjs +1 -1
  19. package/dist/lib/neutral/Query.mjs +21 -9
  20. package/dist/lib/neutral/QueryResult.mjs +1 -1
  21. package/dist/lib/neutral/Ref.mjs +13 -9
  22. package/dist/lib/neutral/Relation.mjs +34 -23
  23. package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
  24. package/dist/lib/neutral/Tag.mjs +14 -10
  25. package/dist/lib/neutral/Type.mjs +52 -36
  26. package/dist/lib/neutral/{chunk-K5K3Z62A.mjs → chunk-4SYHDOQA.mjs} +14 -6
  27. package/dist/lib/neutral/chunk-4SYHDOQA.mjs.map +7 -0
  28. package/dist/lib/neutral/{chunk-XAJMXQ4H.mjs → chunk-4U7OD55H.mjs} +6 -2
  29. package/dist/lib/neutral/chunk-4U7OD55H.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-52NG2XEE.mjs +34 -0
  31. package/dist/lib/neutral/chunk-52NG2XEE.mjs.map +7 -0
  32. package/dist/lib/neutral/{chunk-KB7RIVLK.mjs → chunk-A5HDDVKS.mjs} +33 -6
  33. package/dist/lib/neutral/chunk-A5HDDVKS.mjs.map +7 -0
  34. package/dist/lib/neutral/{chunk-DLPC7DHQ.mjs → chunk-EZ4XJFHJ.mjs} +9 -11
  35. package/dist/lib/neutral/chunk-EZ4XJFHJ.mjs.map +7 -0
  36. package/dist/lib/neutral/{chunk-ZAHWXGK4.mjs → chunk-F625JEZB.mjs} +97 -19
  37. package/dist/lib/neutral/chunk-F625JEZB.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-FFCN66OF.mjs +420 -0
  39. package/dist/lib/neutral/chunk-FFCN66OF.mjs.map +7 -0
  40. package/dist/lib/neutral/{chunk-RPB6V4BE.mjs → chunk-GOHDOJE3.mjs} +16 -3
  41. package/dist/lib/neutral/chunk-GOHDOJE3.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  43. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-J7QWJQQV.mjs +318 -0
  45. package/dist/lib/neutral/chunk-J7QWJQQV.mjs.map +7 -0
  46. package/dist/lib/neutral/{chunk-QARLJVDB.mjs → chunk-JTHNDGAR.mjs} +8 -4
  47. package/dist/lib/neutral/chunk-JTHNDGAR.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-K5RH2PBH.mjs +361 -0
  49. package/dist/lib/neutral/chunk-K5RH2PBH.mjs.map +7 -0
  50. package/dist/lib/neutral/{chunk-RIMHNJ3E.mjs → chunk-KHRAQDYX.mjs} +138 -91
  51. package/dist/lib/neutral/chunk-KHRAQDYX.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-L65CW5EI.mjs +156 -0
  53. package/dist/lib/neutral/chunk-L65CW5EI.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-LNZIPZX6.mjs +2186 -0
  55. package/dist/lib/neutral/chunk-LNZIPZX6.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-MPXUNTME.mjs +41 -0
  57. package/dist/lib/neutral/chunk-MPXUNTME.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-7WE7SBA2.mjs → chunk-O2EOH7XQ.mjs} +152 -134
  59. package/dist/lib/neutral/chunk-O2EOH7XQ.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-MTEHHY62.mjs → chunk-Q7ID37KF.mjs} +121 -94
  61. package/dist/lib/neutral/chunk-Q7ID37KF.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-QLYEQ5VA.mjs +205 -0
  63. package/dist/lib/neutral/chunk-QLYEQ5VA.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-SSDGRJ3A.mjs +747 -0
  65. package/dist/lib/neutral/chunk-SSDGRJ3A.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-ROKO4RKJ.mjs → chunk-TTCSATUD.mjs} +2 -2
  67. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-UEFRFUYC.mjs} +8 -4
  69. package/dist/lib/neutral/chunk-UEFRFUYC.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-UN7K472Q.mjs +132 -0
  71. package/dist/lib/neutral/chunk-UN7K472Q.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-UQAMAXDU.mjs +243 -0
  73. package/dist/lib/neutral/chunk-UQAMAXDU.mjs.map +7 -0
  74. package/dist/lib/neutral/{chunk-4L6DOFXP.mjs → chunk-V5NE2X7Y.mjs} +1 -1
  75. package/dist/lib/neutral/chunk-V5NE2X7Y.mjs.map +7 -0
  76. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
  77. package/dist/lib/neutral/chunk-ZII2BGPM.mjs +269 -0
  78. package/dist/lib/neutral/chunk-ZII2BGPM.mjs.map +7 -0
  79. package/dist/lib/neutral/{chunk-N2QNHMT5.mjs → chunk-ZM7VFIS2.mjs} +22 -2
  80. package/dist/lib/neutral/chunk-ZM7VFIS2.mjs.map +7 -0
  81. package/dist/lib/neutral/index.mjs +56 -29
  82. package/dist/lib/neutral/internal/index.mjs +128 -77
  83. package/dist/lib/neutral/meta.json +1 -1
  84. package/dist/lib/neutral/testing/index.mjs +226 -174
  85. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  86. package/dist/types/src/Annotation.d.ts +3 -3
  87. package/dist/types/src/Annotation.d.ts.map +1 -1
  88. package/dist/types/src/Collection.d.ts +15 -0
  89. package/dist/types/src/Collection.d.ts.map +1 -0
  90. package/dist/types/src/Database.d.ts +27 -42
  91. package/dist/types/src/Database.d.ts.map +1 -1
  92. package/dist/types/src/Dataset.d.ts +29 -0
  93. package/dist/types/src/Dataset.d.ts.map +1 -0
  94. package/dist/types/src/Entity.d.ts +123 -29
  95. package/dist/types/src/Entity.d.ts.map +1 -1
  96. package/dist/types/src/Err.d.ts +56 -13
  97. package/dist/types/src/Err.d.ts.map +1 -1
  98. package/dist/types/src/Extension.d.ts +80 -0
  99. package/dist/types/src/Extension.d.ts.map +1 -0
  100. package/dist/types/src/Extension.test.d.ts +2 -0
  101. package/dist/types/src/Extension.test.d.ts.map +1 -0
  102. package/dist/types/src/Feed.d.ts +229 -0
  103. package/dist/types/src/Feed.d.ts.map +1 -0
  104. package/dist/types/src/Filter.d.ts +74 -11
  105. package/dist/types/src/Filter.d.ts.map +1 -1
  106. package/dist/types/src/Filter.test.d.ts +2 -0
  107. package/dist/types/src/Filter.test.d.ts.map +1 -0
  108. package/dist/types/src/Format.d.ts +3 -3
  109. package/dist/types/src/Format.d.ts.map +1 -1
  110. package/dist/types/src/Hypergraph.d.ts +15 -10
  111. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  112. package/dist/types/src/Json.d.ts +33 -0
  113. package/dist/types/src/Json.d.ts.map +1 -0
  114. package/dist/types/src/Json.test.d.ts +2 -0
  115. package/dist/types/src/Json.test.d.ts.map +1 -0
  116. package/dist/types/src/JsonSchema.d.ts +11 -4
  117. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  118. package/dist/types/src/Key.d.ts +1 -1
  119. package/dist/types/src/Key.d.ts.map +1 -1
  120. package/dist/types/src/Migration.d.ts +72 -0
  121. package/dist/types/src/Migration.d.ts.map +1 -0
  122. package/dist/types/src/Obj.d.ts +201 -77
  123. package/dist/types/src/Obj.d.ts.map +1 -1
  124. package/dist/types/src/Order.d.ts.map +1 -1
  125. package/dist/types/src/Query.d.ts +117 -17
  126. package/dist/types/src/Query.d.ts.map +1 -1
  127. package/dist/types/src/Ref.d.ts +66 -10
  128. package/dist/types/src/Ref.d.ts.map +1 -1
  129. package/dist/types/src/Relation.d.ts +127 -54
  130. package/dist/types/src/Relation.d.ts.map +1 -1
  131. package/dist/types/src/SchemaRegistry.d.ts +12 -13
  132. package/dist/types/src/SchemaRegistry.d.ts.map +1 -1
  133. package/dist/types/src/Tag.d.ts +4 -3
  134. package/dist/types/src/Tag.d.ts.map +1 -1
  135. package/dist/types/src/Type.d.ts +337 -218
  136. package/dist/types/src/Type.d.ts.map +1 -1
  137. package/dist/types/src/View.d.ts +65 -0
  138. package/dist/types/src/View.d.ts.map +1 -0
  139. package/dist/types/src/exemplars.test.d.ts +2 -0
  140. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  141. package/dist/types/src/index.d.ts +8 -1
  142. package/dist/types/src/index.d.ts.map +1 -1
  143. package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +98 -24
  144. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  145. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  146. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  147. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  148. package/dist/types/src/internal/{api → Annotation}/sorting.d.ts +1 -1
  149. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  150. package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +15 -6
  151. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  152. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  153. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  154. package/dist/types/src/internal/Entity/entity.d.ts +67 -0
  155. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  156. package/dist/types/src/internal/Entity/index.d.ts +10 -0
  157. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  158. package/dist/types/src/internal/Entity/model.d.ts +57 -0
  159. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  160. package/dist/types/src/internal/{entities → Entity}/object.d.ts +3 -3
  161. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  162. package/dist/types/src/internal/Entity/relation.d.ts +51 -0
  163. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  164. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  165. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  166. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  167. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  169. package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
  170. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  171. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  172. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  173. package/dist/types/src/internal/{formats → Format}/format.d.ts +2 -1
  174. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  175. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  176. package/dist/types/src/internal/{formats → Format}/index.d.ts +2 -2
  177. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  178. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  179. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  180. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  181. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  182. package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
  183. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  184. package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
  185. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  186. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  187. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  188. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  189. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +37 -37
  190. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  191. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +3 -2
  192. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  193. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  194. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  195. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  196. package/dist/types/src/internal/{object → Obj}/create-object.d.ts +10 -12
  197. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  198. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  199. package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
  200. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  201. package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -1
  202. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  203. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  204. package/dist/types/src/internal/{object → Obj}/json-serializer.d.ts +16 -8
  205. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  206. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  207. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  208. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  209. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  210. package/dist/types/src/internal/{object → Obj}/set-value.d.ts +2 -2
  211. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  212. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  213. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  214. package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +5 -5
  215. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  216. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  217. package/dist/types/src/internal/Query.d.ts +10 -0
  218. package/dist/types/src/internal/Query.d.ts.map +1 -0
  219. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  220. package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +1 -1
  221. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  222. package/dist/types/src/internal/{ref → Ref}/ref.d.ts +42 -19
  223. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  224. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/{schema → Type}/compose.d.ts +1 -1
  226. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  227. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  228. package/dist/types/src/internal/Type/index.d.ts +3 -0
  229. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  230. package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -1
  231. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  232. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  233. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  234. package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
  235. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  236. package/dist/types/src/internal/{api → common/api}/meta.d.ts +3 -3
  237. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  238. package/dist/types/src/internal/common/index.d.ts +4 -0
  239. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  240. package/dist/types/src/internal/{proxy → common/proxy}/change-context.d.ts +1 -1
  241. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  242. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  243. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  244. package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +1 -1
  245. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  246. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  247. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  248. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  249. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  250. package/dist/types/src/internal/common/proxy/make-object.d.ts +19 -0
  251. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  252. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  253. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  254. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  255. package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +1 -1
  256. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  257. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +2 -2
  258. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts.map +1 -1
  259. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  260. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  261. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  262. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  264. package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +18 -2
  265. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  266. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  267. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  268. package/dist/types/src/internal/{types → common/types}/base.d.ts +1 -0
  269. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  270. package/dist/types/src/internal/common/types/entity.d.ts +94 -0
  271. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  272. package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
  273. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  274. package/dist/types/src/internal/{types → common/types}/meta.d.ts +12 -1
  275. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  276. package/dist/types/src/internal/common/types/model-symbols.d.ts +58 -0
  277. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  278. package/dist/types/src/internal/{types → common/types}/typename.d.ts +7 -0
  279. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  280. package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
  281. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  282. package/dist/types/src/internal/index.d.ts +9 -10
  283. package/dist/types/src/internal/index.d.ts.map +1 -1
  284. package/dist/types/src/testing/test-data.d.ts +8 -8
  285. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  286. package/dist/types/src/testing/test-schema.d.ts +77 -82
  287. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  288. package/dist/types/src/testing/util.d.ts +5 -3
  289. package/dist/types/src/testing/util.d.ts.map +1 -1
  290. package/dist/types/tsconfig.tsbuildinfo +1 -1
  291. package/package.json +30 -15
  292. package/src/Annotation.ts +7 -3
  293. package/src/Collection.ts +36 -0
  294. package/src/Database.ts +80 -77
  295. package/src/Dataset.ts +34 -0
  296. package/src/Entity.test.ts +116 -6
  297. package/src/Entity.ts +181 -66
  298. package/src/Err.ts +25 -3
  299. package/src/Extension.test.ts +235 -0
  300. package/src/Extension.ts +122 -0
  301. package/src/Feed.ts +356 -0
  302. package/src/Filter.test.ts +90 -0
  303. package/src/Filter.ts +152 -21
  304. package/src/Format.ts +3 -3
  305. package/src/Hypergraph.ts +16 -11
  306. package/src/Json.test.ts +175 -0
  307. package/src/Json.ts +103 -0
  308. package/src/JsonSchema.ts +14 -4
  309. package/src/Key.ts +1 -1
  310. package/src/Migration.ts +114 -0
  311. package/src/Obj.test.ts +158 -20
  312. package/src/Obj.ts +451 -183
  313. package/src/Order.ts +3 -1
  314. package/src/Query.test.ts +446 -89
  315. package/src/Query.ts +300 -35
  316. package/src/Ref.ts +83 -12
  317. package/src/Relation.test.ts +16 -10
  318. package/src/Relation.ts +236 -165
  319. package/src/SchemaRegistry.ts +13 -17
  320. package/src/Tag.ts +9 -9
  321. package/src/Type.test.ts +169 -24
  322. package/src/Type.ts +561 -354
  323. package/src/View.ts +101 -0
  324. package/src/exemplars.test.ts +21 -0
  325. package/src/index.ts +9 -2
  326. package/src/internal/Annotation/annotations.test.ts +165 -0
  327. package/src/internal/{annotations → Annotation}/annotations.ts +181 -101
  328. package/src/internal/{annotations → Annotation}/index.ts +1 -0
  329. package/src/internal/{api → Annotation}/sorting.ts +2 -4
  330. package/src/internal/{annotations → Annotation}/util.ts +17 -9
  331. package/src/internal/{api/entity.ts → Entity/api.ts} +9 -8
  332. package/src/internal/Entity/entity.ts +246 -0
  333. package/src/internal/{entities → Entity}/index.ts +4 -0
  334. package/src/internal/{entities → Entity}/model.ts +42 -60
  335. package/src/internal/{entities → Entity}/object.ts +13 -6
  336. package/src/internal/Entity/relation.ts +179 -0
  337. package/src/internal/Entity/type-kind.ts +67 -0
  338. package/src/internal/Entity/type-uri.ts +87 -0
  339. package/src/internal/Entity/util.ts +34 -0
  340. package/src/internal/{api → Entity}/version.ts +2 -2
  341. package/src/internal/{formats → Format}/date.test.ts +1 -2
  342. package/src/internal/{formats → Format}/date.ts +0 -4
  343. package/src/internal/{formats → Format}/format.test.ts +1 -2
  344. package/src/internal/{formats → Format}/index.ts +2 -3
  345. package/src/internal/{formats → Format}/types.ts +2 -2
  346. package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
  347. package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
  348. package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +64 -151
  349. package/src/internal/{json-schema → JsonSchema}/json-schema.ts +47 -28
  350. package/src/internal/{object → Obj}/clone.ts +10 -6
  351. package/src/internal/{object → Obj}/common.ts +2 -2
  352. package/src/internal/{object → Obj}/create-object.test.ts +13 -14
  353. package/src/internal/Obj/create-object.ts +135 -0
  354. package/src/internal/{object → Obj}/deleted.ts +2 -2
  355. package/src/internal/{object → Obj}/index.ts +0 -1
  356. package/src/internal/{object → Obj}/inspect.ts +3 -3
  357. package/src/internal/Obj/json-serializer.test.ts +185 -0
  358. package/src/internal/{object → Obj}/json-serializer.ts +108 -45
  359. package/src/internal/{object → Obj}/schema-validator.ts +1 -1
  360. package/src/internal/{object → Obj}/set-value.test.ts +31 -54
  361. package/src/internal/{object → Obj}/set-value.ts +3 -3
  362. package/src/internal/{object → Obj}/snapshot.ts +41 -23
  363. package/src/internal/Obj/typed-object.test.ts +32 -0
  364. package/src/internal/{object → Obj}/typed-object.ts +5 -5
  365. package/src/internal/Query.ts +156 -0
  366. package/src/internal/{ref → Ref}/ref-array.ts +1 -2
  367. package/src/internal/{ref → Ref}/ref.test.ts +16 -26
  368. package/src/internal/{ref → Ref}/ref.ts +117 -57
  369. package/src/internal/{schema → Type}/compose.test.ts +6 -5
  370. package/src/internal/{schema → Type}/compose.ts +1 -1
  371. package/src/internal/Type/index.ts +6 -0
  372. package/src/internal/{schema → Type}/manipulation.ts +0 -25
  373. package/src/internal/Type/type-schema.ts +60 -0
  374. package/src/internal/{README.md → common/README.md} +2 -2
  375. package/src/internal/{api → common/api}/index.ts +0 -4
  376. package/src/internal/{api → common/api}/meta.ts +3 -3
  377. package/src/internal/common/index.ts +7 -0
  378. package/src/internal/{proxy → common/proxy}/change-context.ts +1 -1
  379. package/src/internal/{proxy → common/proxy}/change.test.ts +97 -97
  380. package/src/internal/{proxy → common/proxy}/errors.ts +2 -2
  381. package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -4
  382. package/src/internal/{proxy → common/proxy}/json-serializer.ts +20 -14
  383. package/src/internal/{proxy → common/proxy}/make-object.ts +37 -15
  384. package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
  385. package/src/internal/{proxy → common/proxy}/reactive-array.ts +1 -1
  386. package/src/internal/common/proxy/reactive.test.ts +54 -0
  387. package/src/internal/{proxy → common/proxy}/reactive.ts +12 -4
  388. package/src/internal/common/proxy/schema.test.ts +107 -0
  389. package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +15 -15
  390. package/src/internal/{proxy → common/proxy}/typed-handler.ts +75 -18
  391. package/src/internal/{proxy → common/proxy}/typed-object.test.ts +17 -30
  392. package/src/internal/{types → common/types}/base.ts +1 -1
  393. package/src/internal/common/types/entity.ts +133 -0
  394. package/src/internal/{types → common/types}/index.ts +1 -0
  395. package/src/internal/{types → common/types}/meta.ts +15 -1
  396. package/src/internal/common/types/model-symbols.ts +74 -0
  397. package/src/internal/common/types/typename.ts +91 -0
  398. package/src/internal/{types → common/types}/version.ts +2 -3
  399. package/src/internal/index.ts +9 -31
  400. package/src/testing/api.test.ts +15 -12
  401. package/src/testing/test-data.ts +158 -99
  402. package/src/testing/test-schema.ts +33 -67
  403. package/src/testing/util.ts +14 -11
  404. package/dist/lib/neutral/chunk-2AF5GMG6.mjs +0 -171
  405. package/dist/lib/neutral/chunk-2AF5GMG6.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-4L6DOFXP.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-DLPC7DHQ.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-EBUAT5ID.mjs +0 -229
  411. package/dist/lib/neutral/chunk-EBUAT5ID.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-K5K3Z62A.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-KB7RIVLK.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-LKFNEFHF.mjs +0 -130
  415. package/dist/lib/neutral/chunk-LKFNEFHF.mjs.map +0 -7
  416. package/dist/lib/neutral/chunk-MTEHHY62.mjs.map +0 -7
  417. package/dist/lib/neutral/chunk-N2QNHMT5.mjs.map +0 -7
  418. package/dist/lib/neutral/chunk-QARLJVDB.mjs.map +0 -7
  419. package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +0 -7
  420. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +0 -7
  421. package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +0 -7
  422. package/dist/lib/neutral/chunk-TLGNKUUG.mjs +0 -3905
  423. package/dist/lib/neutral/chunk-TLGNKUUG.mjs.map +0 -7
  424. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs +0 -142
  425. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs.map +0 -7
  426. package/dist/lib/neutral/chunk-VUQGRDRI.mjs +0 -97
  427. package/dist/lib/neutral/chunk-VUQGRDRI.mjs.map +0 -7
  428. package/dist/lib/neutral/chunk-X2MPMYYN.mjs +0 -13
  429. package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +0 -7
  430. package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +0 -7
  431. package/dist/lib/neutral/chunk-ZAHWXGK4.mjs.map +0 -7
  432. package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
  433. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
  434. package/dist/types/src/internal/annotations/index.d.ts +0 -3
  435. package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
  436. package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
  437. package/dist/types/src/internal/api/annotations.d.ts +0 -23
  438. package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
  439. package/dist/types/src/internal/api/entity.d.ts +0 -13
  440. package/dist/types/src/internal/api/entity.d.ts.map +0 -1
  441. package/dist/types/src/internal/api/index.d.ts.map +0 -1
  442. package/dist/types/src/internal/api/meta.d.ts.map +0 -1
  443. package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
  444. package/dist/types/src/internal/api/version.d.ts.map +0 -1
  445. package/dist/types/src/internal/entities/entity.d.ts +0 -20
  446. package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
  447. package/dist/types/src/internal/entities/index.d.ts +0 -6
  448. package/dist/types/src/internal/entities/index.d.ts.map +0 -1
  449. package/dist/types/src/internal/entities/model.d.ts +0 -79
  450. package/dist/types/src/internal/entities/model.d.ts.map +0 -1
  451. package/dist/types/src/internal/entities/object.d.ts.map +0 -1
  452. package/dist/types/src/internal/entities/relation.d.ts +0 -62
  453. package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
  454. package/dist/types/src/internal/entities/util.d.ts.map +0 -1
  455. package/dist/types/src/internal/formats/date.d.ts.map +0 -1
  456. package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
  457. package/dist/types/src/internal/formats/format.d.ts.map +0 -1
  458. package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
  459. package/dist/types/src/internal/formats/index.d.ts.map +0 -1
  460. package/dist/types/src/internal/formats/number.d.ts.map +0 -1
  461. package/dist/types/src/internal/formats/object.d.ts.map +0 -1
  462. package/dist/types/src/internal/formats/select.d.ts.map +0 -1
  463. package/dist/types/src/internal/formats/string.d.ts.map +0 -1
  464. package/dist/types/src/internal/formats/types.d.ts.map +0 -1
  465. package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
  466. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
  467. package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
  468. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
  469. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
  470. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
  471. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
  472. package/dist/types/src/internal/object/clone.d.ts.map +0 -1
  473. package/dist/types/src/internal/object/common.d.ts.map +0 -1
  474. package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
  475. package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
  476. package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
  477. package/dist/types/src/internal/object/ids.d.ts +0 -6
  478. package/dist/types/src/internal/object/ids.d.ts.map +0 -1
  479. package/dist/types/src/internal/object/index.d.ts.map +0 -1
  480. package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
  481. package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
  482. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
  483. package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
  484. package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
  485. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
  486. package/dist/types/src/internal/object/set-value.d.ts.map +0 -1
  487. package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
  488. package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
  489. package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
  490. package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
  491. package/dist/types/src/internal/proxy/change-context.d.ts.map +0 -1
  492. package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
  493. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
  494. package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
  495. package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
  496. package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
  497. package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
  498. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
  499. package/dist/types/src/internal/proxy/make-object.d.ts +0 -14
  500. package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
  501. package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
  502. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
  503. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
  504. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
  505. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
  506. package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
  507. package/dist/types/src/internal/proxy/symbols.d.ts.map +0 -1
  508. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
  509. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
  510. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
  511. package/dist/types/src/internal/ref/index.d.ts.map +0 -1
  512. package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
  513. package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
  514. package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
  515. package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
  516. package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
  517. package/dist/types/src/internal/schema/echo-schema.d.ts +0 -181
  518. package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
  519. package/dist/types/src/internal/schema/index.d.ts +0 -4
  520. package/dist/types/src/internal/schema/index.d.ts.map +0 -1
  521. package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
  522. package/dist/types/src/internal/schema/persistent-schema.d.ts +0 -20
  523. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
  524. package/dist/types/src/internal/types/base.d.ts.map +0 -1
  525. package/dist/types/src/internal/types/entity.d.ts +0 -37
  526. package/dist/types/src/internal/types/entity.d.ts.map +0 -1
  527. package/dist/types/src/internal/types/index.d.ts.map +0 -1
  528. package/dist/types/src/internal/types/meta.d.ts.map +0 -1
  529. package/dist/types/src/internal/types/typename.d.ts.map +0 -1
  530. package/dist/types/src/internal/types/version.d.ts.map +0 -1
  531. package/src/internal/annotations/annotations.test.ts +0 -96
  532. package/src/internal/api/annotations.ts +0 -60
  533. package/src/internal/entities/entity.ts +0 -126
  534. package/src/internal/entities/relation.ts +0 -171
  535. package/src/internal/entities/util.ts +0 -33
  536. package/src/internal/object/create-object.ts +0 -95
  537. package/src/internal/object/ids.ts +0 -12
  538. package/src/internal/object/json-serializer.test.ts +0 -98
  539. package/src/internal/object/typed-object.test.ts +0 -34
  540. package/src/internal/proxy/schema.test.ts +0 -145
  541. package/src/internal/schema/echo-schema.ts +0 -424
  542. package/src/internal/schema/index.ts +0 -7
  543. package/src/internal/schema/persistent-schema.ts +0 -28
  544. package/src/internal/types/entity.ts +0 -54
  545. package/src/internal/types/typename.ts +0 -55
  546. /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
  547. /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
  548. /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
  549. /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
  550. /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
  551. /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
  552. /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
  553. /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
  554. /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
  555. /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
  556. /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
  557. /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
  558. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
  559. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
  560. /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
  561. /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
  562. /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
  563. /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
  564. /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
  565. /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
  566. /package/dist/types/src/internal/{object → Obj}/set-value.test.d.ts +0 -0
  567. /package/dist/types/src/internal/{object → Obj}/snapshot.d.ts +0 -0
  568. /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
  569. /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
  570. /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
  571. /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
  572. /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
  573. /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
  574. /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
  575. /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
  576. /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
  577. /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
  578. /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
  579. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
  580. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
  581. /package/dist/types/src/internal/{proxy → common/proxy}/schema-validator.d.ts +0 -0
  582. /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
  583. /package/dist/types/src/internal/{proxy → common/proxy}/symbols.d.ts +0 -0
  584. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
  585. /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
  586. /package/src/internal/{formats → Format}/format.ts +0 -0
  587. /package/src/internal/{formats → Format}/number.ts +0 -0
  588. /package/src/internal/{formats → Format}/object.ts +0 -0
  589. /package/src/internal/{formats → Format}/select.ts +0 -0
  590. /package/src/internal/{formats → Format}/string.ts +0 -0
  591. /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
  592. /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
  593. /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
  594. /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
  595. /package/src/internal/{ref → Ref}/index.ts +0 -0
  596. /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
  597. /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
  598. /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
  599. /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
  600. /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
  601. /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
  602. /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
@@ -7,26 +7,13 @@ import * as Schema from 'effect/Schema';
7
7
  import { raise } from '@dxos/debug';
8
8
  import { type EncodedReference, ObjectStructure, isEncodedReference } from '@dxos/echo-protocol';
9
9
  import { assertArgument, invariant } from '@dxos/invariant';
10
- import { DXN, ObjectId } from '@dxos/keys';
11
- import { assumeType, deepMapValues, visitValues } from '@dxos/util';
10
+ import { EchoURI, ObjectId, URI } from '@dxos/keys';
11
+ import { assumeType, decodeUint8ArrayFromJson, deepMapValues, isEncodedUint8Array, visitValues } from '@dxos/util';
12
12
 
13
+ import type * as Database from '../../Database';
13
14
  import type * as Obj from '../../Obj';
14
- import { getTypeDXN, setTypename } from '../annotations';
15
- import {
16
- ATTR_DELETED,
17
- ATTR_RELATION_SOURCE,
18
- ATTR_RELATION_TARGET,
19
- ATTR_SELF_DXN,
20
- type ObjectJSON,
21
- RelationSourceDXNId,
22
- RelationSourceId,
23
- RelationTargetDXNId,
24
- RelationTargetId,
25
- SelfDXNId,
26
- assertObjectModel,
27
- } from '../entities';
28
- import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../proxy';
29
- import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../ref';
15
+ import { getTypeAnnotation, getTypeURI, setTypename } from '../Annotation';
16
+ import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';
30
17
  import {
31
18
  ATTR_META,
32
19
  ATTR_PARENT,
@@ -38,7 +25,24 @@ import {
38
25
  ObjectMetaSchema,
39
26
  ParentId,
40
27
  setSchema,
41
- } from '../types';
28
+ setType,
29
+ } from '../common/types';
30
+ import {
31
+ ATTR_DELETED,
32
+ ATTR_RELATION_SOURCE,
33
+ ATTR_RELATION_TARGET,
34
+ ATTR_SELF_URI,
35
+ ATTR_SELF_URI_LEGACY,
36
+ ObjectDatabaseId,
37
+ type ObjectJSON,
38
+ RelationSourceDXNId,
39
+ RelationSourceId,
40
+ RelationTargetDXNId,
41
+ RelationTargetId,
42
+ SelfURIId,
43
+ assertObjectModel,
44
+ } from '../Entity';
45
+ import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../Ref';
42
46
 
43
47
  // Re-export for backward compatibility.
44
48
  export { attachTypedJsonSerializer };
@@ -60,7 +64,7 @@ type SerializedObject<T extends { id: string }> = {
60
64
  * Converts object to it's JSON representation.
61
65
  */
62
66
  export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {
63
- const typename = getTypeDXN(obj)?.toString();
67
+ const typename = getTypeURI(obj);
64
68
  invariant(typename && typeof typename === 'string');
65
69
  return typedJsonSerializer.call(obj);
66
70
  };
@@ -70,28 +74,39 @@ export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> =
70
74
  * Performs schema validation.
71
75
  * References and schema will be resolvable if the `refResolver` is provided.
72
76
  * The function need to be async to support resolving the schema as well as the relation endpoints.
77
+ *
78
+ * @param jsonData - JSON representation of the object.
79
+ * @param options.refResolver - Resolver for references.
80
+ * @param options.uri - Override object URI.
81
+ * @param options.database - Database to associate with the object.
73
82
  */
74
83
  export const objectFromJSON = async (
75
84
  jsonData: unknown,
76
- { refResolver, dxn }: { refResolver?: RefResolver; dxn?: DXN } = {},
85
+ {
86
+ refResolver,
87
+ uri,
88
+ database,
89
+ parent,
90
+ }: { refResolver?: RefResolver; uri?: URI.URI; database?: Database.Database; parent?: Obj.Unknown } = {},
77
91
  ): Promise<AnyEntity> => {
78
92
  assumeType<ObjectJSON>(jsonData);
79
93
  assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');
80
94
  assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');
81
95
  assertArgument(typeof jsonData.id === 'string', 'jsonData.id', 'expected object to have an id');
82
96
 
83
- const type = DXN.parse(jsonData[ATTR_TYPE]);
97
+ const type = URI.make(jsonData[ATTR_TYPE]);
84
98
  const schema = await refResolver?.resolveSchema(type);
85
99
  invariant(schema === undefined || Schema.isSchema(schema));
100
+ const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));
86
101
 
87
102
  let obj: any;
88
103
  if (schema != null) {
89
- obj = await schema.pipe(Schema.decodeUnknownPromise)(jsonData);
104
+ obj = await schema.pipe(Schema.decodeUnknownPromise)(decodedInput);
90
105
  if (refResolver) {
91
106
  setRefResolverOnData(obj, refResolver);
92
107
  }
93
108
  } else {
94
- obj = decodeGeneric(jsonData, { refResolver });
109
+ obj = decodeGeneric(decodedInput, { refResolver });
95
110
  }
96
111
 
97
112
  invariant(ObjectId.isValid(obj.id), 'Invalid object id');
@@ -99,12 +114,21 @@ export const objectFromJSON = async (
99
114
  if (schema) {
100
115
  setSchema(obj, schema);
101
116
  }
117
+ // Resolve and stamp the source type entity, if the resolver provides one.
118
+ // Lets `Obj.getType` / `Entity.getType` return a stable entity for objects
119
+ // loaded via `Obj.fromJSON` (serializer / queue paths).
120
+ if (refResolver?.resolveType) {
121
+ const typeEntity = await refResolver.resolveType(type);
122
+ if (typeEntity != null) {
123
+ setType(obj, typeEntity);
124
+ }
125
+ }
102
126
 
103
127
  const isRelation =
104
128
  typeof jsonData[ATTR_RELATION_SOURCE] === 'string' || typeof jsonData[ATTR_RELATION_TARGET] === 'string';
105
129
  if (isRelation) {
106
- const sourceDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source')));
107
- const targetDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target')));
130
+ const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source'));
131
+ const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target'));
108
132
 
109
133
  const source = (await refResolver?.resolve(sourceDxn)) as AnyEntity | undefined;
110
134
  const target = (await refResolver?.resolve(targetDxn)) as AnyEntity | undefined;
@@ -115,7 +139,13 @@ export const objectFromJSON = async (
115
139
  defineHiddenProperty(obj, RelationSourceId, source);
116
140
  defineHiddenProperty(obj, RelationTargetId, target);
117
141
  } else {
118
- defineHiddenProperty(obj, KindId, EntityKind.Object);
142
+ // Honour the schema's TypeAnnotation kind — persisted `Type.Type` entities
143
+ // (e.g. dynamic schemas loaded from a snapshot import) must brand as
144
+ // `KindId = Type`, not Object, otherwise `Filter.type(Type.Type)` /
145
+ // `Type.isType` skip them and the schema registry never picks them up.
146
+ // Mirrors the kind resolution in `createObject` (the in-memory path).
147
+ const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : undefined;
148
+ defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);
119
149
  }
120
150
 
121
151
  if (typeof jsonData[ATTR_META] === 'object') {
@@ -129,43 +159,72 @@ export const objectFromJSON = async (
129
159
  }
130
160
 
131
161
  if (jsonData[ATTR_PARENT]) {
132
- const parentDxn = DXN.parse(jsonData[ATTR_PARENT]);
133
- const parent = (await refResolver?.resolve(parentDxn)) as Obj.Unknown | undefined;
162
+ const parentDxn = jsonData[ATTR_PARENT];
163
+ const resolvedParent = (await refResolver?.resolve(parentDxn)) as Obj.Unknown | undefined;
164
+ defineHiddenProperty(obj, ParentId, resolvedParent);
165
+ } else if (parent) {
134
166
  defineHiddenProperty(obj, ParentId, parent);
135
167
  }
136
168
 
137
- if (dxn) {
138
- defineHiddenProperty(obj, SelfDXNId, dxn);
169
+ if (uri) {
170
+ defineHiddenProperty(obj, SelfURIId, uri);
171
+ }
172
+
173
+ if (database) {
174
+ defineHiddenProperty(obj, ObjectDatabaseId, database);
139
175
  }
140
176
 
141
177
  assertObjectModel(obj);
142
178
  invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');
143
179
  invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
144
180
  invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');
145
- invariant((obj as any)[ATTR_SELF_DXN] === undefined, 'Invalid object model');
181
+ invariant((obj as any)[ATTR_SELF_URI] === undefined, 'Invalid object model');
182
+ invariant((obj as any)[ATTR_SELF_URI_LEGACY] === undefined, 'Invalid object model');
146
183
  invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');
147
184
  invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');
148
185
  return obj;
149
186
  };
150
187
 
151
188
  const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {
189
+ const props = stripInternalJsonKeys(jsonData);
190
+
191
+ return deepMapValues(props, (value, visitor) => {
192
+ if (isEncodedReference(value)) {
193
+ return refFromEncodedReference(value, options.refResolver);
194
+ }
195
+ if (isEncodedUint8Array(value)) {
196
+ return decodeUint8ArrayFromJson(value);
197
+ }
198
+
199
+ return visitor(value);
200
+ });
201
+ };
202
+
203
+ /**
204
+ * Recursively replaces encoded `Uint8Array` JSON markers with actual `Uint8Array` instances.
205
+ * Runs before schema decoding so `Schema.Uint8ArrayFromSelf` sees real bytes.
206
+ */
207
+ const restoreUint8Arrays = (data: unknown): any =>
208
+ deepMapValues(data, (value, recurse) => {
209
+ if (isEncodedUint8Array(value)) {
210
+ return decodeUint8ArrayFromJson(value);
211
+ }
212
+ return recurse(value);
213
+ });
214
+
215
+ const stripInternalJsonKeys = (jsonData: unknown) => {
152
216
  const {
153
217
  [ATTR_TYPE]: _type,
154
218
  [ATTR_META]: _meta,
155
219
  [ATTR_DELETED]: _deleted,
156
- [ATTR_SELF_DXN]: _selfDxn,
220
+ [ATTR_SELF_URI]: _selfUri,
221
+ [ATTR_SELF_URI_LEGACY]: _legacySelfUri,
157
222
  [ATTR_RELATION_SOURCE]: _relationSource,
158
223
  [ATTR_RELATION_TARGET]: _relationTarget,
159
224
  ...props
160
225
  } = jsonData as any;
161
226
 
162
- return deepMapValues(props, (value, visitor) => {
163
- if (isEncodedReference(value)) {
164
- return refFromEncodedReference(value, options.refResolver);
165
- }
166
-
167
- return visitor(value);
168
- });
227
+ return props;
169
228
  };
170
229
 
171
230
  export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) => {
@@ -184,14 +243,18 @@ export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) =
184
243
  * Convert ObjectStructure to JSON data for indexing.
185
244
  * Different from {@link objectToJSON} as it takes the internal {@link ObjectStructure} representation directly
186
245
  */
187
- export const objectStructureToJson = (objectId: string, structure: ObjectStructure): Obj.JSON => {
246
+ export const objectStructureToJson = (objectId: ObjectId, structure: ObjectStructure): Obj.JSON => {
247
+ const typeRef = ObjectStructure.getTypeReference(structure)?.['/'];
248
+ const parent = ObjectStructure.getParent(structure)?.['/'];
249
+ const source = ObjectStructure.getRelationSource(structure)?.['/'];
250
+ const target = ObjectStructure.getRelationTarget(structure)?.['/'];
188
251
  return {
189
252
  ...structure.data,
190
253
  id: objectId,
191
- [ATTR_TYPE]: (ObjectStructure.getTypeReference(structure)?.['/'] ?? '') as DXN.String,
254
+ [ATTR_TYPE]: typeRef ? URI.make(typeRef) : undefined,
192
255
  [ATTR_DELETED]: ObjectStructure.isDeleted(structure),
193
- [ATTR_PARENT]: ObjectStructure.getParent(structure)?.['/'] as DXN.String | undefined,
194
- [ATTR_RELATION_SOURCE]: ObjectStructure.getRelationSource(structure)?.['/'] as DXN.String | undefined,
195
- [ATTR_RELATION_TARGET]: ObjectStructure.getRelationTarget(structure)?.['/'] as DXN.String | undefined,
256
+ [ATTR_PARENT]: parent !== undefined ? EchoURI.tryParse(parent) : undefined,
257
+ [ATTR_RELATION_SOURCE]: source !== undefined ? EchoURI.tryParse(source) : undefined,
258
+ [ATTR_RELATION_TARGET]: target !== undefined ? EchoURI.tryParse(target) : undefined,
196
259
  };
197
260
  };
@@ -3,4 +3,4 @@
3
3
  //
4
4
 
5
5
  // Re-export from proxy for backward compatibility.
6
- export { SchemaValidator, checkIdNotPresentOnSchema } from '../proxy';
6
+ export { SchemaValidator, checkIdNotPresentOnSchema } from '../common/proxy';
@@ -5,6 +5,8 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, test } from 'vitest';
7
7
 
8
+ import { DXN } from '@dxos/keys';
9
+
8
10
  import * as Obj from '../../Obj';
9
11
  import { TestSchema } from '../../testing';
10
12
  import * as Type from '../../Type';
@@ -17,7 +19,7 @@ describe('Obj.setValue', () => {
17
19
  email: 'john@example.com',
18
20
  });
19
21
 
20
- Obj.change(person, (p) => Obj.setValue(p, ['address', 'city'], 'NYC'));
22
+ Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
21
23
 
22
24
  expect(person.address).toBeDefined();
23
25
  expect(person.address?.city).toBe('NYC');
@@ -30,7 +32,7 @@ describe('Obj.setValue', () => {
30
32
  email: 'john@example.com',
31
33
  });
32
34
 
33
- Obj.change(person, (p) => Obj.setValue(p, ['fields', 0, 'label'], 'Phone'));
35
+ Obj.update(person, (person) => Obj.setValue(person, ['fields', 0, 'label'], 'Phone'));
34
36
 
35
37
  expect(Array.isArray(person.fields)).toBe(true);
36
38
  expect(person.fields?.[0].label).toBe('Phone');
@@ -45,7 +47,7 @@ describe('Obj.setValue', () => {
45
47
  email: 'john@example.com',
46
48
  });
47
49
 
48
- Obj.change(person, (p) => Obj.setValue(p, ['address', 'coordinates', 'lat'], 40.7128));
50
+ Obj.update(person, (person) => Obj.setValue(person, ['address', 'coordinates', 'lat'], 40.7128));
49
51
 
50
52
  expect(person.address).toBeDefined();
51
53
  expect(person.address?.coordinates).toBeDefined();
@@ -60,19 +62,14 @@ describe('Obj.setValue', () => {
60
62
  const Container = Schema.Struct({
61
63
  name: Schema.String,
62
64
  items: Schema.optional(Schema.Array(Item)),
63
- }).pipe(
64
- Type.object({
65
- typename: 'test.com/Container',
66
- version: '0.1.0',
67
- }),
68
- );
65
+ }).pipe(Type.makeObject(DXN.make('com.test.type.container', '0.1.0')));
69
66
 
70
67
  const container = Obj.make(Container, { name: 'box' });
71
68
 
72
- Obj.change(container, (c) => {
73
- Obj.setValue(c, ['items', 0, 'value'], 10);
74
- Obj.setValue(c, ['items', 1, 'value'], 20);
75
- Obj.setValue(c, ['items', 2, 'value'], 30);
69
+ Obj.update(container, (container) => {
70
+ Obj.setValue(container, ['items', 0, 'value'], 10);
71
+ Obj.setValue(container, ['items', 1, 'value'], 20);
72
+ Obj.setValue(container, ['items', 2, 'value'], 30);
76
73
  });
77
74
 
78
75
  expect(container.items).toHaveLength(3);
@@ -88,7 +85,7 @@ describe('Obj.setValue', () => {
88
85
  email: 'john@example.com',
89
86
  });
90
87
 
91
- Obj.change(person, (p) => Obj.setValue(p, ['age'], 25));
88
+ Obj.update(person, (person) => Obj.setValue(person, ['age'], 25));
92
89
 
93
90
  expect(person.age).toBe(25);
94
91
  });
@@ -100,7 +97,7 @@ describe('Obj.setValue', () => {
100
97
  email: 'john@example.com',
101
98
  });
102
99
 
103
- Obj.change(person, (p) => Obj.setValue(p, ['address', 'city'], 'NYC'));
100
+ Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
104
101
 
105
102
  expect(person.address).toBeDefined();
106
103
  expect(person.address?.city).toBe('NYC');
@@ -114,8 +111,8 @@ describe('Obj.setValue', () => {
114
111
  });
115
112
 
116
113
  let result: any;
117
- Obj.change(person, (p) => {
118
- result = Obj.setValue(p, ['age'], 30);
114
+ Obj.update(person, (person) => {
115
+ result = Obj.setValue(person, ['age'], 30);
119
116
  });
120
117
 
121
118
  expect(result).toBe(30);
@@ -129,7 +126,7 @@ describe('Obj.setValue', () => {
129
126
  age: 25,
130
127
  });
131
128
 
132
- Obj.change(person, (p) => Obj.setValue(p, ['age'], 30));
129
+ Obj.update(person, (person) => Obj.setValue(person, ['age'], 30));
133
130
 
134
131
  expect(person.age).toBe(30);
135
132
  });
@@ -142,7 +139,7 @@ describe('Obj.setValue', () => {
142
139
  address: { city: 'Boston', state: 'MA', coordinates: {} },
143
140
  });
144
141
 
145
- Obj.change(person, (p) => Obj.setValue(p, ['address', 'city'], 'NYC'));
142
+ Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
146
143
 
147
144
  expect(person.address?.city).toBe('NYC');
148
145
  expect(person.address?.state).toBe('MA');
@@ -151,20 +148,15 @@ describe('Obj.setValue', () => {
151
148
  test('handles two-dimensional arrays', ({ expect }) => {
152
149
  const Matrix = Schema.Struct({
153
150
  values: Schema.optional(Schema.Array(Schema.Array(Schema.Number))),
154
- }).pipe(
155
- Type.object({
156
- typename: 'test.com/Matrix',
157
- version: '0.1.0',
158
- }),
159
- );
151
+ }).pipe(Type.makeObject(DXN.make('com.test.type.matrix', '0.1.0')));
160
152
 
161
153
  const matrix = Obj.make(Matrix, {});
162
154
 
163
- Obj.change(matrix, (m) => {
164
- Obj.setValue(m, ['values', 0, 0], 1);
165
- Obj.setValue(m, ['values', 0, 1], 2);
166
- Obj.setValue(m, ['values', 1, 0], 3);
167
- Obj.setValue(m, ['values', 1, 1], 4);
155
+ Obj.update(matrix, (matrix) => {
156
+ Obj.setValue(matrix, ['values', 0, 0], 1);
157
+ Obj.setValue(matrix, ['values', 0, 1], 2);
158
+ Obj.setValue(matrix, ['values', 1, 0], 3);
159
+ Obj.setValue(matrix, ['values', 1, 1], 4);
168
160
  });
169
161
 
170
162
  expect(matrix.values?.[0][0]).toBe(1);
@@ -180,8 +172,8 @@ describe('Obj.setValue', () => {
180
172
  email: 'john@example.com',
181
173
  });
182
174
 
183
- Obj.change(person, (p) => {
184
- expect(() => Obj.setValue(p, [], 'value')).toThrow('Path must not be empty');
175
+ Obj.update(person, (person) => {
176
+ expect(() => Obj.setValue(person, [], 'value')).toThrow('Path must not be empty');
185
177
  });
186
178
  });
187
179
 
@@ -192,7 +184,7 @@ describe('Obj.setValue', () => {
192
184
  email: 'john@example.com',
193
185
  });
194
186
 
195
- Obj.change(person, (p) => Obj.setValue(p, ['age'], 30));
187
+ Obj.update(person, (person) => Obj.setValue(person, ['age'], 30));
196
188
 
197
189
  expect(person.age).toBe(30);
198
190
  });
@@ -205,17 +197,12 @@ describe('Obj.setValue', () => {
205
197
  const Container = Schema.Struct({
206
198
  name: Schema.String,
207
199
  items: Schema.optional(Schema.Array(Item)),
208
- }).pipe(
209
- Type.object({
210
- typename: 'test.com/Container',
211
- version: '0.1.0',
212
- }),
213
- );
200
+ }).pipe(Type.makeObject(DXN.make('com.test.type.container', '0.1.0')));
214
201
 
215
202
  const container = Obj.make(Container, { name: 'box' });
216
203
 
217
204
  // Using string '0' for array index.
218
- Obj.change(container, (c) => Obj.setValue(c, ['items', '0', 'value'], 42));
205
+ Obj.update(container, (container) => Obj.setValue(container, ['items', '0', 'value'], 42));
219
206
 
220
207
  expect(container.items?.[0].value).toBe(42);
221
208
  });
@@ -232,18 +219,13 @@ describe('Obj.setValue', () => {
232
219
  const TodoList = Schema.Struct({
233
220
  name: Schema.String,
234
221
  tasks: Schema.optional(Schema.Array(Task)),
235
- }).pipe(
236
- Type.object({
237
- typename: 'test.com/TodoList',
238
- version: '0.1.0',
239
- }),
240
- );
222
+ }).pipe(Type.makeObject(DXN.make('com.test.type.todoList', '0.1.0')));
241
223
 
242
224
  const todoList = Obj.make(TodoList, { name: 'My Tasks' });
243
225
 
244
226
  // This should work: setting a nested property on an array element.
245
227
  // The required 'id' field should be initialized with a default value.
246
- Obj.change(todoList, (t) => Obj.setValue(t, ['tasks', 0, 'title'], 'Buy groceries'));
228
+ Obj.update(todoList, (todoList) => Obj.setValue(todoList, ['tasks', 0, 'title'], 'Buy groceries'));
247
229
 
248
230
  expect(todoList.tasks?.[0].id).toBe(''); // Default value for required String
249
231
  expect(todoList.tasks?.[0].title).toBe('Buy groceries');
@@ -261,16 +243,11 @@ describe('Obj.setValue', () => {
261
243
  const Container = Schema.Struct({
262
244
  name: Schema.String,
263
245
  items: Schema.optional(Schema.Array(Item)),
264
- }).pipe(
265
- Type.object({
266
- typename: 'test.com/Container',
267
- version: '0.1.0',
268
- }),
269
- );
246
+ }).pipe(Type.makeObject(DXN.make('com.test.type.container', '0.1.0')));
270
247
 
271
248
  const container = Obj.make(Container, { name: 'box' });
272
249
 
273
- Obj.change(container, (c) => Obj.setValue(c, ['items', 0, 'label'], 'First Item'));
250
+ Obj.update(container, (container) => Obj.setValue(container, ['items', 0, 'label'], 'First Item'));
274
251
 
275
252
  // All required primitive fields should have default values.
276
253
  expect(container.items?.[0].id).toBe('');
@@ -16,12 +16,12 @@ import {
16
16
  } from '@dxos/effect';
17
17
  import { invariant } from '@dxos/invariant';
18
18
 
19
- import { type Mutable } from '../proxy';
20
- import { getSchema } from '../types';
19
+ import { type Mutable } from '../common/proxy';
20
+ import { getSchema } from '../common/types';
21
21
 
22
22
  /**
23
23
  * Set a deeply nested property on an object.
24
- * Must be called within an Obj.change or Relation.change callback.
24
+ * Must be called within an Obj.update or Relation.update callback.
25
25
  */
26
26
  export const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {
27
27
  invariant(path.length > 0, 'Path must not be empty');
@@ -2,13 +2,25 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { assertArgument } from '@dxos/invariant';
5
6
  import { deepMapValues } from '@dxos/util';
6
7
 
7
- import { ObjectDatabaseId } from '../entities/model';
8
- import { RelationSourceDXNId, RelationSourceId, RelationTargetDXNId, RelationTargetId } from '../entities/relation';
9
- import { KindId, SnapshotKindId } from '../types/entity';
10
- import { MetaId } from '../types/meta';
11
- import { SchemaId, TypeId } from '../types/typename';
8
+ import {
9
+ KindId,
10
+ MetaId,
11
+ ObjectDatabaseId,
12
+ ObjectDeletedId,
13
+ ParentId,
14
+ RelationSourceDXNId,
15
+ RelationSourceId,
16
+ RelationTargetDXNId,
17
+ RelationTargetId,
18
+ SchemaId,
19
+ SelfURIId,
20
+ SnapshotKindId,
21
+ TypeEntityId,
22
+ TypeId,
23
+ } from '../common/types';
12
24
 
13
25
  /**
14
26
  * Copy a Symbol-keyed property from source to target if it has a defined value.
@@ -45,6 +57,8 @@ const copySymbolProperty = (
45
57
  * The snapshot is branded with SnapshotKindId (not KindId).
46
58
  */
47
59
  export const getSnapshot = <T extends object>(obj: T): T => {
60
+ assertArgument(typeof obj === 'object' && obj !== null && KindId in obj, 'obj', 'must be an entity');
61
+
48
62
  const snapshot = deepMapValues(obj, (value, recurse) => {
49
63
  // Do not recurse on references (but do recurse on arrays).
50
64
  if (
@@ -66,28 +80,32 @@ export const getSnapshot = <T extends object>(obj: T): T => {
66
80
 
67
81
  // Preserve Symbol-keyed properties that are important for type introspection.
68
82
  // These are not copied by deepMapValues since Object.keys() doesn't include symbols.
69
- if (obj != null && typeof obj === 'object') {
70
- const source = obj as any;
83
+ const source = obj as any;
71
84
 
72
- // Type introspection symbols.
73
- copySymbolProperty(source, snapshot, TypeId);
74
- copySymbolProperty(source, snapshot, SchemaId);
85
+ // Type introspection symbols.
86
+ copySymbolProperty(source, snapshot, TypeId);
87
+ copySymbolProperty(source, snapshot, SchemaId);
88
+ copySymbolProperty(source, snapshot, TypeEntityId);
89
+ copySymbolProperty(source, snapshot, SelfURIId);
75
90
 
76
- // Database reference (required for Obj.getDatabase to work on snapshots).
77
- copySymbolProperty(source, snapshot, ObjectDatabaseId);
91
+ // Database reference (required for Obj.getDatabase to work on snapshots).
92
+ copySymbolProperty(source, snapshot, ObjectDatabaseId);
93
+ copySymbolProperty(source, snapshot, ObjectDeletedId);
78
94
 
79
- // Metadata symbol. Copy arrays so the snapshot is not affected by mutations to the live meta's keys/tags.
80
- copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({
81
- keys: [...(meta?.keys ?? [])],
82
- tags: [...(meta?.tags ?? [])],
83
- }));
95
+ // Parent reference (required for Obj.getParent to work on snapshots).
96
+ copySymbolProperty(source, snapshot, ParentId);
84
97
 
85
- // Relation endpoint symbols.
86
- copySymbolProperty(source, snapshot, RelationSourceDXNId);
87
- copySymbolProperty(source, snapshot, RelationTargetDXNId);
88
- copySymbolProperty(source, snapshot, RelationSourceId);
89
- copySymbolProperty(source, snapshot, RelationTargetId);
90
- }
98
+ // Metadata symbol. Copy arrays so the snapshot is not affected by mutations to the live meta's keys/tags.
99
+ copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({
100
+ keys: [...(meta?.keys ?? [])],
101
+ tags: [...(meta?.tags ?? [])],
102
+ }));
103
+
104
+ // Relation endpoint symbols.
105
+ copySymbolProperty(source, snapshot, RelationSourceDXNId);
106
+ copySymbolProperty(source, snapshot, RelationTargetDXNId);
107
+ copySymbolProperty(source, snapshot, RelationSourceId);
108
+ copySymbolProperty(source, snapshot, RelationTargetId);
91
109
 
92
110
  return Object.freeze(snapshot) as T;
93
111
  };
@@ -0,0 +1,32 @@
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 { DXN } from '@dxos/keys';
10
+
11
+ import * as Type from '../../Type';
12
+ import { EchoObjectSchema } from '../Entity';
13
+
14
+ const Organization = Schema.Struct({
15
+ name: Schema.String,
16
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.organization', '0.1.0')));
17
+
18
+ type Organization = Type.InstanceType<typeof Organization>;
19
+
20
+ describe('EchoObjectSchema DSL', () => {
21
+ test('type is a Type.Type entity', async () => {
22
+ expect(Schema.isSchema(Type.getSchema(Organization))).to.be.true;
23
+ });
24
+
25
+ test('static typename accessor', async () => {
26
+ expect(Type.getTypename(Organization)).to.eq('com.example.type.organization');
27
+ });
28
+
29
+ test('expect schema', async () => {
30
+ expect(SchemaAST.isTypeLiteral(Type.getSchema(Organization).ast)).to.be.true;
31
+ });
32
+ });
@@ -4,17 +4,17 @@
4
4
 
5
5
  import type * as Schema from 'effect/Schema';
6
6
 
7
- import { type TypeMeta } from '../annotations';
8
- import { type AnyEntity } from '../types';
7
+ import { type TypeMeta } from '../Annotation';
8
+ import { type AnyEntity } from '../common/types';
9
9
 
10
10
  /**
11
11
  * Definition for an object type that can be stored in an ECHO database.
12
12
  * Implements effect schema to define object properties.
13
13
  * Has a typename and version.
14
14
  *
15
- * In contrast to {@link EchoSchema} this definition is not recorded in the database.
15
+ * In contrast to a stored `Type.Type` entity, this definition is not recorded in the database.
16
16
  *
17
- * @deprecated Use `Type.Obj.Any` from `@dxos/echo` instead.
17
+ * @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
18
18
  */
19
19
  export interface TypedObject<A = any, I = any> extends TypeMeta, Schema.Schema<A, I> {}
20
20
 
@@ -22,7 +22,7 @@ export interface TypedObject<A = any, I = any> extends TypeMeta, Schema.Schema<A
22
22
  * Typed object that could be used as a prototype in class definitions.
23
23
  * This is an internal API type.
24
24
  *
25
- * @deprecated Use `Type.Obj.Any` from `@dxos/echo` instead.
25
+ * @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
26
26
  */
27
27
  export interface TypedObjectPrototype<A = any, I = any> extends TypedObject<A, I> {
28
28
  /** Type constructor. */