@dxos/echo 0.8.4-staging.ac66bdf99f → 0.9.0

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 (437) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +37 -6
  4. package/dist/lib/neutral/Database.mjs +6 -17
  5. package/dist/lib/neutral/Entity.mjs +31 -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 +29 -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-3PBP4V4O.mjs +101 -0
  26. package/dist/lib/neutral/chunk-3PBP4V4O.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-4ZUHOTCG.mjs +184 -0
  28. package/dist/lib/neutral/chunk-4ZUHOTCG.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-5SMDBFVB.mjs +108 -0
  30. package/dist/lib/neutral/chunk-5SMDBFVB.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-OS35K56T.mjs → chunk-5SUJPHAE.mjs} +3 -3
  32. package/dist/lib/neutral/{chunk-OS35K56T.mjs.map → chunk-5SUJPHAE.mjs.map} +2 -2
  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-V36VO5SS.mjs → chunk-6YDI3J37.mjs} +32 -40
  36. package/dist/lib/neutral/chunk-6YDI3J37.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-MOR5ERFM.mjs → chunk-7FPIAJIV.mjs} +701 -1256
  38. package/dist/lib/neutral/chunk-7FPIAJIV.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  40. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-JUXPFOEI.mjs → chunk-7PI7C4EF.mjs} +48 -88
  42. package/dist/lib/neutral/chunk-7PI7C4EF.mjs.map +7 -0
  43. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  44. package/dist/lib/neutral/chunk-BBFJWWAV.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-7RO7CPBZ.mjs → chunk-IGK6FN65.mjs} +2 -2
  48. package/dist/lib/neutral/{chunk-HBUZJNZO.mjs → chunk-LWXVKPPW.mjs} +94 -99
  49. package/dist/lib/neutral/chunk-LWXVKPPW.mjs.map +7 -0
  50. package/dist/lib/neutral/{chunk-BVOFLCVF.mjs → chunk-MZ7K3MLL.mjs} +9 -6
  51. package/dist/lib/neutral/chunk-MZ7K3MLL.mjs.map +7 -0
  52. package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-O6BH7EPN.mjs} +30 -3
  53. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  54. package/dist/lib/neutral/{chunk-EAMSSLZC.mjs → chunk-QQIYS74I.mjs} +83 -46
  55. package/dist/lib/neutral/chunk-QQIYS74I.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-R5W6DXR4.mjs +678 -0
  57. package/dist/lib/neutral/chunk-R5W6DXR4.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-WAK4DMFV.mjs → chunk-RIVWNMSF.mjs} +12 -7
  59. package/dist/lib/neutral/chunk-RIVWNMSF.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-T6W2LEZU.mjs → chunk-SBVFRTST.mjs} +73 -38
  61. package/dist/lib/neutral/chunk-SBVFRTST.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-T6E37YIP.mjs +251 -0
  63. package/dist/lib/neutral/chunk-T6E37YIP.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-B4BASU6W.mjs → chunk-TYGKCRMK.mjs} +85 -76
  67. package/dist/lib/neutral/chunk-TYGKCRMK.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-4OIBYSXE.mjs → chunk-UUP46KUQ.mjs} +78 -32
  69. package/dist/lib/neutral/chunk-UUP46KUQ.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-WISOH2XH.mjs +36 -0
  71. package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +7 -0
  72. package/dist/lib/neutral/{chunk-G3IQMKF7.mjs → chunk-WTQJHC75.mjs} +111 -112
  73. package/dist/lib/neutral/chunk-WTQJHC75.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-WU3GIANS.mjs +31 -0
  75. package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +7 -0
  76. package/dist/lib/neutral/{chunk-TU3GW67D.mjs → chunk-ZGNNFYHS.mjs} +40 -40
  77. package/dist/lib/neutral/chunk-ZGNNFYHS.mjs.map +7 -0
  78. package/dist/lib/neutral/index.mjs +47 -41
  79. package/dist/lib/neutral/internal/index.mjs +137 -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 +56 -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 +101 -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 +66 -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 +104 -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 +362 -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 +79 -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 +38 -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/ref-array.d.ts +2 -2
  207. package/dist/types/src/internal/Ref/ref.d.ts +50 -19
  208. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  209. package/dist/types/src/internal/Ref/utils.d.ts +8 -0
  210. package/dist/types/src/internal/Ref/utils.d.ts.map +1 -0
  211. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  212. package/dist/types/src/internal/Type/index.d.ts +1 -2
  213. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  214. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  215. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  216. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  217. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  218. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  219. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  220. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  221. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  222. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  223. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  224. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  225. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  227. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  228. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  231. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  232. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  233. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  235. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  236. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  237. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  238. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  239. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  240. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  241. package/dist/types/src/internal/common/types/entity.d.ts +62 -5
  242. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  243. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  244. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  245. package/dist/types/src/internal/common/types/meta.d.ts +33 -12
  246. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  247. package/dist/types/src/internal/common/types/model-symbols.d.ts +15 -4
  248. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  249. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  250. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  251. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  252. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  253. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  254. package/dist/types/src/internal/index.d.ts +2 -2
  255. package/dist/types/src/internal/index.d.ts.map +1 -1
  256. package/dist/types/src/testing/index.d.ts +1 -0
  257. package/dist/types/src/testing/index.d.ts.map +1 -1
  258. package/dist/types/src/testing/registry.d.ts +9 -0
  259. package/dist/types/src/testing/registry.d.ts.map +1 -0
  260. package/dist/types/src/testing/test-data.d.ts +8 -8
  261. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  262. package/dist/types/src/testing/test-schema.d.ts +83 -89
  263. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  264. package/dist/types/src/testing/util.d.ts +5 -3
  265. package/dist/types/src/testing/util.d.ts.map +1 -1
  266. package/dist/types/tsconfig.tsbuildinfo +1 -1
  267. package/package.json +26 -24
  268. package/src/Annotation.test.ts +439 -0
  269. package/src/Annotation.ts +158 -4
  270. package/src/Collection.ts +5 -9
  271. package/src/Database.ts +93 -100
  272. package/src/Dataset.ts +10 -2
  273. package/src/Entity.test.ts +116 -6
  274. package/src/Entity.ts +134 -32
  275. package/src/Err.ts +4 -4
  276. package/src/Feed.ts +92 -44
  277. package/src/Filter.ts +70 -40
  278. package/src/Format.ts +0 -4
  279. package/src/Hypergraph.ts +14 -9
  280. package/src/Json.test.ts +175 -0
  281. package/src/Json.ts +103 -0
  282. package/src/Key.ts +1 -1
  283. package/src/Migration.ts +39 -19
  284. package/src/Obj.test.ts +122 -20
  285. package/src/Obj.ts +168 -91
  286. package/src/Order.ts +22 -0
  287. package/src/Query.test.ts +183 -154
  288. package/src/Query.ts +172 -85
  289. package/src/QueryResult.ts +26 -0
  290. package/src/Ref.ts +22 -4
  291. package/src/Registry.ts +155 -0
  292. package/src/Relation.test.ts +10 -10
  293. package/src/Relation.ts +116 -69
  294. package/src/Scope.ts +50 -0
  295. package/src/Tag.md +88 -0
  296. package/src/Tag.ts +49 -6
  297. package/src/Type.test.ts +223 -18
  298. package/src/Type.ts +609 -131
  299. package/src/View.ts +14 -23
  300. package/src/exemplars.test.ts +21 -0
  301. package/src/index.ts +4 -4
  302. package/src/internal/Annotation/annotations.test.ts +31 -11
  303. package/src/internal/Annotation/annotations.ts +143 -111
  304. package/src/internal/Annotation/dictionary.ts +47 -0
  305. package/src/internal/Annotation/entity-dictionary.ts +74 -0
  306. package/src/internal/Annotation/index.ts +4 -2
  307. package/src/internal/Annotation/util.ts +17 -8
  308. package/src/internal/Entity/api.ts +54 -7
  309. package/src/internal/Entity/entity.ts +196 -47
  310. package/src/internal/Entity/guard.ts +26 -0
  311. package/src/internal/Entity/index.ts +2 -0
  312. package/src/internal/Entity/model.ts +38 -28
  313. package/src/internal/Entity/object.ts +21 -5
  314. package/src/internal/Entity/relation.ts +68 -34
  315. package/src/internal/Entity/type-kind.ts +75 -0
  316. package/src/internal/Entity/type-uri.ts +92 -0
  317. package/src/internal/Entity/util.ts +9 -9
  318. package/src/internal/Format/date.ts +0 -4
  319. package/src/internal/Format/format.test.ts +21 -0
  320. package/src/internal/Format/index.ts +2 -3
  321. package/src/internal/Format/object.ts +21 -4
  322. package/src/internal/Format/types.ts +1 -1
  323. package/src/internal/JsonSchema/annotations.ts +1 -1
  324. package/src/internal/JsonSchema/json-schema-type.ts +4 -4
  325. package/src/internal/JsonSchema/json-schema.test.ts +71 -145
  326. package/src/internal/JsonSchema/json-schema.ts +49 -35
  327. package/src/internal/Obj/atoms.ts +244 -0
  328. package/src/internal/Obj/clone.ts +9 -4
  329. package/src/internal/Obj/create-object.test.ts +12 -10
  330. package/src/internal/Obj/create-object.ts +68 -22
  331. package/src/internal/Obj/index.ts +1 -1
  332. package/src/internal/Obj/inspect.ts +5 -3
  333. package/src/internal/Obj/json-serializer.test.ts +101 -22
  334. package/src/internal/Obj/json-serializer.ts +89 -33
  335. package/src/internal/Obj/set-value.test.ts +22 -45
  336. package/src/internal/Obj/set-value.ts +12 -19
  337. package/src/internal/Obj/snapshot.ts +13 -4
  338. package/src/internal/Obj/typed-object.test.ts +9 -11
  339. package/src/internal/Obj/typed-object.ts +1 -1
  340. package/src/internal/Query/index.ts +5 -0
  341. package/src/internal/{Query.ts → Query/pretty.ts} +40 -12
  342. package/src/internal/Ref/atoms.ts +20 -0
  343. package/src/internal/Ref/ref-array.ts +3 -3
  344. package/src/internal/Ref/ref.test.ts +18 -27
  345. package/src/internal/Ref/ref.ts +137 -59
  346. package/src/internal/Ref/utils.ts +45 -0
  347. package/src/internal/Type/compose.test.ts +3 -1
  348. package/src/internal/Type/index.ts +1 -2
  349. package/src/internal/Type/manipulation.ts +0 -25
  350. package/src/internal/Type/type-schema.ts +60 -0
  351. package/src/internal/common/README.md +2 -2
  352. package/src/internal/common/api/meta.ts +19 -17
  353. package/src/internal/common/proxy/change-context.ts +1 -1
  354. package/src/internal/common/proxy/change.test.ts +91 -83
  355. package/src/internal/common/proxy/errors.ts +2 -2
  356. package/src/internal/common/proxy/handler.test.ts +1 -1
  357. package/src/internal/common/proxy/json-serializer.ts +27 -16
  358. package/src/internal/common/proxy/make-object.ts +44 -20
  359. package/src/internal/common/proxy/ownership.ts +2 -2
  360. package/src/internal/common/proxy/reactive-array.ts +1 -1
  361. package/src/internal/common/proxy/reactive.test.ts +54 -0
  362. package/src/internal/common/proxy/reactive.ts +11 -2
  363. package/src/internal/common/proxy/schema.test.ts +48 -86
  364. package/src/internal/common/proxy/typed-handler.test.ts +12 -11
  365. package/src/internal/common/proxy/typed-handler.ts +78 -16
  366. package/src/internal/common/proxy/typed-object.test.ts +16 -28
  367. package/src/internal/common/types/base.ts +4 -4
  368. package/src/internal/common/types/entity.ts +80 -1
  369. package/src/internal/common/types/index.ts +6 -1
  370. package/src/internal/common/types/meta.ts +62 -20
  371. package/src/internal/common/types/model-symbols.ts +24 -4
  372. package/src/internal/common/types/typename.ts +39 -3
  373. package/src/internal/common/types/well-known-types.ts +15 -0
  374. package/src/internal/index.ts +6 -4
  375. package/src/testing/api.test.ts +15 -9
  376. package/src/testing/index.ts +1 -0
  377. package/src/testing/registry.ts +44 -0
  378. package/src/testing/test-data.ts +159 -99
  379. package/src/testing/test-schema.ts +22 -58
  380. package/src/testing/util.ts +14 -11
  381. package/dist/lib/neutral/Extension.mjs +0 -18
  382. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  383. package/dist/lib/neutral/chunk-2KHZ36F5.mjs +0 -361
  384. package/dist/lib/neutral/chunk-2KHZ36F5.mjs.map +0 -7
  385. package/dist/lib/neutral/chunk-4OIBYSXE.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-4P3IXBLT.mjs +0 -45
  387. package/dist/lib/neutral/chunk-4P3IXBLT.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  389. package/dist/lib/neutral/chunk-B4BASU6W.mjs.map +0 -7
  390. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  391. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-BVOFLCVF.mjs.map +0 -7
  393. package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-EAMSSLZC.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-G3IQMKF7.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +0 -7
  397. package/dist/lib/neutral/chunk-HBUZJNZO.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-JUXPFOEI.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-MOR5ERFM.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  401. package/dist/lib/neutral/chunk-PHU22NLC.mjs +0 -136
  402. package/dist/lib/neutral/chunk-PHU22NLC.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-ROG4RXXL.mjs +0 -97
  404. package/dist/lib/neutral/chunk-ROG4RXXL.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-T6W2LEZU.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-TU3GW67D.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-V36VO5SS.mjs.map +0 -7
  411. package/dist/lib/neutral/chunk-WAK4DMFV.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-YAHXAYOW.mjs +0 -56
  413. package/dist/lib/neutral/chunk-YAHXAYOW.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +0 -50
  415. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +0 -7
  416. package/dist/types/src/Extension.d.ts +0 -80
  417. package/dist/types/src/Extension.d.ts.map +0 -1
  418. package/dist/types/src/Extension.test.d.ts +0 -2
  419. package/dist/types/src/Extension.test.d.ts.map +0 -1
  420. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  421. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  422. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  423. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  424. package/dist/types/src/internal/Query.d.ts.map +0 -1
  425. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  426. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  427. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  428. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  429. package/src/Extension.test.ts +0 -235
  430. package/src/Extension.ts +0 -122
  431. package/src/SchemaRegistry.ts +0 -106
  432. package/src/internal/Obj/ids.ts +0 -12
  433. package/src/internal/Type/echo-schema.ts +0 -423
  434. package/src/internal/Type/persistent-schema.ts +0 -33
  435. /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
  436. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
  437. /package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs.map → chunk-IGK6FN65.mjs.map} +0 -0
