@dxos/echo 0.8.4-staging.ac66bdf99f → 0.9.1-main.c7dcc2e112

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 (444) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +45 -6
  4. package/dist/lib/neutral/Database.mjs +10 -17
  5. package/dist/lib/neutral/Entity.mjs +35 -20
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +23 -19
  8. package/dist/lib/neutral/Filter.mjs +13 -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 +11 -10
  13. package/dist/lib/neutral/Obj.mjs +33 -20
  14. package/dist/lib/neutral/Order.mjs +7 -3
  15. package/dist/lib/neutral/Query.mjs +17 -17
  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/Relation.mjs +28 -25
  20. package/dist/lib/neutral/Scope.mjs +12 -0
  21. package/dist/lib/neutral/Tag.mjs +17 -14
  22. package/dist/lib/neutral/Type.mjs +54 -26
  23. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-35INCYOE.mjs} +1 -1
  24. package/dist/lib/neutral/chunk-35INCYOE.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-4OIBYSXE.mjs → chunk-3JXQUMUI.mjs} +78 -32
  26. package/dist/lib/neutral/chunk-3JXQUMUI.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-G3IQMKF7.mjs → chunk-4TPQZPLY.mjs} +130 -119
  28. package/dist/lib/neutral/chunk-4TPQZPLY.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-TU3GW67D.mjs → chunk-5GAIWRQB.mjs} +40 -40
  30. package/dist/lib/neutral/chunk-5GAIWRQB.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-B4BASU6W.mjs → chunk-6CEISA3V.mjs} +93 -76
  32. package/dist/lib/neutral/chunk-6CEISA3V.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-GZQTCRJB.mjs → chunk-6M2Z6WBH.mjs} +22 -2
  34. package/dist/lib/neutral/chunk-6M2Z6WBH.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  36. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-WAK4DMFV.mjs → chunk-A53NTBHE.mjs} +12 -7
  38. package/dist/lib/neutral/chunk-A53NTBHE.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-EAMSSLZC.mjs → chunk-AFANXSGV.mjs} +83 -46
  40. package/dist/lib/neutral/chunk-AFANXSGV.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  42. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-E7IOTOZD.mjs +108 -0
  44. package/dist/lib/neutral/chunk-E7IOTOZD.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-EVK6XBXO.mjs} +16 -2
  46. package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-HGWQR5KH.mjs +259 -0
  48. package/dist/lib/neutral/chunk-HGWQR5KH.mjs.map +7 -0
  49. package/dist/lib/neutral/chunk-JZ6LFQU5.mjs +109 -0
  50. package/dist/lib/neutral/chunk-JZ6LFQU5.mjs.map +7 -0
  51. package/dist/lib/neutral/{chunk-JUXPFOEI.mjs → chunk-K3S7D5PR.mjs} +48 -88
  52. package/dist/lib/neutral/chunk-K3S7D5PR.mjs.map +7 -0
  53. package/dist/lib/neutral/{chunk-OS35K56T.mjs → chunk-L3OBWBV2.mjs} +3 -3
  54. package/dist/lib/neutral/{chunk-OS35K56T.mjs.map → chunk-L3OBWBV2.mjs.map} +2 -2
  55. package/dist/lib/neutral/{chunk-V36VO5SS.mjs → chunk-NOL7O3BL.mjs} +32 -40
  56. package/dist/lib/neutral/chunk-NOL7O3BL.mjs.map +7 -0
  57. package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-O6BH7EPN.mjs} +30 -3
  58. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  59. package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs → chunk-PLDMJJJC.mjs} +2 -2
  60. package/dist/lib/neutral/{chunk-HBUZJNZO.mjs → chunk-SZ5WB6HF.mjs} +94 -99
  61. package/dist/lib/neutral/chunk-SZ5WB6HF.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-BVOFLCVF.mjs → chunk-TF5BSLF6.mjs} +9 -6
  63. package/dist/lib/neutral/chunk-TF5BSLF6.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-DQYLD2RB.mjs → chunk-TFEWTY5A.mjs} +155 -129
  65. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-MOR5ERFM.mjs → chunk-VQYL2OQF.mjs} +771 -1252
  67. package/dist/lib/neutral/chunk-VQYL2OQF.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-WISOH2XH.mjs +36 -0
  69. package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-WU3GIANS.mjs +31 -0
  71. package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-WZ32BF53.mjs +702 -0
  73. package/dist/lib/neutral/chunk-WZ32BF53.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-X3NUUON4.mjs +184 -0
  75. package/dist/lib/neutral/chunk-X3NUUON4.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs +168 -0
  77. package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs.map +7 -0
  78. package/dist/lib/neutral/index.mjs +47 -41
  79. package/dist/lib/neutral/internal/index.mjs +157 -72
  80. package/dist/lib/neutral/meta.json +1 -1
  81. package/dist/lib/neutral/testing/index.mjs +261 -178
  82. package/dist/lib/neutral/testing/index.mjs.map +4 -4
  83. package/dist/types/src/Annotation.d.ts +108 -4
  84. package/dist/types/src/Annotation.d.ts.map +1 -1
  85. package/dist/types/src/Annotation.test.d.ts +2 -0
  86. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  87. package/dist/types/src/Collection.d.ts +2 -3
  88. package/dist/types/src/Collection.d.ts.map +1 -1
  89. package/dist/types/src/Database.d.ts +78 -49
  90. package/dist/types/src/Database.d.ts.map +1 -1
  91. package/dist/types/src/Dataset.d.ts +16 -6
  92. package/dist/types/src/Dataset.d.ts.map +1 -1
  93. package/dist/types/src/Entity.d.ts +103 -28
  94. package/dist/types/src/Entity.d.ts.map +1 -1
  95. package/dist/types/src/Err.d.ts +27 -27
  96. package/dist/types/src/Err.d.ts.map +1 -1
  97. package/dist/types/src/Feed.d.ts +69 -19
  98. package/dist/types/src/Feed.d.ts.map +1 -1
  99. package/dist/types/src/Filter.d.ts +38 -12
  100. package/dist/types/src/Filter.d.ts.map +1 -1
  101. package/dist/types/src/Format.d.ts +0 -2
  102. package/dist/types/src/Format.d.ts.map +1 -1
  103. package/dist/types/src/Hypergraph.d.ts +14 -9
  104. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  105. package/dist/types/src/Json.d.ts +33 -0
  106. package/dist/types/src/Json.d.ts.map +1 -0
  107. package/dist/types/src/Json.test.d.ts +2 -0
  108. package/dist/types/src/Json.test.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +2 -2
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  111. package/dist/types/src/Key.d.ts +1 -1
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Migration.d.ts +26 -11
  114. package/dist/types/src/Migration.d.ts.map +1 -1
  115. package/dist/types/src/Obj.d.ts +106 -61
  116. package/dist/types/src/Obj.d.ts.map +1 -1
  117. package/dist/types/src/Order.d.ts +10 -0
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +34 -12
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +21 -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 +73 -41
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +35 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/Tag.d.ts +21 -5
  132. package/dist/types/src/Tag.d.ts.map +1 -1
  133. package/dist/types/src/Type.d.ts +366 -95
  134. package/dist/types/src/Type.d.ts.map +1 -1
  135. package/dist/types/src/View.d.ts +9 -12
  136. package/dist/types/src/View.d.ts.map +1 -1
  137. package/dist/types/src/exemplars.test.d.ts +2 -0
  138. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  139. package/dist/types/src/index.d.ts +4 -3
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/internal/Annotation/annotations.d.ts +120 -38
  142. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  143. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  144. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  145. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  146. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  147. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  148. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  149. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  150. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  151. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  152. package/dist/types/src/internal/Entity/api.d.ts +17 -3
  153. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  154. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  155. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  156. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  157. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  158. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  159. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  160. package/dist/types/src/internal/Entity/model.d.ts +21 -17
  161. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  165. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  167. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/type-uri.d.ts +24 -0
  169. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  170. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  171. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  172. package/dist/types/src/internal/Format/format.d.ts +3 -2
  173. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  174. package/dist/types/src/internal/Format/index.d.ts +2 -2
  175. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  176. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  177. package/dist/types/src/internal/Format/object.d.ts +3 -1
  178. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  179. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  180. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  181. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -34
  182. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  183. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  184. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  185. package/dist/types/src/internal/Obj/atoms.d.ts +43 -0
  186. package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -0
  187. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  188. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  189. package/dist/types/src/internal/Obj/create-object.d.ts +12 -12
  190. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  191. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  192. package/dist/types/src/internal/Obj/index.d.ts +1 -1
  193. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  194. package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
  195. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  197. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  198. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  200. package/dist/types/src/internal/Query/index.d.ts +2 -0
  201. package/dist/types/src/internal/Query/index.d.ts.map +1 -0
  202. package/dist/types/src/internal/{Query.d.ts → Query/pretty.d.ts} +1 -1
  203. package/dist/types/src/internal/Query/pretty.d.ts.map +1 -0
  204. package/dist/types/src/internal/Ref/atoms.d.ts +10 -0
  205. package/dist/types/src/internal/Ref/atoms.d.ts.map +1 -0
  206. package/dist/types/src/internal/Ref/index.d.ts +1 -0
  207. package/dist/types/src/internal/Ref/index.d.ts.map +1 -1
  208. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  209. package/dist/types/src/internal/Ref/ref.d.ts +114 -19
  210. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  211. package/dist/types/src/internal/Ref/strong-deps.d.ts +35 -0
  212. package/dist/types/src/internal/Ref/strong-deps.d.ts.map +1 -0
  213. package/dist/types/src/internal/Ref/utils.d.ts +8 -0
  214. package/dist/types/src/internal/Ref/utils.d.ts.map +1 -0
  215. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  216. package/dist/types/src/internal/Type/index.d.ts +1 -2
  217. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  218. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  219. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  220. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  221. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  222. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  223. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  224. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  225. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  227. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  228. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  231. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  232. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  233. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  235. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  236. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  237. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  238. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  239. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  240. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  241. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  242. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  243. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  244. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  245. package/dist/types/src/internal/common/types/entity.d.ts +62 -5
  246. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  247. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  248. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  249. package/dist/types/src/internal/common/types/meta.d.ts +33 -12
  250. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  251. package/dist/types/src/internal/common/types/model-symbols.d.ts +15 -4
  252. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  253. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  254. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  255. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  256. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  257. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  258. package/dist/types/src/internal/index.d.ts +2 -2
  259. package/dist/types/src/internal/index.d.ts.map +1 -1
  260. package/dist/types/src/testing/index.d.ts +1 -0
  261. package/dist/types/src/testing/index.d.ts.map +1 -1
  262. package/dist/types/src/testing/registry.d.ts +9 -0
  263. package/dist/types/src/testing/registry.d.ts.map +1 -0
  264. package/dist/types/src/testing/test-data.d.ts +8 -8
  265. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  266. package/dist/types/src/testing/test-schema.d.ts +83 -89
  267. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  268. package/dist/types/src/testing/util.d.ts +5 -3
  269. package/dist/types/src/testing/util.d.ts.map +1 -1
  270. package/dist/types/tsconfig.tsbuildinfo +1 -1
  271. package/package.json +26 -24
  272. package/src/Annotation.test.ts +439 -0
  273. package/src/Annotation.ts +163 -4
  274. package/src/Collection.ts +5 -9
  275. package/src/Database.ts +126 -101
  276. package/src/Dataset.ts +10 -2
  277. package/src/Entity.test.ts +116 -6
  278. package/src/Entity.ts +136 -32
  279. package/src/Err.ts +4 -4
  280. package/src/Feed.ts +95 -44
  281. package/src/Filter.ts +70 -40
  282. package/src/Format.ts +0 -4
  283. package/src/Hypergraph.ts +14 -9
  284. package/src/Json.test.ts +175 -0
  285. package/src/Json.ts +103 -0
  286. package/src/Key.ts +1 -1
  287. package/src/Migration.ts +39 -19
  288. package/src/Obj.test.ts +122 -20
  289. package/src/Obj.ts +170 -91
  290. package/src/Order.ts +22 -0
  291. package/src/Query.test.ts +183 -154
  292. package/src/Query.ts +172 -85
  293. package/src/QueryResult.ts +26 -0
  294. package/src/Ref.ts +22 -4
  295. package/src/Registry.ts +155 -0
  296. package/src/Relation.test.ts +10 -10
  297. package/src/Relation.ts +116 -69
  298. package/src/Scope.ts +50 -0
  299. package/src/Tag.md +88 -0
  300. package/src/Tag.ts +50 -6
  301. package/src/Type.test.ts +223 -18
  302. package/src/Type.ts +623 -131
  303. package/src/View.ts +14 -23
  304. package/src/exemplars.test.ts +21 -0
  305. package/src/index.ts +4 -4
  306. package/src/internal/Annotation/annotations.test.ts +31 -11
  307. package/src/internal/Annotation/annotations.ts +199 -111
  308. package/src/internal/Annotation/dictionary.ts +47 -0
  309. package/src/internal/Annotation/entity-dictionary.ts +74 -0
  310. package/src/internal/Annotation/index.ts +4 -2
  311. package/src/internal/Annotation/util.ts +17 -8
  312. package/src/internal/Entity/api.ts +54 -7
  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 +38 -28
  317. package/src/internal/Entity/object.ts +21 -5
  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 +92 -0
  321. package/src/internal/Entity/util.ts +9 -9
  322. package/src/internal/Format/date.ts +0 -4
  323. package/src/internal/Format/format.test.ts +21 -0
  324. package/src/internal/Format/index.ts +2 -3
  325. package/src/internal/Format/object.ts +21 -4
  326. package/src/internal/Format/types.ts +1 -1
  327. package/src/internal/JsonSchema/annotations.ts +1 -1
  328. package/src/internal/JsonSchema/json-schema-type.ts +4 -4
  329. package/src/internal/JsonSchema/json-schema.test.ts +71 -145
  330. package/src/internal/JsonSchema/json-schema.ts +49 -35
  331. package/src/internal/Obj/atoms.ts +275 -0
  332. package/src/internal/Obj/clone.ts +9 -4
  333. package/src/internal/Obj/create-object.test.ts +12 -10
  334. package/src/internal/Obj/create-object.ts +68 -22
  335. package/src/internal/Obj/index.ts +1 -1
  336. package/src/internal/Obj/inspect.ts +5 -3
  337. package/src/internal/Obj/json-serializer.test.ts +101 -22
  338. package/src/internal/Obj/json-serializer.ts +92 -36
  339. package/src/internal/Obj/set-value.test.ts +22 -45
  340. package/src/internal/Obj/set-value.ts +12 -19
  341. package/src/internal/Obj/snapshot.ts +13 -4
  342. package/src/internal/Obj/typed-object.test.ts +9 -11
  343. package/src/internal/Obj/typed-object.ts +1 -1
  344. package/src/internal/Query/index.ts +5 -0
  345. package/src/internal/{Query.ts → Query/pretty.ts} +40 -12
  346. package/src/internal/Ref/atoms.ts +20 -0
  347. package/src/internal/Ref/index.ts +1 -0
  348. package/src/internal/Ref/ref-array.ts +3 -3
  349. package/src/internal/Ref/ref.test.ts +18 -27
  350. package/src/internal/Ref/ref.ts +224 -69
  351. package/src/internal/Ref/strong-deps.ts +107 -0
  352. package/src/internal/Ref/utils.ts +45 -0
  353. package/src/internal/Type/compose.test.ts +3 -1
  354. package/src/internal/Type/index.ts +1 -2
  355. package/src/internal/Type/manipulation.ts +0 -25
  356. package/src/internal/Type/type-schema.ts +60 -0
  357. package/src/internal/common/README.md +2 -2
  358. package/src/internal/common/api/meta.ts +19 -17
  359. package/src/internal/common/proxy/change-context.ts +1 -1
  360. package/src/internal/common/proxy/change.test.ts +91 -83
  361. package/src/internal/common/proxy/errors.ts +2 -2
  362. package/src/internal/common/proxy/handler.test.ts +1 -1
  363. package/src/internal/common/proxy/json-serializer.ts +27 -16
  364. package/src/internal/common/proxy/make-object.ts +44 -20
  365. package/src/internal/common/proxy/ownership.ts +2 -2
  366. package/src/internal/common/proxy/reactive-array.ts +1 -1
  367. package/src/internal/common/proxy/reactive.test.ts +54 -0
  368. package/src/internal/common/proxy/reactive.ts +11 -2
  369. package/src/internal/common/proxy/schema.test.ts +48 -86
  370. package/src/internal/common/proxy/typed-handler.test.ts +12 -11
  371. package/src/internal/common/proxy/typed-handler.ts +78 -16
  372. package/src/internal/common/proxy/typed-object.test.ts +16 -28
  373. package/src/internal/common/types/base.ts +4 -4
  374. package/src/internal/common/types/entity.ts +80 -1
  375. package/src/internal/common/types/index.ts +6 -1
  376. package/src/internal/common/types/meta.ts +62 -20
  377. package/src/internal/common/types/model-symbols.ts +24 -4
  378. package/src/internal/common/types/typename.ts +39 -3
  379. package/src/internal/common/types/well-known-types.ts +15 -0
  380. package/src/internal/index.ts +6 -4
  381. package/src/testing/api.test.ts +15 -9
  382. package/src/testing/index.ts +1 -0
  383. package/src/testing/registry.ts +44 -0
  384. package/src/testing/test-data.ts +159 -99
  385. package/src/testing/test-schema.ts +22 -58
  386. package/src/testing/util.ts +14 -11
  387. package/dist/lib/neutral/Extension.mjs +0 -18
  388. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  389. package/dist/lib/neutral/chunk-2KHZ36F5.mjs +0 -361
  390. package/dist/lib/neutral/chunk-2KHZ36F5.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-4OIBYSXE.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-4P3IXBLT.mjs +0 -45
  393. package/dist/lib/neutral/chunk-4P3IXBLT.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-B4BASU6W.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  397. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-BVOFLCVF.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-EAMSSLZC.mjs.map +0 -7
  401. package/dist/lib/neutral/chunk-G3IQMKF7.mjs.map +0 -7
  402. package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-HBUZJNZO.mjs.map +0 -7
  404. package/dist/lib/neutral/chunk-JUXPFOEI.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-MOR5ERFM.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-PHU22NLC.mjs +0 -136
  408. package/dist/lib/neutral/chunk-PHU22NLC.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-ROG4RXXL.mjs +0 -97
  410. package/dist/lib/neutral/chunk-ROG4RXXL.mjs.map +0 -7
  411. package/dist/lib/neutral/chunk-T6W2LEZU.mjs +0 -125
  412. package/dist/lib/neutral/chunk-T6W2LEZU.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-TU3GW67D.mjs.map +0 -7
  415. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  416. package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +0 -7
  417. package/dist/lib/neutral/chunk-V36VO5SS.mjs.map +0 -7
  418. package/dist/lib/neutral/chunk-WAK4DMFV.mjs.map +0 -7
  419. package/dist/lib/neutral/chunk-YAHXAYOW.mjs +0 -56
  420. package/dist/lib/neutral/chunk-YAHXAYOW.mjs.map +0 -7
  421. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +0 -50
  422. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +0 -7
  423. package/dist/types/src/Extension.d.ts +0 -80
  424. package/dist/types/src/Extension.d.ts.map +0 -1
  425. package/dist/types/src/Extension.test.d.ts +0 -2
  426. package/dist/types/src/Extension.test.d.ts.map +0 -1
  427. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  428. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  429. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  430. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  431. package/dist/types/src/internal/Query.d.ts.map +0 -1
  432. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  433. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  434. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  435. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  436. package/src/Extension.test.ts +0 -235
  437. package/src/Extension.ts +0 -122
  438. package/src/SchemaRegistry.ts +0 -106
  439. package/src/internal/Obj/ids.ts +0 -12
  440. package/src/internal/Type/echo-schema.ts +0 -423
  441. package/src/internal/Type/persistent-schema.ts +0 -33
  442. /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
  443. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
  444. /package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs.map → chunk-PLDMJJJC.mjs.map} +0 -0
