@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
@@ -16,11 +16,17 @@ import { Event } from '@dxos/async';
16
16
  import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
17
17
  import { EncodedReference } from '@dxos/echo-protocol';
18
18
  import { assertArgument, invariant } from '@dxos/invariant';
19
- import { DXN, ObjectId } from '@dxos/keys';
19
+ import { DXN, EID, EntityId, type URI } from '@dxos/keys';
20
20
 
21
21
  import * as Database from '../../Database';
22
- import { ReferenceAnnotationId, getSchemaDXN, getTypeAnnotation, getTypeIdentifierAnnotation } from '../Annotation';
23
- import type { AnyEntity, AnyProperties } from '../common/types';
22
+ import type * as Type from '../../Type';
23
+ import {
24
+ ReferenceAnnotationId,
25
+ getSchemaURI,
26
+ getTypeAnnotation,
27
+ getTypeIdentifierAnnotation,
28
+ } from '../Annotation/annotations';
29
+ import { type AnyEntity, type AnyProperties, type UnknownTypeSchema, getStaticTypeSchema } from '../common/types';
24
30
  import { type JsonSchemaType } from '../JsonSchema';
25
31
 
26
32
  /**
@@ -31,7 +37,9 @@ export const JSON_SCHEMA_ECHO_REF_ID = '/schemas/echo/ref';
31
37
  export const getSchemaReference = (property: JsonSchemaType): { typename: string } | undefined => {
32
38
  const { $id, reference: { schema: { $ref } = {} } = {} } = property;
33
39
  if ($id === JSON_SCHEMA_ECHO_REF_ID && $ref) {
34
- return { typename: DXN.parse($ref).typename };
40
+ const parsed = DXN.tryMake($ref);
41
+ const typename = parsed ? DXN.getName(parsed) : undefined;
42
+ return typename ? { typename } : undefined;
35
43
  }
36
44
  };
37
45
 
@@ -40,7 +48,7 @@ export const createSchemaReference = (typename: string): Types.DeepMutable<JsonS
40
48
  $id: JSON_SCHEMA_ECHO_REF_ID,
41
49
  reference: {
42
50
  schema: {
43
- $ref: DXN.fromTypename(typename).toString(),
51
+ $ref: DXN.make(typename),
44
52
  },
45
53
  },
46
54
  };
@@ -82,7 +90,27 @@ export interface RefSchema<T extends AnyEntity> extends Schema.SchemaClass<Ref<T
82
90
  * Type of the `Ref` function and extra methods attached to it.
83
91
  */
84
92
  export interface RefFn {
85
- <S extends Schema.Schema.Any>(schema: S): RefSchema<Schema.Schema.Type<S>>;
93
+ // A reference target is a `Type.AnyEntity` entity (the canonical Option B
94
+ // input) or one of the well-known "any object" / "any relation" branded
95
+ // schemas (`Obj.Unknown` / `Relation.Unknown`). Arbitrary raw schemas are
96
+ // rejected.
97
+ //
98
+ // Referencing a type-kind entity (a meta-schema, e.g. `Type.Type`) yields a
99
+ // reference to a stored schema record; its loaded target is any registered
100
+ // entity (`Type.AnyEntity`), since a stored object/relation schema is itself a
101
+ // `Type.Type` record. Referencing an object/relation type yields a reference
102
+ // to an instance of that type.
103
+ <S extends Type.AnyEntity | UnknownTypeSchema<any, any> = Type.AnyEntity>(
104
+ schema: S,
105
+ ): RefSchema<
106
+ S extends Type.AnyType
107
+ ? Type.AnyEntity
108
+ : S extends Type.AnyObj | Type.AnyRelation
109
+ ? Type.InstanceType<S>
110
+ : S extends UnknownTypeSchema<infer A, any>
111
+ ? A
112
+ : never
113
+ >;
86
114
 
87
115
  /**
88
116
  * @returns True if the object is a reference.
@@ -92,7 +120,7 @@ export interface RefFn {
92
120
  /**
93
121
  * @returns True if the reference points to the given object id.
94
122
  */
95
- hasObjectId: (id: ObjectId) => (ref: Ref<any>) => boolean;
123
+ hasEntityId: (id: EntityId) => (ref: Ref<any>) => boolean;
96
124
 
97
125
  /**
98
126
  * @returns True if the schema is a reference schema.
@@ -111,15 +139,19 @@ export interface RefFn {
111
139
  make: <T extends AnyEntity>(object: T) => Ref<T>;
112
140
 
113
141
  /**
114
- * Constructs a reference that points to the object specified by the provided DXN.
142
+ * Constructs a reference that points to the object specified by the provided URI
143
+ * (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).
115
144
  */
116
- fromDXN: (dxn: DXN) => Ref<any>;
145
+ fromURI: (uri: URI.URI) => Ref<any>;
117
146
  }