@@ -6,24 +6,22 @@ import type * as Schema from 'effect/Schema';
6
6
 
7
7
  import { type ForeignKey } from '@dxos/echo-protocol';
8
8
  import { invariant } from '@dxos/invariant';
9
- import { DXN, ObjectId } from '@dxos/keys';
9
+ import { EID, EntityId, type URI } from '@dxos/keys';
10
10
  import { assumeType } from '@dxos/util';
11
11
 
12
12
  import type * as Database from '../../Database';
13
13
  import {
14
- type ATTR_META,
15
14
  type ATTR_PARENT,
16
15
  type ATTR_TYPE,
17
16
  ATTR_DELETED,
18
17
  ATTR_RELATION_SOURCE,
19
18
  ATTR_RELATION_TARGET,
20
- ATTR_SELF_DXN,
19
+ ATTR_SELF_URI,
20
+ ATTR_SELF_URI_LEGACY,
21
21
  EntityKind,
22
22
  KindId,
23
- type MetaId,
24
23
  ObjectDatabaseId,
25
24
  ObjectDeletedId,
26
- type ObjectMeta,
27
25
  ObjectVersionId,
28
26
  type ParentId,
29
27
  RelationSourceDXNId,
@@ -31,12 +29,22 @@ import {
31
29
  RelationTargetDXNId,
32
30
  RelationTargetId,
33
31
  type SchemaId,
34
- SelfDXNId,
32
+ SelfURIId,
35
33
  TypeId,
36
34
  type Version,
37
35
  } from '../common/types';
36
+ import { type ATTR_META, type EntityMeta } from '../common/types/meta';
37
+ import { type MetaId } from '../common/types/model-symbols';
38
38
 
39
- export { ATTR_DELETED, ATTR_SELF_DXN, ObjectDatabaseId, ObjectDeletedId, ObjectVersionId, SelfDXNId };
39
+ export {
40
+ ATTR_DELETED,
41
+ ATTR_SELF_URI,
42
+ ATTR_SELF_URI_LEGACY,
43
+ ObjectDatabaseId,
44
+ ObjectDeletedId,
45
+ ObjectVersionId,
46
+ SelfURIId,
47
+ };
40
48
 
41
49
  /**
42
50
  * Internal runtime representation of an object.
@@ -44,18 +52,18 @@ export { ATTR_DELETED, ATTR_SELF_DXN, ObjectDatabaseId, ObjectDeletedId, ObjectV
44
52
  */
45
53
  // NOTE: Each symbol has a jsdoc describing its purpose.
46
54
  export interface InternalObjectProps {
47
- readonly id: ObjectId;
48
- readonly [SelfDXNId]: DXN;
55
+ readonly id: EntityId;
56
+ readonly [SelfURIId]: EID.EID;
49
57
  readonly [KindId]: EntityKind;
50
58
  readonly [SchemaId]: Schema.Schema.AnyNoContext;
51
- readonly [TypeId]: DXN;
52
- readonly [MetaId]?: ObjectMeta;
59
+ readonly [TypeId]: URI.URI;
60
+ readonly [MetaId]?: EntityMeta;
53
61
  [ParentId]?: InternalObjectProps;
54
62
  readonly [ObjectDatabaseId]?: Database.Database;
55
63
  readonly [ObjectDeletedId]?: boolean;
56
64
  readonly [ObjectVersionId]?: Version;
57
- readonly [RelationSourceDXNId]?: DXN;
58
- readonly [RelationTargetDXNId]?: DXN;
65
+ readonly [RelationSourceDXNId]?: EID.EID;
66
+ readonly [RelationTargetDXNId]?: EID.EID;
59
67
  readonly [RelationSourceId]?: InternalObjectProps;
60
68
  readonly [RelationTargetId]?: InternalObjectProps;
61
69
  }
@@ -63,23 +71,25 @@ export interface InternalObjectProps {
63
71
  /**
64
72
  * Entity metadata.
65
73
  */
66
- export interface ObjectMetaJSON {
74
+ export interface EntityMetaJSON {
67
75
  keys: ForeignKey[];
68
76
  tags?: string[];
77
+ key?: string;
78
+ version?: string;
69
79
  }
70
80
 
71
81
  /**
72
82
  * JSON representation of an object or relation metadata.
73
83
  */
74
84
  export interface ObjectJSON {
75
- id: string;
76
- [ATTR_TYPE]: DXN.String;
77
- [ATTR_SELF_DXN]?: DXN.String;
78
- [ATTR_PARENT]?: string; // Encoded reference
85
+ id: EntityId;
86
+ [ATTR_TYPE]?: URI.URI;
87
+ [ATTR_SELF_URI]?: EID.EID;
88
+ [ATTR_PARENT]?: EID.EID; // Encoded reference
79
89
  [ATTR_DELETED]?: boolean;
80
- [ATTR_META]?: ObjectMetaJSON;
81
- [ATTR_RELATION_SOURCE]?: DXN.String;
82
- [ATTR_RELATION_TARGET]?: DXN.String;
90
+ [ATTR_META]?: EntityMetaJSON;
91
+ [ATTR_RELATION_SOURCE]?: EID.EID;
92
+ [ATTR_RELATION_TARGET]?: EID.EID;
83
93
 
84
94
  /**
85
95
  * Application-specific properties.
@@ -93,17 +103,17 @@ export interface ObjectJSON {
93
103
  export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
94
104
  invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
95
105
  assumeType<InternalObjectProps>(obj);
96
- invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');
97
- invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');
106
+ invariant(EntityId.isValid(obj.id), 'Invalid object model: invalid id');
107
+ invariant(obj[TypeId] === undefined || typeof obj[TypeId] === 'string', 'Invalid object model: invalid type');
98
108
  invariant(
99
- obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
109
+ obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation || obj[KindId] === EntityKind.Type,
100
110
  'Invalid object model: invalid entity kind',
101
111
  );
102
112
 
103
113
  if (obj[KindId] === EntityKind.Relation) {
104
- invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');
105
- invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');
106
- invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');
107
- invariant(!(obj[RelationTargetId] instanceof DXN), 'Invalid object model: target pointer is a DXN');
114
+ invariant(EID.isEID(obj[RelationSourceDXNId]), 'Invalid object model: invalid relation source');
115
+ invariant(EID.isEID(obj[RelationTargetDXNId]), 'Invalid object model: invalid relation target');
116
+ invariant(!EID.isEID(obj[RelationSourceId]), 'Invalid object model: source pointer is a DXN');
117
+ invariant(!EID.isEID(obj[RelationTargetId]), 'Invalid object model: target pointer is a DXN');
108
118
  }
109
119
  }
@@ -6,10 +6,13 @@ import * as Schema from 'effect/Schema';
6
6
  import * as SchemaAST from 'effect/SchemaAST';
7
7
 
8
8
  import { invariant } from '@dxos/invariant';
9
+ import { DXN } from '@dxos/keys';
9
10
 
10
- import { type TypeAnnotation, TypeAnnotationId, type TypeMeta, makeTypeJsonSchemaAnnotation } from '../Annotation';
11
+ import { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';
12
+ import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
11
13
  import { EntityKind } from '../common/types';
12
- import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
14
+ import { toJsonSchema } from '../JsonSchema';
15
+ import { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';
13
16
 
14
17
  /**
15
18
  * Object schema type with kind marker.
@@ -25,11 +28,16 @@ export type EchoObjectSchema<
25
28
  */
26
29
  export const EchoObjectSchema: {
27
30
  (
28
- meta: TypeMeta,
31
+ dxn: DXN.DXN,
32
+ options?: EchoTypeOptions,
29
33
  ): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
30
34
  self: Self & { fields?: Fields },
31
35
  ) => EchoObjectSchema<Self, Fields>;
32
- } = ({ typename, version }) => {
36
+ } = (dxn, options) => {
37
+ const typename = DXN.getName(dxn);
38
+ const version = DXN.getVersion(dxn);
39
+ invariant(version, `Type.makeObject requires a versioned DXN: ${dxn}`);
40
+
33
41
  return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
34
42
  self: Self & { fields?: Fields },
35
43
  ): EchoObjectSchema<Self, Fields> => {
@@ -52,6 +60,14 @@ export const EchoObjectSchema: {
52
60
  }),
53
61
  });
54
62
 
55
- return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(fields, ast, typename, version, EntityKind.Object);
63
+ return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(
64
+ fields,
65
+ ast,
66
+ typename,
67
+ version,
68
+ EntityKind.Object,
69
+ () => toJsonSchema(Schema.make(ast)),
70
+ options?.id,
71
+ );
56
72
  };