@@ -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, (person) => Obj.setValue(person, ['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, (person) => Obj.setValue(person, ['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, (person) => Obj.setValue(person, ['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,16 +62,11 @@ 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, (container) => {
69
+ Obj.update(container, (container) => {
73
70
  Obj.setValue(container, ['items', 0, 'value'], 10);
74
71
  Obj.setValue(container, ['items', 1, 'value'], 20);
75
72
  Obj.setValue(container, ['items', 2, 'value'], 30);
@@ -88,7 +85,7 @@ describe('Obj.setValue', () => {
88
85
  email: 'john@example.com',
89
86
  });
90
87
 
91
- Obj.change(person, (person) => Obj.setValue(person, ['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, (person) => Obj.setValue(person, ['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,7 +111,7 @@ describe('Obj.setValue', () => {
114
111
  });
115
112
 
116
113
  let result: any;
117
- Obj.change(person, (person) => {
114
+ Obj.update(person, (person) => {
118
115
  result = Obj.setValue(person, ['age'], 30);
119
116
  });
120
117
 
@@ -129,7 +126,7 @@ describe('Obj.setValue', () => {
129
126
  age: 25,
130
127
  });
131
128
 
132
- Obj.change(person, (person) => Obj.setValue(person, ['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, (person) => Obj.setValue(person, ['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,16 +148,11 @@ 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, (matrix) => {
155
+ Obj.update(matrix, (matrix) => {
164
156
  Obj.setValue(matrix, ['values', 0, 0], 1);
165
157
  Obj.setValue(matrix, ['values', 0, 1], 2);
166
158
  Obj.setValue(matrix, ['values', 1, 0], 3);
@@ -180,7 +172,7 @@ describe('Obj.setValue', () => {
180
172
  email: 'john@example.com',
181
173
  });
182
174
 
183
- Obj.change(person, (person) => {
175
+ Obj.update(person, (person) => {
184
176
  expect(() => Obj.setValue(person, [], 'value')).toThrow('Path must not be empty');
185
177
  });
186
178
  });
@@ -192,7 +184,7 @@ describe('Obj.setValue', () => {
192
184
  email: 'john@example.com',
193
185
  });
194
186
 
195
- Obj.change(person, (person) => Obj.setValue(person, ['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, (container) => Obj.setValue(container, ['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, (todoList) => Obj.setValue(todoList, ['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, (container) => Obj.setValue(container, ['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('');
@@ -6,14 +6,7 @@ import * as Match from 'effect/Match';
6
6
  import * as Option from 'effect/Option';
7
7
  import * as SchemaAST from 'effect/SchemaAST';
8
8
 
9
- import {
10
- type SchemaProperty,
11
- getArrayElementType,
12
- getBaseType,
13
- getProperties,
14
- isArrayType,
15
- isNestedType,
16
- } from '@dxos/effect';
9
+ import { SchemaEx } from '@dxos/effect';
17
10
  import { invariant } from '@dxos/invariant';
18
11
 
19
12
  import { type Mutable } from '../common/proxy';
@@ -21,7 +14,7 @@ import { getSchema } from '../common/types';
21
14
 
22
15
  /**
23
16
  * Set a deeply nested property on an object.
24
- * Must be called within an Obj.change or Relation.change callback.
17
+ * Must be called within an Obj.update or Relation.update callback.
25
18
  */
26
19
  export const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {
27
20
  invariant(path.length > 0, 'Path must not be empty');
@@ -38,7 +31,7 @@ export const setValue = (obj: Mutable<any>, path: readonly (string | number)[],
38
31
  const key = typeof part === 'number' ? part : String(part);
39
32
  if (parent[key] === undefined) {
40
33
  const propertyAST = getPropertyAST(currentAST, String(part));
41
- const shouldBeArray = propertyAST ? isArrayType(propertyAST) : false;
34
+ const shouldBeArray = propertyAST ? SchemaEx.isArrayType(propertyAST) : false;
42
35
 
43
36
  if (shouldBeArray) {
44
37
  // Create array.
@@ -73,16 +66,16 @@ const getPropertyAST = (ast: SchemaAST.AST | undefined, propertyName: string): S
73
66
  return undefined;
74
67
  }
75
68
 
76
- if (isNestedType(ast)) {
77
- const properties = getProperties(ast);
69
+ if (SchemaEx.isNestedType(ast)) {
70
+ const properties = SchemaEx.getProperties(ast);
78
71
  const property = properties.find((p) => p.name.toString() === propertyName);
79
72
  if (property) {
80
- return getBaseType(property).type;
73
+ return SchemaEx.getBaseType(property).type;
81
74
  }
82
75
  }
83
76
 
84
- if (isArrayType(ast)) {
85
- const elementType = getArrayElementType(ast);
77
+ if (SchemaEx.isArrayType(ast)) {
78
+ const elementType = SchemaEx.getArrayElementType(ast);
86
79
  return elementType;
87
80
  }
88
81
 
@@ -96,17 +89,17 @@ const getPropertyAST = (ast: SchemaAST.AST | undefined, propertyName: string): S
96
89
  * @param ast - Schema AST to inspect.
97
90
  * @returns Array of required properties with their types.
98
91
  */
99
- const getRequiredProperties = (ast: SchemaAST.AST | undefined): SchemaProperty[] => {
92
+ const getRequiredProperties = (ast: SchemaAST.AST | undefined): SchemaEx.SchemaProperty[] => {
100
93
  if (!ast) {
101
94
  return [];
102
95
  }
103
96
 
104
97
  // Only objects/structs have properties with optional/required distinction.
105
- if (!isNestedType(ast)) {
98
+ if (!SchemaEx.isNestedType(ast)) {
106
99
  return [];
107
100
  }
108
101
 
109
- const properties = getProperties(ast);
102
+ const properties = SchemaEx.getProperties(ast);
110
103
 
111
104
  // Filter to only required properties (where isOptional === false).
112
105
  return properties.filter((p) => !p.isOptional);
@@ -156,7 +149,7 @@ const createObjectWithDefaults = (ast: SchemaAST.AST | undefined): any => {
156
149
  const defaultValue = getDefaultValueForType(prop.type);
157
150
  if (defaultValue !== undefined) {
158
151
  obj[prop.name] = defaultValue;
159
- } else if (isNestedType(prop.type)) {
152
+ } else if (SchemaEx.isNestedType(prop.type)) {
160
153
  obj[prop.name] = createObjectWithDefaults(prop.type);
161
154
  }
162
155
  }
@@ -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/model-symbols';
22
24
 
23
25
  /**
24
26
  * Copy a Symbol-keyed property from source to target if it has a defined value.
@@ -83,16 +85,23 @@ 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?.key != null ? { key: meta.key } : {}),
103
+ ...(meta?.version != null ? { version: meta.version } : {}),
104
+ ...(meta?.annotations ? { annotations: { ...meta.annotations } } : {}),
96
105
  }));
97
106
 
98
107
  // 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
  */
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './pretty';
@@ -1,5 +1,5 @@
1
1
  //
2
- // Copyright 2025 DXOS.org
2
+ // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
5
  import { type QueryAST } from '@dxos/echo-protocol';
@@ -10,6 +10,18 @@ import { type QueryAST } from '@dxos/echo-protocol';
10
10
  export const prettyFilter = (filter: QueryAST.Filter): string => {
11
11
  switch (filter.type) {
12
12
  case 'object': {
13
+ // A type-less object filter with only a meta-key constraint is `Filter.key(...)`.
14
+ if (
15
+ filter.typename === null &&
16
+ (filter.id === undefined || filter.id.length === 0) &&
17
+ Object.keys(filter.props).length === 0 &&
18
+ (filter.foreignKeys === undefined || filter.foreignKeys.length === 0) &&
19
+ filter.metaKey !== undefined
20
+ ) {
21
+ return filter.metaVersion !== undefined
22
+ ? `Filter.key(${JSON.stringify(filter.metaKey)}, { version: ${JSON.stringify(filter.metaVersion)} })`
23
+ : `Filter.key(${JSON.stringify(filter.metaKey)})`;
24
+ }
13
25
  const parts: string[] = [];
14
26
  if (filter.typename !== null) {
15
27
  parts.push(String(filter.typename));
@@ -25,6 +37,13 @@ export const prettyFilter = (filter: QueryAST.Filter): string => {
25
37
  if (filter.foreignKeys !== undefined && filter.foreignKeys.length > 0) {
26
38
  parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(', ')}]`);
27
39
  }
40
+ if (filter.metaKey !== undefined) {
41
+ parts.push(
42
+ filter.metaVersion !== undefined
43
+ ? `metaKey: ${JSON.stringify(filter.metaKey)} (${filter.metaVersion})`
44
+ : `metaKey: ${JSON.stringify(filter.metaKey)}`,
45
+ );
46
+ }
28
47
  return parts.length > 0 ? `Filter.type(${parts.join(', ')})` : 'Filter.everything()';
29
48
  }
30
49
  case 'compare':
@@ -97,6 +116,9 @@ export const prettyQuery = (query: QueryAST.Query): string => {
97
116
  return 'Order.natural()';
98
117
  } else if (o.kind === 'rank') {
99
118
  return `Order.rank(${JSON.stringify(o.direction)})`;
119
+ } else if (o.kind === 'timestamp') {
120
+ const fn = o.field === 'updatedAt' ? 'updated' : 'created';
121
+ return `Order.${fn}(${JSON.stringify(o.direction)})`;
100
122
  } else {
101
123
  return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;
102
124
  }
@@ -109,22 +131,28 @@ export const prettyQuery = (query: QueryAST.Query): string => {
109
131
  if (opts.deleted !== undefined) {
110
132
  parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);
111
133
  }
134
+ if (opts.debugLabel !== undefined) {
135
+ parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);
136
+ }
112
137
  return `${prettyQuery(query.query)}.options({ ${parts.join(', ')} })`;
113
138
  }
114
139
  case 'from': {
115
140
  if (query.from._tag === 'scope') {
116
- const scope = query.from.scope;
117
- const parts: string[] = [];
118
- if (scope.spaceIds !== undefined) {
119
- parts.push(`spaceIds: [${scope.spaceIds.map((s) => JSON.stringify(s)).join(', ')}]`);
120
- }
121
- if (scope.queues !== undefined) {
122
- parts.push(`queues: [${scope.queues.map(String).join(', ')}]`);
123
- }
124
- if (scope.allQueuesFromSpaces !== undefined) {
125
- parts.push(`allQueuesFromSpaces: ${scope.allQueuesFromSpaces}`);
141
+ if (query.from.scopes.length === 0) {
142
+ return `${prettyQuery(query.query)}.from('all-accessible-spaces')`;
126
143
  }
127
- return `${prettyQuery(query.query)}.from({ ${parts.join(', ')} })`;
144
+ const scopeStrs = query.from.scopes.map((scope) => {
145
+ if (scope._tag === 'space') {
146
+ return scope.includeAllFeeds
147
+ ? `{ space: ${JSON.stringify(scope.spaceId)}, includeAllFeeds: true }`
148
+ : `{ space: ${JSON.stringify(scope.spaceId)} }`;
149
+ }
150
+ if (scope._tag === 'feed') {
151
+ return `{ feed: ${JSON.stringify(String(scope.feedUri))} }`;
152
+ }
153
+ return `{ registry: ${JSON.stringify(scope.location)} }`;
154
+ });
155
+ return `${prettyQuery(query.query)}.from([${scopeStrs.join(', ')}])`;
128
156
  }
129
157
  return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;
130
158
  }
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Atom from '@effect-atom/atom/Atom';
6
+
7
+ import type { Ref } from './ref';
8
+ import { loadRefTarget } from './utils';
9
+
10
+ /**
11
+ * Atom family for ECHO refs.
12
+ * Uses ref reference as key — same ref returns same atom.
13
+ * This atom only updates once when the ref loads — it does not subscribe to target object changes.
14
+ * Use `Obj.atom(ref)` if you need reactive snapshots of ECHO objects via a ref.
15
+ */
16
+ export const refSimpleFamily = Atom.family(<T>(ref: Ref<T>): Atom.Atom<T | undefined> => {
17
+ return Atom.make<T | undefined>((get) => {
18
+ return loadRefTarget(ref, get, (target) => target);
19
+ });
20
+ });
@@ -4,3 +4,4 @@
4
4
 
5
5
  export * from './ref';
6
6
  export * from './ref-array';
7
+ export * from './strong-deps';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type ObjectId } from '@dxos/keys';
5
+ import { type EntityId } from '@dxos/keys';
6
6
  import { isNonNullable } from '@dxos/util';
7
7
 
8
8
  import { type AnyEntity } from '../common/types';
@@ -29,8 +29,8 @@ export const RefArray = Object.freeze({
29
29
  /**
30
30
  * Removes the ref with the given id.
31
31
  */
32
- removeById: (refs: Ref<AnyEntity>[], id: ObjectId) => {
33
- const index = refs.findIndex(Ref.hasObjectId(id));
32
+ removeById: (refs: Ref<AnyEntity>[], id: EntityId) => {
33
+ const index = refs.findIndex(Ref.hasEntityId(id));
34
34
  if (index >= 0) {
35
35
  refs.splice(index, 1);
36
36
  }
@@ -5,46 +5,37 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
- import { DXN, ObjectId } from '@dxos/keys';
8
+ import { EID, EntityId, DXN } from '@dxos/keys';
9
9
 
10
- import { EchoObjectSchema, getObjectDXN } from '../Entity';
10
+ import * as Type from '../../Type';
11
+ import { EchoObjectSchema, getObjectEchoUri } from '../Entity';
11
12
  import { createObject } from '../Obj';
12
13
  import { Ref, getReferenceAst } from './ref';
13
14
 
14
15
  const Task = Schema.Struct({
15
16
  title: Schema.optional(Schema.String),
16
- }).pipe(
17
- EchoObjectSchema({
18
- typename: 'com.example.type.task',
19
- version: '0.1.0',
20
- }),
21
- );
17
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.task', '0.1.0')));
22
18
 
23
- type Task = Schema.Schema.Type<typeof Task>;
19
+ type Task = Type.InstanceType<typeof Task>;
24
20
 
25
21
  const Contact = Schema.Struct({
26
22
  name: Schema.String,
27
23
  email: Schema.optional(Schema.String),
28
24
  tasks: Schema.Array(Ref(Task)),
29
- }).pipe(
30
- EchoObjectSchema({
31
- typename: 'com.example.type.person',
32
- version: '0.1.0',
33
- }),
34
- );
25
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.person', '0.1.0')));
35
26
 
36
- type Contact = Schema.Schema.Type<typeof Contact>;
27
+ type Contact = Type.InstanceType<typeof Contact>;
37
28
 
38
29
  describe('Ref', () => {
39
30
  test('Schema is', () => {
40
- Ref(Contact).pipe(Schema.is)(Ref.fromDXN(DXN.parse(`dxn:echo:@:${ObjectId.random()}`)));
31
+ Ref(Contact).pipe(Schema.is)(Ref.fromURI(EID.make({ entityId: EntityId.random() })));
41
32
  });
42
33
 
43
34
  test('ref ast', () => {
44
35
  const ref = Ref(Task);
45
36
  expect(ref.ast._tag).toEqual('Declaration');
46
37
  const refAst = getReferenceAst(ref.ast);
47
- expect(refAst).toEqual({ typename: Task.typename, version: Task.version });
38
+ expect(refAst).toEqual({ typename: Type.getTypename(Task), version: Type.getVersion(Task) });
48
39
  });
49
40
 
50
41
  // TODO(dmaretskyi): Figure out how to expose this in the API.
@@ -55,14 +46,14 @@ describe('Ref', () => {
55
46
  const json = JSON.parse(JSON.stringify(contact));
56
47
  expect(json).toEqual({
57
48
  id: contact.id,
58
- '@type': `dxn:type:${Contact.typename}:${Contact.version}`,
49
+ '@type': `dxn:${Type.getTypename(Contact)}:${Type.getVersion(Contact)}`,
59
50
  '@meta': {
60
51
  keys: [],
61
52
  },
62
53
  name: 'John Doe',
63
54
  tasks: [
64
55
  {
65
- '/': getObjectDXN(task as any)!.toString(),
56
+ '/': getObjectEchoUri(task)!.toString(),
66
57
  target: JSON.parse(JSON.stringify(task)),
67
58
  },
68
59
  ],
@@ -76,25 +67,25 @@ describe('Ref', () => {
76
67
  const json = JSON.parse(JSON.stringify(contact));
77
68
  expect(json).toEqual({
78
69
  id: contact.id,
79
- '@type': `dxn:type:${Contact.typename}:${Contact.version}`,
70
+ '@type': `dxn:${Type.getTypename(Contact)}:${Type.getVersion(Contact)}`,
80
71
  '@meta': {
81
72
  keys: [],
82
73
  },
83
74
  name: 'John Doe',
84
- tasks: [{ '/': getObjectDXN(task)!.toString() }],
75
+ tasks: [{ '/': getObjectEchoUri(task)!.toString() }],
85
76
  });
86
77
  });
87
78
 
88
79
  test('decode object', () => {
89
- const id = ObjectId.random();
80
+ const id = EntityId.random();
90
81
  const contactData = {
91
- id: ObjectId.random(),
82
+ id: EntityId.random(),
92
83
  name: 'John Doe',
93
- tasks: [{ '/': `dxn:echo:@:${id}` }],
84
+ tasks: [{ '/': `echo:/${id}` }],
94
85
  };
95
86
 
96
- const contact = Contact.pipe(Schema.decodeUnknownSync)(contactData);
87
+ const contact = Type.getSchema(Contact).pipe(Schema.decodeUnknownSync)(contactData);
97
88
  expect(Ref.isRef(contact.tasks[0])).toEqual(true);
98
- expect(contact.tasks[0].dxn.toString()).toEqual(`dxn:echo:@:${id}`);
89
+ expect(contact.tasks[0].uri.toString()).toEqual(`echo:/${id}`);
99
90
  });
100
91
  });