@dxos/echo 0.8.4-main.ef1bc66f44 → 0.8.4-main.effb148878

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 (602) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +9 -9
  3. package/dist/lib/neutral/Annotation.mjs +7 -3
  4. package/dist/lib/neutral/Database.mjs +8 -4
  5. package/dist/lib/neutral/Entity.mjs +35 -18
  6. package/dist/lib/neutral/Err.mjs +3 -1
  7. package/dist/lib/neutral/Extension.mjs +18 -0
  8. package/dist/lib/neutral/Extension.mjs.map +7 -0
  9. package/dist/lib/neutral/Feed.mjs +54 -0
  10. package/dist/lib/neutral/Feed.mjs.map +7 -0
  11. package/dist/lib/neutral/Filter.mjs +25 -12
  12. package/dist/lib/neutral/Format.mjs +23 -3
  13. package/dist/lib/neutral/JsonSchema.mjs +9 -9
  14. package/dist/lib/neutral/Key.mjs +7 -3
  15. package/dist/lib/neutral/Migration.mjs +18 -0
  16. package/dist/lib/neutral/Migration.mjs.map +7 -0
  17. package/dist/lib/neutral/Obj.mjs +41 -23
  18. package/dist/lib/neutral/Order.mjs +1 -1
  19. package/dist/lib/neutral/Query.mjs +21 -9
  20. package/dist/lib/neutral/QueryResult.mjs +1 -1
  21. package/dist/lib/neutral/Ref.mjs +13 -9
  22. package/dist/lib/neutral/Relation.mjs +34 -23
  23. package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
  24. package/dist/lib/neutral/Tag.mjs +14 -10
  25. package/dist/lib/neutral/Type.mjs +52 -36
  26. package/dist/lib/neutral/{chunk-K5K3Z62A.mjs → chunk-4SYHDOQA.mjs} +14 -6
  27. package/dist/lib/neutral/chunk-4SYHDOQA.mjs.map +7 -0
  28. package/dist/lib/neutral/{chunk-XAJMXQ4H.mjs → chunk-4U7OD55H.mjs} +6 -2
  29. package/dist/lib/neutral/chunk-4U7OD55H.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-52NG2XEE.mjs +34 -0
  31. package/dist/lib/neutral/chunk-52NG2XEE.mjs.map +7 -0
  32. package/dist/lib/neutral/{chunk-KB7RIVLK.mjs → chunk-A5HDDVKS.mjs} +33 -6
  33. package/dist/lib/neutral/chunk-A5HDDVKS.mjs.map +7 -0
  34. package/dist/lib/neutral/{chunk-DLPC7DHQ.mjs → chunk-EZ4XJFHJ.mjs} +9 -11
  35. package/dist/lib/neutral/chunk-EZ4XJFHJ.mjs.map +7 -0
  36. package/dist/lib/neutral/{chunk-ZAHWXGK4.mjs → chunk-F625JEZB.mjs} +97 -19
  37. package/dist/lib/neutral/chunk-F625JEZB.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-FFCN66OF.mjs +420 -0
  39. package/dist/lib/neutral/chunk-FFCN66OF.mjs.map +7 -0
  40. package/dist/lib/neutral/{chunk-RPB6V4BE.mjs → chunk-GOHDOJE3.mjs} +16 -3
  41. package/dist/lib/neutral/chunk-GOHDOJE3.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  43. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-J7QWJQQV.mjs +318 -0
  45. package/dist/lib/neutral/chunk-J7QWJQQV.mjs.map +7 -0
  46. package/dist/lib/neutral/{chunk-QARLJVDB.mjs → chunk-JTHNDGAR.mjs} +8 -4
  47. package/dist/lib/neutral/chunk-JTHNDGAR.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-K5RH2PBH.mjs +361 -0
  49. package/dist/lib/neutral/chunk-K5RH2PBH.mjs.map +7 -0
  50. package/dist/lib/neutral/{chunk-RIMHNJ3E.mjs → chunk-KHRAQDYX.mjs} +138 -91
  51. package/dist/lib/neutral/chunk-KHRAQDYX.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-L65CW5EI.mjs +156 -0
  53. package/dist/lib/neutral/chunk-L65CW5EI.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-LNZIPZX6.mjs +2186 -0
  55. package/dist/lib/neutral/chunk-LNZIPZX6.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-MPXUNTME.mjs +41 -0
  57. package/dist/lib/neutral/chunk-MPXUNTME.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-7WE7SBA2.mjs → chunk-O2EOH7XQ.mjs} +152 -134
  59. package/dist/lib/neutral/chunk-O2EOH7XQ.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-MTEHHY62.mjs → chunk-Q7ID37KF.mjs} +121 -94
  61. package/dist/lib/neutral/chunk-Q7ID37KF.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-QLYEQ5VA.mjs +205 -0
  63. package/dist/lib/neutral/chunk-QLYEQ5VA.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-SSDGRJ3A.mjs +747 -0
  65. package/dist/lib/neutral/chunk-SSDGRJ3A.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-ROKO4RKJ.mjs → chunk-TTCSATUD.mjs} +2 -2
  67. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-UEFRFUYC.mjs} +8 -4
  69. package/dist/lib/neutral/chunk-UEFRFUYC.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-UN7K472Q.mjs +132 -0
  71. package/dist/lib/neutral/chunk-UN7K472Q.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-UQAMAXDU.mjs +243 -0
  73. package/dist/lib/neutral/chunk-UQAMAXDU.mjs.map +7 -0
  74. package/dist/lib/neutral/{chunk-4L6DOFXP.mjs → chunk-V5NE2X7Y.mjs} +1 -1
  75. package/dist/lib/neutral/chunk-V5NE2X7Y.mjs.map +7 -0
  76. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
  77. package/dist/lib/neutral/chunk-ZII2BGPM.mjs +269 -0
  78. package/dist/lib/neutral/chunk-ZII2BGPM.mjs.map +7 -0
  79. package/dist/lib/neutral/{chunk-N2QNHMT5.mjs → chunk-ZM7VFIS2.mjs} +22 -2
  80. package/dist/lib/neutral/chunk-ZM7VFIS2.mjs.map +7 -0
  81. package/dist/lib/neutral/index.mjs +56 -29
  82. package/dist/lib/neutral/internal/index.mjs +128 -77
  83. package/dist/lib/neutral/meta.json +1 -1
  84. package/dist/lib/neutral/testing/index.mjs +226 -174
  85. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  86. package/dist/types/src/Annotation.d.ts +3 -3
  87. package/dist/types/src/Annotation.d.ts.map +1 -1
  88. package/dist/types/src/Collection.d.ts +15 -0
  89. package/dist/types/src/Collection.d.ts.map +1 -0
  90. package/dist/types/src/Database.d.ts +27 -42
  91. package/dist/types/src/Database.d.ts.map +1 -1
  92. package/dist/types/src/Dataset.d.ts +29 -0
  93. package/dist/types/src/Dataset.d.ts.map +1 -0
  94. package/dist/types/src/Entity.d.ts +123 -29
  95. package/dist/types/src/Entity.d.ts.map +1 -1
  96. package/dist/types/src/Err.d.ts +56 -13
  97. package/dist/types/src/Err.d.ts.map +1 -1
  98. package/dist/types/src/Extension.d.ts +80 -0
  99. package/dist/types/src/Extension.d.ts.map +1 -0
  100. package/dist/types/src/Extension.test.d.ts +2 -0
  101. package/dist/types/src/Extension.test.d.ts.map +1 -0
  102. package/dist/types/src/Feed.d.ts +229 -0
  103. package/dist/types/src/Feed.d.ts.map +1 -0
  104. package/dist/types/src/Filter.d.ts +74 -11
  105. package/dist/types/src/Filter.d.ts.map +1 -1
  106. package/dist/types/src/Filter.test.d.ts +2 -0
  107. package/dist/types/src/Filter.test.d.ts.map +1 -0
  108. package/dist/types/src/Format.d.ts +3 -3
  109. package/dist/types/src/Format.d.ts.map +1 -1
  110. package/dist/types/src/Hypergraph.d.ts +15 -10
  111. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  112. package/dist/types/src/Json.d.ts +33 -0
  113. package/dist/types/src/Json.d.ts.map +1 -0
  114. package/dist/types/src/Json.test.d.ts +2 -0
  115. package/dist/types/src/Json.test.d.ts.map +1 -0
  116. package/dist/types/src/JsonSchema.d.ts +11 -4
  117. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  118. package/dist/types/src/Key.d.ts +1 -1
  119. package/dist/types/src/Key.d.ts.map +1 -1
  120. package/dist/types/src/Migration.d.ts +72 -0
  121. package/dist/types/src/Migration.d.ts.map +1 -0
  122. package/dist/types/src/Obj.d.ts +201 -77
  123. package/dist/types/src/Obj.d.ts.map +1 -1
  124. package/dist/types/src/Order.d.ts.map +1 -1
  125. package/dist/types/src/Query.d.ts +117 -17
  126. package/dist/types/src/Query.d.ts.map +1 -1
  127. package/dist/types/src/Ref.d.ts +66 -10
  128. package/dist/types/src/Ref.d.ts.map +1 -1
  129. package/dist/types/src/Relation.d.ts +127 -54
  130. package/dist/types/src/Relation.d.ts.map +1 -1
  131. package/dist/types/src/SchemaRegistry.d.ts +12 -13
  132. package/dist/types/src/SchemaRegistry.d.ts.map +1 -1
  133. package/dist/types/src/Tag.d.ts +4 -3
  134. package/dist/types/src/Tag.d.ts.map +1 -1
  135. package/dist/types/src/Type.d.ts +337 -218
  136. package/dist/types/src/Type.d.ts.map +1 -1
  137. package/dist/types/src/View.d.ts +65 -0
  138. package/dist/types/src/View.d.ts.map +1 -0
  139. package/dist/types/src/exemplars.test.d.ts +2 -0
  140. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  141. package/dist/types/src/index.d.ts +8 -1
  142. package/dist/types/src/index.d.ts.map +1 -1
  143. package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +98 -24
  144. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  145. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  146. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  147. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  148. package/dist/types/src/internal/{api → Annotation}/sorting.d.ts +1 -1
  149. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  150. package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +15 -6
  151. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  152. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  153. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  154. package/dist/types/src/internal/Entity/entity.d.ts +67 -0
  155. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  156. package/dist/types/src/internal/Entity/index.d.ts +10 -0
  157. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  158. package/dist/types/src/internal/Entity/model.d.ts +57 -0
  159. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  160. package/dist/types/src/internal/{entities → Entity}/object.d.ts +3 -3
  161. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  162. package/dist/types/src/internal/Entity/relation.d.ts +51 -0
  163. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  164. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  165. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  166. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  167. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  169. package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
  170. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  171. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  172. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  173. package/dist/types/src/internal/{formats → Format}/format.d.ts +2 -1
  174. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  175. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  176. package/dist/types/src/internal/{formats → Format}/index.d.ts +2 -2
  177. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  178. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  179. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  180. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  181. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  182. package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
  183. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  184. package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
  185. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  186. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  187. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  188. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  189. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +37 -37
  190. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  191. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +3 -2
  192. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  193. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  194. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  195. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  196. package/dist/types/src/internal/{object → Obj}/create-object.d.ts +10 -12
  197. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  198. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  199. package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
  200. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  201. package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -1
  202. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  203. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  204. package/dist/types/src/internal/{object → Obj}/json-serializer.d.ts +16 -8
  205. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  206. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  207. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  208. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  209. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  210. package/dist/types/src/internal/{object → Obj}/set-value.d.ts +2 -2
  211. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  212. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  213. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  214. package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +5 -5
  215. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  216. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  217. package/dist/types/src/internal/Query.d.ts +10 -0
  218. package/dist/types/src/internal/Query.d.ts.map +1 -0
  219. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  220. package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +1 -1
  221. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  222. package/dist/types/src/internal/{ref → Ref}/ref.d.ts +42 -19
  223. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  224. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/{schema → Type}/compose.d.ts +1 -1
  226. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  227. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  228. package/dist/types/src/internal/Type/index.d.ts +3 -0
  229. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  230. package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -1
  231. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  232. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  233. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  234. package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
  235. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  236. package/dist/types/src/internal/{api → common/api}/meta.d.ts +3 -3
  237. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  238. package/dist/types/src/internal/common/index.d.ts +4 -0
  239. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  240. package/dist/types/src/internal/{proxy → common/proxy}/change-context.d.ts +1 -1
  241. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  242. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  243. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  244. package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +1 -1
  245. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  246. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  247. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  248. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  249. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  250. package/dist/types/src/internal/common/proxy/make-object.d.ts +19 -0
  251. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  252. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  253. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  254. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  255. package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +1 -1
  256. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  257. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +2 -2
  258. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts.map +1 -1
  259. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  260. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  261. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  262. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  264. package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +18 -2
  265. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  266. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  267. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  268. package/dist/types/src/internal/{types → common/types}/base.d.ts +1 -0
  269. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  270. package/dist/types/src/internal/common/types/entity.d.ts +94 -0
  271. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  272. package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
  273. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  274. package/dist/types/src/internal/{types → common/types}/meta.d.ts +12 -1
  275. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  276. package/dist/types/src/internal/common/types/model-symbols.d.ts +58 -0
  277. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  278. package/dist/types/src/internal/{types → common/types}/typename.d.ts +7 -0
  279. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  280. package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
  281. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  282. package/dist/types/src/internal/index.d.ts +9 -10
  283. package/dist/types/src/internal/index.d.ts.map +1 -1
  284. package/dist/types/src/testing/test-data.d.ts +8 -8
  285. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  286. package/dist/types/src/testing/test-schema.d.ts +77 -82
  287. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  288. package/dist/types/src/testing/util.d.ts +5 -3
  289. package/dist/types/src/testing/util.d.ts.map +1 -1
  290. package/dist/types/tsconfig.tsbuildinfo +1 -1
  291. package/package.json +30 -15
  292. package/src/Annotation.ts +7 -3
  293. package/src/Collection.ts +36 -0
  294. package/src/Database.ts +80 -77
  295. package/src/Dataset.ts +34 -0
  296. package/src/Entity.test.ts +116 -6
  297. package/src/Entity.ts +181 -66
  298. package/src/Err.ts +25 -3
  299. package/src/Extension.test.ts +235 -0
  300. package/src/Extension.ts +122 -0
  301. package/src/Feed.ts +356 -0
  302. package/src/Filter.test.ts +90 -0
  303. package/src/Filter.ts +152 -21
  304. package/src/Format.ts +3 -3
  305. package/src/Hypergraph.ts +16 -11
  306. package/src/Json.test.ts +175 -0
  307. package/src/Json.ts +103 -0
  308. package/src/JsonSchema.ts +14 -4
  309. package/src/Key.ts +1 -1
  310. package/src/Migration.ts +114 -0
  311. package/src/Obj.test.ts +158 -20
  312. package/src/Obj.ts +451 -183
  313. package/src/Order.ts +3 -1
  314. package/src/Query.test.ts +446 -89
  315. package/src/Query.ts +300 -35
  316. package/src/Ref.ts +83 -12
  317. package/src/Relation.test.ts +16 -10
  318. package/src/Relation.ts +236 -165
  319. package/src/SchemaRegistry.ts +13 -17
  320. package/src/Tag.ts +9 -9
  321. package/src/Type.test.ts +169 -24
  322. package/src/Type.ts +561 -354
  323. package/src/View.ts +101 -0
  324. package/src/exemplars.test.ts +21 -0
  325. package/src/index.ts +9 -2
  326. package/src/internal/Annotation/annotations.test.ts +165 -0
  327. package/src/internal/{annotations → Annotation}/annotations.ts +181 -101
  328. package/src/internal/{annotations → Annotation}/index.ts +1 -0
  329. package/src/internal/{api → Annotation}/sorting.ts +2 -4
  330. package/src/internal/{annotations → Annotation}/util.ts +17 -9
  331. package/src/internal/{api/entity.ts → Entity/api.ts} +9 -8
  332. package/src/internal/Entity/entity.ts +246 -0
  333. package/src/internal/{entities → Entity}/index.ts +4 -0
  334. package/src/internal/{entities → Entity}/model.ts +42 -60
  335. package/src/internal/{entities → Entity}/object.ts +13 -6
  336. package/src/internal/Entity/relation.ts +179 -0
  337. package/src/internal/Entity/type-kind.ts +67 -0
  338. package/src/internal/Entity/type-uri.ts +87 -0
  339. package/src/internal/Entity/util.ts +34 -0
  340. package/src/internal/{api → Entity}/version.ts +2 -2
  341. package/src/internal/{formats → Format}/date.test.ts +1 -2
  342. package/src/internal/{formats → Format}/date.ts +0 -4
  343. package/src/internal/{formats → Format}/format.test.ts +1 -2
  344. package/src/internal/{formats → Format}/index.ts +2 -3
  345. package/src/internal/{formats → Format}/types.ts +2 -2
  346. package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
  347. package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
  348. package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +64 -151
  349. package/src/internal/{json-schema → JsonSchema}/json-schema.ts +47 -28
  350. package/src/internal/{object → Obj}/clone.ts +10 -6
  351. package/src/internal/{object → Obj}/common.ts +2 -2
  352. package/src/internal/{object → Obj}/create-object.test.ts +13 -14
  353. package/src/internal/Obj/create-object.ts +135 -0
  354. package/src/internal/{object → Obj}/deleted.ts +2 -2
  355. package/src/internal/{object → Obj}/index.ts +0 -1
  356. package/src/internal/{object → Obj}/inspect.ts +3 -3
  357. package/src/internal/Obj/json-serializer.test.ts +185 -0
  358. package/src/internal/{object → Obj}/json-serializer.ts +108 -45
  359. package/src/internal/{object → Obj}/schema-validator.ts +1 -1
  360. package/src/internal/{object → Obj}/set-value.test.ts +31 -54
  361. package/src/internal/{object → Obj}/set-value.ts +3 -3
  362. package/src/internal/{object → Obj}/snapshot.ts +41 -23
  363. package/src/internal/Obj/typed-object.test.ts +32 -0
  364. package/src/internal/{object → Obj}/typed-object.ts +5 -5
  365. package/src/internal/Query.ts +156 -0
  366. package/src/internal/{ref → Ref}/ref-array.ts +1 -2
  367. package/src/internal/{ref → Ref}/ref.test.ts +16 -26
  368. package/src/internal/{ref → Ref}/ref.ts +117 -57
  369. package/src/internal/{schema → Type}/compose.test.ts +6 -5
  370. package/src/internal/{schema → Type}/compose.ts +1 -1
  371. package/src/internal/Type/index.ts +6 -0
  372. package/src/internal/{schema → Type}/manipulation.ts +0 -25
  373. package/src/internal/Type/type-schema.ts +60 -0
  374. package/src/internal/{README.md → common/README.md} +2 -2
  375. package/src/internal/{api → common/api}/index.ts +0 -4
  376. package/src/internal/{api → common/api}/meta.ts +3 -3
  377. package/src/internal/common/index.ts +7 -0
  378. package/src/internal/{proxy → common/proxy}/change-context.ts +1 -1
  379. package/src/internal/{proxy → common/proxy}/change.test.ts +97 -97
  380. package/src/internal/{proxy → common/proxy}/errors.ts +2 -2
  381. package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -4
  382. package/src/internal/{proxy → common/proxy}/json-serializer.ts +20 -14
  383. package/src/internal/{proxy → common/proxy}/make-object.ts +37 -15
  384. package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
  385. package/src/internal/{proxy → common/proxy}/reactive-array.ts +1 -1
  386. package/src/internal/common/proxy/reactive.test.ts +54 -0
  387. package/src/internal/{proxy → common/proxy}/reactive.ts +12 -4
  388. package/src/internal/common/proxy/schema.test.ts +107 -0
  389. package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +15 -15
  390. package/src/internal/{proxy → common/proxy}/typed-handler.ts +75 -18
  391. package/src/internal/{proxy → common/proxy}/typed-object.test.ts +17 -30
  392. package/src/internal/{types → common/types}/base.ts +1 -1
  393. package/src/internal/common/types/entity.ts +133 -0
  394. package/src/internal/{types → common/types}/index.ts +1 -0
  395. package/src/internal/{types → common/types}/meta.ts +15 -1
  396. package/src/internal/common/types/model-symbols.ts +74 -0
  397. package/src/internal/common/types/typename.ts +91 -0
  398. package/src/internal/{types → common/types}/version.ts +2 -3
  399. package/src/internal/index.ts +9 -31
  400. package/src/testing/api.test.ts +15 -12
  401. package/src/testing/test-data.ts +158 -99
  402. package/src/testing/test-schema.ts +33 -67
  403. package/src/testing/util.ts +14 -11
  404. package/dist/lib/neutral/chunk-2AF5GMG6.mjs +0 -171
  405. package/dist/lib/neutral/chunk-2AF5GMG6.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-4L6DOFXP.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-DLPC7DHQ.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-EBUAT5ID.mjs +0 -229
  411. package/dist/lib/neutral/chunk-EBUAT5ID.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-K5K3Z62A.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-KB7RIVLK.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-LKFNEFHF.mjs +0 -130
  415. package/dist/lib/neutral/chunk-LKFNEFHF.mjs.map +0 -7
  416. package/dist/lib/neutral/chunk-MTEHHY62.mjs.map +0 -7
  417. package/dist/lib/neutral/chunk-N2QNHMT5.mjs.map +0 -7
  418. package/dist/lib/neutral/chunk-QARLJVDB.mjs.map +0 -7
  419. package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +0 -7
  420. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +0 -7
  421. package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +0 -7
  422. package/dist/lib/neutral/chunk-TLGNKUUG.mjs +0 -3905
  423. package/dist/lib/neutral/chunk-TLGNKUUG.mjs.map +0 -7
  424. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs +0 -142
  425. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs.map +0 -7
  426. package/dist/lib/neutral/chunk-VUQGRDRI.mjs +0 -97
  427. package/dist/lib/neutral/chunk-VUQGRDRI.mjs.map +0 -7
  428. package/dist/lib/neutral/chunk-X2MPMYYN.mjs +0 -13
  429. package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +0 -7
  430. package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +0 -7
  431. package/dist/lib/neutral/chunk-ZAHWXGK4.mjs.map +0 -7
  432. package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
  433. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
  434. package/dist/types/src/internal/annotations/index.d.ts +0 -3
  435. package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
  436. package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
  437. package/dist/types/src/internal/api/annotations.d.ts +0 -23
  438. package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
  439. package/dist/types/src/internal/api/entity.d.ts +0 -13
  440. package/dist/types/src/internal/api/entity.d.ts.map +0 -1
  441. package/dist/types/src/internal/api/index.d.ts.map +0 -1
  442. package/dist/types/src/internal/api/meta.d.ts.map +0 -1
  443. package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
  444. package/dist/types/src/internal/api/version.d.ts.map +0 -1
  445. package/dist/types/src/internal/entities/entity.d.ts +0 -20
  446. package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
  447. package/dist/types/src/internal/entities/index.d.ts +0 -6
  448. package/dist/types/src/internal/entities/index.d.ts.map +0 -1
  449. package/dist/types/src/internal/entities/model.d.ts +0 -79
  450. package/dist/types/src/internal/entities/model.d.ts.map +0 -1
  451. package/dist/types/src/internal/entities/object.d.ts.map +0 -1
  452. package/dist/types/src/internal/entities/relation.d.ts +0 -62
  453. package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
  454. package/dist/types/src/internal/entities/util.d.ts.map +0 -1
  455. package/dist/types/src/internal/formats/date.d.ts.map +0 -1
  456. package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
  457. package/dist/types/src/internal/formats/format.d.ts.map +0 -1
  458. package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
  459. package/dist/types/src/internal/formats/index.d.ts.map +0 -1
  460. package/dist/types/src/internal/formats/number.d.ts.map +0 -1
  461. package/dist/types/src/internal/formats/object.d.ts.map +0 -1
  462. package/dist/types/src/internal/formats/select.d.ts.map +0 -1
  463. package/dist/types/src/internal/formats/string.d.ts.map +0 -1
  464. package/dist/types/src/internal/formats/types.d.ts.map +0 -1
  465. package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
  466. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
  467. package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
  468. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
  469. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
  470. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
  471. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
  472. package/dist/types/src/internal/object/clone.d.ts.map +0 -1
  473. package/dist/types/src/internal/object/common.d.ts.map +0 -1
  474. package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
  475. package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
  476. package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
  477. package/dist/types/src/internal/object/ids.d.ts +0 -6
  478. package/dist/types/src/internal/object/ids.d.ts.map +0 -1
  479. package/dist/types/src/internal/object/index.d.ts.map +0 -1
  480. package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
  481. package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
  482. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
  483. package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
  484. package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
  485. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
  486. package/dist/types/src/internal/object/set-value.d.ts.map +0 -1
  487. package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
  488. package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
  489. package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
  490. package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
  491. package/dist/types/src/internal/proxy/change-context.d.ts.map +0 -1
  492. package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
  493. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
  494. package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
  495. package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
  496. package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
  497. package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
  498. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
  499. package/dist/types/src/internal/proxy/make-object.d.ts +0 -14
  500. package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
  501. package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
  502. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
  503. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
  504. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
  505. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
  506. package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
  507. package/dist/types/src/internal/proxy/symbols.d.ts.map +0 -1
  508. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
  509. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
  510. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
  511. package/dist/types/src/internal/ref/index.d.ts.map +0 -1
  512. package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
  513. package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
  514. package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
  515. package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
  516. package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
  517. package/dist/types/src/internal/schema/echo-schema.d.ts +0 -181
  518. package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
  519. package/dist/types/src/internal/schema/index.d.ts +0 -4
  520. package/dist/types/src/internal/schema/index.d.ts.map +0 -1
  521. package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
  522. package/dist/types/src/internal/schema/persistent-schema.d.ts +0 -20
  523. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
  524. package/dist/types/src/internal/types/base.d.ts.map +0 -1
  525. package/dist/types/src/internal/types/entity.d.ts +0 -37
  526. package/dist/types/src/internal/types/entity.d.ts.map +0 -1
  527. package/dist/types/src/internal/types/index.d.ts.map +0 -1
  528. package/dist/types/src/internal/types/meta.d.ts.map +0 -1
  529. package/dist/types/src/internal/types/typename.d.ts.map +0 -1
  530. package/dist/types/src/internal/types/version.d.ts.map +0 -1
  531. package/src/internal/annotations/annotations.test.ts +0 -96
  532. package/src/internal/api/annotations.ts +0 -60
  533. package/src/internal/entities/entity.ts +0 -126
  534. package/src/internal/entities/relation.ts +0 -171
  535. package/src/internal/entities/util.ts +0 -33
  536. package/src/internal/object/create-object.ts +0 -95
  537. package/src/internal/object/ids.ts +0 -12
  538. package/src/internal/object/json-serializer.test.ts +0 -98
  539. package/src/internal/object/typed-object.test.ts +0 -34
  540. package/src/internal/proxy/schema.test.ts +0 -145
  541. package/src/internal/schema/echo-schema.ts +0 -424
  542. package/src/internal/schema/index.ts +0 -7
  543. package/src/internal/schema/persistent-schema.ts +0 -28
  544. package/src/internal/types/entity.ts +0 -54
  545. package/src/internal/types/typename.ts +0 -55
  546. /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
  547. /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
  548. /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
  549. /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
  550. /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
  551. /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
  552. /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
  553. /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
  554. /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
  555. /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
  556. /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
  557. /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
  558. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
  559. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
  560. /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
  561. /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
  562. /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
  563. /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
  564. /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
  565. /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
  566. /package/dist/types/src/internal/{object → Obj}/set-value.test.d.ts +0 -0
  567. /package/dist/types/src/internal/{object → Obj}/snapshot.d.ts +0 -0
  568. /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
  569. /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
  570. /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
  571. /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
  572. /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
  573. /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
  574. /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
  575. /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
  576. /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
  577. /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
  578. /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
  579. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
  580. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
  581. /package/dist/types/src/internal/{proxy → common/proxy}/schema-validator.d.ts +0 -0
  582. /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
  583. /package/dist/types/src/internal/{proxy → common/proxy}/symbols.d.ts +0 -0
  584. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
  585. /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
  586. /package/src/internal/{formats → Format}/format.ts +0 -0
  587. /package/src/internal/{formats → Format}/number.ts +0 -0
  588. /package/src/internal/{formats → Format}/object.ts +0 -0
  589. /package/src/internal/{formats → Format}/select.ts +0 -0
  590. /package/src/internal/{formats → Format}/string.ts +0 -0
  591. /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
  592. /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
  593. /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
  594. /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
  595. /package/src/internal/{ref → Ref}/index.ts +0 -0
  596. /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
  597. /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
  598. /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
  599. /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
  600. /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
  601. /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
  602. /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
