@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
@@ -3,47 +3,70 @@ import {
3
3
  JsonSchemaType,
4
4
  toEffectSchema,
5
5
  toJsonSchema
6
- } from "./chunk-JUXPFOEI.mjs";
6
+ } from "./chunk-7PI7C4EF.mjs";
7
+ import {
8
+ ATTR_META,
9
+ EntityMetaSchema,
10
+ getMeta,
11
+ isEntity
12
+ } from "./chunk-4ZUHOTCG.mjs";
7
13
  import {
8
14
  Ref,
15
+ RefTypeId,
16
+ loadRefTarget,
9
17
  refFromEncodedReference,
10
18
  setRefResolver
11
- } from "./chunk-G3IQMKF7.mjs";
19
+ } from "./chunk-WTQJHC75.mjs";
12
20
  import {
21
+ ATTR_DELETED,
13
22
  ATTR_PARENT,
23
+ ATTR_RELATION_SOURCE,
24
+ ATTR_RELATION_TARGET,
25
+ ATTR_SELF_URI,
26
+ ATTR_SELF_URI_LEGACY,
14
27
  ATTR_TYPE,
15
28
  IconAnnotation,
16
29
  LabelAnnotation,
30
+ MetaId,
31
+ ObjectDatabaseId,
32
+ ObjectDeletedId,
33
+ ObjectVersionId,
17
34
  ParentId,
35
+ RelationSourceDXNId,
36
+ RelationSourceId,
37
+ RelationTargetDXNId,
38
+ RelationTargetId,
18
39
  SchemaId,
19
- SchemaMetaSymbol,
40
+ SelfURIId,
20
41
  TypeAnnotationId,
42
+ TypeEntityId,
21
43
  TypeId,
22
- TypeIdentifierAnnotationId,
23
- TypenameSchema,
24
- VersionSchema,
44
+ assertObjectModel,
45
+ getDatabase,
25
46
  getEntityKind,
26
47
  getLabel,
48
+ getObjectEchoUri,
27
49
  getSchema,
28
- getSchemaDXN,
29
50
  getSchemaTypename,
51
+ getSchemaURI,
52
+ getType,
30
53
  getTypeAnnotation,
31
- getTypeDXN,
32
54
  getTypeIdentifierAnnotation,
55
+ getTypeURI,
33
56
  getTypename,
34
57
  setSchema,
58
+ setType,
35
59
  setTypename
36
- } from "./chunk-2KHZ36F5.mjs";
60
+ } from "./chunk-R5W6DXR4.mjs";
37
61
  import {
38
62
  EntityKind,
39
63
  KindId,
40
64
  SchemaKindId,
41
65
  SnapshotKindId,
66
+ StaticTypeSchemaSlot,
67
+ getStaticTypeSchema,
42
68
  makeTypeJsonSchemaAnnotation
43
- } from "./chunk-TBKX6JQO.mjs";
44
-
45
- // src/internal/index.ts
46
- import { JsonPath, JsonProp, getValue, splitJsonPath } from "@dxos/effect";
69
+ } from "./chunk-O6BH7EPN.mjs";
47
70
 
48
71
  // src/internal/common/types/base.ts
49
72
  import * as Schema from "effect/Schema";
@@ -54,60 +77,6 @@ var RawObject = (schema) => {
54
77
  ]));
55
78
  };
56
79
 
57
- // src/internal/common/types/meta.ts
58
- import * as Schema2 from "effect/Schema";
59
- import { ForeignKey } from "@dxos/echo-protocol";
60
- import { invariant } from "@dxos/invariant";
61
- import { intersection } from "@dxos/util";
62
- var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/types/meta.ts";
63
- var ATTR_META = "@meta";
64
- var MetaId = /* @__PURE__ */ Symbol.for("@dxos/echo/Meta");
65
- var ObjectMetaSchema = Schema2.Struct({
66
- keys: Schema2.Array(ForeignKey),
67
- /**
68
- * A set of tags.
69
- * Tags are arbitrary application-defined strings.
70
- * ECHO makes no assumptions about the tag structure.
71
- */
72
- // TODO(dmaretskyi): Has to be optional for compatibility with old data.
73
- // Defaulting to an empty array is possible but requires a bit more work.
74
- // TODO(dmaretskyi): In automerge this should be a map of { [tag]: boolean } for uniqueness and conflict resolution.
75
- tags: Schema2.optional(Schema2.Array(Schema2.String))
76
- });
77
- var getMeta = (obj) => {
78
- const metadata = obj[MetaId];
79
- invariant(metadata, "ObjectMeta not found.", {
80
- F: __dxlog_file,
81
- L: 54,
82
- S: void 0,
83
- A: [
84
- "metadata",
85
- "'ObjectMeta not found.'"
86
- ]
87
- });
88
- return metadata;
89
- };
90
- var foreignKey = (source, id) => ({
91
- source,
92
- id
93
- });
94
- var foreignKeyEquals = (a, b) => a.source === b.source && a.id === b.id;
95
- var compareForeignKeys = (a, b) => intersection(getMeta(a).keys, getMeta(b).keys, foreignKeyEquals).length > 0;
96
-
97
- // src/internal/common/types/model-symbols.ts
98
- var ATTR_SELF_DXN = "@dxn";
99
- var SelfDXNId = /* @__PURE__ */ Symbol.for("@dxos/echo/DXN");
100
- var ATTR_DELETED = "@deleted";
101
- var ObjectDeletedId = /* @__PURE__ */ Symbol.for("@dxos/echo/Deleted");
102
- var ObjectVersionId = /* @__PURE__ */ Symbol.for("@dxos/echo/Version");
103
- var ObjectDatabaseId = /* @__PURE__ */ Symbol.for("@dxos/echo/Database");
104
- var ATTR_RELATION_SOURCE = "@relationSource";
105
- var RelationSourceId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationSource");
106
- var RelationSourceDXNId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationSourceDXN");
107
- var ATTR_RELATION_TARGET = "@relationTarget";
108
- var RelationTargetId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationTarget");
109
- var RelationTargetDXNId = /* @__PURE__ */ Symbol.for("@dxos/echo/RelationTargetDXN");
110
-
111
80
  // src/internal/common/types/version.ts
112
81
  var VersionTypeId = "~@dxos/echo/VersionTypeId";
113
82
 
@@ -135,64 +104,6 @@ var sort = (...comparators) => {
135
104
  };
136
105
  };
137
106
 
138
- // src/internal/common/api/meta.ts
139
- import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
140
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/api/meta.ts";
141
- function getMetaChecked(entity) {
142
- assertArgument(entity, "entity", "Should be an entity.");
143
- const meta = getMeta(entity);
144
- invariant2(meta != null, "Invalid entity.", {
145
- F: __dxlog_file2,
146
- L: 34,
147
- S: this,
148
- A: [
149
- "meta != null",
150
- "'Invalid entity.'"
151
- ]
152
- });
153
- return meta;
154
- }
155
- var getKeys = (entity, source) => {
156
- assertArgument(entity, "entity", "Should be an entity.");
157
- const meta = getMetaChecked(entity);
158
- invariant2(meta != null, "Invalid entity.", {
159
- F: __dxlog_file2,
160
- L: 45,
161
- S: void 0,
162
- A: [
163
- "meta != null",
164
- "'Invalid entity.'"
165
- ]
166
- });
167
- return meta.keys.filter((key) => key.source === source);
168
- };
169
- var deleteKeys = (entity, source) => {
170
- const meta = getMetaChecked(entity);
171
- for (let i = 0; i < meta.keys.length; i++) {
172
- if (meta.keys[i].source === source) {
173
- meta.keys.splice(i, 1);
174
- i--;
175
- }
176
- }
177
- };
178
- var addTag = (entity, tag) => {
179
- const meta = getMetaChecked(entity);
180
- meta.tags ??= [];
181
- meta.tags.push(tag);
182
- };
183
- var removeTag = (entity, tag) => {
184
- const meta = getMetaChecked(entity);
185
- if (!meta.tags) {
186
- return;
187
- }
188
- for (let i = 0; i < meta.tags.length; i++) {
189
- if (meta.tags[i] === tag) {
190
- meta.tags.splice(i, 1);
191
- i--;
192
- }
193
- }
194
- };
195
-
196
107
  // src/internal/common/proxy/symbols.ts
197
108
  var EventId = /* @__PURE__ */ Symbol.for("@dxos/live-object/EventId");
198
109
  var ChangeId = /* @__PURE__ */ Symbol.for("@dxos/live-object/ChangeId");
@@ -282,7 +193,7 @@ var defineHiddenProperty = (object, key, value2) => {
282
193
  // src/internal/common/proxy/errors.ts
283
194
  var MutationOutsideChangeContextError = class extends Error {
284
195
  constructor(operation, suggestion) {
285
- super(`Cannot ${operation} outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { ${suggestion} }) instead.`);
196
+ super(`Cannot ${operation} outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { ${suggestion} }) instead.`);
286
197
  this.name = "MutationOutsideChangeContextError";
287
198
  }
288
199
  };
@@ -297,10 +208,10 @@ var createArrayMethodError = (method) => {
297
208
  };
298
209
 
299
210
  // src/internal/common/proxy/json-serializer.ts
300
- import { invariant as invariant3 } from "@dxos/invariant";
301
- import { DXN } from "@dxos/keys";
302
- import { deepMapValues } from "@dxos/util";
303
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/json-serializer.ts";
211
+ import { invariant } from "@dxos/invariant";
212
+ import { EID } from "@dxos/keys";
213
+ import { deepMapValues, encodeUint8ArrayToJson } from "@dxos/util";
214
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/json-serializer.ts";
304
215
  var attachTypedJsonSerializer = (obj) => {
305
216
  const descriptor = Object.getOwnPropertyDescriptor(obj, "toJSON");
306
217
  if (descriptor) {
@@ -320,39 +231,23 @@ var typedJsonSerializer = function() {
320
231
  id
321
232
  };
322
233
  if (this[TypeId]) {
323
- result[ATTR_TYPE] = this[TypeId].toString();
234
+ result[ATTR_TYPE] = this[TypeId];
324
235
  }
325
236
  if (this[MetaId]) {
326
237
  result[ATTR_META] = serializeMeta(this[MetaId]);
327
238
  }
328
- if (this[SelfDXNId]) {
329
- result[ATTR_SELF_DXN] = this[SelfDXNId].toString();
239
+ if (this[SelfURIId]) {
240
+ result[ATTR_SELF_URI] = this[SelfURIId];
330
241
  }
331
242
  if (this[RelationSourceDXNId]) {
332
243
  const sourceDXN = this[RelationSourceDXNId];
333
- invariant3(sourceDXN instanceof DXN, void 0, {
334
- F: __dxlog_file3,
335
- L: 64,
336
- S: this,
337
- A: [
338
- "sourceDXN instanceof DXN",
339
- ""
340
- ]
341
- });
342
- result[ATTR_RELATION_SOURCE] = sourceDXN.toString();
244
+ invariant(EID.isEID(sourceDXN), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 44, S: this, A: ["EID.isEID(sourceDXN)", ""] });
245
+ result[ATTR_RELATION_SOURCE] = sourceDXN;
343
246
  }
344
247
  if (this[RelationTargetDXNId]) {
345
248
  const targetDXN = this[RelationTargetDXNId];
346
- invariant3(targetDXN instanceof DXN, void 0, {
347
- F: __dxlog_file3,
348
- L: 69,
349
- S: this,
350
- A: [
351
- "targetDXN instanceof DXN",
352
- ""
353
- ]
354
- });
355
- result[ATTR_RELATION_TARGET] = targetDXN.toString();
249
+ invariant(EID.isEID(targetDXN), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 49, S: this, A: ["EID.isEID(targetDXN)", ""] });
250
+ result[ATTR_RELATION_TARGET] = targetDXN;
356
251
  }
357
252
  Object.assign(result, serializeData(rest));
358
253
  return result;
@@ -362,19 +257,32 @@ var serializeData = (data) => {
362
257
  if (Ref.isRef(value2)) {
363
258
  return value2.noInline().encode();
364
259
  }
260
+ if (value2 instanceof Uint8Array) {
261
+ return encodeUint8ArrayToJson(value2);
262
+ }
365
263
  return recurse(value2);
366
264
  });
367
265
  };
368
266
  var serializeMeta = (meta) => {
369
- return deepMapValues(meta, (value2, recurse) => recurse(value2));
267
+ const { tags, annotations: annotations5, ...rest } = meta;
268
+ const compact = {
269
+ ...rest,
270
+ ...tags != null && tags.length > 0 ? {
271
+ tags
272
+ } : {},
273
+ ...annotations5 != null && Object.keys(annotations5).length > 0 ? {
274
+ annotations: annotations5
275
+ } : {}
276
+ };
277
+ return serializeData(compact);
370
278
  };
371
279
 
372
280
  // src/internal/common/proxy/make-object.ts
373
- import { ObjectId } from "@dxos/keys";
281
+ import { EntityId } from "@dxos/keys";
374
282
 
375
283
  // src/internal/common/proxy/proxy-utils.ts
376
- import { invariant as invariant4 } from "@dxos/invariant";
377
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/proxy-utils.ts";
284
+ import { invariant as invariant2 } from "@dxos/invariant";
285
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/proxy-utils.ts";
378
286
  var symbolIsProxy = /* @__PURE__ */ Symbol.for("@dxos/schema/Proxy");
379
287
  var isProxy = (value2) => !!value2?.[symbolIsProxy];
380
288
  var isValidProxyTarget = (value2) => {
@@ -388,15 +296,7 @@ var isValidProxyTarget = (value2) => {
388
296
  };
389
297
  var getProxySlot = (proxy) => {
390
298
  const value2 = proxy[symbolIsProxy];
391
- invariant4(value2 instanceof ProxyHandlerSlot, void 0, {
392
- F: __dxlog_file4,
393
- L: 32,
394
- S: void 0,
395
- A: [
396
- "value instanceof ProxyHandlerSlot",
397
- ""
398
- ]
399
- });
299
+ invariant2(value2 instanceof ProxyHandlerSlot, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 22, S: void 0, A: ["value instanceof ProxyHandlerSlot", ""] });
400
300
  return value2;
401
301
  };
402
302
  var getProxyTarget = (proxy) => {
@@ -430,15 +330,7 @@ var ProxyHandlerSlot = class {
430
330
  this._handler = _handler;
431
331
  }
432
332
  get handler() {
433
- invariant4(this._handler, void 0, {
434
- F: __dxlog_file4,
435
- L: 91,
436
- S: this,
437
- A: [
438
- "this._handler",
439
- ""
440
- ]
441
- });
333
+ invariant2(this._handler, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 71, S: this, A: ["this._handler", ""] });
442
334
  return this._handler;
443
335
  }
444
336
  // TODO(burdon): Requires comment.
@@ -491,15 +383,15 @@ var ProxyHandlerSlot = class {
491
383
  };
492
384
 
493
385
  // src/internal/common/proxy/typed-handler.ts
494
- import * as Schema4 from "effect/Schema";
386
+ import * as Schema3 from "effect/Schema";
495
387
  import * as SchemaAST3 from "effect/SchemaAST";
496
388
  import { Event } from "@dxos/async";
497
389
  import { inspectCustom } from "@dxos/debug";
498
- import { invariant as invariant7 } from "@dxos/invariant";
390
+ import { assertArgument, invariant as invariant5 } from "@dxos/invariant";
499
391
 
500
392
  // src/internal/common/proxy/ownership.ts