118
147
 
119
148
  /**
120
149
  * Schema builder for references.
121
150
  */
122
- export const Ref: RefFn = <S extends Schema.Schema.Any>(schema: S): RefSchema<Schema.Schema.Type<S>> => {
151
+ export const Ref: RefFn = (input: any): RefSchema<any> => {
152
+ // `Type.Type` entities carry their source schema on the hidden slot; the
153
+ // branded `Obj.Unknown` / `Relation.Unknown` schemas are used directly.
154
+ const schema = getStaticTypeSchema(input) ?? input;
123
155
  assertArgument(Schema.isSchema(schema), 'schema', 'Must call with an instance of effect-schema');
124
156
  const annotation = getTypeAnnotation(schema);
125
157
  if (annotation == null) {
@@ -135,9 +167,9 @@ export const Ref: RefFn = <S extends Schema.Schema.Any>(schema: S): RefSchema<Sc
135
167
  */
136
168
  export interface Ref<T> extends Pipeable.Pipeable {
137
169
  /**
138
- * Target object DXN.
170
+ * Target URI (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).
139
171
  */
140
- get dxn(): DXN;
172
+ get uri(): URI.URI;
141
173
 
142
174
  /**
143
175
  * Returns true if the reference has a target available (inlined or resolver set).
@@ -215,7 +247,10 @@ Ref.isRef = (obj: any): obj is Ref<any> => {
215
247
  return obj && typeof obj === 'object' && RefTypeId in obj;
216
248
  };
217
249
 
218
- Ref.hasObjectId = (id: ObjectId) => (ref: Ref<any>) => ref.dxn.isLocalObjectId() && ref.dxn.parts[1] === id;
250
+ Ref.hasEntityId = (id: EntityId) => (ref: Ref<any>) => {
251
+ const uri = EID.tryParse(ref.uri);
252
+ return uri !== undefined && EID.isLocal(uri) && EID.getEntityId(uri) === id;
253
+ };
219
254
 
220
255
  Ref.isRefSchema = (schema: Schema.Schema<any, any>): schema is RefSchema<any> => {
221
256
  return Ref.isRefSchemaAST(schema.ast);
@@ -230,16 +265,16 @@ Ref.make = <T extends AnyProperties>(obj: T): Ref<T> => {
230
265
  throw new TypeError('Expected: ECHO object.');
231
266
  }
232
267
 
233
- // TODO(dmaretskyi): Extract to `getObjectDXN` function.
268
+ // TODO(dmaretskyi): Extract to `getObjectEchoUri` function.
234
269
  const id = obj.id;
235
- invariant(ObjectId.isValid(id), 'Invalid object ID');
236
- const dxn = DXN.fromLocalObjectId(id);
237
- return new RefImpl(dxn, obj);
270
+ invariant(EntityId.isValid(id), 'Invalid object ID');
271
+ const uri = EID.make({ entityId: id });
272
+ return new RefImpl(uri, obj);
238
273
  };
239
274
 
240
- Ref.fromDXN = (dxn: DXN): Ref<any> => {
241
- assertArgument(dxn instanceof DXN, 'dxn', 'Expected DXN');
242
- return new RefImpl(dxn);
275
+ Ref.fromURI = (uri: URI.URI): Ref<any> => {
276
+ assertArgument(typeof uri === 'string', 'uri', 'Expected URI string');
277
+ return new RefImpl(uri);
243
278
  };
244
279
 
245
280
  /**
@@ -255,18 +290,18 @@ export type JsonSchemaReferenceInfo = {
255
290
  */
256
291
  // TODO(burdon): Move to json schema and make private?
257
292
  export const createEchoReferenceSchema = (
258
- echoId: string | undefined,
293
+ echoUri: string | undefined,
259
294
  typename: string | undefined,
260
295
  version: string | undefined,
261
296
  ): Schema.SchemaClass<Ref<any>, EncodedReference> => {
262
- if (!echoId && !typename) {
263
- throw new TypeError('Either echoId or typename must be provided.');
297
+ if (!echoUri && !typename) {
298
+ throw new TypeError('Either echoUri or typename must be provided.');
264
299
  }
265
300
 
266
301
  const referenceInfo: JsonSchemaReferenceInfo = {
267
302
  schema: {
268
303
  // TODO(dmaretskyi): Include version?
269
- $ref: echoId ?? DXN.fromTypename(typename!).toString(),
304
+ $ref: echoUri ?? DXN.make(typename!),
270
305
  },
271
306
  schemaVersion: version,
272
307
  };
@@ -279,7 +314,7 @@ export const createEchoReferenceSchema = (
279
314
  return (value) =>
280
315
  Effect.gen(function* () {
281
316
  if (Ref.isRef(value)) {
282
- return EncodedReference.fromDXN((value as Ref<any>).dxn);
317
+ return EncodedReference.fromURI((value as Ref<any>).uri);
283
318
  } else if (EncodedReference.isEncodedReference(value)) {
284
319
  return value;
285
320
  }
@@ -294,7 +329,7 @@ export const createEchoReferenceSchema = (
294
329
  // TODO(dmaretskyi): This branch seems to be taken by Schema.is
295
330
  if (Ref.isRef(value)) {
296
331
  if (Option.isSome(dbService)) {
297
- return dbService.value.db.makeRef(value.dxn);
332
+ return dbService.value.db.makeRef(value.uri);
298
333
  } else {
299
334
  return value;
300
335
  }
@@ -304,9 +339,9 @@ export const createEchoReferenceSchema = (
304
339
  return yield* Effect.fail(new ParseResult.Unexpected(value, 'reference'));
305
340
  }
306
341
  if (Option.isSome(dbService)) {
307
- return dbService.value.db.makeRef(EncodedReference.toDXN(value));
342
+ return dbService.value.db.makeRef(EncodedReference.toURI(value));
308
343
  } else {
309
- return Ref.fromDXN(EncodedReference.toDXN(value));
344
+ return Ref.fromURI(EncodedReference.toURI(value));
310
345
  }
311
346
  });
312
347
  },
@@ -340,23 +375,32 @@ export interface RefResolver {
340
375
  /**
341
376
  * Resolve ref synchronously from the objects in the working set.
342
377
  *
343
- * @param dxn
378
+ * @param uri
344
379
  * @param load If true the resolver should attempt to load the object from disk.
345
380
  * @param onLoad Callback to call when the object is loaded.
346
381
  */
347
- resolveSync(dxn: DXN, load: boolean, onLoad?: () => void): AnyProperties | undefined;
382
+ resolveSync(uri: URI.URI, load: boolean, onLoad?: () => void): AnyProperties | undefined;
348
383
 
349
384
  /**
350
385
  * Resolver ref asynchronously.
351
386
  */
352
- resolve(dxn: DXN): Promise<AnyProperties | undefined>;
387
+ resolve(uri: URI.URI): Promise<AnyProperties | undefined>;
353
388
 
354
389
  // TODO(dmaretskyi): Combine with `resolve`.
355
- resolveSchema(dxn: DXN): Promise<Schema.Schema.AnyNoContext | undefined>;
390
+ resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined>;
391
+
392
+ /**
393
+ * Resolve the source `Type.AnyEntity` entity for a type URI. Used by
394
+ * deserialization paths (`Obj.fromJSON`) to set the back-reference accessed
395
+ * via `Obj.getType` / `Entity.getType`. Optional — resolvers that only
396
+ * carry raw schemas may leave this unimplemented; the deserializer falls
397
+ * back to leaving the type entity unset.
398
+ */
399
+ resolveType?(uri: URI.URI): Promise<unknown | undefined>;
356
400
  }
357
401
 
358
402
  export class RefImpl<T> implements Ref<T> {
359
- #dxn: DXN;
403
+ #uri: URI.URI;
360
404
  #resolver?: RefResolver = undefined;
361
405
  #resolved = new Event<void>();
362
406
 
@@ -373,16 +417,16 @@ export class RefImpl<T> implements Ref<T> {
373
417
  this.#resolved.emit();
374
418
  };
375
419
 
376
- constructor(dxn: DXN, target?: T) {
377
- this.#dxn = dxn;
420
+ constructor(uri: URI.URI, target?: T) {
421
+ this.#uri = uri;
378
422
  this.#target = target;
379
423
  }
380
424
 
381
425
  /**
382
426
  * @inheritdoc
383
427
  */
384
- get dxn(): DXN {
385
- return this.#dxn;
428
+ get uri(): URI.URI {
429
+ return this.#uri;
386
430
  }
387
431
 
388
432
  /**
@@ -401,7 +445,7 @@ export class RefImpl<T> implements Ref<T> {
401
445
  }
402
446
 
403
447
  invariant(this.#resolver, 'Resolver is not set');
404
- return this.#resolver.resolveSync(this.#dxn, true, this.#resolverCallback) as T | undefined;
448
+ return this.#resolver.resolveSync(this.#uri, true, this.#resolverCallback) as T | undefined;
405
449
  }
406
450
 
407
451
  /**
@@ -412,7 +456,7 @@ export class RefImpl<T> implements Ref<T> {
412
456
  return this.#target;
413
457
  }
414
458
  invariant(this.#resolver, 'Resolver is not set');
415
- const obj = await this.#resolver.resolve(this.#dxn);
459
+ const obj = await this.#resolver.resolve(this.#uri);
416
460
  if (obj == null) {
417
461
  throw new Error('Object not found');
418
462
  }
@@ -427,7 +471,7 @@ export class RefImpl<T> implements Ref<T> {
427
471
  return this.#target;
428
472
  }
429
473
  invariant(this.#resolver, 'Resolver is not set');
430
- return (await this.#resolver.resolve(this.#dxn)) as T | undefined;
474
+ return (await this.#resolver.resolve(this.#uri)) as T | undefined;
431
475
  }
432
476
 
433
477
  /**
@@ -443,14 +487,14 @@ export class RefImpl<T> implements Ref<T> {
443
487
  * Clones the reference object.
444
488
  */
445
489
  noInline(): RefImpl<T> {
446
- const ref = new RefImpl<T>(this.#dxn, undefined);
490
+ const ref = new RefImpl<T>(this.#uri, undefined);
447
491
  ref.#resolver = this.#resolver;
448
492
  return ref;
449
493
  }
450
494
 
451
495
  encode(): EncodedReference {
452
496
  return {
453
- '/': this.#dxn.toString(),
497
+ '/': this.#uri,
454
498
  ...(this.#target ? { target: this.#target } : {}),
455
499
  };
456
500
  }
@@ -470,7 +514,7 @@ export class RefImpl<T> implements Ref<T> {
470
514
  return `Ref(${this.#target.toString()})`;
471
515
  }
472
516
 
473
- return `Ref(${this.#dxn.toString()})`;
517
+ return `Ref(${this.#uri.toString()})`;
474
518
  }
475
519
 
476
520
  [inspectCustom]: CustomInspectFunction = (depth, options, inspect) => {
@@ -486,12 +530,12 @@ export class RefImpl<T> implements Ref<T> {
486
530
  * so without this, each access would create a separate cache entry.
487
531
  */
488
532
  [Hash.symbol](): number {
489
- return Hash.hash(this.#dxn.toString());
533
+ return Hash.hash(this.#uri.toString());
490
534
  }
491
535
 
492
536
  /** Effect Equal trait. See {@link Hash.symbol} for rationale. */
493
537
  [Equal.symbol](that: Equal.Equal): boolean {
494
- return that instanceof RefImpl && this.#dxn.toString() === that.dxn.toString();
538
+ return that instanceof RefImpl && this.#uri === that.uri;
495
539
  }
496
540
 
497
541
  /**
@@ -538,8 +582,8 @@ const refVariance: Ref<any>[typeof RefTypeId] = {
538
582
  };
539
583
 
540
584
  export const refFromEncodedReference = (encodedReference: EncodedReference, resolver?: RefResolver): Ref<any> => {
541
- const dxn = DXN.parse(encodedReference['/']);
542
- const ref = new RefImpl(dxn);
585
+ const uri = EncodedReference.toURI(encodedReference);
586
+ const ref = new RefImpl(uri);
543
587
 
544
588
  // TODO(dmaretskyi): Handle inline target in the encoded reference.
545
589
 
@@ -550,23 +594,26 @@ export const refFromEncodedReference = (encodedReference: EncodedReference, reso
550
594
  };
551
595
 
552
596
  export class StaticRefResolver implements RefResolver {
553
- public objects = new Map<ObjectId, AnyProperties>();
554
- public schemas = new Map<DXN.String, Schema.Schema.AnyNoContext>();
597
+ public objects = new Map<EntityId, AnyProperties>();
598
+ public schemas = new Map<URI.URI, Schema.Schema.AnyNoContext>();
555
599
 
556
600
  addObject(obj: AnyProperties): this {
557
601
  this.objects.set(obj.id, obj);
558
602
  return this;
559
603
  }
560
604
 
561
- addSchema(schema: Schema.Schema.AnyNoContext): this {
562
- const dxn = getSchemaDXN(schema);
563
- invariant(dxn, 'Schema has no DXN');
564
- this.schemas.set(dxn.toString(), schema);
605
+ addSchema(input: Type.AnyEntity): this {
606
+ const schema = getStaticTypeSchema(input);
607
+ invariant(schema, 'Type entity is missing its source schema');
608
+ const uri = getSchemaURI(schema);
609
+ invariant(uri, 'Schema has no URI');
610
+ this.schemas.set(uri, schema);
565
611
  return this;
566
612
  }
567
613
 
568
- resolveSync(dxn: DXN, _load: boolean, _onLoad?: () => void): AnyProperties | undefined {
569
- const id = dxn?.asEchoDXN()?.echoId;
614
+ resolveSync(uri: URI.URI, _load: boolean, _onLoad?: () => void): AnyProperties | undefined {
615
+ const echoUri = EID.tryParse(uri);
616
+ const id = echoUri ? EID.getEntityId(echoUri) : undefined;
570
617
  if (id == null) {
571
618
  return undefined;
572
619
  }
@@ -574,8 +621,9 @@ export class StaticRefResolver implements RefResolver {
574
621
  return this.objects.get(id);
575
622
  }
576
623
 
577
- async resolve(dxn: DXN): Promise<AnyProperties | undefined> {
578
- const id = dxn?.asEchoDXN()?.echoId;
624
+ async resolve(uri: URI.URI): Promise<AnyProperties | undefined> {
625
+ const echoUri = EID.tryParse(uri);
626
+ const id = echoUri ? EID.getEntityId(echoUri) : undefined;
579
627
  if (id == null) {
580
628
  return undefined;
581
629
  }
@@ -583,7 +631,7 @@ export class StaticRefResolver implements RefResolver {
583
631
  return this.objects.get(id);
584
632
  }
585
633
 
586
- async resolveSchema(dxn: DXN): Promise<Schema.Schema.AnyNoContext | undefined> {
587
- return this.schemas.get(dxn.toString());
634
+ async resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined> {
635
+ return this.schemas.get(uri);
588
636
  }
589
637
  }
@@ -5,6 +5,8 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, test } from 'vitest';
7
7
 
8
+ import { DXN } from '@dxos/keys';
9
+
8
10
  import { FieldPath } from '../Annotation';
9
11
  import { EchoObjectSchema } from '../Entity';
10
12
  import { FormatAnnotation, TypeFormat } from '../Format';
@@ -16,7 +18,7 @@ describe('schema composition', () => {
16
18
  const BaseType = Schema.Struct({
17
19
  name: Schema.String,
18
20
  email: Schema.String,
19
- }).pipe(EchoObjectSchema({ typename: 'com.example.person', version: '0.1.0' }));
21
+ }).pipe(EchoObjectSchema(DXN.make('com.example.person', '0.1.0')));
20
22
 
21
23
  const OverlaySchema = Schema.Struct({
22
24
  email: Schema.String.pipe(FieldPath('$.email'), FormatAnnotation.set(TypeFormat.Email)),
@@ -2,6 +2,5 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './echo-schema';
6
5
  export * from './manipulation';
7
- export * from './persistent-schema';
6
+ export * from './type-schema';
@@ -6,9 +6,6 @@ import * as Schema from 'effect/Schema';
6
6
  import * as SchemaAST from 'effect/SchemaAST';
7
7
 
8
8
  import { invariant } from '@dxos/invariant';
9
- import { DXN } from '@dxos/keys';
10
-
11
- import { type TypeAnnotation, TypeAnnotationId, TypeIdentifierAnnotationId } from '../Annotation';
12
9
 
13
10
  // TODO(ZaymonFC): Do this one at a time. This might be dangerous.
14
11
  export const addFieldsToSchema = (
@@ -68,25 +65,3 @@ export const updateFieldNameInSchema = (
68
65
  ),
69
66
  );
70
67
  };
71
-
72
- export const setTypenameInSchema = (
73
- schema: Schema.Schema.AnyNoContext,
74
- typename: string,
75
- ): Schema.Schema.AnyNoContext => {
76
- const existingAnnotation = schema.ast.annotations[TypeAnnotationId] as TypeAnnotation;
77
- invariant(existingAnnotation, `Missing ${String(TypeAnnotationId)}`);
78
-
79
- return schema.annotations({
80
- ...schema.ast.annotations,
81
- [TypeAnnotationId]: {
82
- kind: existingAnnotation.kind,
83
- typename,
84
- version: existingAnnotation.version,
85
- } satisfies TypeAnnotation,
86
- [SchemaAST.JSONSchemaAnnotationId]: {
87
- ...(schema.ast.annotations[SchemaAST.JSONSchemaAnnotationId] ?? {}),
88
- $id: schema.ast.annotations[TypeIdentifierAnnotationId] ?? DXN.fromTypename(typename).toString(),
89
- typename,
90
- },
91
- });
92
- };
@@ -0,0 +1,60 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { IconAnnotation, LabelAnnotation } from '../Annotation';
8
+ import { EntityKind, KindId, SchemaKindId, StaticTypeSchemaSlot } from '../common/types';
9
+ import { EchoTypeKindSchema, TypeMetaSchemaDXN } from '../Entity';
10
+ import { JsonSchemaType } from '../JsonSchema';
11
+
12
+ /**
13
+ * Raw struct backing {@link TypeSchema}. Exposed only so `TypeSchema`
14
+ * (the TS type) can derive its data fields via `Schema.Schema.Type<typeof ...>`;
15
+ * runtime callers should use {@link TypeSchema} (the piped, branded entity).
16
+ *
17
+ * `typename` and `version` are NOT data fields — they live in `EntityMeta.key` /
18
+ * `EntityMeta.version` (the canonical registry-provenance pair, queryable via
19
+ * `Filter.key(...)`). The same `jsonSchema` payload also embeds them so a
20
+ * standalone JSON-Schema export remains self-describing, but the schema-registry
21
+ * reads/writes them through meta.
22
+ */
23
+ const TypeSchemaStruct = Schema.Struct({
24
+ name: Schema.optional(Schema.String),
25
+ jsonSchema: JsonSchemaType,
26
+ });
27
+
28
+ /**
29
+ * Persistent representation of a schema.
30
+ */
31
+ export const TypeSchema = TypeSchemaStruct.pipe(
32
+ LabelAnnotation.set(['name']),
33
+ IconAnnotation.set({
34
+ icon: 'ph--database--regular',
35
+ hue: 'green',
36
+ }),
37
+ EchoTypeKindSchema(TypeMetaSchemaDXN),
38
+ );
39
+
40
+ /**
41
+ * Persistent representation of a schema — the runtime shape that
42
+ * `db.addType(Type.makeObjectFromJsonSchema(...))` produces
43
+ * and `Filter.type(Type.Type).run()` returns.
44
+ *
45
+ * Structurally identical to a static `Type.Type` entity: the entity-handler's
46
+ * `get` trap exposes `[SchemaKindId]` (derived from `system.kind` and
47
+ * `data.jsonSchema.entityKind`) and rebuilds `[StaticTypeSchemaSlot]` lazily
48
+ * from `jsonSchema`, so a persisted instance satisfies the public `Type<A>`
49
+ * interface without casting.
50
+ */
51
+ export type TypeSchema = Schema.Schema.Type<typeof TypeSchemaStruct> & {
52
+ /** Object identifier — injected by `EchoTypeKindSchema` and stamped at construction. */
53
+ readonly id: string;
54
+ /** Entity-kind discriminator (object/relation/type) carried on every entity instance. */
55
+ readonly [KindId]: EntityKind.Type;
56
+ /** Kind of schema described by this meta-instance — always `EntityKind.Type` for `Type.Type` itself. */
57
+ readonly [SchemaKindId]: EntityKind.Type;
58
+ /** Effect Schema rebuilt lazily from `jsonSchema`; satisfies `Type.getSchema(...)` without an extra cast. */
59
+ readonly [StaticTypeSchemaSlot]: Schema.Schema.AnyNoContext;
60
+ };
@@ -7,7 +7,7 @@
7
7
  - [x] Unify FOUR different nests of test schema.
8
8
  - [x] Remove @deprecated from internal methods and mark @internal (e.g., getSchemaDXN).
9
9
  - NOTE: Internal methods should not use the import \* from Obj/Type APIs.
10
- - [x] import ObjectId => @dxos/keys
10
+ - [x] import EntityId => @dxos/keys
11
11
  - [x] Entity.Any = Obj.Any | Relation.Any
12
12
  - NOTE: Relation does not extend (in not polymorphic with) Obj.
13
13
  - [x] import LabelAnnotation => Annotation.LabelAnnotation
@@ -6,18 +6,21 @@ import type { ForeignKey } from '@dxos/echo-protocol';
6
6
  import { assertArgument, invariant } from '@dxos/invariant';
7
7
  import type { DeepReadonly } from '@dxos/util';
8
8
 
9
+ import type * as Tag from '../../../Tag';
10
+ import type { Ref } from '../../Ref/ref';
9
11
  import { type Mutable } from '../proxy';
10
- import { type AnyProperties, type ObjectMeta, getMeta as getMeta$ } from '../types';
12
+ import { type AnyProperties } from '../types';
13
+ import { type EntityMeta, getMeta as getMeta$ } from '../types/meta';
11
14
 
12
15
  /**
13
- * Deeply read-only version of ObjectMeta.
16
+ * Deeply read-only version of EntityMeta.
14
17
  */
15
- export type ReadonlyMeta = DeepReadonly<ObjectMeta>;
18
+ export type ReadonlyMeta = DeepReadonly<EntityMeta>;
16
19
 
17
20
  /**
18
21
  * Mutable meta type received in meta mutation callbacks.
19
22
  */
20
- export type Meta = Mutable<ObjectMeta>;
23
+ export type Meta = Mutable<EntityMeta>;
21
24
 
22
25
  /**
23
26
  * Get the metadata for an entity with validation.
@@ -61,26 +64,25 @@ export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
61
64
  };
62
65
 
63
66
  /**
64
- * Add a tag to the entity.
67
+ * Add a tag (a reference to a {@link Tag} object) to the entity. Idempotent.
65
68
  * Must be called within an Obj.update or Relation.update callback.
66
69
  */
67
- export const addTag = (entity: Mutable<AnyProperties>, tag: string) => {
70
+ export const addTag = (entity: Mutable<AnyProperties>, tag: Ref<Tag.Tag>) => {
68
71
  const meta = getMetaChecked(entity);
69
- meta.tags ??= [];
70
- meta.tags.push(tag);
72
+ // Two refs to the same target are not `===`; dedupe by URI.
73
+ if (!meta.tags.some((existing) => existing.uri === tag.uri)) {
74
+ meta.tags.push(tag);
75
+ }
71
76
  };
72
77
 
73
78
  /**
74
- * Remove a tag from the entity.
79
+ * Remove a tag (a reference to a {@link Tag} object) from the entity. No-op when not present.
75
80
  * Must be called within an Obj.update or Relation.update callback.
76
81
  */
77
- export const removeTag = (entity: Mutable<AnyProperties>, tag: string) => {
82
+ export const removeTag = (entity: Mutable<AnyProperties>, tag: Ref<Tag.Tag>) => {
78
83
  const meta = getMetaChecked(entity);
79
- if (!meta.tags) {
80
- return;
81
- }
82
84
  for (let i = 0; i < meta.tags.length; i++) {
83
- if (meta.tags[i] === tag) {
85
+ if (meta.tags[i].uri === tag.uri) {
84
86
  meta.tags.splice(i, 1);
85
87
  i--;
86
88
  }