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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +29 -6
  4. package/dist/lib/neutral/Database.mjs +8 -9
  5. package/dist/lib/neutral/Entity.mjs +29 -18
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +27 -19
  8. package/dist/lib/neutral/Filter.mjs +25 -15
  9. package/dist/lib/neutral/Format.mjs +23 -3
  10. package/dist/lib/neutral/JsonSchema.mjs +7 -8
  11. package/dist/lib/neutral/Key.mjs +9 -5
  12. package/dist/lib/neutral/Migration.mjs +18 -0
  13. package/dist/lib/neutral/Obj.mjs +25 -19
  14. package/dist/lib/neutral/Order.mjs +1 -1
  15. package/dist/lib/neutral/Query.mjs +19 -16
  16. package/dist/lib/neutral/QueryResult.mjs +1 -1
  17. package/dist/lib/neutral/Ref.mjs +10 -9
  18. package/dist/lib/neutral/Registry.mjs +14 -0
  19. package/dist/lib/neutral/Registry.mjs.map +7 -0
  20. package/dist/lib/neutral/Relation.mjs +26 -24
  21. package/dist/lib/neutral/Scope.mjs +12 -0
  22. package/dist/lib/neutral/Scope.mjs.map +7 -0
  23. package/dist/lib/neutral/Tag.mjs +17 -13
  24. package/dist/lib/neutral/Type.mjs +52 -26
  25. package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
  26. package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
  28. package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-CIRHIEMW.mjs → chunk-4SFPZJVA.mjs} +92 -112
  30. package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-YWXWXIE5.mjs → chunk-4Z6GET2X.mjs} +3 -3
  32. package/dist/lib/neutral/chunk-4Z6GET2X.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  34. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-43Y5DOS6.mjs → chunk-7OAFN3OX.mjs} +75 -112
  36. package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-BOZZPUXE.mjs → chunk-7PRCIDHH.mjs} +41 -81
  38. package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  40. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-BDQGMDIX.mjs +132 -0
  42. package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
  44. package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-DKLUHO4T.mjs} +1 -1
  46. package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
  48. package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
  49. package/dist/lib/neutral/{chunk-UTBRYVQC.mjs → chunk-G6CFWUYH.mjs} +2 -2
  50. package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
  51. package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
  52. package/dist/lib/neutral/{chunk-FXEG7EOK.mjs → chunk-J3MNM65T.mjs} +9 -6
  53. package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
  55. package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
  57. package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
  59. package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-WYOKA6AE.mjs → chunk-O6BH7EPN.mjs} +31 -4
  61. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-KTAWP7GI.mjs → chunk-OIYW7R2G.mjs} +99 -46
  63. package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-TQQZLKB7.mjs → chunk-OYUG4FHF.mjs} +648 -1228
  65. package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-NQRLRYJM.mjs → chunk-Q5FKCVBC.mjs} +173 -60
  67. package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-Q62IHV2N.mjs +41 -0
  69. package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
  70. package/dist/lib/neutral/{chunk-UFDK26FO.mjs → chunk-QVJDDG44.mjs} +69 -34
  71. package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
  72. package/dist/lib/neutral/{chunk-B5OXLWZL.mjs → chunk-TFEWTY5A.mjs} +155 -129
  73. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  74. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-TTCSATUD.mjs} +1 -1
  75. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs → chunk-VKWOFXT2.mjs} +22 -2
  76. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
  77. package/dist/lib/neutral/{chunk-NXMFBIT5.mjs → chunk-ZACMEAYV.mjs} +89 -23
  78. package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
  79. package/dist/lib/neutral/index.mjs +58 -38
  80. package/dist/lib/neutral/internal/index.mjs +131 -64
  81. package/dist/lib/neutral/meta.json +1 -1
  82. package/dist/lib/neutral/testing/index.mjs +222 -177
  83. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  84. package/dist/types/src/Annotation.d.ts +108 -4
  85. package/dist/types/src/Annotation.d.ts.map +1 -1
  86. package/dist/types/src/Annotation.test.d.ts +2 -0
  87. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  88. package/dist/types/src/Collection.d.ts +2 -3
  89. package/dist/types/src/Collection.d.ts.map +1 -1
  90. package/dist/types/src/Database.d.ts +56 -24
  91. package/dist/types/src/Database.d.ts.map +1 -1
  92. package/dist/types/src/Dataset.d.ts +17 -6
  93. package/dist/types/src/Dataset.d.ts.map +1 -1
  94. package/dist/types/src/Entity.d.ts +102 -26
  95. package/dist/types/src/Entity.d.ts.map +1 -1
  96. package/dist/types/src/Err.d.ts +27 -27
  97. package/dist/types/src/Err.d.ts.map +1 -1
  98. package/dist/types/src/Feed.d.ts +89 -25
  99. package/dist/types/src/Feed.d.ts.map +1 -1
  100. package/dist/types/src/Filter.d.ts +74 -11
  101. package/dist/types/src/Filter.d.ts.map +1 -1
  102. package/dist/types/src/Filter.test.d.ts +2 -0
  103. package/dist/types/src/Filter.test.d.ts.map +1 -0
  104. package/dist/types/src/Hypergraph.d.ts +14 -9
  105. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  106. package/dist/types/src/Json.d.ts +33 -0
  107. package/dist/types/src/Json.d.ts.map +1 -0
  108. package/dist/types/src/Json.test.d.ts +2 -0
  109. package/dist/types/src/Json.test.d.ts.map +1 -0
  110. package/dist/types/src/JsonSchema.d.ts +2 -2
  111. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  112. package/dist/types/src/Key.d.ts +1 -1
  113. package/dist/types/src/Key.d.ts.map +1 -1
  114. package/dist/types/src/Migration.d.ts +72 -0
  115. package/dist/types/src/Migration.d.ts.map +1 -0
  116. package/dist/types/src/Obj.d.ts +108 -65
  117. package/dist/types/src/Obj.d.ts.map +1 -1
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +35 -10
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +9 -0
  122. package/dist/types/src/QueryResult.d.ts.map +1 -1
  123. package/dist/types/src/Ref.d.ts +15 -7
  124. package/dist/types/src/Ref.d.ts.map +1 -1
  125. package/dist/types/src/Registry.d.ts +131 -0
  126. package/dist/types/src/Registry.d.ts.map +1 -0
  127. package/dist/types/src/Relation.d.ts +72 -44
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +34 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/StateMap.d.ts +32 -0
  132. package/dist/types/src/StateMap.d.ts.map +1 -0
  133. package/dist/types/src/StateMap.test.d.ts +2 -0
  134. package/dist/types/src/StateMap.test.d.ts.map +1 -0
  135. package/dist/types/src/Tag.d.ts +21 -5
  136. package/dist/types/src/Tag.d.ts.map +1 -1
  137. package/dist/types/src/TagIndex.d.ts +36 -0
  138. package/dist/types/src/TagIndex.d.ts.map +1 -0
  139. package/dist/types/src/TagIndex.test.d.ts +2 -0
  140. package/dist/types/src/TagIndex.test.d.ts.map +1 -0
  141. package/dist/types/src/Tagging.d.ts +31 -0
  142. package/dist/types/src/Tagging.d.ts.map +1 -0
  143. package/dist/types/src/Type.d.ts +357 -96
  144. package/dist/types/src/Type.d.ts.map +1 -1
  145. package/dist/types/src/View.d.ts +2 -5
  146. package/dist/types/src/View.d.ts.map +1 -1
  147. package/dist/types/src/exemplars.test.d.ts +2 -0
  148. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  149. package/dist/types/src/index.d.ts +8 -2
  150. package/dist/types/src/index.d.ts.map +1 -1
  151. package/dist/types/src/internal/Annotation/annotations.d.ts +79 -37
  152. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  153. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  154. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  155. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  156. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  157. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  158. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  159. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  160. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  161. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/api.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  165. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  167. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  169. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  170. package/dist/types/src/internal/Entity/model.d.ts +20 -17
  171. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  172. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  173. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  174. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  175. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  176. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  177. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  178. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  179. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  180. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  181. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  182. package/dist/types/src/internal/Format/format.d.ts +3 -2
  183. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  184. package/dist/types/src/internal/Format/index.d.ts +2 -2
  185. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  187. package/dist/types/src/internal/Format/object.d.ts +3 -1
  188. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  189. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  190. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +28 -28
  192. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  194. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  195. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  197. package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
  198. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  200. package/dist/types/src/internal/Obj/index.d.ts +0 -1
  201. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  202. package/dist/types/src/internal/Obj/json-serializer.d.ts +11 -10
  203. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  204. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  205. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  206. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  207. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  208. package/dist/types/src/internal/Query.d.ts +10 -0
  209. package/dist/types/src/internal/Query.d.ts.map +1 -0
  210. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  211. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -1
  212. package/dist/types/src/internal/Ref/ref.d.ts +42 -19
  213. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  214. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  215. package/dist/types/src/internal/Type/index.d.ts +1 -2
  216. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  217. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  218. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  219. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  220. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  221. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  222. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  223. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  224. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  225. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  227. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  228. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  231. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  232. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  233. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  235. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  236. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  237. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  238. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  239. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  240. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  241. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  242. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  243. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  244. package/dist/types/src/internal/common/types/entity.d.ts +63 -6
  245. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  246. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  247. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  248. package/dist/types/src/internal/common/types/meta.d.ts +23 -7
  249. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  250. package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
  251. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  252. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  253. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  254. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  255. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  256. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  257. package/dist/types/src/internal/index.d.ts +2 -0
  258. package/dist/types/src/internal/index.d.ts.map +1 -1
  259. package/dist/types/src/testing/test-data.d.ts +8 -8
  260. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  261. package/dist/types/src/testing/test-schema.d.ts +83 -89
  262. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  263. package/dist/types/src/testing/util.d.ts +5 -3
  264. package/dist/types/src/testing/util.d.ts.map +1 -1
  265. package/dist/types/tsconfig.tsbuildinfo +1 -1
  266. package/package.json +27 -19
  267. package/src/Annotation.test.ts +439 -0
  268. package/src/Annotation.ts +152 -4
  269. package/src/Collection.ts +6 -5
  270. package/src/Database.ts +117 -57
  271. package/src/Dataset.ts +10 -2
  272. package/src/Entity.test.ts +116 -6
  273. package/src/Entity.ts +130 -31
  274. package/src/Err.ts +4 -4
  275. package/src/Feed.ts +138 -43
  276. package/src/Filter.test.ts +90 -0
  277. package/src/Filter.ts +143 -27
  278. package/src/Hypergraph.ts +14 -9
  279. package/src/Json.test.ts +175 -0
  280. package/src/Json.ts +103 -0
  281. package/src/Key.ts +1 -1
  282. package/src/Migration.ts +114 -0
  283. package/src/Obj.test.ts +122 -19
  284. package/src/Obj.ts +279 -97
  285. package/src/Query.test.ts +317 -131
  286. package/src/Query.ts +181 -73
  287. package/src/QueryResult.ts +11 -0
  288. package/src/Ref.ts +22 -4
  289. package/src/Registry.ts +155 -0
  290. package/src/Relation.test.ts +10 -10
  291. package/src/Relation.ts +112 -71
  292. package/src/Scope.ts +50 -0
  293. package/src/StateMap.test.ts +56 -0
  294. package/src/StateMap.ts +99 -0
  295. package/src/Tag.md +88 -0
  296. package/src/Tag.ts +49 -6
  297. package/src/TagIndex.test.ts +57 -0
  298. package/src/TagIndex.ts +110 -0
  299. package/src/Tagging.ts +83 -0
  300. package/src/Type.test.ts +223 -18
  301. package/src/Type.ts +602 -132
  302. package/src/View.ts +11 -15
  303. package/src/exemplars.test.ts +21 -0
  304. package/src/index.ts +9 -3
  305. package/src/internal/Annotation/annotations.test.ts +82 -13
  306. package/src/internal/Annotation/annotations.ts +153 -115
  307. package/src/internal/Annotation/dictionary.ts +47 -0
  308. package/src/internal/Annotation/entity-dictionary.ts +40 -0
  309. package/src/internal/Annotation/index.ts +4 -2
  310. package/src/internal/Annotation/sorting.ts +0 -1
  311. package/src/internal/Annotation/util.ts +17 -8
  312. package/src/internal/Entity/api.ts +7 -8
  313. package/src/internal/Entity/entity.ts +196 -47
  314. package/src/internal/Entity/guard.ts +26 -0
  315. package/src/internal/Entity/index.ts +2 -0
  316. package/src/internal/Entity/model.ts +37 -28
  317. package/src/internal/Entity/object.ts +21 -6
  318. package/src/internal/Entity/relation.ts +68 -34
  319. package/src/internal/Entity/type-kind.ts +75 -0
  320. package/src/internal/Entity/type-uri.ts +87 -0
  321. package/src/internal/Entity/util.ts +10 -9
  322. package/src/internal/Entity/version.ts +0 -1
  323. package/src/internal/Format/date.test.ts +0 -1
  324. package/src/internal/Format/date.ts +0 -4
  325. package/src/internal/Format/format.test.ts +21 -1
  326. package/src/internal/Format/index.ts +2 -3
  327. package/src/internal/Format/object.ts +21 -4
  328. package/src/internal/Format/types.ts +1 -1
  329. package/src/internal/JsonSchema/annotations.ts +1 -1
  330. package/src/internal/JsonSchema/json-schema-type.ts +1 -1
  331. package/src/internal/JsonSchema/json-schema.test.ts +55 -142
  332. package/src/internal/JsonSchema/json-schema.ts +44 -31
  333. package/src/internal/Obj/clone.ts +9 -4
  334. package/src/internal/Obj/create-object.test.ts +13 -13
  335. package/src/internal/Obj/create-object.ts +68 -24
  336. package/src/internal/Obj/deleted.ts +1 -1
  337. package/src/internal/Obj/index.ts +0 -1
  338. package/src/internal/Obj/inspect.ts +4 -3
  339. package/src/internal/Obj/json-serializer.test.ts +102 -24
  340. package/src/internal/Obj/json-serializer.ts +105 -43
  341. package/src/internal/Obj/set-value.test.ts +31 -54
  342. package/src/internal/Obj/set-value.ts +1 -1
  343. package/src/internal/Obj/snapshot.ts +11 -4
  344. package/src/internal/Obj/typed-object.test.ts +9 -11
  345. package/src/internal/Obj/typed-object.ts +1 -1
  346. package/src/internal/Query.ts +159 -0
  347. package/src/internal/Ref/ref-array.ts +3 -4
  348. package/src/internal/Ref/ref.test.ts +17 -27
  349. package/src/internal/Ref/ref.ts +124 -59
  350. package/src/internal/Type/compose.test.ts +3 -2
  351. package/src/internal/Type/index.ts +1 -2
  352. package/src/internal/Type/manipulation.ts +0 -25
  353. package/src/internal/Type/type-schema.ts +60 -0
  354. package/src/internal/common/README.md +2 -2
  355. package/src/internal/common/api/meta.ts +19 -17
  356. package/src/internal/common/proxy/change-context.ts +1 -1
  357. package/src/internal/common/proxy/change.test.ts +118 -110
  358. package/src/internal/common/proxy/errors.ts +2 -2
  359. package/src/internal/common/proxy/handler.test.ts +1 -3
  360. package/src/internal/common/proxy/json-serializer.ts +26 -16
  361. package/src/internal/common/proxy/make-object.ts +43 -21
  362. package/src/internal/common/proxy/ownership.ts +2 -3
  363. package/src/internal/common/proxy/reactive-array.ts +1 -1
  364. package/src/internal/common/proxy/reactive.test.ts +54 -0
  365. package/src/internal/common/proxy/reactive.ts +11 -3
  366. package/src/internal/common/proxy/schema.test.ts +48 -86
  367. package/src/internal/common/proxy/typed-handler.test.ts +12 -12
  368. package/src/internal/common/proxy/typed-handler.ts +79 -19
  369. package/src/internal/common/proxy/typed-object.test.ts +16 -29
  370. package/src/internal/common/types/base.ts +4 -4
  371. package/src/internal/common/types/entity.ts +81 -2
  372. package/src/internal/common/types/index.ts +6 -1
  373. package/src/internal/common/types/meta.ts +49 -15
  374. package/src/internal/common/types/model-symbols.ts +16 -4
  375. package/src/internal/common/types/typename.ts +39 -3
  376. package/src/internal/common/types/well-known-types.ts +15 -0
  377. package/src/internal/index.ts +6 -0
  378. package/src/testing/api.test.ts +15 -10
  379. package/src/testing/test-data.ts +159 -100
  380. package/src/testing/test-schema.ts +22 -58
  381. package/src/testing/util.ts +14 -11
  382. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  383. package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +0 -7
  384. package/dist/lib/neutral/chunk-724GQYEN.mjs +0 -56
  385. package/dist/lib/neutral/chunk-724GQYEN.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  387. package/dist/lib/neutral/chunk-B5OXLWZL.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  389. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  390. package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-CIRHIEMW.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-DYDJBZEG.mjs +0 -102
  393. package/dist/lib/neutral/chunk-DYDJBZEG.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-FXEG7EOK.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-KTAWP7GI.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-NEGC54NE.mjs +0 -130
  397. package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-NQRLRYJM.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-OENWMTE6.mjs +0 -45
  401. package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +0 -7
  402. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs +0 -97
  404. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-SEMVAGBM.mjs +0 -355
  406. package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-TQQZLKB7.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-UFDK26FO.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-VA2F47ZC.mjs +0 -152
  411. package/dist/lib/neutral/chunk-VA2F47ZC.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-WYOKA6AE.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-YWXWXIE5.mjs.map +0 -7
  414. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  415. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  416. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  417. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  418. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  419. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  420. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  421. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  422. package/src/SchemaRegistry.ts +0 -106
  423. package/src/internal/Obj/ids.ts +0 -12
  424. package/src/internal/Type/echo-schema.ts +0 -424
  425. package/src/internal/Type/persistent-schema.ts +0 -33
  426. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Migration.mjs.map} +0 -0
  427. /package/dist/lib/neutral/{chunk-UTBRYVQC.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
  428. /package/dist/lib/neutral/{chunk-UI6MWK5W.mjs.map → chunk-TTCSATUD.mjs.map} +0 -0
@@ -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,42 +4,56 @@
4
4
 
5
5
  import type * as Schema from 'effect/Schema';
6
6
 
7
- import { ObjectId } from '@dxos/keys';
8
-
9
- import { getTypeAnnotation } from '../../Annotation';
10
- import { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema, ParentId } from '../types';
7
+ import { EntityId } from '@dxos/keys';
11
8
 
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';
12
12
  import { defineHiddenProperty } from './define-hidden-property';
13
13
  import { attachTypedJsonSerializer } from './json-serializer';
14
14
  import { createProxy, getProxyTarget, isValidProxyTarget } from './proxy-utils';
15
- import { TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
15
+ import { TypeSource, TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
16
16
 
17
17
  /**
18
18
  *
19
19
  */
20
20
  // TODO(burdon): Make internal
21
- 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>;
22
26
 
23
27
  /**
24
28
  * Creates a reactive object from a plain Javascript object.
25
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]`.
26
36
  */
27
37
  // TODO(burdon): Make internal
28
38
  // TODO(dmaretskyi): Deep mutability.
29
39
  // TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.
30
40
  // TODO(dmaretskyi): Could mutate original object making it unusable.
31
- export const makeObject: {
32
- <T extends AnyProperties>(
33
- schema: Schema.Schema<T, any, never>,
34
- obj: NoInfer<MakeObjectProps<T>>,
35
- meta?: ObjectMeta,
36
- ): T;
37
- } = <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 => {
38
47
  // Use Object.assign to copy symbol properties (like ParentId) that spread operator doesn't copy.
39
- 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);
40
49
  };
41
50
 
42
- 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 => {
43
57
  if (!isValidProxyTarget(obj)) {
44
58
  throw new Error('Value cannot be made into a reactive object.');
45
59
  }
@@ -63,7 +77,7 @@ const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta
63
77
  if (parent !== undefined) {
64
78
  defineHiddenProperty(obj, ParentId, parent);
65
79
  }
66
- prepareTypedTarget(obj, schema);
80
+ prepareTypedTarget(obj, schema, typeSource);
67
81
  attachTypedJsonSerializer(obj);
68
82
  const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);
69
83
 
@@ -88,11 +102,11 @@ const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta
88
102
  const setIdOnTarget = (target: any) => {
89
103
  // invariant(!('id' in target), 'Object already has an `id` field, which is reserved.');
90
104
  if ('id' in target && target.id !== undefined && target.id !== null) {
91
- if (!ObjectId.isValid(target.id)) {
105
+ if (!EntityId.isValid(target.id)) {
92
106
  throw new Error('Invalid object id format.');
93
107
  }
94
108
  } else {
95
- target.id = ObjectId.random();
109
+ target.id = EntityId.random();
96
110
  }
97
111
  };
98
112
 
@@ -100,7 +114,15 @@ const setIdOnTarget = (target: any) => {
100
114
  * Set metadata on object.
101
115
  */
102
116
  // TODO(dmaretskyi): Move to echo-schema.
103
- const initMeta = <T>(obj: T, meta: ObjectMeta = { keys: [] }) => {
104
- prepareTypedTarget(meta, ObjectMetaSchema);
105
- 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));
106
128
  };
@@ -5,7 +5,6 @@
5
5
  import { invariant } from '@dxos/invariant';
6
6
 
7
7
  import { KindId } from '../types';
8
-
9
8
  import { queueOwnerNotification } from './change-context';
10
9
  import { defineHiddenProperty } from './define-hidden-property';
11
10
  import { getProxyTarget, isProxy, isValidProxyTarget } from './proxy-utils';
@@ -222,12 +221,12 @@ export const getEchoRoot = (target: object, depth = 0): object => {
222
221
 
223
222
  // Root ECHO objects (those created with Obj.make or Relation.make) have KindId set.
224
223
  // They maintain their own change context identity even when nested inside another object.
225
- // 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.
226
225
  if (KindId in target) {
227
226
  return target;
228
227
  }
229
228
 
230
- // 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.
231
230
  const owner = getOwner(target);
232
231
  if (owner) {
233
232
  return getEchoRoot(owner, depth + 1);
@@ -34,7 +34,7 @@ const checkArrayMutationAllowed = (arr: any, method: string): void => {
34
34
 
35
35
  /**
36
36
  * Extends the native array to make sure that arrays methods are correctly reactive.
37
- * Enforces that mutations only happen within Obj.change() context.
37
+ * Enforces that mutations only happen within Obj.update() context.
38
38
  */
39
39
  export class ReactiveArray<T> extends Array<T> {
40
40
  static override get [Symbol.species]() {
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import * as Obj from '../../../Obj';
8
+ import { TestSchema } from '../../../testing';
9
+
10
+ describe('Obj.subscribe', () => {
11
+ test('subscribes and fires for reactive proxies', () => {
12
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
13
+ let calls = 0;
14
+ const unsubscribe = Obj.subscribe(obj, () => {
15
+ calls++;
16
+ });
17
+
18
+ Obj.update(obj, (obj) => {
19
+ obj.name = 'Updated';
20
+ });
21
+ expect(calls).toBeGreaterThan(0);
22
+
23
+ unsubscribe();
24
+ const seen = calls;
25
+ Obj.update(obj, (obj) => {
26
+ obj.name = 'After unsubscribe';
27
+ });
28
+ expect(calls).toBe(seen);
29
+ });
30
+
31
+ // Regression: queue-stored typed objects (e.g. AiContext.Binding) and other Obj-shaped values
32
+ // satisfy `Obj.isObject` (KindId is set) but are not wrapped in a reactive Proxy. Earlier
33
+ // versions invariant'd inside `getProxyTarget` when an atom body did `Obj.subscribe(obj)` on
34
+ // such an input. The contract is "no-op for non-reactive inputs"; verify the function
35
+ // returns gracefully instead of throwing.
36
+ test('returns a no-op unsubscribe for non-proxy inputs', () => {
37
+ const queueShaped: any = {
38
+ id: '01KQ5NKXJWSKMRPVTVG2GHV8V3',
39
+ blueprints: { added: [], removed: [] },
40
+ objects: { added: [], removed: [] },
41
+ };
42
+ const unsubscribe = Obj.subscribe(queueShaped, () => {});
43
+ expect(typeof unsubscribe).toBe('function');
44
+ expect(() => unsubscribe()).not.toThrow();
45
+ });
46
+
47
+ test('returns a no-op unsubscribe for primitives, null, and undefined', () => {
48
+ for (const value of [null, undefined, 42, 'string', true]) {
49
+ const unsubscribe = Obj.subscribe(value as any, () => {});
50
+ expect(typeof unsubscribe).toBe('function');
51
+ expect(() => unsubscribe()).not.toThrow();
52
+ }
53
+ });
54
+ });
@@ -3,8 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type RefTypeId } from '../../Ref/ref';
6
-
7
- import { getProxyTarget } from './proxy-utils';
6
+ import { getProxyTarget, isProxy } from './proxy-utils';
8
7
  import { ChangeId, EventId } from './symbols';
9
8
 
10
9
  /**
@@ -15,6 +14,15 @@ import { ChangeId, EventId } from './symbols';
15
14
  */
16
15
  // TODO(wittjosiah): Consider throwing if obj doesn't have EventId instead of returning no-op.
17
16
  export const subscribe = (obj: unknown, callback: () => void): (() => void) => {
17
+ // Guard against non-reactive inputs (queue-stored typed objects, snapshots, plain shapes
18
+ // with branded symbols) before `getProxyTarget`'s `ProxyHandlerSlot` invariant kicks in.
19
+ // `Obj.isObject` (KindId-based) is satisfied by these inputs, so callers like
20
+ // `Atom.family((obj) => Atom.make((get) => Obj.subscribe(obj, ...)))` legitimately reach
21
+ // here with a non-proxy. Falling back to a no-op preserves the documented contract that
22
+ // values without subscription support get a no-op unsubscribe.
23
+ if (!isProxy(obj)) {
24
+ return () => {};
25
+ }
18
26
  const target = getProxyTarget(obj as any);
19
27
  if (target && EventId in target) {
20
28
  return (target as any)[EventId].on(callback);
@@ -24,7 +32,7 @@ export const subscribe = (obj: unknown, callback: () => void): (() => void) => {
24
32
 
25
33
  /**
26
34
  * Deeply removes readonly modifiers from all properties of T.
27
- * Inside Obj.change, all properties are fully mutable regardless of schema definition.
35
+ * Inside Obj.update, all properties are fully mutable regardless of schema definition.
28
36
  * Ref types are preserved as-is since they are value-like objects that are replaced, not mutated.
29
37
  * Primitive types (including branded primitives) are preserved as-is.
30
38
  */
@@ -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,12 +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';
13
-
15
+ import { foreignKey, getMeta } from '../types/meta';
14
16
  import { makeObject } from './make-object';
15
17
  import { change, subscribe } from './reactive';
16
18
 
@@ -40,15 +42,13 @@ describe('complex schema validations', () => {
40
42
 
41
43
  test('references', () => {
42
44
  const Foo = Schema.Struct({ field: Schema.String }).pipe(
43
- EchoObjectSchema({ typename: 'com.example.type.foo', version: '0.1.0' }),
44
- );
45
- const Bar = Schema.Struct({ fooRef: Ref(Foo) }).pipe(
46
- EchoObjectSchema({ typename: 'com.example.type.bar', version: '0.1.0' }),
45
+ EchoObjectSchema(DXN.make('com.example.type.foo', '0.1.0')),
47
46
  );
47
+ const Bar = Schema.Struct({ fooRef: Ref(Foo) }).pipe(EchoObjectSchema(DXN.make('com.example.type.bar', '0.1.0')));
48
48
  const field = 'hello';
49
- expect(() => makeObject(Bar, { fooRef: { id: '1', field } as any })).to.throw();
50
- expect(() => makeObject(Bar, { fooRef: undefined as any })).to.throw(); // Unresolved reference.
51
- 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 })) });
52
52
  expect(bar.fooRef.target?.field).to.eq(field);
53
53
  });
54
54
 
@@ -80,7 +80,7 @@ describe('complex schema validations', () => {
80
80
  // Untyped reactive objects are no longer supported - use Atoms for untyped reactive state.
81
81
 
82
82
  test('creating an object with data from another object', () => {
83
- const contact = makeObject(TestSchema.Person, {
83
+ const contact = Obj.make(TestSchema.Person, {
84
84
  name: 'Robert Smith',
85
85
  email: 'robert@example.com',
86
86
  });
@@ -95,9 +95,9 @@ describe('complex schema validations', () => {
95
95
 
96
96
  test('subscribe', () => {
97
97
  const TestSchema = Schema.Struct({ field: Schema.String }).pipe(
98
- EchoObjectSchema({ typename: 'Test', version: '0.1.0' }),
98
+ EchoObjectSchema(DXN.make('com.test.type.test', '0.1.0')),
99
99
  );
100
- const object = makeObject(TestSchema, { field: 'value' });
100
+ const object = Obj.make(TestSchema, { field: 'value' });
101
101
  let called = 0;
102
102
  const unsubscribe = subscribe(object as any, () => {
103
103
  called++;