57
73
  };
@@ -7,17 +7,20 @@ import * as SchemaAST from 'effect/SchemaAST';
7
7
 
8
8
  import { raise } from '@dxos/debug';
9
9
  import { assertArgument, invariant } from '@dxos/invariant';
10
- import { DXN } from '@dxos/keys';
10
+ import { DXN, type EntityId } from '@dxos/keys';
11
11
 
12
+ // Type-only imports (erased at runtime — no import cycle); `internal` may depend
13
+ // on the top-level `Obj` / `Type` API at the type level only.
14
+ import type * as Obj from '../../Obj';
15
+ import type * as Type from '../../Type';
12
16
  import {
13
17
  type TypeAnnotation,
14
18
  TypeAnnotationId,
15
- type TypeMeta,
16
19
  getEntityKind,
17
20
  getSchemaTypename,
18
21
  getTypeIdentifierAnnotation,
19
- makeTypeJsonSchemaAnnotation,
20
- } from '../Annotation';
22
+ } from '../Annotation/annotations';
23
+ import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
21
24
  import {
22
25
  ATTR_RELATION_SOURCE,
23
26
  ATTR_RELATION_TARGET,
@@ -26,6 +29,8 @@ import {
26
29
  RelationSourceId,
27
30
  RelationTargetDXNId,
28
31
  RelationTargetId,
32
+ type UnknownTypeSchema,
33
+ getStaticTypeSchema,
29
34
  } from '../common/types';
30
35
 
31
36
  export {
@@ -37,6 +42,7 @@ export {
37
42
  RelationTargetId,
38
43
  };
39
44
 
45
+ import { toJsonSchema } from '../JsonSchema';
40
46
  import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
41
47
 
42
48
  /**
@@ -58,55 +64,75 @@ export type RelationSourceTargetRefs<Source = any, Target = any> = {
58
64
  export type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;
59
65
  export type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;
60
66
 
61
- export type EchoRelationSchemaOptions<
62
- TSource extends Schema.Schema.AnyNoContext,
63
- TTarget extends Schema.Schema.AnyNoContext,
64
- > = TypeMeta & {
67
+ /**
68
+ * Accepted relation endpoint: an object-kind `Type.Type` entity (slot-backed)
69
+ * or the branded `Obj.Unknown` schema. Source/target are constrained to these
70
+ * relations only connect object-kind entities.
71
+ */
72
+ export type RelationEndpoint = Type.AnyObj | UnknownTypeSchema<any, EntityKind.Object>;
73
+
74
+ /**
75
+ * Resolves a relation endpoint to the instance type it describes — the source /
76
+ * target instance recorded on the relation's `RelationSourceTargetRefs`.
77
+ */
78
+ export type RelationEndpointInstance<S> =
79
+ S extends UnknownTypeSchema<infer A, any> ? A : S extends Type.AnyObj ? Type.InstanceType<S> : unknown;
80
+
81
+ export type EchoRelationSchemaOptions<TSource extends RelationEndpoint, TTarget extends RelationEndpoint> = {
82
+ dxn: DXN.DXN;
65
83
  source: TSource;
66
84
  target: TTarget;
85
+ /**
86
+ * Override the entity id stamped on the in-memory `Type.Type` value.
87
+ *
88
+ * Defaults to `EntityId.deterministic(typename, version)` — stable across processes
89
+ * and workerd-safe (no `crypto.getRandomValues()` at module-evaluation time).
90
+ */
91
+ id?: EntityId;
67
92
  };
68
93
 
69
94
  /**
70
- * Relation schema type with kind marker.
95
+ * Relation schema type with kind marker. `SourceInstance` / `TargetInstance`
96
+ * are the resolved endpoint instance types (see {@link RelationEndpointInstance}).
71
97
  */
72
98
  export type EchoRelationSchema<
73
99
  Self extends Schema.Schema.Any,
74
- Source extends Schema.Schema.AnyNoContext,
75
- Target extends Schema.Schema.AnyNoContext,
100
+ SourceInstance extends Obj.Unknown,
101
+ TargetInstance extends Obj.Unknown,
76
102
  Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
77
- > = EchoTypeSchema<
78
- Self,
79
- RelationSourceTargetRefs<Schema.Schema.Type<Source>, Schema.Schema.Type<Target>>,
80
- EntityKind.Relation,
81
- Fields
82
- >;
103
+ > = EchoTypeSchema<Self, RelationSourceTargetRefs<SourceInstance, TargetInstance>, EntityKind.Relation, Fields>;
83
104
 
84
105
  /**
85
106
  * Schema for Relation entity types.
86
107
  */
87
- export const EchoRelationSchema = <
88
- Source extends Schema.Schema.AnyNoContext,
89
- Target extends Schema.Schema.AnyNoContext,
90
- >({
108
+ export const EchoRelationSchema = <Source extends RelationEndpoint, Target extends RelationEndpoint>({
109
+ dxn,
91
110
  source,
92
111
  target,
93
- typename,
94
- version,
112
+ id: explicitId,
95
113
  }: EchoRelationSchemaOptions<Source, Target>) => {
96
- assertArgument(Schema.isSchema(source), 'source');
97
- assertArgument(Schema.isSchema(target), 'target');
98
- const sourceDXN = getDXNForRelationSchemaRef(source);
99
- const targetDXN = getDXNForRelationSchemaRef(target);
100
- if (getEntityKind(source) !== EntityKind.Object) {
114
+ // `source` / `target` are `Type.Type` entities (slot-backed) or the branded
115
+ // `Obj.Unknown` schema (used directly); resolve each to its Effect Schema for
116
+ // the schema-side machinery (DXN ref + entity-kind checks).
117
+ const sourceSchema = source != null ? (getStaticTypeSchema(source) ?? source) : source;
118
+ const targetSchema = target != null ? (getStaticTypeSchema(target) ?? target) : target;
119
+ assertArgument(Schema.isSchema(sourceSchema), 'source');
120
+ assertArgument(Schema.isSchema(targetSchema), 'target');
121
+ const typename = DXN.getName(dxn);
122
+ const version = DXN.getVersion(dxn);
123
+ invariant(version, `Type.makeRelation requires a versioned DXN: ${dxn}`);
124
+ const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);
125
+ const targetDXN = getDXNForRelationSchemaRef(targetSchema);
126
+ if (getEntityKind(sourceSchema) !== EntityKind.Object) {
101
127
  raise(new Error('Source schema must be an echo object schema.'));
102
128
  }
103
- if (getEntityKind(target) !== EntityKind.Object) {
129
+ if (getEntityKind(targetSchema) !== EntityKind.Object) {
104
130
  raise(new Error('Target schema must be an echo object schema.'));
105
131
  }
106
132
 
107
133
  return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
108
134
  self: Self & { fields?: Fields },
109
- ): EchoRelationSchema<Self, Source, Target, Fields> => {
135
+ ): EchoRelationSchema<Self, RelationEndpointInstance<Source>, RelationEndpointInstance<Target>, Fields> => {
110
136
  invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
111
137
 
112
138
  // Extract fields from the schema if available (Struct schemas have .fields).
@@ -134,15 +160,23 @@ export const EchoRelationSchema = <
134
160
  }),
135
161
  });
136
162
 
137
- return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(fields, ast, typename, version, EntityKind.Relation);
163
+ return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(
164
+ fields,
165
+ ast,
166
+ typename,
167
+ version,
168
+ EntityKind.Relation,
169
+ () => toJsonSchema(Schema.make(ast)),
170
+ explicitId,
171
+ );
138
172
  };
139
173
  };
