@dxos/echo 0.8.4-main.d05539e30a → 0.8.4-main.d9fc60f731

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 (378) hide show
  1. package/README.md +4 -4
  2. package/dist/lib/neutral/Annotation.mjs +27 -6
  3. package/dist/lib/neutral/Database.mjs +6 -11
  4. package/dist/lib/neutral/Entity.mjs +25 -16
  5. package/dist/lib/neutral/Err.mjs +3 -3
  6. package/dist/lib/neutral/Feed.mjs +19 -17
  7. package/dist/lib/neutral/Filter.mjs +13 -13
  8. package/dist/lib/neutral/Format.mjs +23 -3
  9. package/dist/lib/neutral/JsonSchema.mjs +7 -8
  10. package/dist/lib/neutral/Key.mjs +9 -5
  11. package/dist/lib/neutral/Migration.mjs +11 -10
  12. package/dist/lib/neutral/Obj.mjs +21 -18
  13. package/dist/lib/neutral/Query.mjs +17 -17
  14. package/dist/lib/neutral/QueryResult.mjs +1 -1
  15. package/dist/lib/neutral/Ref.mjs +10 -11
  16. package/dist/lib/neutral/Registry.mjs +14 -0
  17. package/dist/lib/neutral/Relation.mjs +24 -23
  18. package/dist/lib/neutral/Scope.mjs +12 -0
  19. package/dist/lib/neutral/Tag.mjs +17 -14
  20. package/dist/lib/neutral/Type.mjs +52 -26
  21. package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
  22. package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
  24. package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-PT37DG2F.mjs → chunk-4SFPZJVA.mjs} +82 -74
  26. package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-APHSOTIX.mjs → chunk-4Z6GET2X.mjs} +3 -3
  28. package/dist/lib/neutral/{chunk-APHSOTIX.mjs.map → chunk-4Z6GET2X.mjs.map} +2 -2
  29. package/dist/lib/neutral/{chunk-7RVZT53K.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  30. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-BMB7IHGB.mjs → chunk-7OAFN3OX.mjs} +70 -57
  32. package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-MLS7U7AT.mjs → chunk-7PRCIDHH.mjs} +41 -28
  34. package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-ZISMEVKD.mjs → chunk-BBFJWWAV.mjs} +6 -6
  36. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-ZFACXBY6.mjs → chunk-BDQGMDIX.mjs} +30 -34
  38. package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
  39. package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
  40. package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-V72DY6LU.mjs → chunk-DKLUHO4T.mjs} +1 -1
  42. package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
  44. package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-QRZ2I3ZM.mjs → chunk-G6CFWUYH.mjs} +2 -2
  46. package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
  47. package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
  48. package/dist/lib/neutral/{chunk-N7VOEPSV.mjs → chunk-J3MNM65T.mjs} +9 -9
  49. package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
  51. package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
  53. package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
  55. package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
  56. package/dist/lib/neutral/{chunk-N4B7FHQT.mjs → chunk-O6BH7EPN.mjs} +30 -3
  57. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-Q7ZL2P5H.mjs → chunk-OIYW7R2G.mjs} +62 -46
  59. package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-G54OX4IX.mjs → chunk-OYUG4FHF.mjs} +527 -847
  61. package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-J54QMAKF.mjs → chunk-Q5FKCVBC.mjs} +64 -59
  63. package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-FIWO2FZK.mjs → chunk-Q62IHV2N.mjs} +12 -7
  65. package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-SCPFDS2E.mjs → chunk-QVJDDG44.mjs} +65 -34
  67. package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-TRPZU2HV.mjs → chunk-TFEWTY5A.mjs} +155 -129
  69. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  70. package/dist/lib/neutral/{chunk-44HT3MEC.mjs → chunk-VKWOFXT2.mjs} +22 -2
  71. package/dist/lib/neutral/{chunk-44HT3MEC.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
  72. package/dist/lib/neutral/{chunk-APJKDGFL.mjs → chunk-ZACMEAYV.mjs} +24 -24
  73. package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
  74. package/dist/lib/neutral/index.mjs +50 -40
  75. package/dist/lib/neutral/internal/index.mjs +125 -64
  76. package/dist/lib/neutral/meta.json +1 -1
  77. package/dist/lib/neutral/testing/index.mjs +88 -99
  78. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  79. package/dist/types/src/Annotation.d.ts +108 -4
  80. package/dist/types/src/Annotation.d.ts.map +1 -1
  81. package/dist/types/src/Annotation.test.d.ts +2 -0
  82. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  83. package/dist/types/src/Collection.d.ts +2 -3
  84. package/dist/types/src/Collection.d.ts.map +1 -1
  85. package/dist/types/src/Database.d.ts +50 -30
  86. package/dist/types/src/Database.d.ts.map +1 -1
  87. package/dist/types/src/Dataset.d.ts +16 -6
  88. package/dist/types/src/Dataset.d.ts.map +1 -1
  89. package/dist/types/src/Entity.d.ts +89 -19
  90. package/dist/types/src/Entity.d.ts.map +1 -1
  91. package/dist/types/src/Err.d.ts +9 -9
  92. package/dist/types/src/Err.d.ts.map +1 -1
  93. package/dist/types/src/Feed.d.ts +35 -12
  94. package/dist/types/src/Feed.d.ts.map +1 -1
  95. package/dist/types/src/Filter.d.ts +21 -8
  96. package/dist/types/src/Filter.d.ts.map +1 -1
  97. package/dist/types/src/Hypergraph.d.ts +13 -8
  98. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  99. package/dist/types/src/Json.d.ts.map +1 -1
  100. package/dist/types/src/JsonSchema.d.ts +1 -1
  101. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  102. package/dist/types/src/Key.d.ts +1 -1
  103. package/dist/types/src/Key.d.ts.map +1 -1
  104. package/dist/types/src/Migration.d.ts +15 -12
  105. package/dist/types/src/Migration.d.ts.map +1 -1
  106. package/dist/types/src/Obj.d.ts +69 -40
  107. package/dist/types/src/Obj.d.ts.map +1 -1
  108. package/dist/types/src/Query.d.ts +24 -10
  109. package/dist/types/src/Query.d.ts.map +1 -1
  110. package/dist/types/src/QueryResult.d.ts +9 -0
  111. package/dist/types/src/QueryResult.d.ts.map +1 -1
  112. package/dist/types/src/Ref.d.ts +15 -8
  113. package/dist/types/src/Ref.d.ts.map +1 -1
  114. package/dist/types/src/Registry.d.ts +131 -0
  115. package/dist/types/src/Registry.d.ts.map +1 -0
  116. package/dist/types/src/Relation.d.ts +55 -26
  117. package/dist/types/src/Relation.d.ts.map +1 -1
  118. package/dist/types/src/Scope.d.ts +34 -0
  119. package/dist/types/src/Scope.d.ts.map +1 -0
  120. package/dist/types/src/StateMap.d.ts +32 -0
  121. package/dist/types/src/StateMap.d.ts.map +1 -0
  122. package/dist/types/src/StateMap.test.d.ts +2 -0
  123. package/dist/types/src/StateMap.test.d.ts.map +1 -0
  124. package/dist/types/src/Tag.d.ts +19 -3
  125. package/dist/types/src/Tag.d.ts.map +1 -1
  126. package/dist/types/src/TagIndex.d.ts +36 -0
  127. package/dist/types/src/TagIndex.d.ts.map +1 -0
  128. package/dist/types/src/TagIndex.test.d.ts +2 -0
  129. package/dist/types/src/TagIndex.test.d.ts.map +1 -0
  130. package/dist/types/src/Tagging.d.ts +31 -0
  131. package/dist/types/src/Tagging.d.ts.map +1 -0
  132. package/dist/types/src/Type.d.ts +356 -95
  133. package/dist/types/src/Type.d.ts.map +1 -1
  134. package/dist/types/src/View.d.ts +1 -4
  135. package/dist/types/src/View.d.ts.map +1 -1
  136. package/dist/types/src/index.d.ts +6 -3
  137. package/dist/types/src/index.d.ts.map +1 -1
  138. package/dist/types/src/internal/Annotation/annotations.d.ts +68 -36
  139. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  140. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  141. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  142. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  143. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  144. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  145. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  146. package/dist/types/src/internal/Annotation/util.d.ts +13 -4
  147. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  148. package/dist/types/src/internal/Entity/api.d.ts +3 -3
  149. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  150. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  151. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  152. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  153. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  154. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  155. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  156. package/dist/types/src/internal/Entity/model.d.ts +18 -17
  157. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  158. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  159. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  160. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  161. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  163. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  164. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  165. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  166. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  167. package/dist/types/src/internal/Format/format.d.ts +3 -2
  168. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  169. package/dist/types/src/internal/Format/index.d.ts +2 -2
  170. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  171. package/dist/types/src/internal/Format/object.d.ts +3 -1
  172. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  173. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +2 -1
  174. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  175. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  176. package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
  177. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  178. package/dist/types/src/internal/Obj/index.d.ts +0 -1
  179. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  180. package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
  181. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  182. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  183. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  184. package/dist/types/src/internal/Query.d.ts.map +1 -1
  185. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  186. package/dist/types/src/internal/Ref/ref.d.ts +29 -19
  187. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  188. package/dist/types/src/internal/Type/index.d.ts +1 -2
  189. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  190. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  191. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  192. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  193. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  194. package/dist/types/src/internal/common/api/meta.d.ts +11 -8
  195. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  196. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  197. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  198. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  199. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  200. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  201. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  202. package/dist/types/src/internal/common/types/entity.d.ts +59 -2
  203. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  204. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  205. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  206. package/dist/types/src/internal/common/types/meta.d.ts +13 -7
  207. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  208. package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
  209. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  210. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  211. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  212. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  213. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  214. package/dist/types/src/internal/index.d.ts +1 -0
  215. package/dist/types/src/internal/index.d.ts.map +1 -1
  216. package/dist/types/src/testing/test-schema.d.ts +32 -38
  217. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  218. package/dist/types/src/testing/util.d.ts +5 -3
  219. package/dist/types/src/testing/util.d.ts.map +1 -1
  220. package/dist/types/tsconfig.tsbuildinfo +1 -1
  221. package/package.json +21 -23
  222. package/src/Annotation.test.ts +439 -0
  223. package/src/Annotation.ts +151 -4
  224. package/src/Collection.ts +5 -9
  225. package/src/Database.ts +86 -61
  226. package/src/Dataset.ts +10 -2
  227. package/src/Entity.test.ts +116 -6
  228. package/src/Entity.ts +116 -23
  229. package/src/Err.ts +4 -4
  230. package/src/Feed.ts +57 -40
  231. package/src/Filter.ts +49 -27
  232. package/src/Hypergraph.ts +13 -8
  233. package/src/Json.test.ts +4 -4
  234. package/src/Json.ts +7 -6
  235. package/src/Key.ts +1 -1
  236. package/src/Migration.ts +27 -19
  237. package/src/Obj.test.ts +19 -8
  238. package/src/Obj.ts +131 -70
  239. package/src/Query.test.ts +147 -151
  240. package/src/Query.ts +133 -75
  241. package/src/QueryResult.ts +11 -0
  242. package/src/Ref.ts +21 -5
  243. package/src/Registry.ts +155 -0
  244. package/src/Relation.test.ts +10 -10
  245. package/src/Relation.ts +89 -52
  246. package/src/Scope.ts +50 -0
  247. package/src/StateMap.test.ts +56 -0
  248. package/src/StateMap.ts +99 -0
  249. package/src/Tag.md +88 -0
  250. package/src/Tag.ts +49 -6
  251. package/src/TagIndex.test.ts +57 -0
  252. package/src/TagIndex.ts +110 -0
  253. package/src/Tagging.ts +83 -0
  254. package/src/Type.test.ts +223 -18
  255. package/src/Type.ts +601 -131
  256. package/src/View.ts +10 -19
  257. package/src/index.ts +6 -4
  258. package/src/internal/Annotation/annotations.test.ts +31 -11
  259. package/src/internal/Annotation/annotations.ts +122 -103
  260. package/src/internal/Annotation/dictionary.ts +47 -0
  261. package/src/internal/Annotation/entity-dictionary.ts +40 -0
  262. package/src/internal/Annotation/index.ts +4 -2
  263. package/src/internal/Annotation/util.ts +17 -8
  264. package/src/internal/Entity/api.ts +7 -7
  265. package/src/internal/Entity/entity.ts +196 -47
  266. package/src/internal/Entity/guard.ts +26 -0
  267. package/src/internal/Entity/index.ts +2 -0
  268. package/src/internal/Entity/model.ts +35 -28
  269. package/src/internal/Entity/object.ts +21 -5
  270. package/src/internal/Entity/relation.ts +68 -34
  271. package/src/internal/Entity/type-kind.ts +75 -0
  272. package/src/internal/Entity/type-uri.ts +87 -0
  273. package/src/internal/Entity/util.ts +10 -9
  274. package/src/internal/Format/date.ts +0 -4
  275. package/src/internal/Format/format.test.ts +21 -0
  276. package/src/internal/Format/index.ts +2 -3
  277. package/src/internal/Format/object.ts +21 -4
  278. package/src/internal/Format/types.ts +1 -1
  279. package/src/internal/JsonSchema/annotations.ts +1 -1
  280. package/src/internal/JsonSchema/json-schema.test.ts +54 -140
  281. package/src/internal/JsonSchema/json-schema.ts +44 -30
  282. package/src/internal/Obj/clone.ts +9 -4
  283. package/src/internal/Obj/create-object.test.ts +12 -10
  284. package/src/internal/Obj/create-object.ts +67 -22
  285. package/src/internal/Obj/index.ts +0 -1
  286. package/src/internal/Obj/inspect.ts +4 -3
  287. package/src/internal/Obj/json-serializer.test.ts +100 -21
  288. package/src/internal/Obj/json-serializer.ts +93 -38
  289. package/src/internal/Obj/set-value.test.ts +7 -30
  290. package/src/internal/Obj/snapshot.ts +11 -4
  291. package/src/internal/Obj/typed-object.test.ts +9 -11
  292. package/src/internal/Obj/typed-object.ts +1 -1
  293. package/src/internal/Query.ts +14 -11
  294. package/src/internal/Ref/ref-array.ts +3 -3
  295. package/src/internal/Ref/ref.test.ts +17 -26
  296. package/src/internal/Ref/ref.ts +107 -59
  297. package/src/internal/Type/compose.test.ts +3 -1
  298. package/src/internal/Type/index.ts +1 -2
  299. package/src/internal/Type/manipulation.ts +0 -25
  300. package/src/internal/Type/type-schema.ts +60 -0
  301. package/src/internal/common/README.md +1 -1
  302. package/src/internal/common/api/meta.ts +16 -14
  303. package/src/internal/common/proxy/change.test.ts +35 -27
  304. package/src/internal/common/proxy/handler.test.ts +1 -1
  305. package/src/internal/common/proxy/json-serializer.ts +26 -16
  306. package/src/internal/common/proxy/make-object.ts +43 -20
  307. package/src/internal/common/proxy/ownership.ts +2 -2
  308. package/src/internal/common/proxy/schema.test.ts +48 -86
  309. package/src/internal/common/proxy/typed-handler.test.ts +12 -11
  310. package/src/internal/common/proxy/typed-handler.ts +71 -9
  311. package/src/internal/common/proxy/typed-object.test.ts +15 -27
  312. package/src/internal/common/types/base.ts +4 -4
  313. package/src/internal/common/types/entity.ts +80 -1
  314. package/src/internal/common/types/index.ts +6 -1
  315. package/src/internal/common/types/meta.ts +37 -14
  316. package/src/internal/common/types/model-symbols.ts +16 -4
  317. package/src/internal/common/types/typename.ts +39 -3
  318. package/src/internal/common/types/well-known-types.ts +15 -0
  319. package/src/internal/index.ts +5 -0
  320. package/src/testing/api.test.ts +15 -9
  321. package/src/testing/test-data.ts +24 -24
  322. package/src/testing/test-schema.ts +22 -58
  323. package/src/testing/util.ts +14 -11
  324. package/dist/lib/neutral/Extension.mjs +0 -18
  325. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  326. package/dist/lib/neutral/chunk-5SL5LDLD.mjs +0 -47
  327. package/dist/lib/neutral/chunk-5SL5LDLD.mjs.map +0 -7
  328. package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +0 -7
  329. package/dist/lib/neutral/chunk-APJKDGFL.mjs.map +0 -7
  330. package/dist/lib/neutral/chunk-BICZKPQG.mjs +0 -7
  331. package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +0 -7
  332. package/dist/lib/neutral/chunk-BMB7IHGB.mjs.map +0 -7
  333. package/dist/lib/neutral/chunk-FIWO2FZK.mjs.map +0 -7
  334. package/dist/lib/neutral/chunk-G54OX4IX.mjs.map +0 -7
  335. package/dist/lib/neutral/chunk-GWFFC34K.mjs +0 -50
  336. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +0 -7
  337. package/dist/lib/neutral/chunk-I2DARWPX.mjs +0 -128
  338. package/dist/lib/neutral/chunk-I2DARWPX.mjs.map +0 -7
  339. package/dist/lib/neutral/chunk-J54QMAKF.mjs.map +0 -7
  340. package/dist/lib/neutral/chunk-MGSQGHOD.mjs +0 -206
  341. package/dist/lib/neutral/chunk-MGSQGHOD.mjs.map +0 -7
  342. package/dist/lib/neutral/chunk-MLS7U7AT.mjs.map +0 -7
  343. package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +0 -7
  344. package/dist/lib/neutral/chunk-N7VOEPSV.mjs.map +0 -7
  345. package/dist/lib/neutral/chunk-PSZBLH53.mjs +0 -81
  346. package/dist/lib/neutral/chunk-PSZBLH53.mjs.map +0 -7
  347. package/dist/lib/neutral/chunk-PT37DG2F.mjs.map +0 -7
  348. package/dist/lib/neutral/chunk-Q2KKKJSV.mjs +0 -56
  349. package/dist/lib/neutral/chunk-Q2KKKJSV.mjs.map +0 -7
  350. package/dist/lib/neutral/chunk-Q7ZL2P5H.mjs.map +0 -7
  351. package/dist/lib/neutral/chunk-SCPFDS2E.mjs.map +0 -7
  352. package/dist/lib/neutral/chunk-TNBK56IN.mjs +0 -350
  353. package/dist/lib/neutral/chunk-TNBK56IN.mjs.map +0 -7
  354. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +0 -7
  355. package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +0 -7
  356. package/dist/lib/neutral/chunk-ZFACXBY6.mjs.map +0 -7
  357. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +0 -7
  358. package/dist/types/src/Extension.d.ts +0 -80
  359. package/dist/types/src/Extension.d.ts.map +0 -1
  360. package/dist/types/src/Extension.test.d.ts +0 -2
  361. package/dist/types/src/Extension.test.d.ts.map +0 -1
  362. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  363. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  364. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  365. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  366. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  367. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  368. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  369. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  370. package/src/Extension.test.ts +0 -235
  371. package/src/Extension.ts +0 -122
  372. package/src/SchemaRegistry.ts +0 -106
  373. package/src/internal/Obj/ids.ts +0 -12
  374. package/src/internal/Type/echo-schema.ts +0 -423
  375. package/src/internal/Type/persistent-schema.ts +0 -33
  376. /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
  377. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
  378. /package/dist/lib/neutral/{chunk-QRZ2I3ZM.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
@@ -4,16 +4,24 @@
4
4
 
5
5
  import { describe, test } from 'vitest';
6
6
 
7
+ import { URI } from '@dxos/keys';
8
+
7
9
  import * as Obj from '../../../Obj';
10
+ import * as Ref from '../../../Ref';
8
11
  import * as Relation from '../../../Relation';
9
12
  import { TestSchema } from '../../../testing';
10
13
 
14
+ // Tags are stored as `Ref<Tag>`; build refs from synthetic URIs and compare by `.uri`.
15
+ const tagRef = (id: string): Ref.Ref<any> => Ref.fromURI(URI.make(`dxn:echo:BBBBBBBBBBBBBBBBBBBBBBBBBB:${id}`));
16
+ const tagUris = (entity: Obj.Unknown | Relation.Unknown): string[] =>
17
+ Obj.getMeta(entity as Obj.Unknown).tags.map((tag) => tag.uri);
18
+
11
19
  /**
12
20
  * Tests for Obj.update context enforcement and mutator type safety.
13
21
  *
14
22
  * These tests verify:
15
23
  * 1. Mutator functions require Mutable<T> at compile-time.
16
- * 2. getMeta returns ReadonlyMeta outside change callbacks and ObjectMeta inside.
24
+ * 2. getMeta returns ReadonlyMeta outside change callbacks and EntityMeta inside.
17
25
  * 3. Mutations outside Obj.update throw at runtime.
18
26
  * 4. Nested object/property mutations work correctly.
19
27
  * 5. Array mutations (push, pop, splice) require change context.
@@ -44,7 +52,7 @@ describe('Obj.update enforcement', () => {
44
52
 
45
53
  // No compile-time error: TypeScript's structural typing allows readonly objects
46
54
  // to be passed to Mutable<T> parameters. Enforcement is runtime-only.
47
- expect(() => Obj.addTag(obj, 'tag')).toThrow(/outside of Obj.update/);
55
+ expect(() => Obj.addTag(obj, tagRef('tag'))).toThrow(/outside of Obj.update/);
48
56
  });
49
57
 
50
58
  test('getMeta mutation outside change throws', ({ expect }) => {
@@ -53,22 +61,22 @@ describe('Obj.update enforcement', () => {
53
61
 
54
62
  // Runtime errors for direct meta mutations.
55
63
  expect(() => ((meta as any).keys = [])).toThrow(/outside of Obj.update/);
56
- expect(() => ((meta as any).tags = ['tag'])).toThrow(/outside of Obj.update/);
64
+ expect(() => ((meta as any).tags = [tagRef('tag')])).toThrow(/outside of Obj.update/);
57
65
  });
58
66
 
59
- test('getMeta returns mutable ObjectMeta inside change callback', ({ expect }) => {
67
+ test('getMeta returns mutable EntityMeta inside change callback', ({ expect }) => {
60
68
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
61
69
 
62
70
  Obj.update(obj, (obj) => {
63
71
  const meta = Obj.getMeta(obj);
64
72
 
65
- // These should compile without errors because meta is ObjectMeta (mutable).
73
+ // These should compile without errors because meta is EntityMeta (mutable).
66
74
  meta.keys = [];
67
- meta.tags = ['tag'];
75
+ meta.tags = [tagRef('tag')];
68
76
  meta.keys.push({ source: 'test', id: '123' });
69
77
  });
70
78
 
71
- expect(Obj.getMeta(obj).tags).toEqual(['tag']);
79
+ expect(tagUris(obj)).toEqual([tagRef('tag').uri]);
72
80
  expect(Obj.getMeta(obj).keys).toHaveLength(1);
73
81
  });
74
82
 
@@ -77,12 +85,12 @@ describe('Obj.update enforcement', () => {
77
85
 
78
86
  // These should compile without errors inside change callback.
79
87
  Obj.update(obj, (obj) => {
80
- Obj.addTag(obj, 'my-tag');
88
+ Obj.addTag(obj, tagRef('my-tag'));
81
89
  Obj.setValue(obj, ['name'], 'Updated');
82
90
  });
83
91
 
84
92
  expect(obj.name).toBe('Updated');
85
- expect(Obj.getMeta(obj).tags).toContain('my-tag');
93
+ expect(tagUris(obj)).toContain(tagRef('my-tag').uri);
86
94
  });
87
95
 
88
96
  test('Relation property mutation outside change throws', ({ expect }) => {
@@ -110,7 +118,7 @@ describe('Obj.update enforcement', () => {
110
118
 
111
119
  // No compile-time error: TypeScript's structural typing allows readonly objects
112
120
  // to be passed to Mutable<T> parameters. Enforcement is runtime-only.
113
- expect(() => Relation.addTag(rel, 'tag')).toThrow(/outside of Obj.update/);
121
+ expect(() => Relation.addTag(rel, tagRef('tag'))).toThrow(/outside of Obj.update/);
114
122
  });
115
123
  });
116
124
 
@@ -151,20 +159,20 @@ describe('Obj.update enforcement', () => {
151
159
  test('addTag and removeTag work correctly', ({ expect }) => {
152
160
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
153
161
 
154
- expect(Obj.getMeta(obj).tags).toBeUndefined();
162
+ expect(Obj.getMeta(obj).tags).toEqual([]);
155
163
 
156
164
  Obj.update(obj, (obj) => {
157
- Obj.addTag(obj, 'tag-1');
158
- Obj.addTag(obj, 'tag-2');
165
+ Obj.addTag(obj, tagRef('tag-1'));
166
+ Obj.addTag(obj, tagRef('tag-2'));
159
167
  });
160
168
 
161
- expect(Obj.getMeta(obj).tags).toEqual(['tag-1', 'tag-2']);
169
+ expect(tagUris(obj)).toEqual([tagRef('tag-1').uri, tagRef('tag-2').uri]);
162
170
 
163
171
  Obj.update(obj, (obj) => {
164
- Obj.removeTag(obj, 'tag-1');
172
+ Obj.removeTag(obj, tagRef('tag-1'));
165
173
  });
166
174
 
167
- expect(Obj.getMeta(obj).tags).toEqual(['tag-2']);
175
+ expect(tagUris(obj)).toEqual([tagRef('tag-2').uri]);
168
176
  });
169
177
 
170
178
  test('deleteKeys removes foreign keys by source', ({ expect }) => {
@@ -202,12 +210,12 @@ describe('Obj.update enforcement', () => {
202
210
 
203
211
  Obj.update(obj, (obj) => {
204
212
  const meta = Obj.getMeta(obj);
205
- meta.tags = ['tag-1', 'tag-2'];
213
+ meta.tags = [tagRef('tag-1'), tagRef('tag-2')];
206
214
  meta.keys.push({ source: 'external', id: '123' });
207
215
  });
208
216
 
209
217
  // Changes should persist after the change callback.
210
- expect(Obj.getMeta(obj).tags).toEqual(['tag-1', 'tag-2']);
218
+ expect(tagUris(obj)).toEqual([tagRef('tag-1').uri, tagRef('tag-2').uri]);
211
219
  expect(Obj.getMeta(obj).keys).toEqual([{ source: 'external', id: '123' }]);
212
220
  });
213
221
 
@@ -218,13 +226,13 @@ describe('Obj.update enforcement', () => {
218
226
  obj.name = 'Name 1';
219
227
  obj.name = 'Name 2';
220
228
  obj.name = 'Name 3';
221
- Obj.addTag(obj, 'tag-1');
222
- Obj.addTag(obj, 'tag-2');
229
+ Obj.addTag(obj, tagRef('tag-1'));
230
+ Obj.addTag(obj, tagRef('tag-2'));
223
231
  });
224
232
 
225
233
  // All mutations should persist.
226
234
  expect(obj.name).toBe('Name 3');
227
- expect(Obj.getMeta(obj).tags).toEqual(['tag-1', 'tag-2']);
235
+ expect(tagUris(obj)).toEqual([tagRef('tag-1').uri, tagRef('tag-2').uri]);
228
236
  });
229
237
  });
230
238
 
@@ -457,11 +465,11 @@ describe('Obj.update enforcement', () => {
457
465
 
458
466
  Relation.update(rel, (rel) => {
459
467
  const meta = Relation.getMeta(rel);
460
- meta.tags = ['rel-tag'];
468
+ meta.tags = [tagRef('rel-tag')];
461
469
  meta.keys.push({ source: 'rel-source', id: 'rel-key' });
462
470
  });
463
471
 
464
- expect(Relation.getMeta(rel).tags).toEqual(['rel-tag']);
472
+ expect(tagUris(rel)).toEqual([tagRef('rel-tag').uri]);
465
473
  expect(Relation.getMeta(rel).keys).toHaveLength(1);
466
474
  });
467
475
 
@@ -474,16 +482,16 @@ describe('Obj.update enforcement', () => {
474
482
  });
475
483
 
476
484
  Relation.update(rel, (rel) => {
477
- Relation.addTag(rel, 'important');
485
+ Relation.addTag(rel, tagRef('important'));
478
486
  });
479
487
 
480
- expect(Relation.getMeta(rel).tags).toContain('important');
488
+ expect(tagUris(rel)).toContain(tagRef('important').uri);
481
489
 
482
490
  Relation.update(rel, (rel) => {
483
- Relation.removeTag(rel, 'important');
491
+ Relation.removeTag(rel, tagRef('important'));
484
492
  });
485
493
 
486
- expect(Relation.getMeta(rel).tags).not.toContain('important');
494
+ expect(tagUris(rel)).not.toContain(tagRef('important').uri);
487
495
  });
488
496
  });
489
497
 
@@ -9,7 +9,7 @@ import { isNode } from '@dxos/util';
9
9
 
10
10
  import { TestSchema, updateCounter } from '../../../testing';
11
11
  import { createObject } from '../../Obj';
12
- import { ATTR_META } from '../types';
12
+ import { ATTR_META } from '../types/meta';
13
13
  import { makeObject } from './make-object';
14
14
  import { objectData } from './proxy-types';
15
15
  import { change } from './reactive';
@@ -2,24 +2,22 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type ObjectMeta } from '@dxos/echo-protocol';
6
5
  import { invariant } from '@dxos/invariant';
7
- import { DXN } from '@dxos/keys';
8
- import { deepMapValues } from '@dxos/util';
6
+ import { EID } from '@dxos/keys';
7
+ import { deepMapValues, encodeUint8ArrayToJson } from '@dxos/util';
9
8
 
10
9
  import { Ref } from '../../Ref';
11
10
  import {
12
- ATTR_META,
13
11
  ATTR_RELATION_SOURCE,
14
12
  ATTR_RELATION_TARGET,
15
- ATTR_SELF_DXN,
13
+ ATTR_SELF_URI,
16
14
  ATTR_TYPE,
17
- MetaId,
18
15
  RelationSourceDXNId,
19
16
  RelationTargetDXNId,
20
- SelfDXNId,
17
+ SelfURIId,
21
18
  TypeId,
22
19
  } from '../types';
20
+ import { ATTR_META, type EntityMeta, MetaId } from '../types/meta';
23
21
 
24
22
  /**
25
23
  * Attaches a toJSON method to the object for typed serialization.
@@ -48,26 +46,26 @@ export const typedJsonSerializer = function (this: any) {
48
46
  };
49
47
 
50
48
  if (this[TypeId]) {
51
- result[ATTR_TYPE] = this[TypeId].toString();
49
+ result[ATTR_TYPE] = this[TypeId];
52
50
  }
53
51
 
54
52
  if (this[MetaId]) {
55
53
  result[ATTR_META] = serializeMeta(this[MetaId]);
56
54
  }
57
55
 
58
- if (this[SelfDXNId]) {
59
- result[ATTR_SELF_DXN] = this[SelfDXNId].toString();
56
+ if (this[SelfURIId]) {
57
+ result[ATTR_SELF_URI] = this[SelfURIId];
60
58
  }
61
59
 
62
60
  if (this[RelationSourceDXNId]) {
63
61
  const sourceDXN = this[RelationSourceDXNId];
64
- invariant(sourceDXN instanceof DXN);
65
- result[ATTR_RELATION_SOURCE] = sourceDXN.toString();
62
+ invariant(EID.isEID(sourceDXN));
63
+ result[ATTR_RELATION_SOURCE] = sourceDXN;
66
64
  }
67
65
  if (this[RelationTargetDXNId]) {
68
66
  const targetDXN = this[RelationTargetDXNId];
69
- invariant(targetDXN instanceof DXN);
70
- result[ATTR_RELATION_TARGET] = targetDXN.toString();
67
+ invariant(EID.isEID(targetDXN));
68
+ result[ATTR_RELATION_TARGET] = targetDXN;
71
69
  }
72
70
 
73
71
  Object.assign(result, serializeData(rest));
@@ -80,11 +78,23 @@ const serializeData = (data: unknown) => {
80
78
  // TODO(dmaretskyi): Should this be configurable?
81
79
  return value.noInline().encode();
82
80
  }
81
+ if (value instanceof Uint8Array) {
82
+ return encodeUint8ArrayToJson(value);
83
+ }
83
84
 
84
85
  return recurse(value);
85
86
  });
86
87
  };
87
88
 
88
- const serializeMeta = (meta: ObjectMeta) => {
89
- return deepMapValues(meta, (value, recurse) => recurse(value));
89
+ const serializeMeta = (meta: EntityMeta) => {
90
+ // Omit empty `tags`/`annotations` to keep serialized output minimal; `objectFromJSON` backfills
91
+ // the required defaults on read.
92
+ const { tags, annotations, ...rest } = meta;
93
+ const compact = {
94
+ ...rest,
95
+ ...(tags != null && tags.length > 0 ? { tags } : {}),
96
+ ...(annotations != null && Object.keys(annotations).length > 0 ? { annotations } : {}),
97
+ };
98
+ // Use `serializeData` so `meta.tags` `Ref<Tag>` values encode to the on-wire reference form.
99
+ return serializeData(compact);
90
100
  };
@@ -4,41 +4,56 @@
4
4
 
5
5
  import type * as Schema from 'effect/Schema';
6
6
 
7
- import { ObjectId } from '@dxos/keys';
7
+ import { EntityId } from '@dxos/keys';
8
8
 
9
- import { getTypeAnnotation } from '../../Annotation';
10
- import { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema, ParentId } from '../types';
9
+ import { getTypeAnnotation } from '../../Annotation/annotations';
10
+ import { type AnyProperties, KindId, ParentId, SchemaKindId, StaticTypeSchemaSlot } from '../types';
11
+ import { MetaId, type EntityMeta, EntityMetaSchema } from '../types/meta';
11
12
  import { defineHiddenProperty } from './define-hidden-property';
12
13
  import { attachTypedJsonSerializer } from './json-serializer';
13
14
  import { createProxy, getProxyTarget, isValidProxyTarget } from './proxy-utils';
14
- import { TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
15
+ import { TypeSource, TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
15
16
 
16
17
  /**
17
18
  *
18
19
  */
19
20
  // TODO(burdon): Make internal
20
- export type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId>;
21
+ // Omits the brand slots — those get stamped on the instance by the entity
22
+ // handler (KindId via setKind, SchemaKindId derived in the proxy `get` trap
23
+ // from kind + jsonSchema.entityKind, StaticTypeSchemaSlot lazily via the
24
+ // proxy), not supplied by the caller.
25
+ export type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId | SchemaKindId | StaticTypeSchemaSlot>;
21
26
 
22
27
  /**
23
28
  * Creates a reactive object from a plain Javascript object.
24
29
  * Requires a TS-effect schema.
30
+ *
31
+ * Callers that have a `Type.Type` entity (not a raw schema) must unwrap it
32
+ * themselves — `Obj.make` / `Relation.make` do this via `Type.getSchema(...)`
33
+ * and pass the entity through as `typeSource` so the instance carries a
34
+ * back-reference for `Obj.getType` and resolves the live source schema
35
+ * uniformly via the entity's `[StaticTypeSchemaSlot]`.
25
36
  */
26
37
  // TODO(burdon): Make internal
27
38
  // TODO(dmaretskyi): Deep mutability.
28
39
  // TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.
29
40
  // TODO(dmaretskyi): Could mutate original object making it unusable.
30
- export const makeObject: {
31
- <T extends AnyProperties>(
32
- schema: Schema.Schema<T, any, never>,
33
- obj: NoInfer<MakeObjectProps<T>>,
34
- meta?: ObjectMeta,
35
- ): T;
36
- } = <T extends AnyProperties>(schema: Schema.Schema<T, any>, obj: MakeObjectProps<T>, meta?: ObjectMeta): T => {
41
+ export const makeObject = <T extends AnyProperties>(
42
+ schema: Schema.Schema<T, any, never>,
43
+ obj: NoInfer<MakeObjectProps<T>>,
44
+ meta?: Partial<EntityMeta>,
45
+ typeSource?: TypeSource,
46
+ ): T => {
37
47
  // Use Object.assign to copy symbol properties (like ParentId) that spread operator doesn't copy.
38
- return createReactiveObject<T>(Object.assign({}, obj) as T, meta, schema);
48
+ return createReactiveObject<T>(Object.assign({}, obj) as T, meta, schema as Schema.Schema<T, any>, typeSource);
39
49
  };
40
50
 
41
- const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta, schema?: Schema.Schema<T>): T => {
51
+ const createReactiveObject = <T extends AnyProperties>(
52
+ obj: T,
53
+ meta?: Partial<EntityMeta>,
54
+ schema?: Schema.Schema<T>,
55
+ typeSource?: TypeSource,
56
+ ): T => {
42
57
  if (!isValidProxyTarget(obj)) {
43
58
  throw new Error('Value cannot be made into a reactive object.');
44
59
  }
@@ -62,7 +77,7 @@ const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta
62
77
  if (parent !== undefined) {
63
78
  defineHiddenProperty(obj, ParentId, parent);
64
79
  }
65
- prepareTypedTarget(obj, schema);
80
+ prepareTypedTarget(obj, schema, typeSource);
66
81
  attachTypedJsonSerializer(obj);
67
82
  const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);
68
83
 
@@ -87,11 +102,11 @@ const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta
87
102
  const setIdOnTarget = (target: any) => {
88
103
  // invariant(!('id' in target), 'Object already has an `id` field, which is reserved.');
89
104
  if ('id' in target && target.id !== undefined && target.id !== null) {
90
- if (!ObjectId.isValid(target.id)) {
105
+ if (!EntityId.isValid(target.id)) {
91
106
  throw new Error('Invalid object id format.');
92
107
  }
93
108
  } else {
94
- target.id = ObjectId.random();
109
+ target.id = EntityId.random();
95
110
  }
96
111
  };
97
112
 
@@ -99,7 +114,15 @@ const setIdOnTarget = (target: any) => {
99
114
  * Set metadata on object.
100
115
  */
101
116
  // TODO(dmaretskyi): Move to echo-schema.
102
- const initMeta = <T>(obj: T, meta: ObjectMeta = { keys: [] }) => {
103
- prepareTypedTarget(meta, ObjectMetaSchema);
104
- defineHiddenProperty(obj, MetaId, createProxy(meta, TypedReactiveHandler.instance as any));
117
+ const initMeta = <T>(obj: T, meta?: Partial<EntityMeta>) => {
118
+ // Backfill required fields so callers may pass a partial meta, or one whose `keys`/`tags`/
119
+ // `annotations` are explicitly `undefined` (coalesce, don't let a spread reintroduce undefined).
120
+ const fullMeta: EntityMeta = {
121
+ ...meta,
122
+ keys: meta?.keys ?? [],
123
+ tags: meta?.tags ?? [],
124
+ annotations: meta?.annotations ?? {},
125
+ };
126
+ prepareTypedTarget(fullMeta, EntityMetaSchema);
127
+ defineHiddenProperty(obj, MetaId, createProxy(fullMeta, TypedReactiveHandler.instance as any));
105
128
  };
@@ -221,12 +221,12 @@ export const getEchoRoot = (target: object, depth = 0): object => {
221
221
 
222
222
  // Root ECHO objects (those created with Obj.make or Relation.make) have KindId set.
223
223
  // They maintain their own change context identity even when nested inside another object.
224
- // Nested helper objects like ObjectMeta don't have KindId and should follow their owner.
224
+ // Nested helper objects like EntityMeta don't have KindId and should follow their owner.
225
225
  if (KindId in target) {
226
226
  return target;
227
227
  }
228
228
 
229
- // For non-root objects (nested records, ObjectMeta, etc.), follow the owner chain.
229
+ // For non-root objects (nested records, EntityMeta, etc.), follow the owner chain.
230
230
  const owner = getOwner(target);
231
231
  if (owner) {
232
232
  return getEchoRoot(owner, depth + 1);
@@ -6,34 +6,43 @@ import * as Schema from 'effect/Schema';
6
6
  import * as SchemaAST from 'effect/SchemaAST';
7
7
  import { describe, expect, test } from 'vitest';
8
8
 
9
+ import { invariant } from '@dxos/invariant';
10
+ import { DXN } from '@dxos/keys';
11
+
9
12
  import { createEchoSchema } from '../../../testing';
13
+ import * as Type from '../../../Type';
10
14
  import { PropertyMeta, getPropertyMetaAnnotation, getTypeAnnotation } from '../../Annotation';
11
15
  import { EchoObjectSchema } from '../../Entity';
12
16
 
13
- // TODO(dmaretskyi): Comment.
14
- const EmptySchemaType = Schema.Struct({}).pipe(
15
- EchoObjectSchema({
16
- typename: 'com.example.type.empty',
17
- version: '0.1.0',
18
- }),
19
- );
17
+ // Test-local: introspect a Type.Type entity's properties via its rebuilt Effect
18
+ // Schema, filter the implicit `id` field, and unwrap `T | undefined` optionality.
19
+ const getProperties = (type: Type.Type): SchemaAST.PropertySignature[] => {
20
+ const ast = Type.getSchema(type).ast;
21
+ invariant(SchemaAST.isTypeLiteral(ast));
22
+ return [...ast.propertySignatures]
23
+ .filter((p) => p.name !== 'id')
24
+ .map((p) => {
25
+ if (!SchemaAST.isUnion(p.type)) {
26
+ return p;
27
+ }
28
+ const nonUndefined = p.type.types.find((t) => !SchemaAST.isUndefinedKeyword(t))!;
29
+ return { ...p, type: nonUndefined } as SchemaAST.PropertySignature;
30
+ });
31
+ };
32
+
33
+ const EmptySchemaType = Schema.Struct({}).pipe(EchoObjectSchema(DXN.make('com.example.type.empty', '0.1.0')));
20
34
 
21
- interface EmptySchemaType extends Schema.Schema.Type<typeof EmptySchemaType> {}
35
+ type EmptySchemaType = Type.InstanceType<typeof EmptySchemaType>;
22
36
 
23
37
  describe('dynamic schema', () => {
24
38
  test('getProperties filters out id and unwraps optionality', async () => {
25
39
  const TestSchema = Schema.Struct({
26
40
  field1: Schema.String,
27
41
  field2: Schema.Boolean,
28
- }).pipe(
29
- EchoObjectSchema({
30
- typename: 'com.example.type.test',
31
- version: '0.1.0',
32
- }),
33
- );
42
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.test', '0.1.0')));
34
43
 
35
- const registered = createEchoSchema(TestSchema);
36
- expect(registered.getProperties().map((p) => [p.name, p.type])).to.deep.eq([
44
+ const registered = createEchoSchema(Type.getSchema(TestSchema));
45
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
37
46
  ['field1', SchemaAST.stringKeyword],
38
47
  ['field2', SchemaAST.booleanKeyword],
39
48
  ]);
@@ -42,28 +51,23 @@ describe('dynamic schema', () => {
42
51
  test('addColumns', async () => {
43
52
  const TestSchema = Schema.Struct({
44
53
  field1: Schema.String,
45
- }).pipe(
46
- EchoObjectSchema({
47
- typename: 'com.example.type.test',
48
- version: '0.1.0',
49
- }),
50
- );
54
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.test', '0.1.0')));
51
55
 
52
- const registered = createEchoSchema(TestSchema);
53
- registered.addFields({ field2: Schema.Boolean });
54
- expect(registered.getProperties().map((p) => [p.name, p.type])).to.deep.eq([
56
+ const registered = createEchoSchema(Type.getSchema(TestSchema));
57
+ Type.addFields(registered, { field2: Schema.Boolean });
58
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
55
59
  ['field1', SchemaAST.stringKeyword],
56
60
  ['field2', SchemaAST.booleanKeyword],
57
61
  ]);
58
62
  });
59
63
 
60
64
  test('updateColumns preserves order of existing and appends new fields', async () => {
61
- const registered = createEchoSchema(EmptySchemaType);
62
- registered.addFields({ field1: Schema.String });
63
- registered.addFields({ field2: Schema.Boolean });
64
- registered.addFields({ field3: Schema.Number });
65
- registered.updateFields({ field4: Schema.Boolean, field2: Schema.String });
66
- expect(registered.getProperties().map((p) => [p.name, p.type])).to.deep.eq([
65
+ const registered = createEchoSchema(Type.getSchema(EmptySchemaType));
66
+ Type.addFields(registered, { field1: Schema.String });
67
+ Type.addFields(registered, { field2: Schema.Boolean });
68
+ Type.addFields(registered, { field3: Schema.Number });
69
+ Type.updateFields(registered, { field4: Schema.Boolean, field2: Schema.String });
70
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
67
71
  ['field1', SchemaAST.stringKeyword],
68
72
  ['field2', SchemaAST.stringKeyword],
69
73
  ['field3', SchemaAST.numberKeyword],
@@ -72,12 +76,12 @@ describe('dynamic schema', () => {
72
76
  });
73
77
 
74
78
  test('removeColumns', async () => {
75
- const registered = createEchoSchema(EmptySchemaType);
76
- registered.addFields({ field1: Schema.String });
77
- registered.addFields({ field2: Schema.Boolean });
78
- registered.addFields({ field3: Schema.Number });
79
- registered.removeFields(['field2']);
80
- expect(registered.getProperties().map((p) => [p.name, p.type])).to.deep.eq([
79
+ const registered = createEchoSchema(Type.getSchema(EmptySchemaType));
80
+ Type.addFields(registered, { field1: Schema.String });
81
+ Type.addFields(registered, { field2: Schema.Boolean });
82
+ Type.addFields(registered, { field3: Schema.Number });
83
+ Type.removeFields(registered, ['field2']);
84
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
81
85
  ['field1', SchemaAST.stringKeyword],
82
86
  ['field3', SchemaAST.numberKeyword],
83
87
  ]);
@@ -86,60 +90,18 @@ describe('dynamic schema', () => {
86
90
  test('schema manipulations preserve annotations', async () => {
87
91
  const metaNamespace = 'dxos.test';
88
92
  const metaInfo = { maxLength: 10 };
89
- const registered = createEchoSchema(EmptySchemaType);
90
- registered.addFields({
93
+ const registered = createEchoSchema(Type.getSchema(EmptySchemaType));
94
+ Type.addFields(registered, {
91
95
  field1: Schema.String.pipe(PropertyMeta(metaNamespace, metaInfo)),
92
96
  field2: Schema.String,
93
97
  });
94
- registered.addFields({ field3: Schema.String });
95
- registered.updateFields({ field3: Schema.Boolean });
96
- registered.removeFields(['field2']);
97
- expect(getTypeAnnotation(registered)).to.deep.contain({
98
+ Type.addFields(registered, { field3: Schema.String });
99
+ Type.updateFields(registered, { field3: Schema.Boolean });
100
+ Type.removeFields(registered, ['field2']);
101
+ expect(getTypeAnnotation(Type.getSchema(registered))).to.deep.contain({
98
102
  typename: 'com.example.type.empty',
99
103
  version: '0.1.0',
100
104
  });
101
- expect(getPropertyMetaAnnotation(registered.getProperties()[0], metaNamespace)).to.deep.eq(metaInfo);
102
- });
103
-
104
- test('updates typename', async ({ expect }) => {
105
- // Create schema with some fields and annotations.
106
- const registered = createEchoSchema(EmptySchemaType);
107
- const originalVersion = registered.persistentSchema.version;
108
- registered.addFields({
109
- name: Schema.String.pipe(PropertyMeta('test', { maxLength: 10 })),
110
- age: Schema.Number,
111
- });
112
-
113
- // First update.
114
- const newTypename1 = 'com.example.type.individual';
115
- registered.updateTypename(newTypename1);
116
-
117
- // Basic typename update checks.
118
- expect(registered.typename).toBe(newTypename1);
119
- expect(registered.jsonSchema.$id).toBe(`dxn:type:${newTypename1}`);
120
- expect(registered.jsonSchema.typename).toBe(newTypename1);
121
-
122
- // Version preservation check.
123
- expect(registered.persistentSchema.version).toBe(originalVersion);
124
-
125
- // Field preservation check.
126
- const properties = registered.getProperties();
127
- expect(properties).toHaveLength(2);
128
- expect(properties[0].name).toBe('name');
129
-
130
- // Annotation preservation check.
131
- const nameMeta = getPropertyMetaAnnotation(properties[0], 'test');
132
- expect(nameMeta).toEqual({ maxLength: 10 });
133
-
134
- // Second update to ensure multiple updates work.
135
- const newTypename2 = 'com.example.type.person';
136
- registered.updateTypename(newTypename2);
137
- expect(registered.typename).toBe(newTypename2);
138
- expect(registered.jsonSchema.$id).toBe(`dxn:type:${newTypename2}`);
139
- expect(registered.jsonSchema.typename).toBe(newTypename2);
140
- expect(getTypeAnnotation(registered)).to.deep.contain({
141
- typename: 'com.example.type.person',
142
- version: '0.1.0',
143
- });
105
+ expect(getPropertyMetaAnnotation(getProperties(registered)[0], metaNamespace)).to.deep.eq(metaInfo);
144
106
  });
145
107
  });
@@ -5,11 +5,14 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
+ import { DXN } from '@dxos/keys';
9
+
10
+ import * as Obj from '../../../Obj';
8
11
  import { TestSchema } from '../../../testing';
9
12
  import { EchoObjectSchema } from '../../Entity';
10
13
  import { setValue } from '../../Obj';
11
14
  import { Ref } from '../../Ref';
12
- import { foreignKey, getMeta } from '../types';
15
+ import { foreignKey, getMeta } from '../types/meta';
13
16
  import { makeObject } from './make-object';
14
17
  import { change, subscribe } from './reactive';
15
18
 
@@ -39,15 +42,13 @@ describe('complex schema validations', () => {
39
42
 
40
43
  test('references', () => {
41
44
  const Foo = Schema.Struct({ field: Schema.String }).pipe(
42
- EchoObjectSchema({ typename: 'com.example.type.foo', version: '0.1.0' }),
43
- );
44
- const Bar = Schema.Struct({ fooRef: Ref(Foo) }).pipe(
45
- EchoObjectSchema({ typename: 'com.example.type.bar', version: '0.1.0' }),
45
+ EchoObjectSchema(DXN.make('com.example.type.foo', '0.1.0')),
46
46
  );
47
+ const Bar = Schema.Struct({ fooRef: Ref(Foo) }).pipe(EchoObjectSchema(DXN.make('com.example.type.bar', '0.1.0')));
47
48
  const field = 'hello';
48
- expect(() => makeObject(Bar, { fooRef: { id: '1', field } as any })).to.throw();
49
- expect(() => makeObject(Bar, { fooRef: undefined as any })).to.throw(); // Unresolved reference.
50
- const bar = makeObject(Bar, { fooRef: Ref.make(makeObject(Foo, { field })) });
49
+ expect(() => Obj.make(Bar, { fooRef: { id: '1', field } as any })).to.throw();
50
+ expect(() => Obj.make(Bar, { fooRef: undefined as any })).to.throw(); // Unresolved reference.
51
+ const bar = Obj.make(Bar, { fooRef: Ref.make(Obj.make(Foo, { field })) });
51
52
  expect(bar.fooRef.target?.field).to.eq(field);
52
53
  });
53
54
 
@@ -79,7 +80,7 @@ describe('complex schema validations', () => {
79
80
  // Untyped reactive objects are no longer supported - use Atoms for untyped reactive state.
80
81
 
81
82
  test('creating an object with data from another object', () => {
82
- const contact = makeObject(TestSchema.Person, {
83
+ const contact = Obj.make(TestSchema.Person, {
83
84
  name: 'Robert Smith',
84
85
  email: 'robert@example.com',
85
86
  });
@@ -94,9 +95,9 @@ describe('complex schema validations', () => {
94
95
 
95
96
  test('subscribe', () => {
96
97
  const TestSchema = Schema.Struct({ field: Schema.String }).pipe(
97
- EchoObjectSchema({ typename: 'Test', version: '0.1.0' }),
98
+ EchoObjectSchema(DXN.make('com.test.type.test', '0.1.0')),
98
99
  );
99
- const object = makeObject(TestSchema, { field: 'value' });
100
+ const object = Obj.make(TestSchema, { field: 'value' });
100
101
  let called = 0;
101
102
  const unsubscribe = subscribe(object as any, () => {
102
103
  called++;