@dxos/echo 0.8.4-main.40e3dcdf1b → 0.8.4-main.43cb759274

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 (428) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +29 -6
  4. package/dist/lib/neutral/Database.mjs +8 -9
  5. package/dist/lib/neutral/Entity.mjs +29 -18
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +27 -19
  8. package/dist/lib/neutral/Filter.mjs +25 -15
  9. package/dist/lib/neutral/Format.mjs +23 -3
  10. package/dist/lib/neutral/JsonSchema.mjs +7 -8
  11. package/dist/lib/neutral/Key.mjs +9 -5
  12. package/dist/lib/neutral/Migration.mjs +18 -0
  13. package/dist/lib/neutral/Obj.mjs +25 -19
  14. package/dist/lib/neutral/Order.mjs +1 -1
  15. package/dist/lib/neutral/Query.mjs +19 -16
  16. package/dist/lib/neutral/QueryResult.mjs +1 -1
  17. package/dist/lib/neutral/Ref.mjs +10 -9
  18. package/dist/lib/neutral/Registry.mjs +14 -0
  19. package/dist/lib/neutral/Registry.mjs.map +7 -0
  20. package/dist/lib/neutral/Relation.mjs +26 -24
  21. package/dist/lib/neutral/Scope.mjs +12 -0
  22. package/dist/lib/neutral/Scope.mjs.map +7 -0
  23. package/dist/lib/neutral/Tag.mjs +17 -13
  24. package/dist/lib/neutral/Type.mjs +52 -26
  25. package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
  26. package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
  28. package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-CIRHIEMW.mjs → chunk-4SFPZJVA.mjs} +92 -112
  30. package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-YWXWXIE5.mjs → chunk-4Z6GET2X.mjs} +3 -3
  32. package/dist/lib/neutral/chunk-4Z6GET2X.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  34. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-43Y5DOS6.mjs → chunk-7OAFN3OX.mjs} +75 -112
  36. package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-BOZZPUXE.mjs → chunk-7PRCIDHH.mjs} +41 -81
  38. package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  40. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-BDQGMDIX.mjs +132 -0
  42. package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
  44. package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-DKLUHO4T.mjs} +1 -1
  46. package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
  48. package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
  49. package/dist/lib/neutral/{chunk-UTBRYVQC.mjs → chunk-G6CFWUYH.mjs} +2 -2
  50. package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
  51. package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
  52. package/dist/lib/neutral/{chunk-FXEG7EOK.mjs → chunk-J3MNM65T.mjs} +9 -6
  53. package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
  55. package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
  57. package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
  59. package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-WYOKA6AE.mjs → chunk-O6BH7EPN.mjs} +31 -4
  61. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-KTAWP7GI.mjs → chunk-OIYW7R2G.mjs} +99 -46
  63. package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-TQQZLKB7.mjs → chunk-OYUG4FHF.mjs} +648 -1228
  65. package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-NQRLRYJM.mjs → chunk-Q5FKCVBC.mjs} +173 -60
  67. package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-Q62IHV2N.mjs +41 -0
  69. package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
  70. package/dist/lib/neutral/{chunk-UFDK26FO.mjs → chunk-QVJDDG44.mjs} +69 -34
  71. package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
  72. package/dist/lib/neutral/{chunk-B5OXLWZL.mjs → chunk-TFEWTY5A.mjs} +155 -129
  73. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  74. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-TTCSATUD.mjs} +1 -1
  75. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs → chunk-VKWOFXT2.mjs} +22 -2
  76. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
  77. package/dist/lib/neutral/{chunk-NXMFBIT5.mjs → chunk-ZACMEAYV.mjs} +89 -23
  78. package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
  79. package/dist/lib/neutral/index.mjs +58 -38
  80. package/dist/lib/neutral/internal/index.mjs +131 -64
  81. package/dist/lib/neutral/meta.json +1 -1
  82. package/dist/lib/neutral/testing/index.mjs +222 -177
  83. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  84. package/dist/types/src/Annotation.d.ts +108 -4
  85. package/dist/types/src/Annotation.d.ts.map +1 -1
  86. package/dist/types/src/Annotation.test.d.ts +2 -0
  87. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  88. package/dist/types/src/Collection.d.ts +2 -3
  89. package/dist/types/src/Collection.d.ts.map +1 -1
  90. package/dist/types/src/Database.d.ts +56 -24
  91. package/dist/types/src/Database.d.ts.map +1 -1
  92. package/dist/types/src/Dataset.d.ts +17 -6
  93. package/dist/types/src/Dataset.d.ts.map +1 -1
  94. package/dist/types/src/Entity.d.ts +102 -26
  95. package/dist/types/src/Entity.d.ts.map +1 -1
  96. package/dist/types/src/Err.d.ts +27 -27
  97. package/dist/types/src/Err.d.ts.map +1 -1
  98. package/dist/types/src/Feed.d.ts +89 -25
  99. package/dist/types/src/Feed.d.ts.map +1 -1
  100. package/dist/types/src/Filter.d.ts +74 -11
  101. package/dist/types/src/Filter.d.ts.map +1 -1
  102. package/dist/types/src/Filter.test.d.ts +2 -0
  103. package/dist/types/src/Filter.test.d.ts.map +1 -0
  104. package/dist/types/src/Hypergraph.d.ts +14 -9
  105. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  106. package/dist/types/src/Json.d.ts +33 -0
  107. package/dist/types/src/Json.d.ts.map +1 -0
  108. package/dist/types/src/Json.test.d.ts +2 -0
  109. package/dist/types/src/Json.test.d.ts.map +1 -0
  110. package/dist/types/src/JsonSchema.d.ts +2 -2
  111. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  112. package/dist/types/src/Key.d.ts +1 -1
  113. package/dist/types/src/Key.d.ts.map +1 -1
  114. package/dist/types/src/Migration.d.ts +72 -0
  115. package/dist/types/src/Migration.d.ts.map +1 -0
  116. package/dist/types/src/Obj.d.ts +108 -65
  117. package/dist/types/src/Obj.d.ts.map +1 -1
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +35 -10
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +9 -0
  122. package/dist/types/src/QueryResult.d.ts.map +1 -1
  123. package/dist/types/src/Ref.d.ts +15 -7
  124. package/dist/types/src/Ref.d.ts.map +1 -1
  125. package/dist/types/src/Registry.d.ts +131 -0
  126. package/dist/types/src/Registry.d.ts.map +1 -0
  127. package/dist/types/src/Relation.d.ts +72 -44
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +34 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/StateMap.d.ts +32 -0
  132. package/dist/types/src/StateMap.d.ts.map +1 -0
  133. package/dist/types/src/StateMap.test.d.ts +2 -0
  134. package/dist/types/src/StateMap.test.d.ts.map +1 -0
  135. package/dist/types/src/Tag.d.ts +21 -5
  136. package/dist/types/src/Tag.d.ts.map +1 -1
  137. package/dist/types/src/TagIndex.d.ts +36 -0
  138. package/dist/types/src/TagIndex.d.ts.map +1 -0
  139. package/dist/types/src/TagIndex.test.d.ts +2 -0
  140. package/dist/types/src/TagIndex.test.d.ts.map +1 -0
  141. package/dist/types/src/Tagging.d.ts +31 -0
  142. package/dist/types/src/Tagging.d.ts.map +1 -0
  143. package/dist/types/src/Type.d.ts +357 -96
  144. package/dist/types/src/Type.d.ts.map +1 -1
  145. package/dist/types/src/View.d.ts +2 -5
  146. package/dist/types/src/View.d.ts.map +1 -1
  147. package/dist/types/src/exemplars.test.d.ts +2 -0
  148. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  149. package/dist/types/src/index.d.ts +8 -2
  150. package/dist/types/src/index.d.ts.map +1 -1
  151. package/dist/types/src/internal/Annotation/annotations.d.ts +79 -37
  152. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  153. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  154. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  155. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  156. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  157. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  158. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  159. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  160. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  161. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/api.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  165. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  167. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  169. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  170. package/dist/types/src/internal/Entity/model.d.ts +20 -17
  171. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  172. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  173. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  174. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  175. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  176. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  177. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  178. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  179. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  180. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  181. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  182. package/dist/types/src/internal/Format/format.d.ts +3 -2
  183. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  184. package/dist/types/src/internal/Format/index.d.ts +2 -2
  185. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  187. package/dist/types/src/internal/Format/object.d.ts +3 -1
  188. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  189. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  190. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +28 -28
  192. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  194. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  195. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  197. package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
  198. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  200. package/dist/types/src/internal/Obj/index.d.ts +0 -1
  201. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  202. package/dist/types/src/internal/Obj/json-serializer.d.ts +11 -10
  203. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  204. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  205. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  206. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  207. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  208. package/dist/types/src/internal/Query.d.ts +10 -0
  209. package/dist/types/src/internal/Query.d.ts.map +1 -0
  210. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  211. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -1
  212. package/dist/types/src/internal/Ref/ref.d.ts +42 -19
  213. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  214. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  215. package/dist/types/src/internal/Type/index.d.ts +1 -2
  216. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  217. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  218. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  219. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  220. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  221. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  222. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  223. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  224. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  225. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  227. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  228. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  231. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  232. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  233. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  235. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  236. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  237. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  238. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  239. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  240. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  241. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  242. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  243. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  244. package/dist/types/src/internal/common/types/entity.d.ts +63 -6
  245. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  246. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  247. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  248. package/dist/types/src/internal/common/types/meta.d.ts +23 -7
  249. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  250. package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
  251. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  252. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  253. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  254. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  255. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  256. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  257. package/dist/types/src/internal/index.d.ts +2 -0
  258. package/dist/types/src/internal/index.d.ts.map +1 -1
  259. package/dist/types/src/testing/test-data.d.ts +8 -8
  260. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  261. package/dist/types/src/testing/test-schema.d.ts +83 -89
  262. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  263. package/dist/types/src/testing/util.d.ts +5 -3
  264. package/dist/types/src/testing/util.d.ts.map +1 -1
  265. package/dist/types/tsconfig.tsbuildinfo +1 -1
  266. package/package.json +27 -19
  267. package/src/Annotation.test.ts +439 -0
  268. package/src/Annotation.ts +152 -4
  269. package/src/Collection.ts +6 -5
  270. package/src/Database.ts +117 -57
  271. package/src/Dataset.ts +10 -2
  272. package/src/Entity.test.ts +116 -6
  273. package/src/Entity.ts +130 -31
  274. package/src/Err.ts +4 -4
  275. package/src/Feed.ts +138 -43
  276. package/src/Filter.test.ts +90 -0
  277. package/src/Filter.ts +143 -27
  278. package/src/Hypergraph.ts +14 -9
  279. package/src/Json.test.ts +175 -0
  280. package/src/Json.ts +103 -0
  281. package/src/Key.ts +1 -1
  282. package/src/Migration.ts +114 -0
  283. package/src/Obj.test.ts +122 -19
  284. package/src/Obj.ts +279 -97
  285. package/src/Query.test.ts +317 -131
  286. package/src/Query.ts +181 -73
  287. package/src/QueryResult.ts +11 -0
  288. package/src/Ref.ts +22 -4
  289. package/src/Registry.ts +155 -0
  290. package/src/Relation.test.ts +10 -10
  291. package/src/Relation.ts +112 -71
  292. package/src/Scope.ts +50 -0
  293. package/src/StateMap.test.ts +56 -0
  294. package/src/StateMap.ts +99 -0
  295. package/src/Tag.md +88 -0
  296. package/src/Tag.ts +49 -6
  297. package/src/TagIndex.test.ts +57 -0
  298. package/src/TagIndex.ts +110 -0
  299. package/src/Tagging.ts +83 -0
  300. package/src/Type.test.ts +223 -18
  301. package/src/Type.ts +602 -132
  302. package/src/View.ts +11 -15
  303. package/src/exemplars.test.ts +21 -0
  304. package/src/index.ts +9 -3
  305. package/src/internal/Annotation/annotations.test.ts +82 -13
  306. package/src/internal/Annotation/annotations.ts +153 -115
  307. package/src/internal/Annotation/dictionary.ts +47 -0
  308. package/src/internal/Annotation/entity-dictionary.ts +40 -0
  309. package/src/internal/Annotation/index.ts +4 -2
  310. package/src/internal/Annotation/sorting.ts +0 -1
  311. package/src/internal/Annotation/util.ts +17 -8
  312. package/src/internal/Entity/api.ts +7 -8
  313. package/src/internal/Entity/entity.ts +196 -47
  314. package/src/internal/Entity/guard.ts +26 -0
  315. package/src/internal/Entity/index.ts +2 -0
  316. package/src/internal/Entity/model.ts +37 -28
  317. package/src/internal/Entity/object.ts +21 -6
  318. package/src/internal/Entity/relation.ts +68 -34
  319. package/src/internal/Entity/type-kind.ts +75 -0
  320. package/src/internal/Entity/type-uri.ts +87 -0
  321. package/src/internal/Entity/util.ts +10 -9
  322. package/src/internal/Entity/version.ts +0 -1
  323. package/src/internal/Format/date.test.ts +0 -1
  324. package/src/internal/Format/date.ts +0 -4
  325. package/src/internal/Format/format.test.ts +21 -1
  326. package/src/internal/Format/index.ts +2 -3
  327. package/src/internal/Format/object.ts +21 -4
  328. package/src/internal/Format/types.ts +1 -1
  329. package/src/internal/JsonSchema/annotations.ts +1 -1
  330. package/src/internal/JsonSchema/json-schema-type.ts +1 -1
  331. package/src/internal/JsonSchema/json-schema.test.ts +55 -142
  332. package/src/internal/JsonSchema/json-schema.ts +44 -31
  333. package/src/internal/Obj/clone.ts +9 -4
  334. package/src/internal/Obj/create-object.test.ts +13 -13
  335. package/src/internal/Obj/create-object.ts +68 -24
  336. package/src/internal/Obj/deleted.ts +1 -1
  337. package/src/internal/Obj/index.ts +0 -1
  338. package/src/internal/Obj/inspect.ts +4 -3
  339. package/src/internal/Obj/json-serializer.test.ts +102 -24
  340. package/src/internal/Obj/json-serializer.ts +105 -43
  341. package/src/internal/Obj/set-value.test.ts +31 -54
  342. package/src/internal/Obj/set-value.ts +1 -1
  343. package/src/internal/Obj/snapshot.ts +11 -4
  344. package/src/internal/Obj/typed-object.test.ts +9 -11
  345. package/src/internal/Obj/typed-object.ts +1 -1
  346. package/src/internal/Query.ts +159 -0
  347. package/src/internal/Ref/ref-array.ts +3 -4
  348. package/src/internal/Ref/ref.test.ts +17 -27
  349. package/src/internal/Ref/ref.ts +124 -59
  350. package/src/internal/Type/compose.test.ts +3 -2
  351. package/src/internal/Type/index.ts +1 -2
  352. package/src/internal/Type/manipulation.ts +0 -25
  353. package/src/internal/Type/type-schema.ts +60 -0
  354. package/src/internal/common/README.md +2 -2
  355. package/src/internal/common/api/meta.ts +19 -17
  356. package/src/internal/common/proxy/change-context.ts +1 -1
  357. package/src/internal/common/proxy/change.test.ts +118 -110
  358. package/src/internal/common/proxy/errors.ts +2 -2
  359. package/src/internal/common/proxy/handler.test.ts +1 -3
  360. package/src/internal/common/proxy/json-serializer.ts +26 -16
  361. package/src/internal/common/proxy/make-object.ts +43 -21
  362. package/src/internal/common/proxy/ownership.ts +2 -3
  363. package/src/internal/common/proxy/reactive-array.ts +1 -1
  364. package/src/internal/common/proxy/reactive.test.ts +54 -0
  365. package/src/internal/common/proxy/reactive.ts +11 -3
  366. package/src/internal/common/proxy/schema.test.ts +48 -86
  367. package/src/internal/common/proxy/typed-handler.test.ts +12 -12
  368. package/src/internal/common/proxy/typed-handler.ts +79 -19
  369. package/src/internal/common/proxy/typed-object.test.ts +16 -29
  370. package/src/internal/common/types/base.ts +4 -4
  371. package/src/internal/common/types/entity.ts +81 -2
  372. package/src/internal/common/types/index.ts +6 -1
  373. package/src/internal/common/types/meta.ts +49 -15
  374. package/src/internal/common/types/model-symbols.ts +16 -4
  375. package/src/internal/common/types/typename.ts +39 -3
  376. package/src/internal/common/types/well-known-types.ts +15 -0
  377. package/src/internal/index.ts +6 -0
  378. package/src/testing/api.test.ts +15 -10
  379. package/src/testing/test-data.ts +159 -100
  380. package/src/testing/test-schema.ts +22 -58
  381. package/src/testing/util.ts +14 -11
  382. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  383. package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +0 -7
  384. package/dist/lib/neutral/chunk-724GQYEN.mjs +0 -56
  385. package/dist/lib/neutral/chunk-724GQYEN.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  387. package/dist/lib/neutral/chunk-B5OXLWZL.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  389. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  390. package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-CIRHIEMW.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-DYDJBZEG.mjs +0 -102
  393. package/dist/lib/neutral/chunk-DYDJBZEG.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-FXEG7EOK.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-KTAWP7GI.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-NEGC54NE.mjs +0 -130
  397. package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-NQRLRYJM.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-OENWMTE6.mjs +0 -45
  401. package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +0 -7
  402. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs +0 -97
  404. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-SEMVAGBM.mjs +0 -355
  406. package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-TQQZLKB7.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-UFDK26FO.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-VA2F47ZC.mjs +0 -152
  411. package/dist/lib/neutral/chunk-VA2F47ZC.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-WYOKA6AE.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-YWXWXIE5.mjs.map +0 -7
  414. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  415. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  416. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  417. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  418. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  419. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  420. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  421. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  422. package/src/SchemaRegistry.ts +0 -106
  423. package/src/internal/Obj/ids.ts +0 -12
  424. package/src/internal/Type/echo-schema.ts +0 -424
  425. package/src/internal/Type/persistent-schema.ts +0 -33
  426. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Migration.mjs.map} +0 -0
  427. /package/dist/lib/neutral/{chunk-UTBRYVQC.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
  428. /package/dist/lib/neutral/{chunk-UI6MWK5W.mjs.map → chunk-TTCSATUD.mjs.map} +0 -0
@@ -5,42 +5,42 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
7
  import { raise } from '@dxos/debug';
8
- import { type EncodedReference, ObjectStructure, isEncodedReference } from '@dxos/echo-protocol';
8
+ import { type EncodedReference, EntityStructure, 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 { EID, EntityId, URI } from '@dxos/keys';
11
+ import { assumeType, decodeUint8ArrayFromJson, deepMapValues, isEncodedUint8Array, visitValues } from '@dxos/util';
12
12
 
13
13
  import type * as Database from '../../Database';
14
14
  import type * as Obj from '../../Obj';
15
- import { getTypeDXN, setTypename } from '../Annotation';
15
+ import { getTypeAnnotation, getTypeURI, setTypename } from '../Annotation';
16
+ import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';
17
+ import {
18
+ ATTR_PARENT,
19
+ ATTR_TYPE,
20
+ type AnyEntity,
21
+ EntityKind,
22
+ KindId,
23
+ ParentId,
24
+ setSchema,
25
+ setType,
26
+ } from '../common/types';
27
+ import { ATTR_META, MetaId, EntityMetaSchema } from '../common/types/meta';
16
28
  import {
17
29
  ATTR_DELETED,
18
30
  ATTR_RELATION_SOURCE,
19
31
  ATTR_RELATION_TARGET,
20
- ATTR_SELF_DXN,
32
+ ATTR_SELF_URI,
33
+ ATTR_SELF_URI_LEGACY,
21
34
  ObjectDatabaseId,
22
35
  type ObjectJSON,
23
36
  RelationSourceDXNId,
24
37
  RelationSourceId,
25
38
  RelationTargetDXNId,
26
39
  RelationTargetId,
27
- SelfDXNId,
40
+ SelfURIId,
28
41
  assertObjectModel,
29
42
  } from '../Entity';
30
- import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';
31
43
  import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../Ref';
32
- import {
33
- ATTR_META,
34
- ATTR_PARENT,
35
- ATTR_TYPE,
36
- type AnyEntity,
37
- EntityKind,
38
- KindId,
39
- MetaId,
40
- ObjectMetaSchema,
41
- ParentId,
42
- setSchema,
43
- } from '../common/types';
44
44
 
45
45
  // Re-export for backward compatibility.
46
46
  export { attachTypedJsonSerializer };
@@ -62,7 +62,7 @@ type SerializedObject<T extends { id: string }> = {
62
62
  * Converts object to it's JSON representation.
63
63
  */
64
64
  export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {
65
- const typename = getTypeDXN(obj)?.toString();
65
+ const typename = getTypeURI(obj);
66
66
  invariant(typename && typeof typename === 'string');
67
67
  return typedJsonSerializer.call(obj);
68
68
  };
@@ -75,22 +75,27 @@ export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> =
75
75
  *
76
76
  * @param jsonData - JSON representation of the object.
77
77
  * @param options.refResolver - Resolver for references.
78
- * @param options.dxn - Override object DXN.
78
+ * @param options.uri - Override object URI.
79
79
  * @param options.database - Database to associate with the object.
80
80
  */
81
81
  export const objectFromJSON = async (
82
82
  jsonData: unknown,
83
- { refResolver, dxn, database }: { refResolver?: RefResolver; dxn?: DXN; database?: Database.Database } = {},
83
+ {
84
+ refResolver,
85
+ uri,
86
+ database,
87
+ parent,
88
+ }: { refResolver?: RefResolver; uri?: URI.URI; database?: Database.Database; parent?: Obj.Unknown } = {},
84
89
  ): Promise<AnyEntity> => {
85
90
  assumeType<ObjectJSON>(jsonData);
86
91
  assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');
87
92
  assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');
88
93
  assertArgument(typeof jsonData.id === 'string', 'jsonData.id', 'expected object to have an id');
89
94
 
90
- const type = DXN.parse(jsonData[ATTR_TYPE]);
95
+ const type = URI.make(jsonData[ATTR_TYPE]);
91
96
  const schema = await refResolver?.resolveSchema(type);
92
97
  invariant(schema === undefined || Schema.isSchema(schema));
93
- const decodedInput = stripInternalJsonKeys(jsonData);
98
+ const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));
94
99
 
95
100
  let obj: any;
96
101
  if (schema != null) {
@@ -102,17 +107,26 @@ export const objectFromJSON = async (
102
107
  obj = decodeGeneric(decodedInput, { refResolver });
103
108
  }
104
109
 
105
- invariant(ObjectId.isValid(obj.id), 'Invalid object id');
110
+ invariant(EntityId.isValid(obj.id), 'Invalid object id');
106
111
  setTypename(obj, type);
107
112
  if (schema) {
108
113
  setSchema(obj, schema);
109
114
  }
115
+ // Resolve and stamp the source type entity, if the resolver provides one.
116
+ // Lets `Obj.getType` / `Entity.getType` return a stable entity for objects
117
+ // loaded via `Obj.fromJSON` (serializer / queue paths).
118
+ if (refResolver?.resolveType) {
119
+ const typeEntity = await refResolver.resolveType(type);
120
+ if (typeEntity != null) {
121
+ setType(obj, typeEntity);
122
+ }
123
+ }
110
124
 
111
125
  const isRelation =
112
126
  typeof jsonData[ATTR_RELATION_SOURCE] === 'string' || typeof jsonData[ATTR_RELATION_TARGET] === 'string';
113
127
  if (isRelation) {
114
- const sourceDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source')));
115
- const targetDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target')));
128
+ const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source'));
129
+ const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target'));
116
130
 
117
131
  const source = (await refResolver?.resolve(sourceDxn)) as AnyEntity | undefined;
118
132
  const target = (await refResolver?.resolve(targetDxn)) as AnyEntity | undefined;
@@ -123,27 +137,37 @@ export const objectFromJSON = async (
123
137
  defineHiddenProperty(obj, RelationSourceId, source);
124
138
  defineHiddenProperty(obj, RelationTargetId, target);
125
139
  } else {
126
- defineHiddenProperty(obj, KindId, EntityKind.Object);
140
+ // Honour the schema's TypeAnnotation kind — persisted `Type.Type` entities
141
+ // (e.g. dynamic schemas loaded from a snapshot import) must brand as
142
+ // `KindId = Type`, not Object, otherwise `Filter.type(Type.Type)` /
143
+ // `Type.isType` skip them and the schema registry never picks them up.
144
+ // Mirrors the kind resolution in `createObject` (the in-memory path).
145
+ const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : undefined;
146
+ defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);
127
147
  }
128
148
 
129
149
  if (typeof jsonData[ATTR_META] === 'object') {
130
- const meta = await ObjectMetaSchema.pipe(Schema.decodeUnknownPromise)(jsonData[ATTR_META]);
150
+ const meta = await EntityMetaSchema.pipe(Schema.decodeUnknownPromise)(normalizeMeta(jsonData[ATTR_META]));
131
151
  invariant(Array.isArray(meta.keys));
132
152
  defineHiddenProperty(obj, MetaId, meta);
133
153
  } else {
134
154
  defineHiddenProperty(obj, MetaId, {
135
155
  keys: [],
156
+ tags: [],
157
+ annotations: {},
136
158
  });
137
159
  }
138
160
 
139
161
  if (jsonData[ATTR_PARENT]) {
140
- const parentDxn = DXN.parse(jsonData[ATTR_PARENT]);
141
- 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) {
142
166
  defineHiddenProperty(obj, ParentId, parent);
143
167
  }
144
168
 
145
- if (dxn) {
146
- defineHiddenProperty(obj, SelfDXNId, dxn);
169
+ if (uri) {
170
+ defineHiddenProperty(obj, SelfURIId, uri);
147
171
  }
148
172
 
149
173
  if (database) {
@@ -154,12 +178,30 @@ export const objectFromJSON = async (
154
178
  invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');
155
179
  invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
156
180
  invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');
157
- 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');
158
183
  invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');
159
184
  invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');
160
185
  return obj;
161
186
  };
162
187
 
188
+ /**
189
+ * Backfills required meta fields and upgrades legacy `tags` (bare URI strings) to encoded references
190
+ * so serialized data produced before the tags-as-refs migration still decodes.
191
+ */
192
+ const normalizeMeta = (meta: any): any => {
193
+ const tags = Array.isArray(meta?.tags)
194
+ ? meta.tags.map((tag: unknown) => (typeof tag === 'string' ? { '/': URI.make(tag) } : tag))
195
+ : [];
196
+ // Coalesce required fields so explicit `undefined` in legacy input doesn't override the defaults.
197
+ return {
198
+ ...meta,
199
+ keys: Array.isArray(meta?.keys) ? meta.keys : [],
200
+ tags,
201
+ annotations: meta?.annotations ?? {},
202
+ };
203
+ };
204
+
163
205
  const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {
164
206
  const props = stripInternalJsonKeys(jsonData);
165
207
 
@@ -167,17 +209,33 @@ const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }
167
209
  if (isEncodedReference(value)) {
168
210
  return refFromEncodedReference(value, options.refResolver);
169
211
  }
212
+ if (isEncodedUint8Array(value)) {
213
+ return decodeUint8ArrayFromJson(value);
214
+ }
170
215
 
171
216
  return visitor(value);
172
217
  });
173
218
  };
174
219
 
220
+ /**
221
+ * Recursively replaces encoded `Uint8Array` JSON markers with actual `Uint8Array` instances.
222
+ * Runs before schema decoding so `Schema.Uint8ArrayFromSelf` sees real bytes.
223
+ */
224
+ const restoreUint8Arrays = (data: unknown): any =>
225
+ deepMapValues(data, (value, recurse) => {
226
+ if (isEncodedUint8Array(value)) {
227
+ return decodeUint8ArrayFromJson(value);
228
+ }
229
+ return recurse(value);
230
+ });
231
+
175
232
  const stripInternalJsonKeys = (jsonData: unknown) => {
176
233
  const {
177
234
  [ATTR_TYPE]: _type,
178
235
  [ATTR_META]: _meta,
179
236
  [ATTR_DELETED]: _deleted,
180
- [ATTR_SELF_DXN]: _selfDxn,
237
+ [ATTR_SELF_URI]: _selfUri,
238
+ [ATTR_SELF_URI_LEGACY]: _legacySelfUri,
181
239
  [ATTR_RELATION_SOURCE]: _relationSource,
182
240
  [ATTR_RELATION_TARGET]: _relationTarget,
183
241
  ...props
@@ -199,17 +257,21 @@ export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) =
199
257
  };
200
258
 
201
259
  /**
202
- * Convert ObjectStructure to JSON data for indexing.
203
- * Different from {@link objectToJSON} as it takes the internal {@link ObjectStructure} representation directly
260
+ * Convert EntityStructure to JSON data for indexing.
261
+ * Different from {@link objectToJSON} as it takes the internal {@link EntityStructure} representation directly
204
262
  */
205
- export const objectStructureToJson = (objectId: string, structure: ObjectStructure): Obj.JSON => {
263
+ export const objectStructureToJson = (objectId: EntityId, structure: EntityStructure): Obj.JSON => {
264
+ const typeRef = EntityStructure.getTypeReference(structure)?.['/'];
265
+ const parent = EntityStructure.getParent(structure)?.['/'];
266
+ const source = EntityStructure.getRelationSource(structure)?.['/'];
267
+ const target = EntityStructure.getRelationTarget(structure)?.['/'];
206
268
  return {
207
269
  ...structure.data,
208
270
  id: objectId,
209
- [ATTR_TYPE]: (ObjectStructure.getTypeReference(structure)?.['/'] ?? '') as DXN.String,
210
- [ATTR_DELETED]: ObjectStructure.isDeleted(structure),
211
- [ATTR_PARENT]: ObjectStructure.getParent(structure)?.['/'] as DXN.String | undefined,
212
- [ATTR_RELATION_SOURCE]: ObjectStructure.getRelationSource(structure)?.['/'] as DXN.String | undefined,
213
- [ATTR_RELATION_TARGET]: ObjectStructure.getRelationTarget(structure)?.['/'] as DXN.String | undefined,
271
+ [ATTR_TYPE]: typeRef ? URI.make(typeRef) : undefined,
272
+ [ATTR_DELETED]: EntityStructure.isDeleted(structure),
273
+ [ATTR_PARENT]: parent !== undefined ? EID.tryParse(parent) : undefined,
274
+ [ATTR_RELATION_SOURCE]: source !== undefined ? EID.tryParse(source) : undefined,
275
+ [ATTR_RELATION_TARGET]: target !== undefined ? EID.tryParse(target) : undefined,
214
276
  };
215
277
  };
@@ -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('');
@@ -21,7 +21,7 @@ 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');
@@ -7,18 +7,20 @@ import { deepMapValues } from '@dxos/util';
7
7
 
8
8
  import {
9
9
  KindId,
10
- MetaId,
11
10
  ObjectDatabaseId,
12
11
  ObjectDeletedId,
12
+ ParentId,
13
13
  RelationSourceDXNId,
14
14
  RelationSourceId,
15
15
  RelationTargetDXNId,
16
16
  RelationTargetId,
17
17
  SchemaId,
18
- SelfDXNId,
18
+ SelfURIId,
19
19
  SnapshotKindId,
20
+ TypeEntityId,
20
21
  TypeId,
21
22
  } from '../common/types';
23
+ import { MetaId } from '../common/types/meta';
22
24
 
23
25
  /**
24
26
  * Copy a Symbol-keyed property from source to target if it has a defined value.
@@ -83,16 +85,21 @@ export const getSnapshot = <T extends object>(obj: T): T => {
83
85
  // Type introspection symbols.
84
86
  copySymbolProperty(source, snapshot, TypeId);
85
87
  copySymbolProperty(source, snapshot, SchemaId);
86
- copySymbolProperty(source, snapshot, SelfDXNId);
88
+ copySymbolProperty(source, snapshot, TypeEntityId);
89
+ copySymbolProperty(source, snapshot, SelfURIId);
87
90
 
88
91
  // Database reference (required for Obj.getDatabase to work on snapshots).
89
92
  copySymbolProperty(source, snapshot, ObjectDatabaseId);
90
93
  copySymbolProperty(source, snapshot, ObjectDeletedId);
91
94
 
92
- // Metadata symbol. Copy arrays so the snapshot is not affected by mutations to the live meta's keys/tags.
95
+ // Parent reference (required for Obj.getParent to work on snapshots).
96
+ copySymbolProperty(source, snapshot, ParentId);
97
+
98
+ // Metadata symbol. Copy arrays/objects so the snapshot is not affected by mutations to the live meta.
93
99
  copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({
94
100
  keys: [...(meta?.keys ?? [])],
95
101
  tags: [...(meta?.tags ?? [])],
102
+ ...(meta?.annotations ? { annotations: { ...meta.annotations } } : {}),
96
103
  }));
97
104
 
98
105
  // Relation endpoint symbols.
@@ -6,29 +6,27 @@ import * as Schema from 'effect/Schema';
6
6
  import * as SchemaAST from 'effect/SchemaAST';
7
7
  import { describe, expect, test } from 'vitest';
8
8
 
9
+ import { DXN } from '@dxos/keys';
10
+
11
+ import * as Type from '../../Type';
9
12
  import { EchoObjectSchema } from '../Entity';
10
13
 
11
14
  const Organization = Schema.Struct({
12
15
  name: Schema.String,
13
- }).pipe(
14
- EchoObjectSchema({
15
- typename: 'com.example.type.organization',
16
- version: '0.1.0',
17
- }),
18
- );
16
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.organization', '0.1.0')));
19
17
 
20
- interface Organization extends Schema.Schema.Type<typeof Organization> {}
18
+ type Organization = Type.InstanceType<typeof Organization>;
21
19
 
22
20
  describe('EchoObjectSchema DSL', () => {
23
- test('type is a valid schema', async () => {
24
- expect(Schema.isSchema(Organization)).to.be.true;
21
+ test('type is a Type.Type entity', async () => {
22
+ expect(Schema.isSchema(Type.getSchema(Organization))).to.be.true;
25
23
  });
26
24
 
27
25
  test('static typename accessor', async () => {
28
- expect(Organization.typename).to.eq('com.example.type.organization');
26
+ expect(Type.getTypename(Organization)).to.eq('com.example.type.organization');
29
27
  });
30
28
 
31
29
  test('expect schema', async () => {
32
- expect(SchemaAST.isTypeLiteral(Organization.ast)).to.be.true;
30
+ expect(SchemaAST.isTypeLiteral(Type.getSchema(Organization).ast)).to.be.true;
33
31
  });
34
32
  });
@@ -12,7 +12,7 @@ import { type AnyEntity } from '../common/types';
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
17
  * @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
18
18
  */