140
174
 
141
- const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): string => {
175
+ export const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): DXN.DXN => {
142
176
  assertArgument(Schema.isSchema(schema), 'schema');
143
177
  const identifier = getTypeIdentifierAnnotation(schema);
144
178
  if (identifier) {
145
- return identifier;
179
+ return DXN.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));
146
180
  }
147
181
 
148
182
  const typename = getSchemaTypename(schema);
@@ -150,5 +184,5 @@ const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): string => {
150
184
  throw new Error('Schema must have a typename');
151
185
  }
152
186
 
153
- return DXN.fromTypename(typename).toString();
187
+ return DXN.make(typename);
154
188
  };
@@ -0,0 +1,75 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import { invariant } from '@dxos/invariant';
9
+ import { DXN } from '@dxos/keys';
10
+
11
+ import { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';
12
+ import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
13
+ import { EntityKind } from '../common/types';
14
+ import { toJsonSchema } from '../JsonSchema';
15
+ import { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';
16
+
17
+ /**
18
+ * Type-kind schema marker — produced by {@link EchoTypeKindSchema}.
19
+ *
20
+ * Distinguishes meta-schemas (entities of `EntityKind.Type`, such as the
21
+ * built-in `Type.Type` TypeSchema) from object and relation types.
22
+ */
23
+ export type EchoTypeKindSchema<
24
+ Self extends Schema.Schema.Any,
25
+ Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
26
+ > = EchoTypeSchema<Self, {}, EntityKind.Type, Fields>;
27
+
28
+ /**
29
+ * Pipeable that brands a schema as a type-kind ECHO entity. Mirrors
30
+ * {@link EchoObjectSchema} / {@link EchoRelationSchema}, but stamps the
31
+ * resulting entity with `[SchemaKindId]: EntityKind.Type` and a matching
32
+ * `TypeAnnotation.kind = 'type'` so meta-schemas surface uniformly through
33
+ * `Type.isTypeKind`, `Filter.type`, etc.
34
+ */
35
+ export const EchoTypeKindSchema: {
36
+ (
37
+ dxn: DXN.DXN,
38
+ options?: EchoTypeOptions,
39
+ ): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
40
+ self: Self & { fields?: Fields },
41
+ ) => EchoTypeKindSchema<Self, Fields>;
42
+ } = (dxn, options) => {
43
+ const typename = DXN.getName(dxn);
44
+ const version = DXN.getVersion(dxn);
45
+ invariant(version, `Type-kind schemas require a versioned DXN: ${dxn}`);
46
+
47
+ return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
48
+ self: Self & { fields?: Fields },
49
+ ): EchoTypeKindSchema<Self, Fields> => {
50
+ invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
51
+
52
+ const fields = ((self as any).fields ?? {}) as Fields;
53
+
54
+ const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
55
+ const ast = SchemaAST.annotations(schemaWithId.ast, {
56
+ ...self.ast.annotations,
57
+ [TypeAnnotationId]: { kind: EntityKind.Type, typename, version } satisfies TypeAnnotation,
58
+ [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
59
+ kind: EntityKind.Type,
60
+ typename,
61
+ version,
62
+ }),
63
+ });
64
+
65
+ return makeEchoTypeSchema<Self, EntityKind.Type, Fields>(
66
+ fields,
67
+ ast,
68
+ typename,
69
+ version,
70
+ EntityKind.Type,
71
+ () => toJsonSchema(Schema.make(ast)),
72
+ options?.id,
73
+ );
74
+ };
75
+ };
@@ -0,0 +1,92 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { raise } from '@dxos/debug';
8
+ import { assertArgument } from '@dxos/invariant';
9
+ import { DXN, EID, URI } from '@dxos/keys';
10
+
11
+ import { getSchemaURI, getTypename } from '../Annotation/annotations';
12
+ import { type AnyEntity, InstancePhantomId, KindId, TypeId, getStaticTypeSchema } from '../common/types';
13
+ import { getUri as getUriFromEntity } from './api';
14
+
15
+ /**
16
+ * @param input schema, `Type.Type` entity, or a type URI (an `echo:` EID or a `dxn:` DXN).
17
+ * @return type identifier URI — see {@link getSchemaURI}. A URI is returned verbatim. For a
18
+ * `Type.Type` entity, the URI of the schema it declares, symmetric with what
19
+ * `Obj.make(typeEntity, ...)` stamps on `system.type`: a static declaration resolves to its
20
+ * typename DXN, a persisted entity to its local `echo:/<objectId>`.
21
+ */
22
+ export const getTypeURIFromSpecifier = (input: Schema.Schema.All | AnyEntity | URI.URI): URI.URI => {
23
+ if (Schema.isSchema(input)) {
24
+ return getSchemaURI(input) ?? raise(new TypeError('Schema has no URI'));
25
+ }
26
+ if (typeof input === 'object' && input !== null && KindId in input) {
27
+ // `Type.Type` entity. Both in-memory and persisted forms expose the schema
28
+ // they declare via `StaticTypeSchemaSlot`, whose URI is exactly what
29
+ // `Obj.make` stamps on `system.type` — a static declaration carries
30
+ // `TypeAnnotation` (→ typename DXN), a persisted entity's rebuilt schema
31
+ // carries `TypeIdentifierAnnotation` (→ local `echo:/<objectId>`).
32
+ const schema = getStaticTypeSchema(input);
33
+ if (schema != null) {
34
+ // Static types carry TypeAnnotation → DXN; persisted db types carry
35
+ // TypeIdentifierAnnotation → echo EID. In-memory makeObjectFromJsonSchema
36
+ // entities have neither (plain JSON Schema), so fall through to the EID path.
37
+ const uri = getSchemaURI(schema);
38
+ if (uri != null) {
39
+ return uri;
40
+ }
41
+ }
42
+ return getUriFromEntity(input as AnyEntity);
43
+ }
44
+ // A string specifier is already a branded URI — an `echo:` EID or a `dxn:` DXN.
45
+ assertArgument(EID.isEID(input) || DXN.isDXN(input), 'input', 'expected a type URI (EID or DXN)');
46
+ return input;
47
+ };
48
+
49
+ /**
50
+ * Checks if the object is an instance of the schema.
51
+ * Only typename is compared, the schema version is ignored.
52
+ *
53
+ * The following cases are considered to mean that the object is an instance of the schema:
54
+ * - Object was created with this exact schema.
55
+ * - Object was created with a different version of this schema.
56
+ * - Object was created with a different schema (maybe dynamic) that has the same typename.
57
+ */
58
+ // TODO(burdon): Can we use `Schema.is`?
59
+ export const isInstanceOf = <S>(
60
+ schemaOrType: S extends Schema.Schema.AnyNoContext ? S : Schema.Schema.AnyNoContext | AnyEntity,
61
+ object: any,
62
+ ): object is S extends Schema.Schema.AnyNoContext
63
+ ? Schema.Schema.Type<S>
64
+ : S extends { readonly [InstancePhantomId]?: infer A }
65
+ ? A
66
+ : unknown => {
67
+ if (object == null) {
68
+ return false;
69
+ }
70
+
71
+ const schemaURI = getTypeURIFromSpecifier(schemaOrType);
72
+
73
+ // `object` is arbitrary input — read TypeId directly (it may be missing on
74
+ // non-entities) rather than via `getTypeURI` which asserts the URI is set.
75
+ const type = (object as any)[TypeId];
76
+ if (URI.isURI(type) && type === schemaURI) {
77
+ return true;
78
+ }
79
+
80
+ const typename = getTypename(object);
81
+ if (!typename) {
82
+ return false;
83
+ }
84
+
85
+ if (!DXN.isDXN(schemaURI)) {
86
+ // EID-based schema URI — no typename match possible.
87
+ return false;
88
+ }
89
+
90
+ const parsed = DXN.tryMake(schemaURI);
91
+ return parsed != null && DXN.getName(parsed) === typename;
92
+ };
@@ -5,29 +5,29 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
7
  import { assertArgument, invariant } from '@dxos/invariant';