@@ -0,0 +1,246 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+ import type * as Types from 'effect/Types';
8
+
9
+ import { DXN, ObjectId } from '@dxos/keys';
10
+ import { type ToMutable } from '@dxos/util';
11
+
12
+ import { type TypeAnnotation, TypeAnnotationId, makeTypeJsonSchemaAnnotation } from '../Annotation';
13
+ import { defineHiddenProperty } from '../common/proxy/define-hidden-property';
14
+ import { makeObject } from '../common/proxy/make-object';
15
+ import { getProxyTarget } from '../common/proxy/proxy-utils';
16
+ import {
17
+ type AnyEntity,
18
+ EntityKind,
19
+ InstancePhantomId,
20
+ KindId,
21
+ type ObjectMeta,
22
+ SchemaKindId,
23
+ StaticTypeSchemaSlot,
24
+ } from '../common/types';
25
+ import { JsonSchemaType } from '../JsonSchema';
26
+
27
+ // TODO(burdon): Define Schema type for `typename` and use consistently for all DXN-like properties.
28
+
29
+ // type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];
30
+ export type EchoTypeSchemaProps<T, ExtraFields = {}> = Types.Simplify<AnyEntity & ToMutable<T> & ExtraFields>;
31
+
32
+ /**
33
+ * In-memory `Type.Type` entity shape produced by `Type.makeObject(dxn)` /
34
+ * `Type.makeRelation({...})`. A live reactive `TypeSchema` instance —
35
+ * identical to a persisted `Type.Type` except for database attachment.
36
+ *
37
+ * NOT a `Schema.Schema`. The underlying Effect Schema is cached on the hidden
38
+ * `StaticTypeSchemaSlot` slot — retrieve it via `Type.getSchema(...)`.
39
+ */
40
+ // TODO(burdon): Rename EchoEntitySchema.
41
+ export interface EchoTypeSchema<
42
+ Self extends Schema.Schema.Any,
43
+ ExtraFields = {},
44
+ K extends EntityKind = EntityKind,
45
+ Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
46
+ > {
47
+ /**
48
+ * Entity-kind brand. Type entities are their own kind (`Type`) regardless of
49
+ * the kind of instance they describe — `[SchemaKindId]` carries the latter.
50
+ * This lets predicates like `Obj.isObject` / `Relation.isRelation` cleanly
51
+ * reject type entities without also having to inspect `[SchemaKindId]`.
52
+ */
53
+ readonly [KindId]: EntityKind.Type;
54
+
55
+ /** Schema-kind brand indicating what kind of instance this type describes. */
56
+ readonly [SchemaKindId]: K;
57
+
58
+ /**
59
+ * Entity id. Always present — stamped at construction — but NOT the type's
60
+ * identity while in-memory: an unattached type resolves its URI to the typename
61
+ * DXN, switching to `echo:/<id>` only once attached to a database (see
62
+ * `getTypeURIFromSpecifier`, which discriminates by database attachment).
63
+ */
64
+ readonly id: ObjectId;
65
+
66
+ /** Source Effect Schema (kept on a hidden slot for `Type.getSchema`). */
67
+ readonly [StaticTypeSchemaSlot]: Schema.Schema.AnyNoContext;
68
+
69
+ // NOTE: `typename` / `version` are intentionally NOT fields. They live in
70
+ // `ObjectMeta` (`key` / `version`); read via `Type.getTypename(self)` /
71
+ // `Type.getVersion(self)`.
72
+ readonly jsonSchema: JsonSchemaType;
73
+
74
+ /** Struct fields for introspection. */
75
+ readonly fields: Fields;
76
+
77
+ /** Phantom — instance type produced by `Obj.make(self, ...)`. */
78
+ readonly _instance?: EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields>;
79
+
80
+ /**
81
+ * Phantom slot mirroring `Type<A>` so internal helpers (`makeObject`,
82
+ * `createObject`, `Ref.make`) infer the instance type uniformly whether
83
+ * the caller passes an `EchoTypeSchema` or a top-level `Type.Type` entity.
84
+ *
85
+ * Includes the instance-kind brand (`[KindId]`) so the phantom is assignable
86
+ * to the matching public-side interface in `Type.ts` (`Type.Obj` /
87
+ * `Type.Relation` / `Type.Type`). Each kind projects identity: instances of
88
+ * an object-kind schema are object-kind entities, type-kind schemas produce
89
+ * type-kind (persisted Type.Type) entities — the latter additionally carry
90
+ * the `[SchemaKindId]` / `[StaticTypeSchemaSlot]` brands the echo-handler
91
+ * proxy exposes on persisted Type entities.
92
+ */
93
+ readonly [InstancePhantomId]?: EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields> & {
94
+ readonly [KindId]: K;
95
+ } & (K extends EntityKind.Type
96
+ ? {
97
+ readonly [SchemaKindId]: EntityKind.Type;
98
+ readonly [StaticTypeSchemaSlot]: Schema.Schema.AnyNoContext;
99
+ }
100
+ : {});
101
+ }
102
+
103
+ // type MakeProps =
104
+ // | boolean
105
+ // | {
106
+ // readonly disableValidation?: boolean;
107
+ // };
108
+
109
+ // NOTE: Utils copied from Effect `Schema.ts`.
110
+ // const _ownKeys = (o: object): Array<PropertyKey> =>
111
+ // (Object.keys(o) as Array<PropertyKey>).concat(Object.getOwnPropertySymbols(o));
112
+
113
+ // const _lazilyMergeDefaults = (
114
+ // fields: Schema.Struct.Fields,
115
+ // out: Record<PropertyKey, unknown>,
116
+ // ): { [x: string | symbol]: unknown } => {
117
+ // const ownKeys = _ownKeys(fields);
118
+ // for (const key of ownKeys) {
119
+ // const field = fields[key];
120
+ // if (out[key] === undefined && Schema.isPropertySignature(field)) {
121
+ // const ast = field.ast;
122
+ // const defaultValue = ast._tag === 'PropertySignatureDeclaration' ? ast.defaultValue : ast.to.defaultValue;
123
+ // if (defaultValue !== undefined) {
124
+ // out[key] = defaultValue();
125
+ // }
126
+ // }
127
+ // }
128
+ // return out;
129
+ // };
130
+
131
+ // const _getDisableValidationMakeOption = (options: MakeProps | undefined): boolean =>
132
+ // Predicate.isBoolean(options) ? options : options?.disableValidation ?? false;
133
+
134
+ /**
135
+ * Identity (typename + version) of the type meta-schema — the `Type.Type` that
136
+ * every ECHO type entity is itself an instance of. Shared by the materialisation
137
+ * vehicle ({@link persistentEntitySchema}) and `TypeSchema` so the two cannot
138
+ * drift on identity.
139
+ */
140
+ export const TypeMetaSchemaDXN = DXN.make('org.dxos.type.schema', '0.1.0');
141
+
142
+ /**
143
+ * Effect Schema that every `Type.Type` entity is an instance of: the meta-schema
144
+ * struct `{ name?, jsonSchema, id }` branded as a type-kind ECHO entity. This is
145
+ * the materialisation vehicle for `makeObject` below — the canonical user-facing
146
+ * entity is `Type/type-schema.ts`'s `TypeSchema`, which carries the same shape
147
+ * plus UI annotations.
148
+ *
149
+ * Kept self-contained (no import of `TypeSchema`) to avoid a bootstrap cycle:
150
+ * `TypeSchema` is itself produced via `makeEchoTypeSchema`, so this builder must
151
+ * not depend on it. `jsonSchema` is declared optional here (only on the
152
+ * materialisation vehicle — the canonical `TypeSchema` keeps it required) so the
153
+ * construction-time `Schema.asserts` does not force the field before it is
154
+ * attached; it is populated immediately after via a lazy accessor (see
155
+ * `makeEchoTypeSchema`).
156
+ */
157
+ // TODO(wittjosiah): Reconcile with `TypeSchema` (`Type/type-schema.ts`).
158
+ // Both describe the same `org.dxos.type.schema` shape.
159
+ const persistentEntitySchema: Schema.Schema.AnyNoContext = (() => {
160
+ const typename = DXN.getName(TypeMetaSchemaDXN);
161
+ const version = DXN.getVersion(TypeMetaSchemaDXN)!;
162
+ const struct = Schema.Struct({
163
+ name: Schema.optional(Schema.String),
164
+ jsonSchema: JsonSchemaType.pipe(Schema.optional),
165
+ id: ObjectId,
166
+ });
167
+ const ast = SchemaAST.annotations(struct.ast, {
168
+ [TypeAnnotationId]: { kind: EntityKind.Type, typename, version } satisfies TypeAnnotation,
169
+ [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({ kind: EntityKind.Type, typename, version }),
170
+ });
171
+ return Schema.make(ast);
172
+ })();
173
+
174
+ /**
175
+ * @internal
176
+ *
177
+ * Build an in-memory `Type.Type` entity (the value returned by `Type.makeObject`
178
+ * / `Type.makeRelation`). The result is a LIVE reactive `TypeSchema`
179
+ * instance — identical in every respect to a persisted `Type.Type` except that
180
+ * it is not yet attached to a database. It is mutable via `Type.update`, can be
181
+ * passed to `db.add(...)` (which keeps the same proxy and swaps the handler),
182
+ * and round-trips through `jsonSchema`.
183
+ *
184
+ * The source Effect Schema describing the user's type is cached on
185
+ * `[StaticTypeSchemaSlot]` so `Type.getSchema(...)` returns it without a
186
+ * jsonSchema round-trip; the cache is invalidated by the proxy set-trap when
187
+ * `jsonSchema` is mutated (see `typed-handler.ts`).
188
+ */
189
+ export const makeEchoTypeSchema = <
190
+ Self extends Schema.Schema.Any,
191
+ K extends EntityKind = EntityKind,
192
+ // TODO(wittjosiah): Can this be inferred from the schema?
193
+ Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
194
+ >(
195
+ fields: Fields,
196
+ ast: SchemaAST.AST,
197
+ typename: string,
198
+ version: string,
199
+ kind: K,
200
+ computeJsonSchema: () => JsonSchemaType,
201
+ ): EchoTypeSchema<Self, {}, K, Fields> => {
202
+ // Source Effect Schema describing the user's type — cached for `Type.getSchema`.
203
+ const sourceSchema = Schema.make<
204
+ EchoTypeSchemaProps<Schema.Schema.Type<Self>>,
205
+ EchoTypeSchemaProps<Schema.Schema.Encoded<Self>>,
206
+ Schema.Schema.Context<Self>
207
+ >(ast);
208
+
209
+ // `typename` / `version` route through `ObjectMeta` (`key` / `version`) — the
210
+ // canonical registry-provenance pair — not data fields. `keys` is empty for
211
+ // in-memory declarations until persisted.
212
+ const meta: ObjectMeta = { keys: [], key: typename, version };
213
+
214
+ // Materialise as a live reactive meta-schema instance. `jsonSchema` is attached
215
+ // below as a getter (not passed here as data) for two reasons; see that accessor.
216
+ const entity = makeObject(persistentEntitySchema, {} as any, meta);
217
+
218
+ const target = getProxyTarget(entity)!;
219
+ // `jsonSchema` is always available, but computed once on first read rather than at
220
+ // construction: serializing the AST walks `Schema.suspend(...)` thunks, and for a
221
+ // self-referential type (`Schema.suspend(() => Self)`) that thunk hits `Self`'s TDZ
222
+ // while we're still inside its `const` initializer. A getter also lets reads return
223
+ // the raw object instead of a child reactive proxy.
224
+ let memoizedJsonSchema: JsonSchemaType | undefined;
225
+ Object.defineProperty(target, 'jsonSchema', {
226
+ configurable: true,
227
+ enumerable: true,
228
+ get() {
229
+ return (memoizedJsonSchema ??= computeJsonSchema());
230
+ },
231
+ set(value: JsonSchemaType) {
232
+ memoizedJsonSchema = value;
233
+ },
234
+ });
235
+ // Cache the source Effect Schema (read by `Type.getSchema` via the proxy's
236
+ // `[StaticTypeSchemaSlot]` get-trap; invalidated on `jsonSchema` mutation).
237
+ defineHiddenProperty(target, StaticTypeSchemaSlot, sourceSchema);
238
+ // Schema-kind brand: what kind of instance this type describes. There is no
239
+ // database handler to derive it for in-memory entities, so stamp it directly.
240
+ defineHiddenProperty(target, SchemaKindId, kind);
241
+ // Struct fields for introspection. A getter (not a data property) so reads return
242
+ // the raw fields object rather than a child reactive proxy.
243
+ Object.defineProperty(target, 'fields', { configurable: true, enumerable: false, get: () => fields });
244
+
245
+ return entity as unknown as EchoTypeSchema<Self, {}, K, Fields>;
246
+ };
@@ -2,8 +2,12 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ export * from './api';
5
6
  export * from './entity';
6
7
  export * from './model'; // TODO(burdon): Rename.
7
8
  export * from './object';
8
9
  export * from './relation';
10
+ export * from './type-kind';
11
+ export * from './type-uri';
9
12
  export * from './util';
13
+ export * from './version';
@@ -6,7 +6,7 @@ import type * as Schema from 'effect/Schema';
6
6
 
7
7
  import { type ForeignKey } from '@dxos/echo-protocol';
8
8
  import { invariant } from '@dxos/invariant';
9
- import { DXN, ObjectId } from '@dxos/keys';
9
+ import { EchoURI, ObjectId, type URI } from '@dxos/keys';
10
10
  import { assumeType } from '@dxos/util';
11
11
 
12
12
  import type * as Database from '../../Database';
@@ -14,58 +14,38 @@ import {
14
14
  type ATTR_META,
15
15
  type ATTR_PARENT,
16
16
  type ATTR_TYPE,
17
+ ATTR_DELETED,
18
+ ATTR_RELATION_SOURCE,
19
+ ATTR_RELATION_TARGET,
20
+ ATTR_SELF_URI,
21
+ ATTR_SELF_URI_LEGACY,
17
22
  EntityKind,
18
23
  KindId,
19
24
  type MetaId,
25
+ ObjectDatabaseId,
26
+ ObjectDeletedId,
20
27
  type ObjectMeta,
28
+ ObjectVersionId,
21
29
  type ParentId,
22
- type SchemaId,
23
- TypeId,
24
- type Version,
25
- } from '../types';
26
-
27
- import {
28
- type ATTR_RELATION_SOURCE,
29
- type ATTR_RELATION_TARGET,
30
30
  RelationSourceDXNId,
31
31
  RelationSourceId,
32
32
  RelationTargetDXNId,
33
33
  RelationTargetId,
34
- } from './relation';
35
-
36
- //
37
- // Defines the internal model of the echo object.
38
- //
39
-
40
- /**
41
- * Property name for self DXN when object is serialized to JSON.
42
- */
43
- export const ATTR_SELF_DXN = '@dxn';
44
-
45
- /**
46
- * DXN to the object itself.
47
- */
48
- export const SelfDXNId = Symbol.for('@dxos/echo/DXN');
49
-
50
- /**
51
- * Property name for deleted when object is serialized to JSON.
52
- */
53
- export const ATTR_DELETED = '@deleted';
54
-
55
- /**
56
- * Deletion marker.
57
- */
58
- export const ObjectDeletedId = Symbol.for('@dxos/echo/Deleted');
59
-
60
- /**
61
- * Object version accessor symbol.
62
- */
63
- export const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/Version');
64
-
65
- /**
66
- * Object database accessor symbol.
67
- */
68
- export const ObjectDatabaseId = Symbol.for('@dxos/echo/Database');
34
+ type SchemaId,
35
+ SelfURIId,
36
+ TypeId,
37
+ type Version,
38
+ } from '../common/types';
39
+
40
+ export {
41
+ ATTR_DELETED,
42
+ ATTR_SELF_URI,
43
+ ATTR_SELF_URI_LEGACY,
44
+ ObjectDatabaseId,
45
+ ObjectDeletedId,
46
+ ObjectVersionId,
47
+ SelfURIId,
48
+ };
69
49
 