501
- import { invariant as invariant5 } from "@dxos/invariant";
502
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/ownership.ts";
393
+ import { invariant as invariant3 } from "@dxos/invariant";
394
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/ownership.ts";
503
395
  var EchoOwner = /* @__PURE__ */ Symbol.for("@dxos/echo/Owner");
504
396
  var getRawTarget = (value2) => {
505
397
  return isProxy(value2) ? getProxyTarget(value2) : value2;
@@ -528,15 +420,7 @@ var setOwnerRecursive = (value2, owner, options = {}) => {
528
420
  }
529
421
  if (!isRootEchoObject) {
530
422
  const ownershipAllowed = existingOwner == null || existingOwner === owner || existingOwner === newAllowedPreviousOwner;
531
- invariant5(ownershipAllowed, "Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.", {
532
- F: __dxlog_file5,
533
- L: 101,
534
- S: void 0,
535
- A: [
536
- "ownershipAllowed",
537
- "'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.'"
538
- ]
539
- });
423
+ invariant3(ownershipAllowed, "Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 76, S: void 0, A: ["ownershipAllowed", "'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.'"] });
540
424
  }
541
425
  defineHiddenProperty(actualValue, EchoOwner, owner);
542
426
  const recursiveOptions = {
@@ -603,15 +487,7 @@ var hasForeignOwner = (value2, target) => traverseObjectGraph(value2, (v) => {
603
487
  });
604
488
  var MAX_OWNER_DEPTH = 100;
605
489
  var getEchoRoot = (target, depth = 0) => {
606
- invariant5(depth < MAX_OWNER_DEPTH, "Owner chain too deep - possible circular ownership", {
607
- F: __dxlog_file5,
608
- L: 220,
609
- S: void 0,
610
- A: [
611
- "depth < MAX_OWNER_DEPTH",
612
- "'Owner chain too deep - possible circular ownership'"
613
- ]
614
- });
490
+ invariant3(depth < MAX_OWNER_DEPTH, "Owner chain too deep - possible circular ownership", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 169, S: void 0, A: ["depth < MAX_OWNER_DEPTH", "'Owner chain too deep - possible circular ownership'"] });
615
491
  if (KindId in target) {
616
492
  return target;
617
493
  }
@@ -675,18 +551,18 @@ var ReactiveArray = class extends Array {
675
551
  };
676
552
 
677
553
  // src/internal/common/proxy/schema-validator.ts
678
- import * as Schema3 from "effect/Schema";
554
+ import * as Schema2 from "effect/Schema";
679
555
  import * as SchemaAST2 from "effect/SchemaAST";
680
- import { invariant as invariant6 } from "@dxos/invariant";
556
+ import { invariant as invariant4 } from "@dxos/invariant";
681
557
  import { log } from "@dxos/log";
682
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/schema-validator.ts";
558
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/schema-validator.ts";
683
559
  var SchemaValidator = class {
684
560
  /**
685
561
  * Recursively check that schema specifies constructions we can handle.
686
562
  * Validates there are no ambiguous discriminated union types.
687
563
  */
688
564
  static validateSchema(schema) {
689
- const visitAll = (nodes) => nodes.forEach((node) => this.validateSchema(Schema3.make(node)));
565
+ const visitAll = (nodes) => nodes.forEach((node) => this.validateSchema(Schema2.make(node)));
690
566
  if (SchemaAST2.isUnion(schema.ast)) {
691
567
  const typeAstList = schema.ast.types.filter((type) => SchemaAST2.isTypeLiteral(type));
692
568
  if (typeAstList.length > 1) {
@@ -733,70 +609,41 @@ var SchemaValidator = class {
733
609
  log.warn("unknown property", {
734
610
  path: propertyPath,
735
611
  property: propertyName
736
- }, {
737
- F: __dxlog_file6,
738
- L: 71,
739
- S: this,
740
- C: (f, a) => f(...a)
741
- });
612
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 60, S: this });
742
613
  continue;
743
614
  }
744
- schema = Schema3.make(propertyType).annotations(propertyType.annotations);
615
+ schema = Schema2.make(propertyType).annotations(propertyType.annotations);
745
616
  }
746
617
  }
747
618
  return schema;
748
619
  }
749
620
  static getTargetPropertySchema(target, prop) {
750
621
  const schema = target[SchemaId];
751
- invariant6(schema, "target has no schema", {
752
- F: __dxlog_file6,
753
- L: 84,
754
- S: this,
755
- A: [
756
- "schema",
757
- "'target has no schema'"
758
- ]
759
- });
622
+ invariant4(schema, "target has no schema", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 73, S: this, A: ["schema", "'target has no schema'"] });
760
623
  const arrayAst = unwrapArray(schema.ast);
761
624
  if (arrayAst != null) {
762
625
  return getArrayElementSchema(arrayAst, prop);
763
626
  }
764
627
  const propertyType = getPropertyType(schema.ast, prop.toString(), (prop2) => target[prop2]);
765
628
  if (propertyType == null) {
766
- return Schema3.Any;
767
- }
768
- invariant6(propertyType, `invalid property: ${prop.toString()}`, {
769
- F: __dxlog_file6,
770
- L: 95,
771
- S: this,
772
- A: [
773
- "propertyType",
774
- "`invalid property: ${prop.toString()}`"
775
- ]
776
- });
777
- return Schema3.make(propertyType);
629
+ return Schema2.Any;
630
+ }
631
+ invariant4(propertyType, `invalid property: ${prop.toString()}`, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 82, S: this, A: ["propertyType", "`invalid property: ${prop.toString()}`"] });
632
+ return Schema2.make(propertyType);
778
633
  }
779
634
  };
780
635
  var getArrayElementSchema = (tupleAst, property) => {
781
636
  const elementIndex = typeof property === "string" ? parseInt(property, 10) : Number.NaN;
782
637
  if (Number.isNaN(elementIndex)) {
783
- invariant6(property === "length", `invalid array property: ${String(property)}`, {
784
- F: __dxlog_file6,
785
- L: 111,
786
- S: void 0,
787
- A: [
788
- "property === 'length'",
789
- "`invalid array property: ${String(property)}`"
790
- ]
791
- });
792
- return Schema3.Number;
638
+ invariant4(property === "length", `invalid array property: ${String(property)}`, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 93, S: void 0, A: ["property === 'length'", "`invalid array property: ${String(property)}`"] });
639
+ return Schema2.Number;
793
640
  }
794
641
  if (elementIndex < tupleAst.elements.length) {
795
642
  const elementType = tupleAst.elements[elementIndex].type;
796
- return Schema3.make(elementType).annotations(elementType.annotations);
643
+ return Schema2.make(elementType).annotations(elementType.annotations);
797
644
  }
798
645
  const restType = tupleAst.rest;
799
- return Schema3.make(restType[0].type).annotations(restType[0].annotations);
646
+ return Schema2.make(restType[0].type).annotations(restType[0].annotations);
800
647
  };
801
648
  var flattenUnion = (typeAst) => SchemaAST2.isUnion(typeAst) ? typeAst.types.flatMap(flattenUnion) : [
802
649
  typeAst
@@ -813,15 +660,7 @@ var getProperties = (typeAst, getTargetPropertyFn) => {
813
660
  const typeDiscriminators = getTypeDiscriminators(typeAstList);
814
661
  const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));
815
662
  const typeIndex = typeDiscriminators.findIndex((p) => targetPropertyValue === p.type.literal);
816
- invariant6(typeIndex !== -1, "discriminator field not set on target", {
817
- F: __dxlog_file6,
818
- L: 142,
819
- S: void 0,
820
- A: [
821
- "typeIndex !== -1",
822
- "'discriminator field not set on target'"
823
- ]
824
- });
663
+ invariant4(typeIndex !== -1, "discriminator field not set on target", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 118, S: void 0, A: ["typeIndex !== -1", "'discriminator field not set on target'"] });
825
664
  return SchemaAST2.getPropertySignatures(typeAstList[typeIndex]);
826
665
  };
827
666
  var getPropertyType = (ast, propertyName, getTargetPropertyFn) => {
@@ -851,15 +690,7 @@ var getTypeDiscriminators = (typeAstList) => {
851
690
  const isValidDiscriminator = discriminatorPropCandidates.every((p) => p.name === propertyName && !p.isOptional);
852
691
  const everyTypeHasDiscriminator = discriminatorPropCandidates.length === typeAstList.length;
853
692
  const isDiscriminatedUnion = isValidDiscriminator && everyTypeHasDiscriminator;
854
- invariant6(isDiscriminatedUnion, "type ambiguity: every type in a union must have a single unique-literal field", {
855
- F: __dxlog_file6,
856
- L: 193,
857
- S: void 0,
858
- A: [
859
- "isDiscriminatedUnion",
860
- "'type ambiguity: every type in a union must have a single unique-literal field'"
861
- ]
862
- });
693
+ invariant4(isDiscriminatedUnion, "type ambiguity: every type in a union must have a single unique-literal field", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 148, S: void 0, A: ["isDiscriminatedUnion", "'type ambiguity: every type in a union must have a single unique-literal field'"] });
863
694
  return discriminatorPropCandidates;
864
695
  };