8
- import { DXN, ObjectId } from '@dxos/keys';
8
+ import { EID, EntityId } from '@dxos/keys';
9
9
  import { assumeType } from '@dxos/util';
10
10
 
11
- import { type InternalObjectProps, SelfDXNId } from './model';
11
+ import { type InternalObjectProps, SelfURIId } from './model';
12
12
 
13
13
  /**
14
- * Returns a DXN for an object or schema.
14
+ * Returns the EID of an object.
15
15
  *
16
16
  * @internal
17
17
  */
18
- export const getObjectDXN = (object: any): DXN | undefined => {
18
+ export const getObjectEchoUri = (object: any): EID.EID | undefined => {
19
19
  invariant(!Schema.isSchema(object), 'schema not allowed in this function');
20
20
  assertArgument(typeof object === 'object' && object != null, 'object', 'expected object');
21
21
  assumeType<InternalObjectProps>(object);
22
22
 
23
- if (object[SelfDXNId]) {
24
- invariant(object[SelfDXNId] instanceof DXN, 'Invalid object model: invalid self dxn');
25
- return object[SelfDXNId];
23
+ if (object[SelfURIId]) {
24
+ invariant(EID.isEID(object[SelfURIId]), 'Invalid object model: invalid self dxn');
25
+ return EID.parse(object[SelfURIId]);
26
26
  }
27
27
 
28
- if (!ObjectId.isValid(object.id)) {
28
+ if (!EntityId.isValid(object.id)) {
29
29
  throw new TypeError('Object id is not valid.');
30
30
  }
31
31
 
32
- return DXN.fromLocalObjectId(object.id);
32
+ return EID.make({ entityId: object.id });
33
33
  };
@@ -104,7 +104,6 @@ export const DateOnly = /* Schema.transformOrFail(Schema.String, SimpleDate, {
104
104
  }) */ Schema.String.pipe(
105
105
  FormatAnnotation.set(TypeFormat.Date),
106
106
  Schema.annotations({
107
- title: 'Date',
108
107
  description: 'Valid date in ISO format',
109
108
  }),
110
109
  );
@@ -134,7 +133,6 @@ export const TimeOnly = /* Schema.transformOrFail(Schema.String, SimpleTime, {
134
133
  }) */ Schema.String.pipe(
135
134
  FormatAnnotation.set(TypeFormat.Time),
136
135
  Schema.annotations({
137
- title: 'Time',
138
136
  description: 'Valid time in ISO format',
139
137
  }),
140
138
  );
@@ -179,7 +177,6 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
179
177
  }) */ Schema.String.pipe(
180
178
  FormatAnnotation.set(TypeFormat.DateTime),
181
179
  Schema.annotations({
182
- title: 'DateTime',
183
180
  description: 'Valid date and time in ISO format',
184
181
  }),
185
182
  );
@@ -191,7 +188,6 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
191
188
  export const Duration = Schema.String.pipe(
192
189
  FormatAnnotation.set(TypeFormat.Duration),
193
190
  Schema.annotations({
194
- title: 'Duration',
195
191
  description: 'Duration in ISO 8601 format',
196
192
  [SchemaAST.ExamplesAnnotationId]: ['1h', '3D'],
197
193
  }),
@@ -74,3 +74,24 @@ describe('formats', () => {
74
74
  }
75
75
  });
76
76
  });