70
50
  /**
71
51
  * Internal runtime representation of an object.
@@ -74,17 +54,17 @@ export const ObjectDatabaseId = Symbol.for('@dxos/echo/Database');
74
54
  // NOTE: Each symbol has a jsdoc describing its purpose.
75
55
  export interface InternalObjectProps {
76
56
  readonly id: ObjectId;
77
- readonly [SelfDXNId]: DXN;
57
+ readonly [SelfURIId]: EchoURI.EchoURI;
78
58
  readonly [KindId]: EntityKind;
79
59
  readonly [SchemaId]: Schema.Schema.AnyNoContext;
80
- readonly [TypeId]: DXN;
60
+ readonly [TypeId]: URI.URI;
81
61
  readonly [MetaId]?: ObjectMeta;
82
62
  [ParentId]?: InternalObjectProps;
83
63
  readonly [ObjectDatabaseId]?: Database.Database;
84
64
  readonly [ObjectDeletedId]?: boolean;
85
65
  readonly [ObjectVersionId]?: Version;
86
- readonly [RelationSourceDXNId]?: DXN;
87
- readonly [RelationTargetDXNId]?: DXN;
66
+ readonly [RelationSourceDXNId]?: EchoURI.EchoURI;
67
+ readonly [RelationTargetDXNId]?: EchoURI.EchoURI;
88
68
  readonly [RelationSourceId]?: InternalObjectProps;
89
69
  readonly [RelationTargetId]?: InternalObjectProps;
90
70
  }
@@ -95,20 +75,22 @@ export interface InternalObjectProps {
95
75
  export interface ObjectMetaJSON {
96
76
  keys: ForeignKey[];
97
77
  tags?: string[];
78
+ key?: string;
79
+ version?: string;
98
80
  }
99
81
 
100
82
  /**
101
83
  * JSON representation of an object or relation metadata.
102
84
  */