865
696
  var unwrapAst = (rootAst, predicate) => {
@@ -885,15 +716,7 @@ var unwrapAst = (rootAst, predicate) => {
885
716
  };
886
717
  var unwrapArray = (ast) => unwrapAst(ast, SchemaAST2.isTupleType);
887
718
  var checkIdNotPresentOnSchema = (schema) => {
888
- invariant6(SchemaAST2.isTypeLiteral(schema.ast), void 0, {
889
- F: __dxlog_file6,
890
- L: 236,
891
- S: void 0,
892
- A: [
893
- "SchemaAST.isTypeLiteral(schema.ast)",
894
- ""
895
- ]
896
- });
719
+ invariant4(SchemaAST2.isTypeLiteral(schema.ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 184, S: void 0, A: ["SchemaAST.isTypeLiteral(schema.ast)", ""] });
897
720
  const idProperty = SchemaAST2.getPropertySignatures(schema.ast).find((prop) => prop.name === "id");
898
721
  if (idProperty != null) {
899
722
  throw new Error('"id" property name is reserved');
@@ -901,7 +724,7 @@ var checkIdNotPresentOnSchema = (schema) => {
901
724
  };
902
725
 
903
726
  // src/internal/common/proxy/typed-handler.ts
904
- var __dxlog_file7 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/typed-handler.ts";
727
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/typed-handler.ts";
905
728
  var deepCopy = (value2, visited = /* @__PURE__ */ new Map()) => {
906
729
  if (value2 == null || typeof value2 !== "object") {
907
730
  return value2;
@@ -954,24 +777,8 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
954
777
  constructor() {
955
778
  }
956
779
  init(target) {
957
- invariant7(typeof target === "object" && target !== null, void 0, {
958
- F: __dxlog_file7,
959
- L: 145,
960
- S: this,
961
- A: [
962
- "typeof target === 'object' && target !== null",
963
- ""
964
- ]
965
- });
966
- invariant7(SchemaId in target, "Schema is not defined for the target", {
967
- F: __dxlog_file7,
968
- L: 146,
969
- S: this,
970
- A: [
971
- "SchemaId in target",
972
- "'Schema is not defined for the target'"
973
- ]
974
- });
780
+ assertArgument(typeof target === "object" && target !== null, "target");
781
+ invariant5(SchemaId in target, "Schema is not defined for the target", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 101, S: this, A: ["SchemaId in target", "'Schema is not defined for the target'"] });
975
782
  const hasOwner = !!getOwner(target);
976
783
  if (!(EventId in target) && !hasOwner) {
977
784
  defineHiddenProperty(target, EventId, new Event());
@@ -1013,6 +820,22 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1013
820
  }
1014
821
  return (callback) => executeChange(target, target, receiver, callback);
1015
822
  }
823
+ case TypeEntityId: {
824
+ return Reflect.get(target, prop, receiver);
825
+ }
826
+ case StaticTypeSchemaSlot: {
827
+ const existing = Reflect.get(target, prop, receiver);
828
+ if (existing !== void 0) {
829
+ return existing;
830
+ }
831
+ const jsonSchema = target.jsonSchema;
832
+ if (jsonSchema == null) {
833
+ return void 0;
834
+ }
835
+ const rebuilt = toEffectSchema(jsonSchema);
836
+ defineHiddenProperty(target, StaticTypeSchemaSlot, rebuilt);
837
+ return rebuilt;
838
+ }
1016
839
  }
1017
840
  if (Object.getOwnPropertyDescriptor(target, prop)?.get) {
1018
841
  return Reflect.get(target, prop, receiver);
@@ -1028,7 +851,7 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1028
851
  const isInitialized = ChangeId in echoRoot || EventId in echoRoot;
1029
852
  const isSymbolProp = typeof prop === "symbol";
1030
853
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
1031
- throw new Error(`Cannot modify object property "${String(prop)}" outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
854
+ throw new Error(`Cannot modify object property "${String(prop)}" outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
1032
855
  }
1033
856
  let result = false;
1034
857
  this._inSet = true;
@@ -1036,6 +859,9 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1036
859
  batchEvents(() => {
1037
860
  const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value2);
1038
861
  result = Reflect.set(target, prop, preparedValue, receiver);
862
+ if (prop === "jsonSchema") {
863
+ Reflect.deleteProperty(target, StaticTypeSchemaSlot);
864
+ }
1039
865
  if (isInitialized) {
1040
866
  queueNotification(echoRoot);
1041
867
  notifyOwnerChain(target);
@@ -1067,7 +893,7 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1067
893
  const isInitialized = ChangeId in echoRoot || EventId in echoRoot;
1068
894
  const isSymbolProp = typeof property === "symbol";
1069
895
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
1070
- throw new Error(`Cannot modify object property "${String(property)}" outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
896
+ throw new Error(`Cannot modify object property "${String(property)}" outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
1071
897
  }
1072
898
  const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, property, attributes.value);
1073
899
  const result = Reflect.defineProperty(target, property, {
@@ -1127,7 +953,7 @@ var TypedReactiveHandler = class _TypedReactiveHandler {
1127
953
  return value2;
1128
954
  }
1129
955
  const schema = SchemaValidator.getTargetPropertySchema(target, prop);
1130
- const _ = Schema4.asserts(schema)(value2);
956
+ const _ = Schema3.asserts(schema)(value2);
1131
957
  if (isValidProxyTarget(value2)) {
1132
958
  setSchemaProperties(value2, schema);
1133
959
  }
@@ -1148,12 +974,21 @@ var toJSON = (target) => {
1148
974
  ...target
1149
975
  };
1150
976
  };
1151
- var setSchemaProperties = (obj, schema) => {
1152
- const schemaType = getSchemaDXN(schema);
977
+ var setSchemaProperties = (obj, schema, typeSource) => {
978
+ const schemaType = getSchemaURI(schema);
1153
979
  if (schemaType != null) {
1154
980
  defineHiddenProperty(obj, TypeId, schemaType);
1155
981
  }
1156
- defineHiddenProperty(obj, SchemaId, schema);
982
+ if (typeSource != null) {
983
+ defineHiddenProperty(obj, TypeEntityId, typeSource);
984
+ Object.defineProperty(obj, SchemaId, {
985
+ get: () => typeSource[StaticTypeSchemaSlot] ?? schema,
986
+ enumerable: false,
987
+ configurable: true
988
+ });
989
+ } else {
990
+ defineHiddenProperty(obj, SchemaId, schema);
991
+ }
1157
992
  for (const key in obj) {
1158
993
  if (isValidProxyTarget(obj[key])) {
1159
994
  const elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);
@@ -1163,14 +998,14 @@ var setSchemaProperties = (obj, schema) => {
1163
998
  }
1164
999
  }
1165
1000
  };
1166
- var prepareTypedTarget = (target, schema) => {
1001
+ var prepareTypedTarget = (target, schema, typeSource) => {
1167
1002
  if (!SchemaAST3.isTypeLiteral(schema.ast)) {
1168
1003
  throw new Error("schema has to describe an object type");
1169
1004
  }
1170
1005
  SchemaValidator.validateSchema(schema);
1171
- const _ = Schema4.asserts(schema)(target);
1006
+ const _ = Schema3.asserts(schema)(target);
1172
1007
  makeArraysReactive(target);
1173
- setSchemaProperties(target, schema);
1008
+ setSchemaProperties(target, schema, typeSource);
1174
1009
  };
1175
1010
  var makeArraysReactive = (target) => {
1176
1011
  for (const key in target) {
@@ -1187,10 +1022,10 @@ var makeArraysReactive = (target) => {
1187
1022
  };
1188
1023
 
1189
1024
  // src/internal/common/proxy/make-object.ts
1190
- var makeObject = (schema, obj, meta) => {
1191
- return createReactiveObject(Object.assign({}, obj), meta, schema);
1025
+ var makeObject = (schema, obj, meta, typeSource) => {
1026
+ return createReactiveObject(Object.assign({}, obj), meta, schema, typeSource);
1192
1027
  };
1193
- var createReactiveObject = (obj, meta, schema) => {
1028
+ var createReactiveObject = (obj, meta, schema, typeSource) => {
1194
1029
  if (!isValidProxyTarget(obj)) {
1195
1030
  throw new Error("Value cannot be made into a reactive object.");
1196
1031
  }
@@ -1210,7 +1045,7 @@ var createReactiveObject = (obj, meta, schema) => {
1210
1045
  if (parent !== void 0) {
1211
1046
  defineHiddenProperty(obj, ParentId, parent);
1212
1047
  }
1213
- prepareTypedTarget(obj, schema);
1048
+ prepareTypedTarget(obj, schema, typeSource);
1214
1049
  attachTypedJsonSerializer(obj);
1215
1050
  const proxy = createProxy(obj, TypedReactiveHandler.instance);
1216
1051
  const metaProxy = obj[MetaId];
@@ -1224,22 +1059,30 @@ var createReactiveObject = (obj, meta, schema) => {
1224
1059
  };
1225
1060
  var setIdOnTarget = (target) => {
1226
1061
  if ("id" in target && target.id !== void 0 && target.id !== null) {
1227
- if (!ObjectId.isValid(target.id)) {
1062
+ if (!EntityId.isValid(target.id)) {
1228
1063
  throw new Error("Invalid object id format.");
1229
1064
  }
1230
1065
  } else {
1231
- target.id = ObjectId.random();
1066
+ target.id = EntityId.random();
1232
1067
  }
1233
1068
  };
1234
- var initMeta = (obj, meta = {
1235
- keys: []
1236
- }) => {
1237
- prepareTypedTarget(meta, ObjectMetaSchema);
1238
- defineHiddenProperty(obj, MetaId, createProxy(meta, TypedReactiveHandler.instance));
1069
+ var initMeta = (obj, meta) => {
1070
+ const fullMeta = {
1071
+ ...meta,
1072
+ keys: meta?.keys ?? [],
1073
+ tags: meta?.tags ?? [],
1074
+ annotations: meta?.annotations ?? {}
1075
+ };
1076
+ prepareTypedTarget(fullMeta, EntityMetaSchema);
1077
+ defineHiddenProperty(obj, MetaId, createProxy(fullMeta, TypedReactiveHandler.instance));
1239
1078
  };
1240
1079
 
1241
1080
  // src/internal/common/proxy/reactive.ts
1242
1081
  var subscribe = (obj, callback) => {
1082
+ if (!isProxy(obj)) {
1083
+ return () => {
1084
+ };
1085
+ }
1243
1086
  const target = getProxyTarget(obj);
1244
1087
  if (target && EventId in target) {
1245
1088
  return target[EventId].on(callback);
@@ -1256,208 +1099,177 @@ var change = (obj, callback) => {
1256
1099
  }
1257
1100
  };
1258
1101
 
1259
- // src/internal/Entity/api.ts
1260
- import { invariant as invariant10 } from "@dxos/invariant";
1261
- import { assumeType as assumeType3 } from "@dxos/util";
1262
-
1263
- // src/internal/Entity/model.ts
1264
- import { invariant as invariant8 } from "@dxos/invariant";
1265
- import { DXN as DXN2, ObjectId as ObjectId2 } from "@dxos/keys";
1266
- import { assumeType } from "@dxos/util";
1267
- var __dxlog_file8 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/model.ts";
1268
- function assertObjectModel(obj) {
1269
- invariant8(typeof obj === "object" && obj !== null, "Invalid object model: not an object", {
1270
- F: __dxlog_file8,
1271
- L: 94,
1272
- S: this,
1273
- A: [
1274
- "typeof obj === 'object' && obj !== null",
1275
- "'Invalid object model: not an object'"
1276
- ]
1102
+ // src/internal/Entity/entity.ts
1103
+ import * as Schema4 from "effect/Schema";
1104
+ import * as SchemaAST4 from "effect/SchemaAST";
1105
+ import { DXN, EntityId as EntityId2 } from "@dxos/keys";
1106
+ var TypeMetaSchemaDXN = DXN.make("org.dxos.type.schema", "0.1.0");
1107
+ var persistentEntitySchema = (() => {
1108
+ const typename = DXN.getName(TypeMetaSchemaDXN);
1109
+ const version2 = DXN.getVersion(TypeMetaSchemaDXN);
1110
+ const struct = Schema4.Struct({
1111
+ name: Schema4.optional(Schema4.String),
1112
+ jsonSchema: JsonSchemaType.pipe(Schema4.optional),
1113
+ id: EntityId2
1277
1114
  });
1278
- assumeType(obj);
1279
- invariant8(ObjectId2.isValid(obj.id), "Invalid object model: invalid id", {
1280
- F: __dxlog_file8,
1281
- L: 96,
1282
- S: this,
1283
- A: [
1284
- "ObjectId.isValid(obj.id)",
1285
- "'Invalid object model: invalid id'"
1286
- ]
1115
+ const ast = SchemaAST4.annotations(struct.ast, {
1116
+ [TypeAnnotationId]: {
1117
+ kind: EntityKind.Type,
1118
+ typename,
1119
+ version: version2
1120
+ },
1121
+ [SchemaAST4.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1122
+ kind: EntityKind.Type,
1123
+ typename,
1124
+ version: version2
1125
+ })
1287
1126
  });
1288
- invariant8(obj[TypeId] === void 0 || obj[TypeId] instanceof DXN2, "Invalid object model: invalid type", {
1289
- F: __dxlog_file8,
1290
- L: 97,
1291
- S: this,
1292
- A: [
1293
- "obj[TypeId] === undefined || obj[TypeId] instanceof DXN",
1294
- "'Invalid object model: invalid type'"
1295
- ]
1127
+ return Schema4.make(ast);
1128
+ })();
1129
+ var makeEchoTypeSchema = (fields, ast, typename, version2, kind, computeJsonSchema, explicitId) => {
1130
+ const sourceSchema = Schema4.make(ast);
1131
+ const meta = {
1132
+ keys: [],
1133
+ key: typename,
1134
+ version: version2
1135
+ };
1136
+ const id = explicitId ?? EntityId2.deterministic(typename, version2);
1137
+ const entity = makeObject(persistentEntitySchema, {
1138
+ id
1139
+ }, meta);
1140
+ const target = getProxyTarget(entity);
1141
+ let memoizedJsonSchema;
1142
+ Object.defineProperty(target, "jsonSchema", {
1143
+ configurable: true,
1144
+ enumerable: true,
1145
+ get() {
1146
+ return memoizedJsonSchema ??= computeJsonSchema();
1147
+ },
1148
+ set(value2) {
1149
+ memoizedJsonSchema = value2;
1150
+ }
1296
1151
  });
1297
- invariant8(obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation, "Invalid object model: invalid entity kind", {
1298
- F: __dxlog_file8,
1299
- L: 98,
1300
- S: this,
1301
- A: [
1302
- "obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation",
1303
- "'Invalid object model: invalid entity kind'"
1304
- ]
1152
+ defineHiddenProperty(target, StaticTypeSchemaSlot, sourceSchema);
1153
+ defineHiddenProperty(target, SchemaKindId, kind);
1154
+ Object.defineProperty(target, "fields", {
1155
+ configurable: true,
1156
+ enumerable: false,
1157
+ get: () => fields
1305
1158
  });
1306
- if (obj[KindId] === EntityKind.Relation) {
1307
- invariant8(obj[RelationSourceDXNId] instanceof DXN2, "Invalid object model: invalid relation source", {
1308
- F: __dxlog_file8,
1309
- L: 104,
1310
- S: this,
1311
- A: [
1312
- "obj[RelationSourceDXNId] instanceof DXN",
1313
- "'Invalid object model: invalid relation source'"
1314
- ]
1315
- });
1316
- invariant8(obj[RelationTargetDXNId] instanceof DXN2, "Invalid object model: invalid relation target", {
1317
- F: __dxlog_file8,
1318
- L: 105,
1319
- S: this,
1320
- A: [
1321
- "obj[RelationTargetDXNId] instanceof DXN",
1322
- "'Invalid object model: invalid relation target'"
1323
- ]
1324
- });
1325
- invariant8(!(obj[RelationSourceId] instanceof DXN2), "Invalid object model: source pointer is a DXN", {
1326
- F: __dxlog_file8,
1327
- L: 106,
1328
- S: this,
1329
- A: [
1330
- "!(obj[RelationSourceId] instanceof DXN)",
1331
- "'Invalid object model: source pointer is a DXN'"
1332
- ]
1333
- });
1334
- invariant8(!(obj[RelationTargetId] instanceof DXN2), "Invalid object model: target pointer is a DXN", {
1335
- F: __dxlog_file8,
1336
- L: 107,
1337
- S: this,
1338
- A: [
1339
- "!(obj[RelationTargetId] instanceof DXN)",
1340
- "'Invalid object model: target pointer is a DXN'"
1341
- ]
1342
- });
1343
- }
1344
- }
1159
+ return entity;
1160
+ };
1345
1161
 
1346
- // src/internal/Entity/util.ts
1162
+ // src/internal/Entity/object.ts
1347
1163
  import * as Schema5 from "effect/Schema";
1348
- import { assertArgument as assertArgument2, invariant as invariant9 } from "@dxos/invariant";
1349
- import { DXN as DXN3, ObjectId as ObjectId3 } from "@dxos/keys";
1350
- import { assumeType as assumeType2 } from "@dxos/util";
1351
- var __dxlog_file9 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/util.ts";
1352
- var getObjectDXN = (object) => {
1353
- invariant9(!Schema5.isSchema(object), "schema not allowed in this function", {
1354
- F: __dxlog_file9,
1355
- L: 19,
1356
- S: void 0,
1357
- A: [
1358
- "!Schema.isSchema(object)",
1359
- "'schema not allowed in this function'"
1360
- ]
1361
- });
1362
- assertArgument2(typeof object === "object" && object != null, "object", "expected object");
1363
- assumeType2(object);
1364
- if (object[SelfDXNId]) {
1365
- invariant9(object[SelfDXNId] instanceof DXN3, "Invalid object model: invalid self dxn", {
1366
- F: __dxlog_file9,
1367
- L: 24,
1368
- S: void 0,
1369
- A: [
1370
- "object[SelfDXNId] instanceof DXN",
1371
- "'Invalid object model: invalid self dxn'"
1372
- ]
1373
- });
1374
- return object[SelfDXNId];
1375
- }
1376
- if (!ObjectId3.isValid(object.id)) {
1377
- throw new TypeError("Object id is not valid.");
1378
- }
1379
- return DXN3.fromLocalObjectId(object.id);
1380
- };
1164
+ import * as SchemaAST5 from "effect/SchemaAST";
1165
+ import { invariant as invariant6 } from "@dxos/invariant";
1166
+ import { DXN as DXN2 } from "@dxos/keys";
1381
1167
 
1382
- // src/internal/Entity/api.ts
1383
- var __dxlog_file10 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/api.ts";
1384
- var getDXN = (entity) => {
1385
- const dxn = getObjectDXN(entity);
1386
- invariant10(dxn != null, "Invalid entity.", {
1387
- F: __dxlog_file10,
1388
- L: 19,
1389
- S: void 0,
1390
- A: [
1391
- "dxn != null",
1392
- "'Invalid entity.'"
1393
- ]
1394
- });
1395
- return dxn;
1168
+ // src/internal/JsonSchema/json-schema-normalize.ts
1169
+ var normalizeSchema = (schema) => {
1170
+ const copy = structuredClone(schema);
1171
+ go(copy);
1172
+ return copy;
1396
1173
  };
1397
- var getDatabase = (entity) => {
1398
- assumeType3(entity);
1399
- return entity[ObjectDatabaseId];
1174
+ var go = (schema) => {
1175
+ if (typeof schema !== "object" || schema === null) {
1176
+ return;
1177
+ }
1178
+ if (schema.exclusiveMaximum === true) {
1179
+ schema.exclusiveMaximum = schema.maximum;
1180
+ delete schema.exclusiveMaximum;
1181
+ } else if (schema.exclusiveMaximum === false) {
1182
+ delete schema.exclusiveMaximum;
1183
+ }
1184
+ if (schema.exclusiveMinimum === true) {
1185
+ schema.exclusiveMinimum = schema.minimum;
1186
+ delete schema.exclusiveMinimum;
1187
+ } else if (schema.exclusiveMinimum === false) {
1188
+ delete schema.exclusiveMinimum;
1189
+ }
1190
+ for (const key of Object.keys(schema)) {
1191
+ if (!JsonSchemaFields.includes(key)) {
1192
+ delete schema[key];
1193
+ }
1194
+ }
1195
+ if (schema.properties) {
1196
+ goOnRecord(schema.properties);
1197
+ }
1198
+ if (schema.patternProperties) {
1199
+ goOnRecord(schema.patternProperties);
1200
+ }
1201
+ if (schema.propertyNames) {
1202
+ go(schema.propertyNames);
1203
+ }
1204
+ if (schema.definitions) {
1205
+ goOnRecord(schema.definitions);
1206
+ }
1207
+ if (schema.items) {
1208
+ maybeGoOnArray(schema.items);
1209
+ }
1210
+ if (schema.additionalItems) {
1211
+ maybeGoOnArray(schema.additionalItems);
1212
+ }
1213
+ if (schema.contains) {
1214
+ go(schema.contains);
1215
+ }
1216
+ if (schema.if) {
1217
+ go(schema.if);
1218
+ }
1219
+ if (schema.then) {
1220
+ go(schema.then);
1221
+ }
1222
+ if (schema.else) {
1223
+ go(schema.else);
1224
+ }
1225
+ if (schema.allOf) {
1226
+ maybeGoOnArray(schema.allOf);
1227
+ }
1228
+ if (schema.anyOf) {
1229
+ maybeGoOnArray(schema.anyOf);
1230
+ }
1231
+ if (schema.oneOf) {
1232
+ maybeGoOnArray(schema.oneOf);
1233
+ }
1234
+ if (schema.not) {
1235
+ go(schema.not);
1236
+ }
1237
+ if (schema.$defs) {
1238
+ goOnRecord(schema.$defs);
1239
+ }
1240
+ if (schema.reference) {
1241
+ go(schema.reference.schema);
1242
+ }
1400
1243
  };
1401
-
1402
- // src/internal/Entity/entity.ts
1403
- import * as Schema6 from "effect/Schema";
1404
- var makeEchoTypeSchema = (fields, ast, typename, version2, kind) => {
1405
- return class EchoObjectSchemaClass extends Schema6.make(ast) {
1406
- static typename = typename;
1407
- static version = version2;
1408
- static [SchemaKindId] = kind;
1409
- static fields = fields;
1410
- static annotations(annotations3) {
1411
- const schema = Schema6.make(ast).annotations(annotations3);
1412
- return makeEchoTypeSchema(fields, schema.ast, typename, version2, kind);
1413
- }
1414
- // static make(
1415
- // props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
1416
- // ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
1417
- // : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
1418
- // options?: MakeProps,
1419
- // ): Simplify<Schema.TypeLiteral.Type<Fields, []>> {
1420
- // const propsWithDefaults: any = _lazilyMergeDefaults(fields, { ...(props as any) });
1421
- // return _getDisableValidationMakeOption(options)
1422
- // ? propsWithDefaults
1423
- // : ParseResult.validateSync(this)(propsWithDefaults);
1424
- // }
1425
- static instanceOf(value2) {
1426
- return Schema6.is(this)(value2);
1244
+ var maybeGoOnArray = (value2) => {
1245
+ if (Array.isArray(value2)) {
1246
+ for (const item of value2) {
1247
+ go(item);
1427
1248
  }
1428
- };
1249
+ } else if (typeof value2 === "object" && value2 !== null) {
1250
+ go(value2);
1251
+ }
1252
+ };
1253
+ var goOnRecord = (record) => {
1254
+ for (const key of Object.keys(record)) {
1255
+ go(record[key]);
1256
+ }
1429
1257
  };
1430
1258
 
1431
1259
  // src/internal/Entity/object.ts
1432
- import * as Schema7 from "effect/Schema";
1433
- import * as SchemaAST4 from "effect/SchemaAST";
1434
- import { invariant as invariant11 } from "@dxos/invariant";
1435
- var __dxlog_file11 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/object.ts";
1436
- var EchoObjectSchema = ({ typename, version: version2 }) => {
1260
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/object.ts";
1261
+ var EchoObjectSchema = (dxn, options) => {
1262
+ const typename = DXN2.getName(dxn);
1263
+ const version2 = DXN2.getVersion(dxn);
1264
+ invariant6(version2, `Type.makeObject requires a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 19, S: void 0, A: ["version", "`Type.makeObject requires a versioned DXN: ${dxn}`"] });
1437
1265
  return (self) => {
1438
- invariant11(typeof TypeAnnotationId === "symbol", "Sanity.", {
1439
- F: __dxlog_file11,
1440
- L: 36,
1441
- S: void 0,
1442
- A: [
1443
- "typeof TypeAnnotationId === 'symbol'",
1444
- "'Sanity.'"
1445
- ]
1446
- });
1447
- invariant11(SchemaAST4.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", {
1448
- F: __dxlog_file11,
1449
- L: 37,
1450
- S: void 0,
1451
- A: [
1452
- "SchemaAST.isTypeLiteral(self.ast)",
1453
- "'Schema must be a TypeLiteral.'"
1454
- ]
1455
- });
1266
+ invariant6(typeof TypeAnnotationId === "symbol", "Sanity.", { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 21, S: void 0, A: ["typeof TypeAnnotationId === 'symbol'", "'Sanity.'"] });
1267
+ invariant6(SchemaAST5.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 22, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
1456
1268
  const fields = self.fields ?? {};
1457
- const schemaWithId = Schema7.extend(self, Schema7.Struct({
1458
- id: Schema7.String
1269
+ const schemaWithId = Schema5.extend(self, Schema5.Struct({
1270
+ id: Schema5.String
1459
1271
  }));
1460
- const ast = SchemaAST4.annotations(schemaWithId.ast, {
1272
+ const ast = SchemaAST5.annotations(schemaWithId.ast, {
1461
1273
  // TODO(dmaretskyi): `extend` kills the annotations.
1462
1274
  ...self.ast.annotations,
1463
1275
  [TypeAnnotationId]: {
@@ -1466,49 +1278,46 @@ var EchoObjectSchema = ({ typename, version: version2 }) => {
1466
1278
  version: version2
1467
1279
  },
1468
1280
  // TODO(dmaretskyi): TypeIdentifierAnnotationId?
1469
- [SchemaAST4.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1281
+ [SchemaAST5.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1470
1282
  kind: EntityKind.Object,
1471
1283
  typename,
1472
1284
  version: version2
1473
1285
  })
1474
1286
  });
1475
- return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Object);
1287
+ return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Object, () => toJsonSchema(Schema5.make(ast)), options?.id);
1476
1288
  };
1477
1289
  };
1478
1290
 
1479
1291
  // src/internal/Entity/relation.ts
1480
- import * as Schema8 from "effect/Schema";
1481
- import * as SchemaAST5 from "effect/SchemaAST";
1292
+ import * as Schema6 from "effect/Schema";
1293
+ import * as SchemaAST6 from "effect/SchemaAST";
1482
1294
  import { raise } from "@dxos/debug";
1483
- import { assertArgument as assertArgument3, invariant as invariant12 } from "@dxos/invariant";
1484
- import { DXN as DXN4 } from "@dxos/keys";
1485
- var __dxlog_file12 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/relation.ts";
1486
- var EchoRelationSchema = ({ source, target, typename, version: version2 }) => {
1487
- assertArgument3(Schema8.isSchema(source), "source");
1488
- assertArgument3(Schema8.isSchema(target), "target");
1489
- const sourceDXN = getDXNForRelationSchemaRef(source);
1490
- const targetDXN = getDXNForRelationSchemaRef(target);
1491
- if (getEntityKind(source) !== EntityKind.Object) {
1295
+ import { assertArgument as assertArgument2, invariant as invariant7 } from "@dxos/invariant";
1296
+ import { DXN as DXN3 } from "@dxos/keys";
1297
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/relation.ts";
1298
+ var EchoRelationSchema = ({ dxn, source, target, id: explicitId }) => {
1299
+ const sourceSchema = source != null ? getStaticTypeSchema(source) ?? source : source;
1300
+ const targetSchema = target != null ? getStaticTypeSchema(target) ?? target : target;
1301
+ assertArgument2(Schema6.isSchema(sourceSchema), "source");
1302
+ assertArgument2(Schema6.isSchema(targetSchema), "target");
1303
+ const typename = DXN3.getName(dxn);
1304
+ const version2 = DXN3.getVersion(dxn);
1305
+ invariant7(version2, `Type.makeRelation requires a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 27, S: void 0, A: ["version", "`Type.makeRelation requires a versioned DXN: ${dxn}`"] });
1306
+ const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);
1307
+ const targetDXN = getDXNForRelationSchemaRef(targetSchema);
1308
+ if (getEntityKind(sourceSchema) !== EntityKind.Object) {
1492
1309
  raise(new Error("Source schema must be an echo object schema."));
1493
1310
  }
1494
- if (getEntityKind(target) !== EntityKind.Object) {
1311
+ if (getEntityKind(targetSchema) !== EntityKind.Object) {
1495
1312
  raise(new Error("Target schema must be an echo object schema."));
1496
1313
  }
1497
1314
  return (self) => {
1498
- invariant12(SchemaAST5.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", {
1499
- F: __dxlog_file12,
1500
- L: 110,
1501
- S: void 0,
1502
- A: [
1503
- "SchemaAST.isTypeLiteral(self.ast)",
1504
- "'Schema must be a TypeLiteral.'"
1505
- ]
1506
- });
1315
+ invariant7(SchemaAST6.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 37, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
1507
1316
  const fields = self.fields ?? {};
1508
- const schemaWithId = Schema8.extend(self, Schema8.Struct({
1509
- id: Schema8.String
1317
+ const schemaWithId = Schema6.extend(self, Schema6.Struct({
1318
+ id: Schema6.String
1510
1319
  }));
1511
- const ast = SchemaAST5.annotations(schemaWithId.ast, {
1320
+ const ast = SchemaAST6.annotations(schemaWithId.ast, {
1512
1321
  // TODO(dmaretskyi): `extend` kills the annotations.
1513
1322
  ...self.ast.annotations,
1514
1323
  [TypeAnnotationId]: {
@@ -1519,7 +1328,7 @@ var EchoRelationSchema = ({ source, target, typename, version: version2 }) => {
1519
1328
  targetSchema: targetDXN
1520
1329
  },
1521
1330
  // TODO(dmaretskyi): TypeIdentifierAnnotationId?
1522
- [SchemaAST5.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1331
+ [SchemaAST6.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1523
1332
  kind: EntityKind.Relation,
1524
1333
  typename,
1525
1334
  version: version2,
@@ -1527,24 +1336,57 @@ var EchoRelationSchema = ({ source, target, typename, version: version2 }) => {
1527
1336
  relationTarget: targetDXN
1528
1337
  })
1529
1338
  });
1530
- return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Relation);
1339
+ return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Relation, () => toJsonSchema(Schema6.make(ast)), explicitId);
1531
1340
  };
1532
1341
  };
1533
1342
  var getDXNForRelationSchemaRef = (schema) => {
1534
- assertArgument3(Schema8.isSchema(schema), "schema");
1343
+ assertArgument2(Schema6.isSchema(schema), "schema");
1535
1344
  const identifier = getTypeIdentifierAnnotation(schema);
1536
1345
  if (identifier) {
1537
- return identifier;
1346
+ return DXN3.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));
1538
1347
  }
1539
1348
  const typename = getSchemaTypename(schema);
1540
1349
  if (!typename) {
1541
1350
  throw new Error("Schema must have a typename");
1542
1351
  }
1543
- return DXN4.fromTypename(typename).toString();
1352
+ return DXN3.make(typename);
1353
+ };
1354
+
1355
+ // src/internal/Entity/type-kind.ts
1356
+ import * as Schema7 from "effect/Schema";
1357
+ import * as SchemaAST7 from "effect/SchemaAST";
1358
+ import { invariant as invariant8 } from "@dxos/invariant";
1359
+ import { DXN as DXN4 } from "@dxos/keys";
1360
+ var __dxlog_file8 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/type-kind.ts";
1361
+ var EchoTypeKindSchema = (dxn, options) => {
1362
+ const typename = DXN4.getName(dxn);
1363
+ const version2 = DXN4.getVersion(dxn);
1364
+ invariant8(version2, `Type-kind schemas require a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 22, S: void 0, A: ["version", "`Type-kind schemas require a versioned DXN: ${dxn}`"] });
1365
+ return (self) => {
1366
+ invariant8(SchemaAST7.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 24, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
1367
+ const fields = self.fields ?? {};
1368
+ const schemaWithId = Schema7.extend(self, Schema7.Struct({
1369
+ id: Schema7.String
1370
+ }));
1371
+ const ast = SchemaAST7.annotations(schemaWithId.ast, {
1372
+ ...self.ast.annotations,
1373
+ [TypeAnnotationId]: {
1374
+ kind: EntityKind.Type,
1375
+ typename,
1376
+ version: version2
1377
+ },
1378
+ [SchemaAST7.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
1379
+ kind: EntityKind.Type,
1380
+ typename,
1381
+ version: version2
1382
+ })
1383
+ });
1384
+ return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Type, () => toJsonSchema(Schema7.make(ast)), options?.id);
1385
+ };
1544
1386
  };
1545
1387
 
1546
1388
  // src/internal/Entity/version.ts
1547
- import { assertArgument as assertArgument4 } from "@dxos/invariant";
1389
+ import { assertArgument as assertArgument3 } from "@dxos/invariant";
1548
1390
  var unversioned = {
1549
1391
  [VersionTypeId]: {},
1550
1392
  versioned: false
@@ -1560,12 +1402,12 @@ var version = (entity) => {
1560
1402
  return ver;
1561
1403
  };
1562
1404
  var versionValid = (ver) => {
1563
- assertArgument4(isVersion(ver), "version", "Invalid version object");
1405
+ assertArgument3(isVersion(ver), "version", "Invalid version object");
1564
1406
  return !!ver.versioned;
1565
1407
  };
1566
1408
  var compareVersions = (version1, version2) => {
1567
- assertArgument4(isVersion(version1), "version1", "Invalid version object");
1568
- assertArgument4(isVersion(version2), "version2", "Invalid version object");
1409
+ assertArgument3(isVersion(version1), "version1", "Invalid version object");
1410
+ assertArgument3(isVersion(version2), "version2", "Invalid version object");
1569
1411
  if (!versionValid(version1) || !versionValid(version2)) {
1570
1412
  return "unversioned";
1571
1413
  }
@@ -1586,99 +1428,8 @@ var decodeVersion = (ver) => {
1586
1428
  return parsed;
1587
1429
  };
1588
1430
 
1589
- // src/internal/JsonSchema/json-schema-normalize.ts
1590
- var normalizeSchema = (schema) => {
1591
- const copy = structuredClone(schema);
1592
- go(copy);
1593
- return copy;
1594
- };
1595
- var go = (schema) => {
1596
- if (typeof schema !== "object" || schema === null) {
1597
- return;
1598
- }
1599
- if (schema.exclusiveMaximum === true) {
1600
- schema.exclusiveMaximum = schema.maximum;
1601
- delete schema.exclusiveMaximum;
1602
- } else if (schema.exclusiveMaximum === false) {
1603
- delete schema.exclusiveMaximum;
1604
- }
1605
- if (schema.exclusiveMinimum === true) {
1606
- schema.exclusiveMinimum = schema.minimum;
1607
- delete schema.exclusiveMinimum;
1608
- } else if (schema.exclusiveMinimum === false) {
1609
- delete schema.exclusiveMinimum;
1610
- }
1611
- for (const key of Object.keys(schema)) {
1612
- if (!JsonSchemaFields.includes(key)) {
1613
- delete schema[key];
1614
- }
1615
- }
1616
- if (schema.properties) {
1617
- goOnRecord(schema.properties);
1618
- }
1619
- if (schema.patternProperties) {
1620
- goOnRecord(schema.patternProperties);
1621
- }
1622
- if (schema.propertyNames) {
1623
- go(schema.propertyNames);
1624
- }
1625
- if (schema.definitions) {
1626
- goOnRecord(schema.definitions);
1627
- }
1628
- if (schema.items) {
1629
- maybeGoOnArray(schema.items);
1630
- }
1631
- if (schema.additionalItems) {
1632
- maybeGoOnArray(schema.additionalItems);
1633
- }
1634
- if (schema.contains) {
1635
- go(schema.contains);
1636
- }
1637
- if (schema.if) {
1638
- go(schema.if);
1639
- }
1640
- if (schema.then) {
1641
- go(schema.then);
1642
- }
1643
- if (schema.else) {
1644
- go(schema.else);
1645
- }
1646
- if (schema.allOf) {
1647
- maybeGoOnArray(schema.allOf);
1648
- }
1649
- if (schema.anyOf) {
1650
- maybeGoOnArray(schema.anyOf);
1651
- }
1652
- if (schema.oneOf) {
1653
- maybeGoOnArray(schema.oneOf);
1654
- }
1655
- if (schema.not) {
1656
- go(schema.not);
1657
- }
1658
- if (schema.$defs) {
1659
- goOnRecord(schema.$defs);
1660
- }
1661
- if (schema.reference) {
1662
- go(schema.reference.schema);
1663
- }
1664
- };
1665
- var maybeGoOnArray = (value2) => {
1666
- if (Array.isArray(value2)) {
1667
- for (const item of value2) {
1668
- go(item);
1669
- }
1670
- } else if (typeof value2 === "object" && value2 !== null) {
1671
- go(value2);
1672
- }
1673
- };
1674
- var goOnRecord = (record) => {
1675
- for (const key of Object.keys(record)) {
1676
- go(record[key]);
1677
- }
1678
- };
1679
-
1680
1431
  // src/internal/Obj/common.ts
1681
- import * as Schema9 from "effect/Schema";
1432
+ import * as Schema8 from "effect/Schema";
1682
1433
  var makeTypedEntityClass = (typename, version2, baseSchema) => {
1683
1434
  return class {
1684
1435
  // Implement TypedObject properties.
@@ -1686,7 +1437,7 @@ var makeTypedEntityClass = (typename, version2, baseSchema) => {
1686
1437
  static version = version2;
1687
1438
  // Implement Schema.Schema properties.
1688
1439
  // TODO(burdon): Comment required.
1689
- static [Schema9.TypeId] = schemaVariance;
1440
+ static [Schema8.TypeId] = schemaVariance;
1690
1441
  static ast = baseSchema.ast;
1691
1442
  static annotations = baseSchema.annotations.bind(baseSchema);
1692
1443
  static pipe = baseSchema.pipe.bind(baseSchema);
@@ -1708,8 +1459,8 @@ var schemaVariance = {
1708
1459
 
1709
1460
  // src/internal/Obj/create-object.ts
1710
1461
  import { raise as raise3 } from "@dxos/debug";
1711
- import { assertArgument as assertArgument6, failedInvariant } from "@dxos/invariant";
1712
- import { ObjectId as ObjectId5 } from "@dxos/keys";
1462
+ import { assertArgument as assertArgument5, failedInvariant } from "@dxos/invariant";
1463
+ import { EntityId as EntityId4 } from "@dxos/keys";
1713
1464
 
1714
1465
  // src/internal/Obj/inspect.ts
1715
1466
  import { inspectCustom as inspectCustom2 } from "@dxos/debug";
@@ -1729,53 +1480,37 @@ var typedObjectInspectFunction = function(depth, options, inspect) {
1729
1480
  const { id, ...props } = this;
1730
1481
  return inspect({
1731
1482
  id,
1732
- [ATTR_TYPE]: getTypeDXN(this),
1483
+ [ATTR_TYPE]: getTypeURI(this),
1733
1484
  ...props,
1734
1485
  [ATTR_META]: this[MetaId]
1735
1486
  }, options);
1736
1487
  };
1737
1488
 
1738
1489
  // src/internal/Obj/json-serializer.ts
1739
- import * as Schema10 from "effect/Schema";
1490
+ import * as Schema9 from "effect/Schema";
1740
1491
  import { raise as raise2 } from "@dxos/debug";
1741
- import { ObjectStructure, isEncodedReference } from "@dxos/echo-protocol";
1742
- import { assertArgument as assertArgument5, invariant as invariant13 } from "@dxos/invariant";
1743
- import { DXN as DXN5, ObjectId as ObjectId4 } from "@dxos/keys";
1744
- import { assumeType as assumeType4, deepMapValues as deepMapValues2, visitValues } from "@dxos/util";
1745
- var __dxlog_file13 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/json-serializer.ts";
1492
+ import { EntityStructure, isEncodedReference } from "@dxos/echo-protocol";
1493
+ import { assertArgument as assertArgument4, invariant as invariant9 } from "@dxos/invariant";
1494
+ import { EID as EID2, EntityId as EntityId3, URI } from "@dxos/keys";
1495
+ import { assumeType, decodeUint8ArrayFromJson, deepMapValues as deepMapValues2, isEncodedUint8Array, visitValues } from "@dxos/util";
1496
+ var __dxlog_file9 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/json-serializer.ts";
1746
1497
  var objectToJSON = (obj) => {
1747
- const typename = getTypeDXN(obj)?.toString();
1748
- invariant13(typename && typeof typename === "string", void 0, {
1749
- F: __dxlog_file13,
1750
- L: 66,
1751
- S: void 0,
1752
- A: [
1753
- "typename && typeof typename === 'string'",
1754
- ""
1755
- ]
1756
- });
1498
+ const typename = getTypeURI(obj);
1499
+ invariant9(typename && typeof typename === "string", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 23, S: void 0, A: ["typename && typeof typename === 'string'", ""] });
1757
1500
  return typedJsonSerializer.call(obj);
1758
1501
  };
1759
- var objectFromJSON = async (jsonData, { refResolver, dxn, database, parent } = {}) => {
1760
- assumeType4(jsonData);
1761
- assertArgument5(typeof jsonData === "object" && jsonData !== null, "jsonData", "expect object");
1762
- assertArgument5(typeof jsonData[ATTR_TYPE] === "string", "jsonData[ATTR_TYPE]", "expected object to have a type");
1763
- assertArgument5(typeof jsonData.id === "string", "jsonData.id", "expected object to have an id");
1764
- const type = DXN5.parse(jsonData[ATTR_TYPE]);
1502
+ var objectFromJSON = async (jsonData, { refResolver, uri, database, parent } = {}) => {
1503
+ assumeType(jsonData);
1504
+ assertArgument4(typeof jsonData === "object" && jsonData !== null, "jsonData", "expect object");
1505
+ assertArgument4(typeof jsonData[ATTR_TYPE] === "string", "jsonData[ATTR_TYPE]", "expected object to have a type");
1506
+ assertArgument4(typeof jsonData.id === "string", "jsonData.id", "expected object to have an id");
1507
+ const type = URI.make(jsonData[ATTR_TYPE]);
1765
1508
  const schema = await refResolver?.resolveSchema(type);
1766
- invariant13(schema === void 0 || Schema10.isSchema(schema), void 0, {
1767
- F: __dxlog_file13,
1768
- L: 97,
1769
- S: void 0,
1770
- A: [
1771
- "schema === undefined || Schema.isSchema(schema)",
1772
- ""
1773
- ]
1774
- });
1775
- const decodedInput = stripInternalJsonKeys(jsonData);
1509
+ invariant9(schema === void 0 || Schema9.isSchema(schema), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 43, S: void 0, A: ["schema === undefined || Schema.isSchema(schema)", ""] });
1510
+ const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));
1776
1511
  let obj;
1777
1512
  if (schema != null) {
1778
- obj = await schema.pipe(Schema10.decodeUnknownPromise)(decodedInput);
1513
+ obj = await schema.pipe(Schema9.decodeUnknownPromise)(decodedInput);
1779
1514
  if (refResolver) {
1780
1515
  setRefResolverOnData(obj, refResolver);
1781
1516
  }
@@ -1784,23 +1519,21 @@ var objectFromJSON = async (jsonData, { refResolver, dxn, database, parent } = {
1784
1519
  refResolver
1785
1520
  });
1786
1521
  }
1787
- invariant13(ObjectId4.isValid(obj.id), "Invalid object id", {
1788
- F: __dxlog_file13,
1789
- L: 110,
1790
- S: void 0,
1791
- A: [
1792
- "ObjectId.isValid(obj.id)",
1793
- "'Invalid object id'"
1794
- ]
1795
- });
1522
+ invariant9(EntityId3.isValid(obj.id), "Invalid object id", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 56, S: void 0, A: ["EntityId.isValid(obj.id)", "'Invalid object id'"] });
1796
1523
  setTypename(obj, type);
1797
1524
  if (schema) {
1798
1525
  setSchema(obj, schema);
1799
1526
  }
1527
+ if (refResolver?.resolveType) {
1528
+ const typeEntity = await refResolver.resolveType(type);
1529
+ if (typeEntity != null) {
1530
+ setType(obj, typeEntity);
1531
+ }
1532
+ }
1800
1533
  const isRelation = typeof jsonData[ATTR_RELATION_SOURCE] === "string" || typeof jsonData[ATTR_RELATION_TARGET] === "string";
1801
1534
  if (isRelation) {
1802
- const sourceDxn = DXN5.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise2(new TypeError("Missing relation source")));
1803
- const targetDxn = DXN5.parse(jsonData[ATTR_RELATION_TARGET] ?? raise2(new TypeError("Missing relation target")));
1535
+ const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise2(new TypeError("Missing relation source"));
1536
+ const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise2(new TypeError("Missing relation target"));
1804
1537
  const source = await refResolver?.resolve(sourceDxn);
1805
1538
  const target = await refResolver?.resolve(targetDxn);
1806
1539
  defineHiddenProperty(obj, KindId, EntityKind.Relation);
@@ -1809,106 +1542,74 @@ var objectFromJSON = async (jsonData, { refResolver, dxn, database, parent } = {
1809
1542
  defineHiddenProperty(obj, RelationSourceId, source);
1810
1543
  defineHiddenProperty(obj, RelationTargetId, target);
1811
1544
  } else {
1812
- defineHiddenProperty(obj, KindId, EntityKind.Object);
1545
+ const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : void 0;
1546
+ defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);
1813
1547
  }
1814
1548
  if (typeof jsonData[ATTR_META] === "object") {
1815
- const meta = await ObjectMetaSchema.pipe(Schema10.decodeUnknownPromise)(jsonData[ATTR_META]);
1816
- invariant13(Array.isArray(meta.keys), void 0, {
1817
- F: __dxlog_file13,
1818
- L: 136,
1819
- S: void 0,
1820
- A: [
1821
- "Array.isArray(meta.keys)",
1822
- ""
1823
- ]
1824
- });
1549
+ const meta = await EntityMetaSchema.pipe(Schema9.decodeUnknownPromise)(normalizeMeta(jsonData[ATTR_META]));
1550
+ invariant9(Array.isArray(meta.keys), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 92, S: void 0, A: ["Array.isArray(meta.keys)", ""] });
1825
1551
  defineHiddenProperty(obj, MetaId, meta);
1826
1552
  } else {
1827
1553
  defineHiddenProperty(obj, MetaId, {
1828
- keys: []
1554
+ keys: [],
1555
+ tags: [],
1556
+ annotations: {}
1829
1557
  });
1830
1558
  }
1831
1559
  if (jsonData[ATTR_PARENT]) {
1832
- const parentDxn = DXN5.parse(jsonData[ATTR_PARENT]);
1560
+ const parentDxn = jsonData[ATTR_PARENT];
1833
1561
  const resolvedParent = await refResolver?.resolve(parentDxn);
1834
1562
  defineHiddenProperty(obj, ParentId, resolvedParent);
1835
1563
  } else if (parent) {
1836
1564
  defineHiddenProperty(obj, ParentId, parent);
1837
1565
  }
1838
- if (dxn) {
1839
- defineHiddenProperty(obj, SelfDXNId, dxn);
1566
+ if (uri) {
1567
+ defineHiddenProperty(obj, SelfURIId, uri);
1840
1568
  }
1841
1569
  if (database) {
1842
1570
  defineHiddenProperty(obj, ObjectDatabaseId, database);
1843
1571
  }
1844
1572
  assertObjectModel(obj);
1845
- invariant13(obj[ATTR_TYPE] === void 0, "Invalid object model", {
1846
- F: __dxlog_file13,
1847
- L: 161,
1848
- S: void 0,
1849
- A: [
1850
- "(obj as any)[ATTR_TYPE] === undefined",
1851
- "'Invalid object model'"
1852
- ]
1853
- });
1854
- invariant13(obj[ATTR_META] === void 0, "Invalid object model", {
1855
- F: __dxlog_file13,
1856
- L: 162,
1857
- S: void 0,
1858
- A: [
1859
- "(obj as any)[ATTR_META] === undefined",
1860
- "'Invalid object model'"
1861
- ]
1862
- });
1863
- invariant13(obj[ATTR_DELETED] === void 0, "Invalid object model", {
1864
- F: __dxlog_file13,
1865
- L: 163,
1866
- S: void 0,
1867
- A: [
1868
- "(obj as any)[ATTR_DELETED] === undefined",
1869
- "'Invalid object model'"
1870
- ]
1871
- });
1872
- invariant13(obj[ATTR_SELF_DXN] === void 0, "Invalid object model", {
1873
- F: __dxlog_file13,
1874
- L: 164,
1875
- S: void 0,
1876
- A: [
1877
- "(obj as any)[ATTR_SELF_DXN] === undefined",
1878
- "'Invalid object model'"
1879
- ]
1880
- });
1881
- invariant13(obj[ATTR_RELATION_SOURCE] === void 0, "Invalid object model", {
1882
- F: __dxlog_file13,
1883
- L: 165,
1884
- S: void 0,
1885
- A: [
1886
- "(obj as any)[ATTR_RELATION_SOURCE] === undefined",
1887
- "'Invalid object model'"
1888
- ]
1889
- });
1890
- invariant13(obj[ATTR_RELATION_TARGET] === void 0, "Invalid object model", {
1891
- F: __dxlog_file13,
1892
- L: 166,
1893
- S: void 0,
1894
- A: [
1895
- "(obj as any)[ATTR_RELATION_TARGET] === undefined",
1896
- "'Invalid object model'"
1897
- ]
1898
- });
1573
+ invariant9(obj[ATTR_TYPE] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 115, S: void 0, A: ["obj[ATTR_TYPE] === undefined", "'Invalid object model'"] });
1574
+ invariant9(obj[ATTR_META] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 116, S: void 0, A: ["obj[ATTR_META] === undefined", "'Invalid object model'"] });
1575
+ invariant9(obj[ATTR_DELETED] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 117, S: void 0, A: ["obj[ATTR_DELETED] === undefined", "'Invalid object model'"] });
1576
+ invariant9(obj[ATTR_SELF_URI] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 118, S: void 0, A: ["obj[ATTR_SELF_URI] === undefined", "'Invalid object model'"] });
1577
+ invariant9(obj[ATTR_SELF_URI_LEGACY] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 119, S: void 0, A: ["obj[ATTR_SELF_URI_LEGACY] === undefined", "'Invalid object model'"] });
1578
+ invariant9(obj[ATTR_RELATION_SOURCE] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 120, S: void 0, A: ["obj[ATTR_RELATION_SOURCE] === undefined", "'Invalid object model'"] });
1579
+ invariant9(obj[ATTR_RELATION_TARGET] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 121, S: void 0, A: ["obj[ATTR_RELATION_TARGET] === undefined", "'Invalid object model'"] });
1899
1580
  return obj;
1900
1581
  };
1582
+ var normalizeMeta = (meta) => {
1583
+ const tags = Array.isArray(meta?.tags) ? meta.tags.map((tag) => typeof tag === "string" ? {
1584
+ "/": URI.make(tag)
1585
+ } : tag) : [];
1586
+ return {
1587
+ ...meta,
1588
+ keys: Array.isArray(meta?.keys) ? meta.keys : [],
1589
+ tags,
1590
+ annotations: meta?.annotations ?? {}
1591
+ };
1592
+ };
1901
1593
  var decodeGeneric = (jsonData, options) => {
1902
1594
  const props = stripInternalJsonKeys(jsonData);
1903
1595
  return deepMapValues2(props, (value2, visitor) => {
1904
1596
  if (isEncodedReference(value2)) {
1905
1597
  return refFromEncodedReference(value2, options.refResolver);
1906
1598
  }
1599
+ if (isEncodedUint8Array(value2)) {
1600
+ return decodeUint8ArrayFromJson(value2);
1601
+ }
1907
1602
  return visitor(value2);
1908
1603
  });
1909
1604
  };
1605
+ var restoreUint8Arrays = (data) => deepMapValues2(data, (value2, recurse) => {
1606
+ if (isEncodedUint8Array(value2)) {
1607
+ return decodeUint8ArrayFromJson(value2);
1608
+ }
1609
+ return recurse(value2);
1610
+ });
1910
1611
  var stripInternalJsonKeys = (jsonData) => {
1911
- const { [ATTR_TYPE]: _type, [ATTR_META]: _meta, [ATTR_DELETED]: _deleted, [ATTR_SELF_DXN]: _selfDxn, [ATTR_RELATION_SOURCE]: _relationSource, [ATTR_RELATION_TARGET]: _relationTarget, ...props } = jsonData;
1612
+ const { [ATTR_TYPE]: _type, [ATTR_META]: _meta, [ATTR_DELETED]: _deleted, [ATTR_SELF_URI]: _selfUri, [ATTR_SELF_URI_LEGACY]: _legacySelfUri, [ATTR_RELATION_SOURCE]: _relationSource, [ATTR_RELATION_TARGET]: _relationTarget, ...props } = jsonData;
1912
1613
  return props;
1913
1614
  };
1914
1615
  var setRefResolverOnData = (obj, refResolver) => {
@@ -1922,43 +1623,58 @@ var setRefResolverOnData = (obj, refResolver) => {
1922
1623
  visitor(obj);
1923
1624
  };
1924
1625
  var objectStructureToJson = (objectId, structure) => {
1626
+ const typeRef = EntityStructure.getTypeReference(structure)?.["/"];
1627
+ const parent = EntityStructure.getParent(structure)?.["/"];
1628
+ const source = EntityStructure.getRelationSource(structure)?.["/"];
1629
+ const target = EntityStructure.getRelationTarget(structure)?.["/"];
1925
1630
  return {
1926
1631
  ...structure.data,
1927
1632
  id: objectId,
1928
- [ATTR_TYPE]: ObjectStructure.getTypeReference(structure)?.["/"] ?? "",
1929
- [ATTR_DELETED]: ObjectStructure.isDeleted(structure),
1930
- [ATTR_PARENT]: ObjectStructure.getParent(structure)?.["/"],
1931
- [ATTR_RELATION_SOURCE]: ObjectStructure.getRelationSource(structure)?.["/"],
1932
- [ATTR_RELATION_TARGET]: ObjectStructure.getRelationTarget(structure)?.["/"]
1633
+ [ATTR_TYPE]: typeRef ? URI.make(typeRef) : void 0,
1634
+ [ATTR_DELETED]: EntityStructure.isDeleted(structure),
1635
+ [ATTR_PARENT]: parent !== void 0 ? EID2.tryParse(parent) : void 0,
1636
+ [ATTR_RELATION_SOURCE]: source !== void 0 ? EID2.tryParse(source) : void 0,
1637
+ [ATTR_RELATION_TARGET]: target !== void 0 ? EID2.tryParse(target) : void 0
1933
1638
  };
1934
1639
  };
1935
1640
 
1936
1641
  // src/internal/Obj/create-object.ts
1937
- var createObject = (schema, props) => {
1642
+ var createObject = (input, props) => {
1643
+ const schema = getStaticTypeSchema(input) ?? failedInvariant("Type entity is missing its source schema");
1938
1644
  const annotation = getTypeAnnotation(schema);
1939
1645
  if (!annotation) {
1940
1646
  throw new Error("Schema is not an ECHO schema");
1941
1647
  }
1942
- assertArgument6(!("@type" in props), "data", "@type is not allowed");
1943
- assertArgument6(!(RelationSourceDXNId in props), "data", "Relation source DXN is not allowed in the constructor");
1944
- assertArgument6(!(RelationTargetDXNId in props), "data", "Relation target DXN is not allowed in the constructor");
1945
- assertArgument6(RelationSourceId in props === RelationTargetId in props, "data", "Relation source and target must be provided together");
1648
+ assertArgument5(!("@type" in props), "data", "@type is not allowed");
1649
+ assertArgument5(!(RelationSourceDXNId in props), "data", "Relation source DXN is not allowed in the constructor");
1650
+ assertArgument5(!(RelationTargetDXNId in props), "data", "Relation target DXN is not allowed in the constructor");
1651
+ assertArgument5(RelationSourceId in props === RelationTargetId in props, "data", "Relation source and target must be provided together");
1652
+ const metaOverride = props[MetaId];
1653
+ if (metaOverride !== void 0) {
1654
+ delete props[MetaId];
1655
+ }
1946
1656
  const obj = {
1947
1657
  ...props,
1948
- id: props.id ?? ObjectId5.random()
1658
+ id: props.id ?? EntityId4.random()
1949
1659
  };
1950
- const kind = RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
1660
+ const kind = annotation.kind === EntityKind.Type ? EntityKind.Type : annotation.kind === EntityKind.Relation || RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
1951
1661
  defineHiddenProperty(obj, KindId, kind);
1952
1662
  defineHiddenProperty(obj, MetaId, {
1953
- keys: []
1663
+ ...metaOverride,
1664
+ keys: metaOverride?.keys ?? [],
1665
+ tags: metaOverride?.tags ?? [],
1666
+ annotations: metaOverride?.annotations ?? {}
1954
1667
  });
1955
1668
  setSchema(obj, schema);
1956
- setTypename(obj, getSchemaDXN(schema) ?? failedInvariant("Missing schema DXN"));
1669
+ if (input !== schema) {
1670
+ setType(obj, input);
1671
+ }
1672
+ setTypename(obj, getSchemaURI(schema) ?? failedInvariant("Missing schema URI"));
1957
1673
  attachTypedJsonSerializer(obj);
1958
1674
  attachedTypedObjectInspector(obj);
1959
1675
  if (kind === EntityKind.Relation) {
1960
- const sourceDXN = getObjectDXN(props[RelationSourceId]) ?? raise3(new Error("Unresolved relation source"));
1961
- const targetDXN = getObjectDXN(props[RelationTargetId]) ?? raise3(new Error("Unresolved relation target"));
1676
+ const sourceDXN = getObjectEchoUri(props[RelationSourceId]) ?? raise3(new Error("Unresolved relation source"));
1677
+ const targetDXN = getObjectEchoUri(props[RelationTargetId]) ?? raise3(new Error("Unresolved relation target"));
1962
1678
  defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
1963
1679
  defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
1964
1680
  }
@@ -1974,41 +1690,17 @@ var isDeleted = (obj) => {
1974
1690
  return obj[ObjectDeletedId] ?? false;
1975
1691
  };
1976
1692
 
1977
- // src/internal/Obj/ids.ts
1978
- import { DXN as DXN6, ObjectId as ObjectId6, QueueSubspaceTags, SpaceId } from "@dxos/keys";
1979
- var createQueueDXN = (spaceId = SpaceId.random(), queueId = ObjectId6.random()) => new DXN6(DXN6.kind.QUEUE, [
1980
- QueueSubspaceTags.DATA,
1981
- spaceId,
1982
- queueId
1983
- ]);
1984
-
1985
1693
  // src/internal/Obj/set-value.ts
1986
1694
  import * as Match from "effect/Match";
1987
1695
  import * as Option from "effect/Option";
1988
- import * as SchemaAST6 from "effect/SchemaAST";
1989
- import { getArrayElementType, getBaseType, getProperties as getProperties2, isArrayType, isNestedType } from "@dxos/effect";
1990
- import { invariant as invariant14 } from "@dxos/invariant";
1991
- var __dxlog_file14 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/set-value.ts";
1696
+ import * as SchemaAST8 from "effect/SchemaAST";
1697
+ import { SchemaEx } from "@dxos/effect";
1698
+ import { invariant as invariant10 } from "@dxos/invariant";
1699
+ var __dxlog_file10 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/set-value.ts";
1992
1700
  var setValue = (obj, path, value2) => {
1993
- invariant14(path.length > 0, "Path must not be empty", {
1994
- F: __dxlog_file14,
1995
- L: 27,
1996
- S: void 0,
1997
- A: [
1998
- "path.length > 0",
1999
- "'Path must not be empty'"
2000
- ]
2001
- });
1701
+ invariant10(path.length > 0, "Path must not be empty", { "~LogMeta": "~LogMeta", F: __dxlog_file10, L: 14, S: void 0, A: ["path.length > 0", "'Path must not be empty'"] });
2002
1702
  const schema = getSchema(obj);
2003
- invariant14(schema != null, "Object must have a schema", {
2004
- F: __dxlog_file14,
2005
- L: 30,
2006
- S: void 0,
2007
- A: [
2008
- "schema != null",
2009
- "'Object must have a schema'"
2010
- ]
2011
- });
1703
+ invariant10(schema != null, "Object must have a schema", { "~LogMeta": "~LogMeta", F: __dxlog_file10, L: 16, S: void 0, A: ["schema != null", "'Object must have a schema'"] });
2012
1704
  let parent = obj;
2013
1705
  let currentAST = schema.ast;
2014
1706
  for (let i = 0; i < path.length - 1; i++) {
@@ -2016,7 +1708,7 @@ var setValue = (obj, path, value2) => {
2016
1708
  const key = typeof part === "number" ? part : String(part);
2017
1709
  if (parent[key] === void 0) {
2018
1710
  const propertyAST = getPropertyAST(currentAST, String(part));
2019
- const shouldBeArray = propertyAST ? isArrayType(propertyAST) : false;
1711
+ const shouldBeArray = propertyAST ? SchemaEx.isArrayType(propertyAST) : false;
2020
1712
  if (shouldBeArray) {
2021
1713
  parent[key] = [];
2022
1714
  } else {
@@ -2035,15 +1727,15 @@ var getPropertyAST = (ast, propertyName) => {
2035
1727
  if (!ast) {
2036
1728
  return void 0;
2037
1729
  }
2038
- if (isNestedType(ast)) {
2039
- const properties = getProperties2(ast);
1730
+ if (SchemaEx.isNestedType(ast)) {
1731
+ const properties = SchemaEx.getProperties(ast);
2040
1732
  const property = properties.find((p) => p.name.toString() === propertyName);
2041
1733
  if (property) {
2042
- return getBaseType(property).type;
1734
+ return SchemaEx.getBaseType(property).type;
2043
1735
  }
2044
1736
  }
2045
- if (isArrayType(ast)) {
2046
- const elementType = getArrayElementType(ast);
1737
+ if (SchemaEx.isArrayType(ast)) {
1738
+ const elementType = SchemaEx.getArrayElementType(ast);
2047
1739
  return elementType;
2048
1740
  }
2049
1741
  return void 0;
@@ -2052,17 +1744,17 @@ var getRequiredProperties = (ast) => {
2052
1744
  if (!ast) {
2053
1745
  return [];
2054
1746
  }
2055
- if (!isNestedType(ast)) {
1747
+ if (!SchemaEx.isNestedType(ast)) {
2056
1748
  return [];
2057
1749
  }
2058
- const properties = getProperties2(ast);
1750
+ const properties = SchemaEx.getProperties(ast);
2059
1751
  return properties.filter((p) => !p.isOptional);
2060
1752
  };
2061
1753
  var getDefaultValueForType = (ast) => {
2062
1754
  if (!ast) {
2063
1755
  return void 0;
2064
1756
  }
2065
- const defaultValue = SchemaAST6.getDefaultAnnotation(ast);
1757
+ const defaultValue = SchemaAST8.getDefaultAnnotation(ast);
2066
1758
  if (Option.isSome(defaultValue)) {
2067
1759
  return defaultValue.value;
2068
1760
  }
@@ -2084,7 +1776,7 @@ var createObjectWithDefaults = (ast) => {
2084
1776
  const defaultValue = getDefaultValueForType(prop.type);
2085
1777
  if (defaultValue !== void 0) {
2086
1778
  obj[prop.name] = defaultValue;
2087
- } else if (isNestedType(prop.type)) {
1779
+ } else if (SchemaEx.isNestedType(prop.type)) {
2088
1780
  obj[prop.name] = createObjectWithDefaults(prop.type);
2089
1781
  }
2090
1782
  }
@@ -2092,7 +1784,7 @@ var createObjectWithDefaults = (ast) => {
2092
1784
  };
2093
1785
 
2094
1786
  // src/internal/Obj/snapshot.ts
2095
- import { assertArgument as assertArgument7 } from "@dxos/invariant";
1787
+ import { assertArgument as assertArgument6 } from "@dxos/invariant";
2096
1788
  import { deepMapValues as deepMapValues3 } from "@dxos/util";
2097
1789
  var copySymbolProperty = (source, target, symbol, transform) => {
2098
1790
  let value2;
@@ -2112,7 +1804,7 @@ var copySymbolProperty = (source, target, symbol, transform) => {
2112
1804
  }
2113
1805
  };
2114
1806
  var getSnapshot = (obj) => {
2115
- assertArgument7(typeof obj === "object" && obj !== null && KindId in obj, "obj", "must be an entity");
1807
+ assertArgument6(typeof obj === "object" && obj !== null && KindId in obj, "obj", "must be an entity");
2116
1808
  const snapshot = deepMapValues3(obj, (value2, recurse) => {
2117
1809
  if (typeof value2 === "object" && value2 !== null && Object.getPrototypeOf(value2) !== Object.prototype && !Array.isArray(value2)) {
2118
1810
  return value2;
@@ -2125,16 +1817,29 @@ var getSnapshot = (obj) => {
2125
1817
  const source = obj;
2126
1818
  copySymbolProperty(source, snapshot, TypeId);
2127
1819
  copySymbolProperty(source, snapshot, SchemaId);
2128
- copySymbolProperty(source, snapshot, SelfDXNId);
1820
+ copySymbolProperty(source, snapshot, TypeEntityId);
1821
+ copySymbolProperty(source, snapshot, SelfURIId);
2129
1822
  copySymbolProperty(source, snapshot, ObjectDatabaseId);
2130
1823
  copySymbolProperty(source, snapshot, ObjectDeletedId);
1824
+ copySymbolProperty(source, snapshot, ParentId);
2131
1825
  copySymbolProperty(source, snapshot, MetaId, (meta) => ({
2132
1826
  keys: [
2133
1827
  ...meta?.keys ?? []
2134
1828
  ],
2135
1829
  tags: [
2136
1830
  ...meta?.tags ?? []
2137
- ]
1831
+ ],
1832
+ ...meta?.key != null ? {
1833
+ key: meta.key
1834
+ } : {},
1835
+ ...meta?.version != null ? {
1836
+ version: meta.version
1837
+ } : {},
1838
+ ...meta?.annotations ? {
1839
+ annotations: {
1840
+ ...meta.annotations
1841
+ }
1842
+ } : {}
2138
1843
  }));
2139
1844
  copySymbolProperty(source, snapshot, RelationSourceDXNId);
2140
1845
  copySymbolProperty(source, snapshot, RelationTargetDXNId);
@@ -2143,22 +1848,151 @@ var getSnapshot = (obj) => {
2143
1848
  return Object.freeze(snapshot);
2144
1849
  };
2145
1850
 
1851
+ // src/internal/Obj/atoms.ts
1852
+ import * as Atom from "@effect-atom/atom/Atom";
1853
+ import * as Result from "@effect-atom/atom/Result";
1854
+ import * as Effect from "effect/Effect";
1855
+ import * as Function from "effect/Function";
1856
+ import * as Option2 from "effect/Option";
1857
+ import { assertArgument as assertArgument7 } from "@dxos/invariant";
1858
+ var isRef = (obj) => obj != null && typeof obj === "object" && RefTypeId in obj;
1859
+ var getReactiveOption = (snapshot) => Effect.gen(function* () {
1860
+ const db = getDatabase(snapshot);
1861
+ if (!db) {
1862
+ return Option2.none();
1863
+ }
1864
+ const obj = db.getObjectById(snapshot.id);
1865
+ return obj ? Option2.some(obj) : Option2.none();
1866
+ });
1867
+ var objectFamily = Atom.family((obj) => {
1868
+ return Atom.make((get) => {
1869
+ const unsubscribe = subscribe(obj, () => {
1870
+ get.setSelf(getSnapshot(obj));
1871
+ });
1872
+ get.addFinalizer(() => unsubscribe());
1873
+ return getSnapshot(obj);
1874
+ }).pipe(Atom.keepAlive);
1875
+ });
1876
+ var refFamily = Atom.family((ref) => {
1877
+ return Atom.make((get) => {
1878
+ let unsubscribeTarget;
1879
+ const setupTargetSubscription = (target) => {
1880
+ unsubscribeTarget?.();
1881
+ unsubscribeTarget = subscribe(target, () => {
1882
+ get.setSelf(getSnapshot(target));
1883
+ });
1884
+ return getSnapshot(target);
1885
+ };
1886
+ get.addFinalizer(() => {
1887
+ unsubscribeTarget?.();
1888
+ });
1889
+ return loadRefTarget(ref, get, setupTargetSubscription);
1890
+ }).pipe(Atom.keepAlive);
1891
+ });
1892
+ var snapshotForComparison = (value2) => {
1893
+ if (Array.isArray(value2)) {
1894
+ return [
1895
+ ...value2
1896
+ ];
1897
+ }
1898
+ if (value2 !== null && typeof value2 === "object") {
1899
+ return {
1900
+ ...value2
1901
+ };
1902
+ }
1903
+ return value2;
1904
+ };
1905
+ var propertyFamily = Atom.family((obj) => Atom.family((key) => {
1906
+ return Atom.make((get) => {
1907
+ let previousSnapshot = snapshotForComparison(obj[key]);
1908
+ const unsubscribe2 = subscribe(obj, () => {
1909
+ const newValue = obj[key];
1910
+ const newSnapshot = snapshotForComparison(newValue);
1911
+ if (newSnapshot !== previousSnapshot) {
1912
+ previousSnapshot = newSnapshot;
1913
+ get.setSelf(newSnapshot);
1914
+ }
1915
+ });
1916
+ get.addFinalizer(() => unsubscribe2());
1917
+ return snapshotForComparison(obj[key]);
1918
+ }).pipe(Atom.keepAlive);
1919
+ }));
1920
+ var objectWithReactiveFamily = Atom.family((obj) => {
1921
+ return Atom.make((get) => {
1922
+ const unsubscribe = subscribe(obj, () => {
1923
+ get.setSelf(obj);
1924
+ });
1925
+ get.addFinalizer(() => unsubscribe());
1926
+ return obj;
1927
+ }).pipe(Atom.keepAlive);
1928
+ });
1929
+ var refWithReactiveFamily = Atom.family((ref) => {
1930
+ const effect = (get) => Effect.gen(function* () {
1931
+ const snapshot = get(makeAtom(ref));
1932
+ if (snapshot == null) {
1933
+ return void 0;
1934
+ }
1935
+ const option = yield* getReactiveOption(snapshot);
1936
+ return Option2.getOrElse(option, () => void 0);
1937
+ });
1938
+ return Function.pipe(Atom.make(effect), Atom.map((result) => Result.getOrElse(result, () => void 0)));
1939
+ });
1940
+ var entityFamily = Atom.family((entity) => {
1941
+ return Atom.make((get) => {
1942
+ const unsubscribe = subscribe(entity, () => {
1943
+ get.setSelf(getSnapshot(entity));
1944
+ });
1945
+ get.addFinalizer(() => unsubscribe());
1946
+ return getSnapshot(entity);
1947
+ }).pipe(Atom.keepAlive);
1948
+ });
1949
+ var relationFamily = Atom.family((relation) => {
1950
+ return Atom.make((get) => {
1951
+ const unsubscribe = subscribe(relation, () => {
1952
+ get.setSelf(getSnapshot(relation));
1953
+ });
1954
+ get.addFinalizer(() => unsubscribe());
1955
+ return getSnapshot(relation);
1956
+ }).pipe(Atom.keepAlive);
1957
+ });
1958
+ var makeAtom = (objOrRef) => {
1959
+ if (isRef(objOrRef)) {
1960
+ return refFamily(objOrRef);
1961
+ }
1962
+ const obj = objOrRef;
1963
+ assertArgument7(isEntity(obj), "obj", "Object must be a reactive object");
1964
+ return objectFamily(obj);
1965
+ };
1966
+ var makeProperty = (obj, key) => {
1967
+ assertArgument7(isEntity(obj), "obj", "Object must be a reactive object");
1968
+ return propertyFamily(obj)(key);
1969
+ };
1970
+ var makeWithReactive = (objOrRef) => {
1971
+ if (isRef(objOrRef)) {
1972
+ return refWithReactiveFamily(objOrRef);
1973
+ }
1974
+ const obj = objOrRef;
1975
+ assertArgument7(isEntity(obj), "obj", "Object must be a reactive object");
1976
+ return objectWithReactiveFamily(obj);
1977
+ };
1978
+ var makeEntity = (entity) => {
1979
+ assertArgument7(isEntity(entity), "entity", "Must be a reactive ECHO entity");
1980
+ return entityFamily(entity);
1981
+ };
1982
+ var makeRelation = (relation) => {
1983
+ assertArgument7(isEntity(relation), "relation", "Must be a reactive ECHO relation");
1984
+ return relationFamily(relation);
1985
+ };
1986
+
2146
1987
  // src/internal/Obj/clone.ts
2147
- import { invariant as invariant15 } from "@dxos/invariant";
1988
+ import { invariant as invariant11 } from "@dxos/invariant";
2148
1989
  import { deepMapValues as deepMapValues4 } from "@dxos/util";
2149
- var __dxlog_file15 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/clone.ts";
1990
+ var __dxlog_file11 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/clone.ts";
2150
1991
  var clone = (obj, opts) => {
2151
1992
  const { id, ...data } = obj;
2152
- const schema = getSchema(obj);
2153
- invariant15(schema != null, "Object should have a schema", {
2154
- F: __dxlog_file15,
2155
- L: 21,
2156
- S: void 0,
2157
- A: [
2158
- "schema != null",
2159
- "'Object should have a schema'"
2160
- ]
2161
- });
1993
+ const typeEntity = getType(obj);
1994
+ const schema = typeEntity != null ? getStaticTypeSchema(typeEntity) : getSchema(obj);
1995
+ invariant11(schema != null, "Object should have a type or schema", { "~LogMeta": "~LogMeta", F: __dxlog_file11, L: 21, S: void 0, A: ["schema != null", "'Object should have a type or schema'"] });
2162
1996
  const props = deepMapValues4(data, (value2, recurse) => {
2163
1997
  if (Ref.isRef(value2)) {
2164
1998
  if (opts?.deep) {
@@ -2180,13 +2014,16 @@ var clone = (obj, opts) => {
2180
2014
  }
2181
2015
  return recurse(value2);
2182
2016
  });
2183
- return makeObject(schema, props, meta);
2017
+ return makeObject(schema, props, meta, typeEntity);
2184
2018
  };
2185
2019
 
2186
- // src/internal/Query.ts
2020
+ // src/internal/Query/pretty.ts
2187
2021
  var prettyFilter = (filter) => {
2188
2022
  switch (filter.type) {
2189
2023
  case "object": {
2024
+ if (filter.typename === null && (filter.id === void 0 || filter.id.length === 0) && Object.keys(filter.props).length === 0 && (filter.foreignKeys === void 0 || filter.foreignKeys.length === 0) && filter.metaKey !== void 0) {
2025
+ return filter.metaVersion !== void 0 ? `Filter.key(${JSON.stringify(filter.metaKey)}, { version: ${JSON.stringify(filter.metaVersion)} })` : `Filter.key(${JSON.stringify(filter.metaKey)})`;
2026
+ }
2190
2027
  const parts = [];
2191
2028
  if (filter.typename !== null) {
2192
2029
  parts.push(String(filter.typename));
@@ -2202,6 +2039,9 @@ var prettyFilter = (filter) => {
2202
2039
  if (filter.foreignKeys !== void 0 && filter.foreignKeys.length > 0) {
2203
2040
  parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(", ")}]`);
2204
2041
  }
2042
+ if (filter.metaKey !== void 0) {
2043
+ parts.push(filter.metaVersion !== void 0 ? `metaKey: ${JSON.stringify(filter.metaKey)} (${filter.metaVersion})` : `metaKey: ${JSON.stringify(filter.metaKey)}`);
2044
+ }
2205
2045
  return parts.length > 0 ? `Filter.type(${parts.join(", ")})` : "Filter.everything()";
2206
2046
  }
2207
2047
  case "compare":
@@ -2265,6 +2105,9 @@ var prettyQuery = (query) => {
2265
2105
  return "Order.natural()";
2266
2106
  } else if (o.kind === "rank") {
2267
2107
  return `Order.rank(${JSON.stringify(o.direction)})`;
2108
+ } else if (o.kind === "timestamp") {
2109
+ const fn = o.field === "updatedAt" ? "updated" : "created";
2110
+ return `Order.${fn}(${JSON.stringify(o.direction)})`;
2268
2111
  } else {
2269
2112
  return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;
2270
2113
  }
@@ -2277,22 +2120,26 @@ var prettyQuery = (query) => {
2277
2120
  if (opts.deleted !== void 0) {
2278
2121
  parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);
2279
2122
  }
2123
+ if (opts.debugLabel !== void 0) {
2124
+ parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);
2125
+ }
2280
2126
  return `${prettyQuery(query.query)}.options({ ${parts.join(", ")} })`;
2281
2127
  }
2282
2128
  case "from": {
2283
2129
  if (query.from._tag === "scope") {
2284
- const scope = query.from.scope;
2285
- const parts = [];
2286
- if (scope.spaceIds !== void 0) {
2287
- parts.push(`spaceIds: [${scope.spaceIds.map((s) => JSON.stringify(s)).join(", ")}]`);
2288
- }
2289
- if (scope.queues !== void 0) {
2290
- parts.push(`queues: [${scope.queues.map(String).join(", ")}]`);
2291
- }
2292
- if (scope.allQueuesFromSpaces !== void 0) {
2293
- parts.push(`allQueuesFromSpaces: ${scope.allQueuesFromSpaces}`);
2130
+ if (query.from.scopes.length === 0) {
2131
+ return `${prettyQuery(query.query)}.from('all-accessible-spaces')`;
2294
2132
  }
2295
- return `${prettyQuery(query.query)}.from({ ${parts.join(", ")} })`;
2133
+ const scopeStrs = query.from.scopes.map((scope) => {
2134
+ if (scope._tag === "space") {
2135
+ return scope.includeAllFeeds ? `{ space: ${JSON.stringify(scope.spaceId)}, includeAllFeeds: true }` : `{ space: ${JSON.stringify(scope.spaceId)} }`;
2136
+ }
2137
+ if (scope._tag === "feed") {
2138
+ return `{ feed: ${JSON.stringify(String(scope.feedUri))} }`;
2139
+ }
2140
+ return `{ registry: ${JSON.stringify(scope.location)} }`;
2141
+ });
2142
+ return `${prettyQuery(query.query)}.from([${scopeStrs.join(", ")}])`;
2296
2143
  }
2297
2144
  return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;
2298
2145
  }
@@ -2301,36 +2148,22 @@ var prettyQuery = (query) => {
2301
2148
  }
2302
2149
  };
2303
2150
 
2304
- // src/internal/Type/echo-schema.ts
2305
- import * as Schema13 from "effect/Schema";
2306
- import * as SchemaAST8 from "effect/SchemaAST";
2307
- import { invariant as invariant17 } from "@dxos/invariant";
2308
-
2309
2151
  // src/internal/Type/manipulation.ts
2310
- import * as Schema11 from "effect/Schema";
2311
- import * as SchemaAST7 from "effect/SchemaAST";
2312
- import { invariant as invariant16 } from "@dxos/invariant";
2313
- import { DXN as DXN7 } from "@dxos/keys";
2314
- var __dxlog_file16 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Type/manipulation.ts";
2152
+ import * as Schema10 from "effect/Schema";
2153
+ import * as SchemaAST9 from "effect/SchemaAST";
2154
+ import { invariant as invariant12 } from "@dxos/invariant";
2155
+ var __dxlog_file12 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Type/manipulation.ts";
2315
2156
  var addFieldsToSchema = (schema, fields) => {
2316
- const schemaExtension = Schema11.partial(Schema11.Struct(fields));
2317
- return Schema11.extend(schema, schemaExtension).annotations(schema.ast.annotations);
2157
+ const schemaExtension = Schema10.partial(Schema10.Struct(fields));
2158
+ return Schema10.extend(schema, schemaExtension).annotations(schema.ast.annotations);
2318
2159
  };
2319
2160
  var updateFieldsInSchema = (schema, fields) => {
2320
2161
  const ast = schema.ast;
2321
- invariant16(SchemaAST7.isTypeLiteral(ast), void 0, {
2322
- F: __dxlog_file16,
2323
- L: 29,
2324
- S: void 0,
2325
- A: [
2326
- "SchemaAST.isTypeLiteral(ast)",
2327
- ""
2328
- ]
2329
- });
2162
+ invariant12(SchemaAST9.isTypeLiteral(ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file12, L: 14, S: void 0, A: ["SchemaAST.isTypeLiteral(ast)", ""] });
2330
2163
  const updatedProperties = [
2331
2164
  ...ast.propertySignatures
2332
2165
  ];
2333
- const propertiesToUpdate = Schema11.partial(Schema11.Struct(fields)).ast.propertySignatures;
2166
+ const propertiesToUpdate = Schema10.partial(Schema10.Struct(fields)).ast.propertySignatures;
2334
2167
  for (const property of propertiesToUpdate) {
2335
2168
  const index = updatedProperties.findIndex((p) => p.name === property.name);
2336
2169
  if (index !== -1) {
@@ -2339,420 +2172,37 @@ var updateFieldsInSchema = (schema, fields) => {
2339
2172
  updatedProperties.push(property);
2340
2173
  }
2341
2174
  }
2342
- return Schema11.make(new SchemaAST7.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));
2175
+ return Schema10.make(new SchemaAST9.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));
2343
2176
  };
2344
2177
  var removeFieldsFromSchema = (schema, fieldNames) => {
2345
- return Schema11.make(SchemaAST7.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);
2178
+ return Schema10.make(SchemaAST9.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);
2346
2179
  };
2347
2180
  var updateFieldNameInSchema = (schema, { before, after }) => {
2348
2181
  const ast = schema.ast;
2349
- invariant16(SchemaAST7.isTypeLiteral(ast), void 0, {
2350
- F: __dxlog_file16,
2351
- L: 57,
2352
- S: void 0,
2353
- A: [
2354
- "SchemaAST.isTypeLiteral(ast)",
2355
- ""
2356
- ]
2357
- });
2358
- return Schema11.make(new SchemaAST7.TypeLiteral(ast.propertySignatures.map((p) => p.name === before ? new SchemaAST7.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations) : p), ast.indexSignatures, ast.annotations));
2359
- };
2360
- var setTypenameInSchema = (schema, typename) => {
2361
- const existingAnnotation = schema.ast.annotations[TypeAnnotationId];
2362
- invariant16(existingAnnotation, `Missing ${String(TypeAnnotationId)}`, {
2363
- F: __dxlog_file16,
2364
- L: 77,
2365
- S: void 0,
2366
- A: [
2367
- "existingAnnotation",
2368
- "`Missing ${String(TypeAnnotationId)}`"
2369
- ]
2370
- });
2371
- return schema.annotations({
2372
- ...schema.ast.annotations,
2373
- [TypeAnnotationId]: {
2374
- kind: existingAnnotation.kind,
2375
- typename,
2376
- version: existingAnnotation.version
2377
- },
2378
- [SchemaAST7.JSONSchemaAnnotationId]: {
2379
- ...schema.ast.annotations[SchemaAST7.JSONSchemaAnnotationId] ?? {},
2380
- $id: schema.ast.annotations[TypeIdentifierAnnotationId] ?? DXN7.fromTypename(typename).toString(),
2381
- typename
2382
- }
2383
- });
2182
+ invariant12(SchemaAST9.isTypeLiteral(ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file12, L: 34, S: void 0, A: ["SchemaAST.isTypeLiteral(ast)", ""] });
2183
+ return Schema10.make(new SchemaAST9.TypeLiteral(ast.propertySignatures.map((p) => p.name === before ? new SchemaAST9.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations) : p), ast.indexSignatures, ast.annotations));
2384
2184
  };
2385
2185
 
2386
- // src/internal/Type/persistent-schema.ts
2387
- import * as Schema12 from "effect/Schema";
2388
- var PersistentSchema = Schema12.Struct({
2389
- name: Schema12.optional(Schema12.String),
2390
- typename: TypenameSchema,
2391
- version: VersionSchema,
2186
+ // src/internal/Type/type-schema.ts
2187
+ import * as Schema11 from "effect/Schema";
2188
+ var TypeSchemaStruct = Schema11.Struct({
2189
+ name: Schema11.optional(Schema11.String),
2392
2190
  jsonSchema: JsonSchemaType
2393
- }).pipe(EchoObjectSchema({
2394
- typename: "org.dxos.type.schema",
2395
- version: "0.1.0"
2396
- }), LabelAnnotation.set([
2191
+ });
2192
+ var TypeSchema = TypeSchemaStruct.pipe(LabelAnnotation.set([
2397
2193
  "name"
2398
2194
  ]), IconAnnotation.set({
2399
2195
  icon: "ph--database--regular",
2400
2196
  hue: "green"
2401
- }));
2402
-
2403
- // src/internal/Type/echo-schema.ts
2404
- var __dxlog_file17 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Type/echo-schema.ts";
2405
- var ImmutableSchema = class {
2406
- _schema;
2407
- _objectAnnotation;
2408
- constructor(_schema) {
2409
- this._schema = _schema;
2410
- this._objectAnnotation = getTypeAnnotation(this._schema);
2411
- invariant17(this._objectAnnotation, void 0, {
2412
- F: __dxlog_file17,
2413
- L: 48,
2414
- S: this,
2415
- A: [
2416
- "this._objectAnnotation",
2417
- ""
2418
- ]
2419
- });
2420
- }
2421
- //
2422
- // Effect Schema (push to abstract base class).
2423
- //
2424
- get [Schema13.TypeId]() {
2425
- return schemaVariance2;
2426
- }
2427
- get Type() {
2428
- return this._schema.Type;
2429
- }
2430
- get Encoded() {
2431
- return this._schema.Encoded;
2432
- }
2433
- get Context() {
2434
- return this._schema.Context;
2435
- }
2436
- get ast() {
2437
- return this._schema.ast;
2438
- }
2439
- get annotations() {
2440
- return this._schema.annotations;
2441
- }
2442
- get pipe() {
2443
- return this._schema.pipe;
2444
- }
2445
- //
2446
- // TypedObject
2447
- //
2448
- get kind() {
2449
- return this._objectAnnotation.kind;
2450
- }
2451
- get typename() {
2452
- return this._objectAnnotation.typename;
2453
- }
2454
- get version() {
2455
- return this._objectAnnotation.version;
2456
- }
2457
- //
2458
- // BaseSchema
2459
- //
2460
- get readonly() {
2461
- return true;
2462
- }
2463
- get snapshot() {
2464
- return this._schema;
2465
- }
2466
- // TODO(burdon): Change from getter since this is expensive.
2467
- get jsonSchema() {
2468
- return toJsonSchema(this._schema);
2469
- }
2470
- get mutable() {
2471
- throw new Error("Schema is readonly.");
2472
- }
2473
- };
2474
- var EchoSchemaConstructor = () => {
2475
- return class {
2476
- static get _schema() {
2477
- return Schema13.Union(PersistentSchema, Schema13.instanceOf(EchoSchema)).annotations(PersistentSchema.ast.annotations);
2478
- }
2479
- static [Schema13.TypeId] = schemaVariance2;
2480
- static get ast() {
2481
- const schema = this._schema;
2482
- return schema.ast;
2483
- }
2484
- static get annotations() {
2485
- const schema = this._schema;
2486
- return schema.annotations.bind(schema);
2487
- }
2488
- static get pipe() {
2489
- const schema = this._schema;
2490
- return schema.pipe.bind(schema);
2491
- }
2492
- };
2493
- };
2494
- var isMutable = (schema) => {
2495
- return schema instanceof EchoSchema;
2496
- };
2497
- var schemaVariance2 = {
2498
- _A: (_) => _,
2499
- _I: (_) => _,
2500
- _R: (_) => _
2501
- };
2502
- var EchoSchema = class extends EchoSchemaConstructor() {
2503
- _persistentSchema;
2504
- _schema;
2505
- _isDirty = true;
2506
- /**
2507
- * Schema kind key that marks this as an ECHO schema.
2508
- * Makes EchoSchema satisfy the Type.AnyObj type.
2509
- */
2510
- [SchemaKindId] = EntityKind.Object;
2511
- constructor(_persistentSchema) {
2512
- super(), this._persistentSchema = _persistentSchema;
2513
- }
2514
- //
2515
- // Effect Schema (push to abstract base class).
2516
- //
2517
- get [Schema13.TypeId]() {
2518
- return schemaVariance2;
2519
- }
2520
- get Type() {
2521
- return this._persistentSchema;
2522
- }
2523
- get Encoded() {
2524
- return this._persistentSchema;
2525
- }
2526
- get Context() {
2527
- const schema = this._getSchema();
2528
- return schema.Context;
2529
- }
2530
- get ast() {
2531
- const schema = this._getSchema();
2532
- return schema.ast;
2533
- }
2534
- get annotations() {
2535
- const schema = this._getSchema();
2536
- return schema.annotations.bind(schema);
2537
- }
2538
- get pipe() {
2539
- const schema = this._getSchema();
2540
- return schema.pipe.bind(schema);
2541
- }
2542
- //
2543
- // BaseSchema
2544
- //
2545
- get kind() {
2546
- return EntityKind.Object;
2547
- }
2548
- get typename() {
2549
- return this._persistentSchema.typename;
2550
- }
2551
- get version() {
2552
- return this._persistentSchema.version;
2553
- }
2554
- get readonly() {
2555
- return false;
2556
- }
2557
- /**
2558
- * Returns an immutable schema snapshot of the current state of the schema.
2559
- */
2560
- get snapshot() {
2561
- return this._getSchema();
2562
- }
2563
- /**
2564
- * Returns the JSON schema for the schema.
2565
- */
2566
- get jsonSchema() {
2567
- return this._persistentSchema.jsonSchema;
2568
- }
2569
- /**
2570
- * Returns a mutable schema.
2571
- */
2572
- get mutable() {
2573
- invariant17(!this.readonly, "Schema is not mutable", {
2574
- F: __dxlog_file17,
2575
- L: 278,
2576
- S: this,
2577
- A: [
2578
- "!this.readonly",
2579
- "'Schema is not mutable'"
2580
- ]
2581
- });
2582
- return this;
2583
- }
2584
- //
2585
- // Mutable Schema
2586
- //
2587
- /**
2588
- * Id of the ECHO object containing the schema.
2589
- */
2590
- get id() {
2591
- return this._persistentSchema.id;
2592
- }
2593
- /**
2594
- * Short name of the schema.
2595
- */
2596
- get name() {
2597
- return this._persistentSchema.name;
2598
- }
2599
- get [SchemaMetaSymbol]() {
2600
- return {
2601
- id: this.id,
2602
- typename: this.typename,
2603
- version: this._persistentSchema.version
2604
- };
2605
- }
2606
- /**
2607
- * Reference to the underlying persistent schema object.
2608
- */
2609
- get persistentSchema() {
2610
- return this._persistentSchema;
2611
- }
2612
- getProperties() {
2613
- const ast = this._getSchema().ast;
2614
- invariant17(SchemaAST8.isTypeLiteral(ast), void 0, {
2615
- F: __dxlog_file17,
2616
- L: 313,
2617
- S: this,
2618
- A: [
2619
- "SchemaAST.isTypeLiteral(ast)",
2620
- ""
2621
- ]
2622
- });
2623
- return [
2624
- ...ast.propertySignatures
2625
- ].filter((p) => p.name !== "id").map(unwrapOptionality);
2626
- }
2627
- //
2628
- // Mutation methods.
2629
- // TODO(burdon): Create separate interface for dynamic schema.
2630
- // TODO(burdon): Deprecate direct manipulation? Use JSONSchema directly.
2631
- //
2632
- /**
2633
- * @throws Error if the schema is readonly.
2634
- */
2635
- updateTypename(typename) {
2636
- const updated = setTypenameInSchema(this._getSchema(), typename);
2637
- this._change((schema) => {
2638
- schema.typename = typename;
2639
- schema.jsonSchema = toJsonSchema(updated);
2640
- });
2641
- }
2642
- /**
2643
- * @throws Error if the schema is readonly.
2644
- */
2645
- addFields(fields) {
2646
- const extended = addFieldsToSchema(this._getSchema(), fields);
2647
- this._change((schema) => {
2648
- schema.jsonSchema = toJsonSchema(extended);
2649
- });
2650
- }
2651
- /**
2652
- * @throws Error if the schema is readonly.
2653
- */
2654
- updateFields(fields) {
2655
- const updated = updateFieldsInSchema(this._getSchema(), fields);
2656
- this._change((schema) => {
2657
- schema.jsonSchema = toJsonSchema(updated);
2658
- });
2659
- }
2660
- /**
2661
- * @throws Error if the schema is readonly.
2662
- */
2663
- updateFieldPropertyName({ before, after }) {
2664
- const renamed = updateFieldNameInSchema(this._getSchema(), {
2665
- before,
2666
- after
2667
- });
2668
- this._change((schema) => {
2669
- schema.jsonSchema = toJsonSchema(renamed);
2670
- });
2671
- }
2672
- /**
2673
- * @throws Error if the schema is readonly.
2674
- */
2675
- removeFields(fieldNames) {
2676
- const removed = removeFieldsFromSchema(this._getSchema(), fieldNames);
2677
- this._change((schema) => {
2678
- schema.jsonSchema = toJsonSchema(removed);
2679
- });
2680
- }
2681
- /**
2682
- * Wrapper for Obj.change that handles the change context for the persistent schema.
2683
- */
2684
- _change(callback) {
2685
- const changeFn = this._persistentSchema[ChangeId];
2686
- if (changeFn) {
2687
- changeFn(callback);
2688
- } else {
2689
- callback(this._persistentSchema);
2690
- }
2691
- }
2692
- //
2693
- // Internals
2694
- //
2695
- /**
2696
- * Called by DatabaseSchemaRegistry on update.
2697
- */
2698
- _invalidate() {
2699
- this._isDirty = true;
2700
- }
2701
- /**
2702
- * Rebuilds this schema if it is dirty.
2703
- */
2704
- _rebuild() {
2705
- if (this._isDirty || this._schema == null) {
2706
- this._schema = toEffectSchema(getSnapshot(this._persistentSchema).jsonSchema);
2707
- this._isDirty = false;
2708
- }
2709
- }
2710
- _getSchema() {
2711
- this._rebuild();
2712
- return this._schema;
2713
- }
2714
- };
2715
- var unwrapOptionality = (property) => {
2716
- if (!SchemaAST8.isUnion(property.type)) {
2717
- return property;
2718
- }
2719
- return {
2720
- ...property,
2721
- type: property.type.types.find((type) => !SchemaAST8.isUndefinedKeyword(type))
2722
- };
2723
- };
2197
+ }), EchoTypeKindSchema(TypeMetaSchemaDXN));
2724
2198
 
2725
2199
  export {
2726
2200
  RawObject,
2727
- ATTR_META,
2728
- MetaId,
2729
- ObjectMetaSchema,
2730
- getMeta,
2731
- foreignKey,
2732
- foreignKeyEquals,
2733
- compareForeignKeys,
2734
- ATTR_SELF_DXN,
2735
- SelfDXNId,
2736
- ATTR_DELETED,
2737
- ObjectDeletedId,
2738
- ObjectVersionId,
2739
- ObjectDatabaseId,
2740
- ATTR_RELATION_SOURCE,
2741
- RelationSourceId,
2742
- RelationSourceDXNId,
2743
- ATTR_RELATION_TARGET,
2744
- RelationTargetId,
2745
- RelationTargetDXNId,
2746
2201
  VersionTypeId,
2747
2202
  compare,
2748
2203
  sortByLabel,
2749
2204
  sortByTypename,
2750
2205
  sort,
2751
- getMetaChecked,
2752
- getKeys,
2753
- deleteKeys,
2754
- addTag,
2755
- removeTag,
2756
2206
  EventId,
2757
2207
  ChangeId,
2758
2208
  batchEvents,
@@ -2790,20 +2240,19 @@ export {
2790
2240
  makeObject,
2791
2241
  subscribe,
2792
2242
  change,
2793
- assertObjectModel,
2794
- getObjectDXN,
2795
- getDXN,
2796
- getDatabase,
2243
+ TypeMetaSchemaDXN,
2797
2244
  makeEchoTypeSchema,
2245
+ normalizeSchema,
2798
2246
  EchoObjectSchema,
2799
2247
  EchoRelationSchema,
2248
+ getDXNForRelationSchemaRef,
2249
+ EchoTypeKindSchema,
2800
2250
  isVersion,
2801
2251
  version,
2802
2252
  versionValid,
2803
2253
  compareVersions,
2804
2254
  encodeVersion,
2805
2255
  decodeVersion,
2806
- normalizeSchema,
2807
2256
  makeTypedEntityClass,
2808
2257
  objectToJSON,
2809
2258
  objectFromJSON,
@@ -2811,9 +2260,13 @@ export {
2811
2260
  objectStructureToJson,
2812
2261
  createObject,
2813
2262
  isDeleted,
2814
- createQueueDXN,
2815
2263
  setValue,
2816
2264
  getSnapshot,
2265
+ makeAtom,
2266
+ makeProperty,
2267
+ makeWithReactive,
2268
+ makeEntity,
2269
+ makeRelation,
2817
2270
  clone,
2818
2271
  prettyFilter,
2819
2272
  prettyQuery,
@@ -2821,14 +2274,6 @@ export {
2821
2274
  updateFieldsInSchema,
2822
2275
  removeFieldsFromSchema,
2823
2276
  updateFieldNameInSchema,
2824
- setTypenameInSchema,
2825
- PersistentSchema,
2826
- ImmutableSchema,
2827
- isMutable,
2828
- EchoSchema,
2829
- JsonPath,
2830
- JsonProp,
2831
- getValue,
2832
- splitJsonPath
2833
- };
2834
- //# sourceMappingURL=chunk-MOR5ERFM.mjs.map
2277
+ TypeSchema
2278
+ };
2279
+ //# sourceMappingURL=chunk-7FPIAJIV.mjs.map