77
+
78
+ describe('GeoPoint', () => {
79
+ const decode = Schema.decodeUnknownSync(Format.GeoPoint);
80
+
81
+ test('rounds high-precision coordinates to 7 decimal places', ({ expect }) => {
82
+ // Live geocoders (e.g. Nominatim/OSRM) emit > 7 decimals; rounding keeps them valid GeoPoints.
83
+ expect(decode([-0.12776534, 51.50744561])).toEqual([-0.1277653, 51.5074456]);
84
+ });
85
+
86
+ test('passes through coordinates already within precision', ({ expect }) => {
87
+ expect(decode([2.3522, 48.8566])).toEqual([2.3522, 48.8566]);
88
+ });
89
+
90
+ test('preserves an optional altitude', ({ expect }) => {
91
+ expect(decode([-0.12776534, 51.50744561, 42])).toEqual([-0.1277653, 51.5074456, 42]);
92
+ });
93
+
94
+ test('clamps out-of-range coordinates', ({ expect }) => {
95
+ expect(decode([200, 100])).toEqual([180, 90]);
96
+ });
97
+ });
@@ -2,11 +2,10 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export type { SimpleDate, SimpleDateTime, SimpleTime } from './date';
5
+ export * from './date';
6
+ export * from './format';
6
7
  export { CurrencyAnnotationId, DecimalPrecision, Currency } from './number';
7
8
  export { GeoPoint, GeoLocation } from './object';
8
-
9
- export * from './format';
10
9
  export * from './select';
11
10
  export * from './string';
12
11
  export * from './types';