103
85
  export interface ObjectJSON {
104
- id: string;
105
- [ATTR_TYPE]: DXN.String;
106
- [ATTR_SELF_DXN]?: DXN.String;
107
- [ATTR_PARENT]?: string; // Encoded reference
86
+ id: ObjectId;
87
+ [ATTR_TYPE]?: URI.URI;
88
+ [ATTR_SELF_URI]?: EchoURI.EchoURI;
89
+ [ATTR_PARENT]?: EchoURI.EchoURI; // Encoded reference
108
90
  [ATTR_DELETED]?: boolean;
109
91
  [ATTR_META]?: ObjectMetaJSON;
110
- [ATTR_RELATION_SOURCE]?: DXN.String;
111
- [ATTR_RELATION_TARGET]?: DXN.String;
92
+ [ATTR_RELATION_SOURCE]?: EchoURI.EchoURI;
93
+ [ATTR_RELATION_TARGET]?: EchoURI.EchoURI;
112
94
 
113
95
  /**
114
96
  * Application-specific properties.
@@ -123,16 +105,16 @@ export function assertObjectModel(obj: unknown): asserts obj is InternalObjectPr
123
105
  invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
124
106
  assumeType<InternalObjectProps>(obj);
125
107
  invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');
126
- invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');
108
+ invariant(obj[TypeId] === undefined || typeof obj[TypeId] === 'string', 'Invalid object model: invalid type');
127
109
  invariant(
128
- obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
110
+ obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation || obj[KindId] === EntityKind.Type,
129
111
  'Invalid object model: invalid entity kind',
130
112
  );
131
113
 
132
114
  if (obj[KindId] === EntityKind.Relation) {
133
- invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');
134
- invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');
135
- invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');
136
- invariant(!(obj[RelationTargetId] instanceof DXN), 'Invalid object model: target pointer is a DXN');
115
+ invariant(EchoURI.isEchoURI(obj[RelationSourceDXNId]), 'Invalid object model: invalid relation source');
116
+ invariant(EchoURI.isEchoURI(obj[RelationTargetDXNId]), 'Invalid object model: invalid relation target');
117
+ invariant(!EchoURI.isEchoURI(obj[RelationSourceId]), 'Invalid object model: source pointer is a DXN');
118
+ invariant(!EchoURI.isEchoURI(obj[RelationTargetId]), 'Invalid object model: target pointer is a DXN');
137
119
  }
138
120
  }
@@ -6,10 +6,11 @@ import * as Schema from 'effect/Schema';
6
6
  import * as SchemaAST from 'effect/SchemaAST';
7
7
 
8
8
  import { invariant } from '@dxos/invariant';
9
+ import { DXN } from '@dxos/keys';
9
10
 
10
- import { type TypeAnnotation, TypeAnnotationId, type TypeMeta, makeTypeJsonSchemaAnnotation } from '../annotations';
11
- import { EntityKind } from '../types';
12
-
11
+ import { type TypeAnnotation, TypeAnnotationId, makeTypeJsonSchemaAnnotation } from '../Annotation';
12
+ import { EntityKind } from '../common/types';
13
+ import { toJsonSchema } from '../JsonSchema';
13
14
  import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
14
15
 
15
16
  /**
@@ -26,11 +27,15 @@ export type EchoObjectSchema<
26
27
  */
27
28
  export const EchoObjectSchema: {
28
29
  (
29
- meta: TypeMeta,
30
+ dxn: DXN.DXN,
30
31
  ): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
31
32
  self: Self & { fields?: Fields },
32
33
  ) => EchoObjectSchema<Self, Fields>;
33
- } = ({ typename, version }) => {
34
+ } = (dxn) => {
35
+ const typename = DXN.getName(dxn);
36
+ const version = DXN.getVersion(dxn);
37
+ invariant(version, `Type.makeObject requires a versioned DXN: ${dxn}`);
38
+
34
39
  return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
35
40
  self: Self & { fields?: Fields },
36
41
  ): EchoObjectSchema<Self, Fields> => {
@@ -53,6 +58,8 @@ export const EchoObjectSchema: {
53
58
  }),
54
59
  });
55
60
 
56
- return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(fields, ast, typename, version, EntityKind.Object);
61
+ return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(fields, ast, typename, version, EntityKind.Object, () =>
62
+ toJsonSchema(Schema.make(ast)),
63
+ );
57
64
  };
58
65
  };
@@ -0,0 +1,179 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import { raise } from '@dxos/debug';
9
+ import { assertArgument, invariant } from '@dxos/invariant';
10
+ import { DXN } from '@dxos/keys';
11
+
12
+ // Type-only imports (erased at runtime — no import cycle); `internal` may depend
13
+ // on the top-level `Obj` / `Type` API at the type level only.
14
+ import type * as Obj from '../../Obj';
15
+ import type * as Type from '../../Type';
16
+ import {
17
+ type TypeAnnotation,
18
+ TypeAnnotationId,
19
+ getEntityKind,
20
+ getSchemaTypename,
21
+ getTypeIdentifierAnnotation,
22
+ makeTypeJsonSchemaAnnotation,
23
+ } from '../Annotation';
24
+ import {
25
+ ATTR_RELATION_SOURCE,
26
+ ATTR_RELATION_TARGET,
27
+ EntityKind,
28
+ RelationSourceDXNId,
29
+ RelationSourceId,
30
+ RelationTargetDXNId,
31
+ RelationTargetId,
32
+ type UnknownTypeSchema,
33
+ getStaticTypeSchema,
34
+ } from '../common/types';
35
+
36
+ export {
37
+ ATTR_RELATION_SOURCE,
38
+ ATTR_RELATION_TARGET,
39
+ RelationSourceDXNId,
40
+ RelationSourceId,
41
+ RelationTargetDXNId,
42
+ RelationTargetId,
43
+ };
44
+
45
+ import { toJsonSchema } from '../JsonSchema';
46
+ import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
47
+
48
+ /**
49
+ * Source and target props on relations.
50
+ */
51
+ // TODO(burdon): any?
52
+ export type RelationSourceTargetRefs<Source = any, Target = any> = {
53
+ /**
54
+ * Source ECHO live object.
55
+ */
56
+ [RelationSourceId]: Source;
57
+
58
+ /**
59
+ * Target ECHO live object.
60
+ */
61
+ [RelationTargetId]: Target;
62
+ };
63
+
64
+ export type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;
65
+ export type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;
66
+
67
+ /**
68
+ * Accepted relation endpoint: an object-kind `Type.Type` entity (slot-backed)
69
+ * or the branded `Obj.Unknown` schema. Source/target are constrained to these
70
+ * — relations only connect object-kind entities.
71
+ */
72
+ export type RelationEndpoint = Type.AnyObj | UnknownTypeSchema<any, EntityKind.Object>;
73
+
74
+ /**
75
+ * Resolves a relation endpoint to the instance type it describes — the source /
76
+ * target instance recorded on the relation's `RelationSourceTargetRefs`.
77
+ */
78
+ export type RelationEndpointInstance<S> =
79
+ S extends UnknownTypeSchema<infer A, any> ? A : S extends Type.AnyObj ? Type.InstanceType<S> : unknown;
80
+
81
+ export type EchoRelationSchemaOptions<TSource extends RelationEndpoint, TTarget extends RelationEndpoint> = {
82
+ dxn: DXN.DXN;
83
+ source: TSource;
84
+ target: TTarget;
85
+ };
86
+
87
+ /**
88
+ * Relation schema type with kind marker. `SourceInstance` / `TargetInstance`
89
+ * are the resolved endpoint instance types (see {@link RelationEndpointInstance}).
90
+ */
91
+ export type EchoRelationSchema<
92
+ Self extends Schema.Schema.Any,
93
+ SourceInstance extends Obj.Unknown,
94
+ TargetInstance extends Obj.Unknown,
95
+ Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
96
+ > = EchoTypeSchema<Self, RelationSourceTargetRefs<SourceInstance, TargetInstance>, EntityKind.Relation, Fields>;
97
+
98
+ /**
99
+ * Schema for Relation entity types.
100
+ */
101
+ export const EchoRelationSchema = <Source extends RelationEndpoint, Target extends RelationEndpoint>({
102
+ dxn,
103
+ source,
104
+ target,
105
+ }: EchoRelationSchemaOptions<Source, Target>) => {
106
+ // `source` / `target` are `Type.Type` entities (slot-backed) or the branded
107
+ // `Obj.Unknown` schema (used directly); resolve each to its Effect Schema for
108
+ // the schema-side machinery (DXN ref + entity-kind checks).
109
+ const sourceSchema = source != null ? (getStaticTypeSchema(source) ?? source) : source;
110
+ const targetSchema = target != null ? (getStaticTypeSchema(target) ?? target) : target;
111
+ assertArgument(Schema.isSchema(sourceSchema), 'source');
112
+ assertArgument(Schema.isSchema(targetSchema), 'target');
113
+ const typename = DXN.getName(dxn);
114
+ const version = DXN.getVersion(dxn);
115
+ invariant(version, `Type.makeRelation requires a versioned DXN: ${dxn}`);
116
+ const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);
117
+ const targetDXN = getDXNForRelationSchemaRef(targetSchema);
118
+ if (getEntityKind(sourceSchema) !== EntityKind.Object) {
119
+ raise(new Error('Source schema must be an echo object schema.'));
120
+ }
121
+ if (getEntityKind(targetSchema) !== EntityKind.Object) {
122
+ raise(new Error('Target schema must be an echo object schema.'));
123
+ }
124
+
125
+ return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
126
+ self: Self & { fields?: Fields },
127
+ ): EchoRelationSchema<Self, RelationEndpointInstance<Source>, RelationEndpointInstance<Target>, Fields> => {
128
+ invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
129
+
130
+ // Extract fields from the schema if available (Struct schemas have .fields).
131
+ const fields = ((self as any).fields ?? {}) as Fields;
132
+
133
+ const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
134
+ const ast = SchemaAST.annotations(schemaWithId.ast, {
135
+ // TODO(dmaretskyi): `extend` kills the annotations.
136
+ ...self.ast.annotations,
137
+ [TypeAnnotationId]: {
138
+ kind: EntityKind.Relation,
139
+ typename,
140
+ version,
141
+ sourceSchema: sourceDXN,
142
+ targetSchema: targetDXN,
143
+ } satisfies TypeAnnotation,
144
+ // TODO(dmaretskyi): TypeIdentifierAnnotationId?
145
+
146
+ [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
147
+ kind: EntityKind.Relation,
148
+ typename,
149
+ version,
150
+ relationSource: sourceDXN,
151
+ relationTarget: targetDXN,
152
+ }),
153
+ });
154
+
155
+ return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(
156
+ fields,
157
+ ast,
158
+ typename,
159
+ version,
160
+ EntityKind.Relation,
161
+ () => toJsonSchema(Schema.make(ast)),
162
+ );
163
+ };
164
+ };
165
+
166
+ export const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): DXN.DXN => {
167
+ assertArgument(Schema.isSchema(schema), 'schema');
168
+ const identifier = getTypeIdentifierAnnotation(schema);
169
+ if (identifier) {
170
+ return DXN.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));
171
+ }
172
+
173
+ const typename = getSchemaTypename(schema);
174
+ if (!typename) {
175
+ throw new Error('Schema must have a typename');
176
+ }
177
+
178
+ return DXN.make(typename);
179
+ };