@dxos/echo 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae

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 (495) hide show
  1. package/README.md +4 -5
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +45 -0
  4. package/dist/lib/neutral/Entity.mjs +56 -0
  5. package/dist/lib/neutral/Entity.mjs.map +7 -0
  6. package/dist/lib/neutral/Err.mjs +12 -0
  7. package/dist/lib/neutral/Err.mjs.map +7 -0
  8. package/dist/lib/neutral/Feed.mjs +43 -0
  9. package/dist/lib/neutral/Feed.mjs.map +7 -0
  10. package/dist/lib/neutral/Filter.mjs +61 -0
  11. package/dist/lib/neutral/Filter.mjs.map +7 -0
  12. package/dist/lib/neutral/Format.mjs +66 -0
  13. package/dist/lib/neutral/Format.mjs.map +7 -0
  14. package/dist/lib/neutral/JsonSchema.mjs +18 -0
  15. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  16. package/dist/lib/neutral/Key.mjs +12 -0
  17. package/dist/lib/neutral/Key.mjs.map +7 -0
  18. package/dist/lib/neutral/Obj.mjs +107 -0
  19. package/dist/lib/neutral/Obj.mjs.map +7 -0
  20. package/dist/lib/neutral/Order.mjs +12 -0
  21. package/dist/lib/neutral/Order.mjs.map +7 -0
  22. package/dist/lib/neutral/Query.mjs +32 -0
  23. package/dist/lib/neutral/Query.mjs.map +7 -0
  24. package/dist/lib/neutral/QueryResult.mjs +2 -0
  25. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  26. package/dist/lib/neutral/Ref.mjs +24 -0
  27. package/dist/lib/neutral/Ref.mjs.map +7 -0
  28. package/dist/lib/neutral/Relation.mjs +90 -0
  29. package/dist/lib/neutral/Relation.mjs.map +7 -0
  30. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  31. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  32. package/dist/lib/neutral/Tag.mjs +25 -0
  33. package/dist/lib/neutral/Tag.mjs.map +7 -0
  34. package/dist/lib/neutral/Type.mjs +34 -0
  35. package/dist/lib/neutral/Type.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-4KG6IGL4.mjs +67 -0
  37. package/dist/lib/neutral/chunk-4KG6IGL4.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-5ELDDYWE.mjs +130 -0
  39. package/dist/lib/neutral/chunk-5ELDDYWE.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-ALOGSVBP.mjs +299 -0
  41. package/dist/lib/neutral/chunk-ALOGSVBP.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
  43. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-AQP4QKYP.mjs +283 -0
  45. package/dist/lib/neutral/chunk-AQP4QKYP.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-BRJSLACP.mjs +152 -0
  47. package/dist/lib/neutral/chunk-BRJSLACP.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-DZQSL6RW.mjs +73 -0
  49. package/dist/lib/neutral/chunk-DZQSL6RW.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs +327 -0
  51. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs +56 -0
  53. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-GFNCSK7F.mjs +101 -0
  55. package/dist/lib/neutral/chunk-GFNCSK7F.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  57. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-KGV3QIRX.mjs +313 -0
  59. package/dist/lib/neutral/chunk-KGV3QIRX.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-M2KVTHZM.mjs +402 -0
  61. package/dist/lib/neutral/chunk-M2KVTHZM.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-MXQJZCPY.mjs +51 -0
  63. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-O3TZFQCT.mjs +27 -0
  65. package/dist/lib/neutral/chunk-O3TZFQCT.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
  67. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-OVUBTQLT.mjs +45 -0
  69. package/dist/lib/neutral/chunk-OVUBTQLT.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-PP4DNUZU.mjs +3919 -0
  71. package/dist/lib/neutral/chunk-PP4DNUZU.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-QXF3LGN2.mjs +43 -0
  73. package/dist/lib/neutral/chunk-QXF3LGN2.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs +97 -0
  75. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-T6JEFNP6.mjs +7 -0
  77. package/dist/lib/neutral/chunk-T6JEFNP6.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs +121 -0
  79. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs.map +7 -0
  80. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs +42 -0
  81. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs.map +7 -0
  82. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs +298 -0
  83. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs.map +7 -0
  84. package/dist/lib/neutral/index.mjs +94 -0
  85. package/dist/lib/neutral/index.mjs.map +7 -0
  86. package/dist/lib/neutral/internal/index.mjs +464 -0
  87. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  88. package/dist/lib/neutral/meta.json +1 -0
  89. package/dist/lib/neutral/testing/index.mjs +369 -0
  90. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  91. package/dist/types/src/Annotation.d.ts +24 -0
  92. package/dist/types/src/Annotation.d.ts.map +1 -0
  93. package/dist/types/src/Collection.d.ts +16 -0
  94. package/dist/types/src/Collection.d.ts.map +1 -0
  95. package/dist/types/src/Database.d.ts +189 -0
  96. package/dist/types/src/Database.d.ts.map +1 -0
  97. package/dist/types/src/Dataset.d.ts +18 -0
  98. package/dist/types/src/Dataset.d.ts.map +1 -0
  99. package/dist/types/src/Entity.d.ts +168 -0
  100. package/dist/types/src/Entity.d.ts.map +1 -0
  101. package/dist/types/src/Entity.test.d.ts +2 -0
  102. package/dist/types/src/Entity.test.d.ts.map +1 -0
  103. package/dist/types/src/Err.d.ts +107 -0
  104. package/dist/types/src/Err.d.ts.map +1 -0
  105. package/dist/types/src/Feed.d.ts +165 -0
  106. package/dist/types/src/Feed.d.ts.map +1 -0
  107. package/dist/types/src/Filter.d.ts +120 -0
  108. package/dist/types/src/Filter.d.ts.map +1 -0
  109. package/dist/types/src/Format.d.ts +4 -0
  110. package/dist/types/src/Format.d.ts.map +1 -0
  111. package/dist/types/src/Hypergraph.d.ts +60 -0
  112. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  113. package/dist/types/src/JsonSchema.d.ts +16 -0
  114. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  115. package/dist/types/src/Key.d.ts +1 -0
  116. package/dist/types/src/Key.d.ts.map +1 -1
  117. package/dist/types/src/Obj.d.ts +457 -35
  118. package/dist/types/src/Obj.d.ts.map +1 -1
  119. package/dist/types/src/Obj.test.d.ts +2 -0
  120. package/dist/types/src/Obj.test.d.ts.map +1 -0
  121. package/dist/types/src/Order.d.ts +16 -0
  122. package/dist/types/src/Order.d.ts.map +1 -0
  123. package/dist/types/src/Query.d.ts +202 -0
  124. package/dist/types/src/Query.d.ts.map +1 -0
  125. package/dist/types/src/Query.test.d.ts +2 -0
  126. package/dist/types/src/Query.test.d.ts.map +1 -0
  127. package/dist/types/src/QueryResult.d.ts +80 -0
  128. package/dist/types/src/QueryResult.d.ts.map +1 -0
  129. package/dist/types/src/Ref.d.ts +61 -11
  130. package/dist/types/src/Ref.d.ts.map +1 -1
  131. package/dist/types/src/Relation.d.ts +290 -21
  132. package/dist/types/src/Relation.d.ts.map +1 -1
  133. package/dist/types/src/Relation.test.d.ts +2 -0
  134. package/dist/types/src/Relation.test.d.ts.map +1 -0
  135. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  136. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  137. package/dist/types/src/Tag.d.ts +18 -0
  138. package/dist/types/src/Tag.d.ts.map +1 -0
  139. package/dist/types/src/Type.d.ts +120 -98
  140. package/dist/types/src/Type.d.ts.map +1 -1
  141. package/dist/types/src/Type.test.d.ts +2 -0
  142. package/dist/types/src/Type.test.d.ts.map +1 -0
  143. package/dist/types/src/View.d.ts +68 -0
  144. package/dist/types/src/View.d.ts.map +1 -0
  145. package/dist/types/src/hierarchy.test.d.ts +2 -0
  146. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  147. package/dist/types/src/index.d.ts +19 -3
  148. package/dist/types/src/index.d.ts.map +1 -1
  149. package/dist/types/src/internal/annotations/annotations.d.ts +209 -0
  150. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  151. package/dist/types/src/internal/annotations/annotations.test.d.ts +2 -0
  152. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  153. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  154. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  155. package/dist/types/src/internal/annotations/util.d.ts +39 -0
  156. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  157. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  158. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  159. package/dist/types/src/internal/api/entity.d.ts +13 -0
  160. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  161. package/dist/types/src/internal/api/index.d.ts +15 -0
  162. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  163. package/dist/types/src/internal/api/meta.d.ts +42 -0
  164. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  165. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  166. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  167. package/dist/types/src/internal/api/version.d.ts +42 -0
  168. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  169. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  170. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  171. package/dist/types/src/internal/entities/index.d.ts +6 -0
  172. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  173. package/dist/types/src/internal/entities/model.d.ts +79 -0
  174. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  175. package/dist/types/src/internal/entities/object.d.ts +18 -0
  176. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  177. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  178. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  179. package/dist/types/src/internal/entities/util.d.ts +2 -0
  180. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  181. package/dist/types/src/internal/formats/date.d.ts +63 -0
  182. package/dist/types/src/internal/formats/date.d.ts.map +1 -0
  183. package/dist/types/src/internal/formats/date.test.d.ts +2 -0
  184. package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
  185. package/dist/types/src/internal/formats/format.d.ts +32 -0
  186. package/dist/types/src/internal/formats/format.d.ts.map +1 -0
  187. package/dist/types/src/internal/formats/format.test.d.ts +2 -0
  188. package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
  189. package/dist/types/src/internal/formats/index.d.ts +8 -0
  190. package/dist/types/src/internal/formats/index.d.ts.map +1 -0
  191. package/dist/types/src/internal/formats/number.d.ts +31 -0
  192. package/dist/types/src/internal/formats/number.d.ts.map +1 -0
  193. package/dist/types/src/internal/formats/object.d.ts +35 -0
  194. package/dist/types/src/internal/formats/object.d.ts.map +1 -0
  195. package/dist/types/src/internal/formats/select.d.ts +13 -0
  196. package/dist/types/src/internal/formats/select.d.ts.map +1 -0
  197. package/dist/types/src/internal/formats/string.d.ts +42 -0
  198. package/dist/types/src/internal/formats/string.d.ts.map +1 -0
  199. package/dist/types/src/internal/formats/types.d.ts +72 -0
  200. package/dist/types/src/internal/formats/types.d.ts.map +1 -0
  201. package/dist/types/src/internal/index.d.ts +12 -0
  202. package/dist/types/src/internal/index.d.ts.map +1 -0
  203. package/dist/types/src/internal/json-schema/annotations.d.ts +19 -0
  204. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  205. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts +2 -0
  206. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  207. package/dist/types/src/internal/json-schema/index.d.ts +5 -0
  208. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
  209. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
  210. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
  211. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +351 -0
  212. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
  213. package/dist/types/src/internal/json-schema/json-schema.d.ts +30 -0
  214. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  215. package/dist/types/src/internal/json-schema/json-schema.test.d.ts +2 -0
  216. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  217. package/dist/types/src/internal/object/clone.d.ts +8 -0
  218. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  219. package/dist/types/src/internal/object/common.d.ts +18 -0
  220. package/dist/types/src/internal/object/common.d.ts.map +1 -0
  221. package/dist/types/src/internal/object/create-object.d.ts +39 -0
  222. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  223. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  224. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/object/deleted.d.ts +6 -0
  226. package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
  227. package/dist/types/src/internal/object/ids.d.ts +6 -0
  228. package/dist/types/src/internal/object/ids.d.ts.map +1 -0
  229. package/dist/types/src/internal/object/index.d.ts +11 -0
  230. package/dist/types/src/internal/object/index.d.ts.map +1 -0
  231. package/dist/types/src/internal/object/inspect.d.ts +2 -0
  232. package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
  233. package/dist/types/src/internal/object/json-serializer.d.ts +37 -0
  234. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
  235. package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
  236. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
  237. package/dist/types/src/internal/object/schema-validator.d.ts +2 -0
  238. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
  239. package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
  240. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
  241. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  242. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  243. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  244. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  245. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  246. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  247. package/dist/types/src/internal/object/typed-object.d.ts +25 -0
  248. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
  249. package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
  250. package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
  251. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  252. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  253. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  254. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  255. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  256. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  257. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  258. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  259. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  260. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  261. package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
  262. package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  264. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  265. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  266. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  267. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  268. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  269. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  270. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  271. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  272. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  273. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  274. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  275. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  276. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  277. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  278. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  279. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  280. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  281. package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
  282. package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
  283. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  284. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  285. package/dist/types/src/internal/proxy/typed-handler.d.ts +48 -0
  286. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
  287. package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
  288. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
  289. package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
  290. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
  291. package/dist/types/src/internal/ref/index.d.ts +3 -0
  292. package/dist/types/src/internal/ref/index.d.ts.map +1 -0
  293. package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
  294. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
  295. package/dist/types/src/internal/ref/ref.d.ts +231 -0
  296. package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
  297. package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
  298. package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
  299. package/dist/types/src/internal/schema/compose.d.ts +7 -0
  300. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  301. package/dist/types/src/internal/schema/compose.test.d.ts +2 -0
  302. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  303. package/dist/types/src/internal/schema/echo-schema.d.ts +181 -0
  304. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
  305. package/dist/types/src/internal/schema/index.d.ts +4 -0
  306. package/dist/types/src/internal/schema/index.d.ts.map +1 -0
  307. package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
  308. package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
  309. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  310. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  311. package/dist/types/src/internal/types/base.d.ts +27 -0
  312. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  313. package/dist/types/src/internal/types/entity.d.ts +37 -0
  314. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  315. package/dist/types/src/internal/types/index.d.ts +6 -0
  316. package/dist/types/src/internal/types/index.d.ts.map +1 -0
  317. package/dist/types/src/internal/types/meta.d.ts +33 -0
  318. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  319. package/dist/types/src/internal/types/typename.d.ts +21 -0
  320. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  321. package/dist/types/src/internal/types/version.d.ts +15 -0
  322. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  323. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  324. package/dist/types/src/testing/index.d.ts +3 -1
  325. package/dist/types/src/testing/index.d.ts.map +1 -1
  326. package/dist/types/src/testing/test-data.d.ts +18 -0
  327. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  328. package/dist/types/src/testing/test-schema.d.ts +304 -0
  329. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  330. package/dist/types/src/testing/util.d.ts +21 -0
  331. package/dist/types/src/testing/util.d.ts.map +1 -0
  332. package/dist/types/tsconfig.tsbuildinfo +1 -1
  333. package/package.json +112 -53
  334. package/src/Annotation.ts +46 -0
  335. package/src/Collection.ts +30 -0
  336. package/src/Database.ts +315 -0
  337. package/src/Dataset.ts +24 -0
  338. package/src/Entity.test.ts +22 -0
  339. package/src/Entity.ts +234 -0
  340. package/src/Err.ts +38 -0
  341. package/src/Feed.ts +254 -0
  342. package/src/Filter.ts +389 -0
  343. package/src/Format.ts +9 -0
  344. package/src/Hypergraph.ts +74 -0
  345. package/src/JsonSchema.ts +24 -0
  346. package/src/Key.ts +3 -0
  347. package/src/Obj.test.ts +447 -0
  348. package/src/Obj.ts +641 -78
  349. package/src/Order.ts +44 -0
  350. package/src/Query.test.ts +632 -0
  351. package/src/Query.ts +520 -0
  352. package/src/QueryResult.ts +106 -0
  353. package/src/Ref.ts +76 -9
  354. package/src/Relation.test.ts +88 -0
  355. package/src/Relation.ts +446 -52
  356. package/src/SchemaRegistry.ts +106 -0
  357. package/src/Tag.ts +39 -0
  358. package/src/Type.test.ts +52 -0
  359. package/src/Type.ts +163 -151
  360. package/src/View.ts +100 -0
  361. package/src/hierarchy.test.ts +33 -0
  362. package/src/index.ts +21 -4
  363. package/src/internal/README.md +102 -0
  364. package/src/internal/annotations/annotations.test.ts +96 -0
  365. package/src/internal/annotations/annotations.ts +526 -0
  366. package/src/internal/annotations/index.ts +6 -0
  367. package/src/internal/annotations/util.ts +85 -0
  368. package/src/internal/api/annotations.ts +60 -0
  369. package/src/internal/api/entity.ts +29 -0
  370. package/src/internal/api/index.ts +19 -0
  371. package/src/internal/api/meta.ts +88 -0
  372. package/src/internal/api/sorting.ts +53 -0
  373. package/src/internal/api/version.ts +96 -0
  374. package/src/internal/entities/entity.ts +128 -0
  375. package/src/internal/entities/index.ts +9 -0
  376. package/src/internal/entities/model.ts +138 -0
  377. package/src/internal/entities/object.ts +58 -0
  378. package/src/internal/entities/relation.ts +171 -0
  379. package/src/internal/entities/util.ts +33 -0
  380. package/src/internal/formats/date.test.ts +56 -0
  381. package/src/internal/formats/date.ts +217 -0
  382. package/src/internal/formats/format.test.ts +77 -0
  383. package/src/internal/formats/format.ts +54 -0
  384. package/src/internal/formats/index.ts +12 -0
  385. package/src/internal/formats/number.ts +89 -0
  386. package/src/internal/formats/object.ts +80 -0
  387. package/src/internal/formats/select.ts +18 -0
  388. package/src/internal/formats/string.ts +81 -0
  389. package/src/internal/formats/types.ts +186 -0
  390. package/src/internal/index.ts +39 -0
  391. package/src/internal/json-schema/annotations.ts +50 -0
  392. package/src/internal/json-schema/effect-schema.test.ts +143 -0
  393. package/src/internal/json-schema/index.ts +8 -0
  394. package/src/internal/json-schema/json-schema-normalize.ts +111 -0
  395. package/src/internal/json-schema/json-schema-type.ts +403 -0
  396. package/src/internal/json-schema/json-schema.test.ts +861 -0
  397. package/src/internal/json-schema/json-schema.ts +534 -0
  398. package/src/internal/object/clone.ts +48 -0
  399. package/src/internal/object/common.ts +75 -0
  400. package/src/internal/object/create-object.test.ts +116 -0
  401. package/src/internal/object/create-object.ts +95 -0
  402. package/src/internal/object/deleted.ts +19 -0
  403. package/src/internal/object/ids.ts +12 -0
  404. package/src/internal/object/index.ts +14 -0
  405. package/src/internal/object/inspect.ts +46 -0
  406. package/src/internal/object/json-serializer.test.ts +121 -0
  407. package/src/internal/object/json-serializer.ts +204 -0
  408. package/src/internal/object/schema-validator.test.ts +182 -0
  409. package/src/internal/object/schema-validator.ts +6 -0
  410. package/src/internal/object/set-value.test.ts +281 -0
  411. package/src/internal/object/set-value.ts +165 -0
  412. package/src/internal/object/snapshot.ts +96 -0
  413. package/src/internal/object/typed-object.test.ts +34 -0
  414. package/src/internal/object/typed-object.ts +30 -0
  415. package/src/internal/proxy/change-context.ts +138 -0
  416. package/src/internal/proxy/change.test.ts +519 -0
  417. package/src/internal/proxy/define-hidden-property.ts +14 -0
  418. package/src/internal/proxy/errors.ts +42 -0
  419. package/src/internal/proxy/event-batch.ts +44 -0
  420. package/src/internal/proxy/handler.test.ts +123 -0
  421. package/src/internal/proxy/index.ts +17 -0
  422. package/src/internal/proxy/json-serializer.ts +87 -0
  423. package/src/internal/proxy/make-object.ts +106 -0
  424. package/src/internal/proxy/ownership.ts +253 -0
  425. package/src/internal/proxy/proxy-types.ts +23 -0
  426. package/src/internal/proxy/proxy-utils.ts +150 -0
  427. package/src/internal/proxy/reactive-array.ts +71 -0
  428. package/src/internal/proxy/reactive.ts +69 -0
  429. package/src/internal/proxy/schema-validator.ts +244 -0
  430. package/src/internal/proxy/schema.test.ts +145 -0
  431. package/src/internal/proxy/symbols.ts +7 -0
  432. package/src/internal/proxy/typed-handler.test.ts +314 -0
  433. package/src/internal/proxy/typed-handler.ts +450 -0
  434. package/src/internal/proxy/typed-object.test.ts +116 -0
  435. package/src/internal/ref/index.ts +6 -0
  436. package/src/internal/ref/ref-array.ts +39 -0
  437. package/src/internal/ref/ref.test.ts +101 -0
  438. package/src/internal/ref/ref.ts +572 -0
  439. package/src/internal/schema/compose.test.ts +42 -0
  440. package/src/internal/schema/compose.ts +41 -0
  441. package/src/internal/schema/echo-schema.ts +424 -0
  442. package/src/internal/schema/index.ts +7 -0
  443. package/src/internal/schema/manipulation.ts +92 -0
  444. package/src/internal/schema/persistent-schema.ts +33 -0
  445. package/src/internal/types/base.ts +43 -0
  446. package/src/internal/types/entity.ts +54 -0
  447. package/src/internal/types/index.ts +9 -0
  448. package/src/internal/types/meta.ts +68 -0
  449. package/src/internal/types/typename.ts +55 -0
  450. package/src/internal/types/version.ts +19 -0
  451. package/src/testing/api.test.ts +126 -0
  452. package/src/testing/index.ts +3 -1
  453. package/src/testing/test-data.ts +130 -0
  454. package/src/testing/test-schema.ts +240 -0
  455. package/src/testing/util.ts +85 -0
  456. package/dist/lib/browser/chunk-EUA7CM23.mjs +0 -619
  457. package/dist/lib/browser/chunk-EUA7CM23.mjs.map +0 -7
  458. package/dist/lib/browser/index.mjs +0 -22
  459. package/dist/lib/browser/meta.json +0 -1
  460. package/dist/lib/browser/testing/index.mjs +0 -70
  461. package/dist/lib/browser/testing/index.mjs.map +0 -7
  462. package/dist/lib/node-esm/chunk-IV6BWGHK.mjs +0 -619
  463. package/dist/lib/node-esm/chunk-IV6BWGHK.mjs.map +0 -7
  464. package/dist/lib/node-esm/index.mjs +0 -22
  465. package/dist/lib/node-esm/meta.json +0 -1
  466. package/dist/lib/node-esm/testing/index.mjs +0 -70
  467. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  468. package/dist/types/src/experimental/database.d.ts +0 -8
  469. package/dist/types/src/experimental/database.d.ts.map +0 -1
  470. package/dist/types/src/experimental/index.d.ts +0 -1
  471. package/dist/types/src/experimental/index.d.ts.map +0 -1
  472. package/dist/types/src/experimental/queue.d.ts +0 -8
  473. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  474. package/dist/types/src/experimental/space.d.ts +0 -8
  475. package/dist/types/src/experimental/space.d.ts.map +0 -1
  476. package/dist/types/src/query/dsl.d.ts +0 -218
  477. package/dist/types/src/query/dsl.d.ts.map +0 -1
  478. package/dist/types/src/query/dsl.test.d.ts +0 -2
  479. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  480. package/dist/types/src/query/index.d.ts +0 -2
  481. package/dist/types/src/query/index.d.ts.map +0 -1
  482. package/dist/types/src/testing/types.d.ts +0 -113
  483. package/dist/types/src/testing/types.d.ts.map +0 -1
  484. package/src/experimental/database.ts +0 -11
  485. package/src/experimental/index.ts +0 -7
  486. package/src/experimental/queue.ts +0 -11
  487. package/src/experimental/space.ts +0 -11
  488. package/src/query/dsl.test.ts +0 -323
  489. package/src/query/dsl.ts +0 -646
  490. package/src/query/index.ts +0 -5
  491. package/src/test/api.test.ts +0 -173
  492. package/src/testing/types.ts +0 -91
  493. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  494. /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
  495. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
package/src/Tag.ts ADDED
@@ -0,0 +1,39 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import * as internal from './internal';
8
+ import * as Obj from './Obj';
9
+ import * as Type from './Type';
10
+
11
+ export const Tag = Schema.Struct({
12
+ label: Schema.String,
13
+ hue: Schema.optional(Schema.String), // TODO(burdon): Color name?
14
+ }).pipe(
15
+ Type.object({
16
+ typename: 'dxos.org/type/Tag',
17
+ version: '0.1.0',
18
+ }),
19
+ internal.LabelAnnotation.set(['label']),
20
+ internal.SystemTypeAnnotation.set(true),
21
+ );
22
+
23
+ export type Tag = Schema.Schema.Type<typeof Tag>;
24
+
25
+ export const make = (props: Obj.MakeProps<typeof Tag>) => Obj.make(Tag, props);
26
+
27
+ export type Map = Record<string, Tag>;
28
+
29
+ export const sortTags = ({ label: a }: Tag, { label: b }: Tag) => a.localeCompare(b);
30
+
31
+ export const createTagList = (tags: Map): Tag[] =>
32
+ Object.entries(tags)
33
+ .map(([id, tag]) => ({ ...tag, id }))
34
+ .sort(sortTags);
35
+
36
+ export const findTagByLabel = (tags: Map | undefined, name: string): Tag | undefined => {
37
+ const entry = Object.entries(tags ?? {}).find(([_, tag]) => tag.label.toLowerCase() === name.toLowerCase());
38
+ return entry ? { ...entry[1], id: entry[0] } : undefined;
39
+ };
@@ -0,0 +1,52 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { describe, test } from 'vitest';
7
+
8
+ import * as Obj from './Obj';
9
+ import * as Relation from './Relation';
10
+ import { TestSchema } from './testing';
11
+ import * as Type from './Type';
12
+
13
+ describe('Type', () => {
14
+ describe('Obj.Unknown schema', () => {
15
+ test('has SchemaKindId for schema type checking', ({ expect }) => {
16
+ // Type.isObjectSchema uses SchemaKindId to check if a schema is an object schema.
17
+ expect(Type.isObjectSchema(Obj.Unknown)).toBe(true);
18
+ expect(Type.isObjectSchema(TestSchema.Person)).toBe(true);
19
+ expect(Type.isObjectSchema(Relation.Unknown)).toBe(false);
20
+ });
21
+
22
+ test('Schema.is validates structural compatibility only', ({ expect }) => {
23
+ // Schema.is does structural validation (has id field).
24
+ // It accepts both ECHO objects and plain objects with compatible structure.
25
+ expect(Schema.is(Obj.Unknown)({ id: 'plain-object' })).toBe(true);
26
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
27
+ expect(Schema.is(Obj.Unknown)(obj)).toBe(true);
28
+ });
29
+ });
30
+
31
+ describe('Relation.Unknown schema', () => {
32
+ test('has SchemaKindId for schema type checking', ({ expect }) => {
33
+ // Type.isRelationSchema uses SchemaKindId to check if a schema is a relation schema.
34
+ expect(Type.isRelationSchema(Relation.Unknown)).toBe(true);
35
+ expect(Type.isRelationSchema(TestSchema.HasManager)).toBe(true);
36
+ expect(Type.isRelationSchema(Obj.Unknown)).toBe(false);
37
+ });
38
+
39
+ test('Schema.is validates structural compatibility only', ({ expect }) => {
40
+ // Schema.is does structural validation (has id field).
41
+ // It accepts both ECHO relations and plain objects with compatible structure.
42
+ expect(Schema.is(Relation.Unknown)({ id: 'plain-object' })).toBe(true);
43
+ const obj1 = Obj.make(TestSchema.Person, { name: 'Alice' });
44
+ const obj2 = Obj.make(TestSchema.Person, { name: 'Bob' });
45
+ const rel = Relation.make(TestSchema.HasManager, {
46
+ [Relation.Source]: obj1,
47
+ [Relation.Target]: obj2,
48
+ });
49
+ expect(Schema.is(Relation.Unknown)(rel)).toBe(true);
50
+ });
51
+ });
52
+ });
package/src/Type.ts CHANGED
@@ -2,194 +2,211 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Schema } from 'effect';
6
- import { type Simplify } from 'effect/Schema';
5
+ import type * as Schema from 'effect/Schema';
7
6
 
8
7
  import { type EncodedReference } from '@dxos/echo-protocol';
9
- import * as EchoSchema from '@dxos/echo-schema';
10
- import { type ToMutable } from '@dxos/echo-schema';
11
8
  import { invariant } from '@dxos/invariant';
12
- import type * as Keys from '@dxos/keys';
9
+ import { type DXN } from '@dxos/keys';
10
+ import { type ToMutable } from '@dxos/util';
13
11
 
12
+ import type * as EntityModule from './Entity';
13
+ import * as internal from './internal';
14
+ import type * as ObjModule from './Obj';
14
15
  import type * as RelationModule from './Relation';
15
16
 
16
- //
17
- // Kind
18
- //
19
-
20
- export const KindId: unique symbol = EchoSchema.EntityKindId as any;
21
- export type KindId = typeof KindId;
22
-
23
- export const Kind = EchoSchema.EntityKind;
24
-
25
17
  /**
26
- * Assigns a kind to an Object or Relation instance.
18
+ * Dynamic type that can be constructed, mutated, and persisted in the ECHO database.
27
19
  */
28
- // NOTE: Needed to make `isRelation` and `isObject` checks work.
29
- export interface OfKind<Kind extends EchoSchema.EntityKind> {
30
- readonly id: Keys.ObjectId;
31
- readonly [KindId]: Kind;
32
- }
20
+ export const RuntimeType = internal.EchoSchema;
33
21
 
34
22
  /**
35
- * Base ECHO schema type.
23
+ * Dynamic type that can be constructed, mutated, and persisted in the ECHO database.
36
24
  */
37
- export type Schema = EchoSchema.EchoSchema;
25
+ export type RuntimeType = internal.EchoSchema;
26
+
27
+ //
28
+ // Internal types (not exported)
29
+ //
38
30
 
39
31
  /**
40
- * Returns all properties of an object or relation except for the id and kind.
32
+ * Type that marks a schema as an ECHO schema.
33
+ * The value indicates the entity kind (Object or Relation).
41
34
  */
42
- export type Properties<T> = Omit<T, 'id' | KindId | RelationModule.Source | RelationModule.Target>;
35
+ type EchoSchemaKind<K extends internal.EntityKind = internal.EntityKind> = {
36
+ readonly [internal.SchemaKindId]: K;
37
+ };
43
38
 
44
39
  //
45
- // Obj
40
+ // Obj - Runtime schema for any ECHO object
46
41
  //
47
42
 
48
- interface ObjJsonProps {
49
- id: string;
50
- }
51
-
52
43
  /**
53
- * Return type of the `Obj` schema constructor.
44
+ * TypeScript type for an ECHO object schema.
45
+ * `T` is the instance type produced by the schema.
46
+ * `Fields` is the optional struct fields type for introspection.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * const PersonSchema: Type.Obj<Person> = Schema.Struct({
51
+ * name: Schema.String,
52
+ * }).pipe(Type.object({ typename: 'Person', version: '0.1.0' }));
54
53
  *
55
- * This typedef avoids `TS4023` error (name from external module cannot be used named).
56
- * See Effect's note on interface types.
54
+ * // Access fields for introspection:
55
+ * Object.keys(PersonSchema.fields); // ['name']
56
+ * ```
57
57
  */
58
- export interface obj<Self extends Schema.Schema.Any>
59
- extends EchoSchema.TypeMeta,
58
+ export interface Obj<T, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>
59
+ extends
60
+ internal.TypeMeta,
61
+ EchoSchemaKind<internal.EntityKind.Object>,
60
62
  Schema.AnnotableClass<
61
- obj<Self>,
62
- OfKind<EchoSchema.EntityKind.Object> & ToMutable<Schema.Schema.Type<Self>>,
63
- Simplify<ObjJsonProps & ToMutable<Schema.Schema.Encoded<Self>>>,
64
- Schema.Schema.Context<Self>
65
- > {}
63
+ Obj<T, Fields>,
64
+ EntityModule.OfKind<typeof EntityModule.Kind.Object> & T,
65
+ Schema.Simplify<ObjModule.BaseObjJson & ToMutable<T>>,
66
+ never
67
+ > {
68
+ /**
69
+ * The fields defined in the original struct schema.
70
+ * Allows accessing field definitions for introspection.
71
+ */
72
+ readonly fields: Fields;
73
+ }
66
74
 
67
75
  /**
68
- * Object schema.
76
+ * Structural base type for any ECHO object schema.
77
+ * Accepts both static schemas (created with Type.object()) and EchoSchema.
78
+ * NOTE: Does not include the brand symbol to avoid TS4053 declaration portability issues.
79
+ * Use Type.isObjectSchema() for runtime type guards.
69
80
  */
70
- export const Obj: {
71
- (opts: EchoSchema.TypeMeta): <Self extends Schema.Schema.Any>(self: Self) => obj<Self>;
72
- } = EchoSchema.EchoObject as any;
81
+ type ObjectSchemaBase = Schema.Schema.AnyNoContext & {
82
+ readonly typename: string;
83
+ readonly version: string;
84
+ };
73
85
 
74
86
  /**
75
- * Object schema type definitions.
87
+ * Type that represents any ECHO object schema.
88
+ * Accepts both static schemas (Type.object()) and mutable schemas (EchoSchema).
76
89
  */
77
- export namespace Obj {
78
- /**
79
- * Type that represents an arbitrary schema type of an object.
80
- * NOTE: This is not an instance type.
81
- */
82
- // TODO(dmaretskyi): If schema was covariant, we could specify props in here, like `id: ObjectId`.
83
- export type Any = Schema.Schema.AnyNoContext;
84
- }
85
-
86
- //
87
- // Expando
88
- //
89
-
90
- export interface Expando extends OfKind<EchoSchema.EntityKind.Object> {
91
- [key: string]: any;
92
- }
90
+ export type AnyObj = ObjectSchemaBase;
93
91
 
94
- type ExpandoEncoded = Simplify<ObjJsonProps & { [key: string]: any }>;
95
-
96
- export const Expando: Schema.Schema<Expando, ExpandoEncoded, never> = EchoSchema.Expando as any;
92
+ /**
93
+ * Factory function to create an ECHO object schema.
94
+ * Adds object metadata annotations to an Effect schema.
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * const Person = Schema.Struct({
99
+ * name: Schema.String,
100
+ * }).pipe(Type.object({ typename: 'example.com/type/Person', version: '0.1.0' }));
101
+ * ```
102
+ */
103
+ export const object: {
104
+ (opts: internal.TypeMeta): <Self extends Schema.Schema.Any>(self: Self) => Obj<Schema.Schema.Type<Self>>;
105
+ } = internal.EchoObjectSchema as any;
97
106
 
98
107
  //
99
- // Relation
108
+ // PersistentType (Schema stored in database)
100
109
  //
101
110
 
102
- interface RelationJsonProps {
103
- id: string;
104
- [EchoSchema.ATTR_RELATION_SOURCE]: string;
105
- [EchoSchema.ATTR_RELATION_TARGET]: string;
106
- }
111
+ export const PersistentType: Obj<internal.PersistentSchema> = internal.PersistentSchema as any;
112
+
113
+ export interface PersistentType extends Schema.Schema.Type<typeof PersistentType> {}
107
114
 
108
115
  /**
109
- * Return type of the `Relation` schema constructor.
110
- *
111
- * This typedef avoids `TS4023` error (name from external module cannot be used named).
112
- * See Effect's note on interface types.
113
- */
114
- export interface relation<
115
- Self extends Schema.Schema.Any,
116
- SourceSchema extends Schema.Schema.Any,
117
- TargetSchema extends Schema.Schema.Any,
118
- > extends EchoSchema.TypeMeta,
116
+ * TypeScript type for an ECHO relation schema.
117
+ * `T` is the instance type produced by the schema (excluding source/target).
118
+ * `Source` and `Target` are the endpoint types.
119
+ * `Fields` is the optional struct fields type for introspection.
120
+ */
121
+ export interface Relation<T, Source, Target, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>
122
+ extends
123
+ internal.TypeMeta,
124
+ EchoSchemaKind<internal.EntityKind.Relation>,
119
125
  Schema.AnnotableClass<
120
- relation<Self, SourceSchema, TargetSchema>,
121
- OfKind<EchoSchema.EntityKind.Relation> &
122
- Relation.Endpoints<Schema.Schema.Type<SourceSchema>, Schema.Schema.Type<TargetSchema>> &
123
- ToMutable<Schema.Schema.Type<Self>>,
124
- Simplify<RelationJsonProps & ToMutable<Schema.Schema.Encoded<Self>>>,
125
- Schema.Schema.Context<Self>
126
- > {}
126
+ Relation<T, Source, Target, Fields>,
127
+ EntityModule.OfKind<typeof EntityModule.Kind.Relation> & RelationModule.Endpoints<Source, Target> & T,
128
+ Schema.Simplify<RelationModule.BaseRelationJson & ToMutable<T>>,
129
+ never
130
+ > {
131
+ /**
132
+ * The fields defined in the original struct schema.
133
+ * Allows accessing field definitions for introspection.
134
+ */
135
+ readonly fields: Fields;
136
+ }
127
137
 
128
138
  /**
129
- * Relation schema.
139
+ * Structural base type for any ECHO relation schema.
140
+ * Accepts static schemas (created with Type.relation()).
141
+ * NOTE: Does not include the brand symbol to avoid TS4053 declaration portability issues.
142
+ * Use Type.isRelationSchema() for runtime type guards.
130
143
  */
131
- // TODO(dmaretskyi): I have to redefine the type here so that the definition uses symbols from @dxos/echo/Relation.
132
- export const Relation: {
133
- <Source extends Schema.Schema.AnyNoContext, Target extends Schema.Schema.AnyNoContext>(
134
- opts: EchoSchema.EchoRelationOptions<Source, Target>,
135
- ): <Self extends Schema.Schema.Any>(self: Self) => relation<Self, Source, Target>;
136
- } = EchoSchema.EchoRelation as any;
144
+ type RelationSchemaBase = Schema.Schema.AnyNoContext & {
145
+ readonly typename: string;
146
+ readonly version: string;
147
+ };
137
148
 
138
149
  /**
139
- * Relation schema type definitions.
150
+ * Type that represents any ECHO relation schema.
151
+ * Accepts static schemas (Type.relation()).
140
152
  */
141
- export namespace Relation {
142
- /**
143
- * Type that represents an arbitrary schema type of a relation.
144
- * NOTE: This is not an instance type.
145
- */
146
- // TODO(dmaretskyi): If schema was covariant, we could specify props in here, like `id: ObjectId`.
147
- export type Any = Schema.Schema.AnyNoContext;
148
-
149
- /**
150
- * Get relation source type.
151
- */
152
- export type Source<A> = A extends Relation.Endpoints<infer S, infer _T> ? S : never;
153
-
154
- /**
155
- * Get relation target type.
156
- */
157
- export type Target<A> = A extends Relation.Endpoints<infer _S, infer T> ? T : never;
153
+ export type AnyRelation = RelationSchemaBase;
158
154
 
159
- export type Endpoints<Source, Target> = {
160
- [RelationModule.Source]: Source;
161
- [RelationModule.Target]: Target;
162
- };
163
- }
155
+ /**
156
+ * Factory function to create an ECHO relation schema.
157
+ * Adds relation metadata annotations to an Effect schema.
158
+ *
159
+ * @example
160
+ * ```ts
161
+ * const WorksFor = Schema.Struct({
162
+ * role: Schema.String,
163
+ * }).pipe(Type.relation({
164
+ * typename: 'example.com/type/WorksFor',
165
+ * version: '0.1.0',
166
+ * source: Person,
167
+ * target: Company,
168
+ * }));
169
+ * ```
170
+ */
171
+ export const relation: {
172
+ <SourceSchema extends Schema.Schema.AnyNoContext, TargetSchema extends Schema.Schema.AnyNoContext>(
173
+ opts: internal.EchoRelationSchemaOptions<SourceSchema, TargetSchema>,
174
+ ): <Self extends Schema.Schema.Any>(
175
+ self: Self,
176
+ ) => Relation<Schema.Schema.Type<Self>, Schema.Schema.Type<SourceSchema>, Schema.Schema.Type<TargetSchema>>;
177
+ } = internal.EchoRelationSchema as any;
164
178
 
165
- //
166
- // Ref
167
- //
179
+ /**
180
+ * Type alias for any ECHO entity schema (object or relation).
181
+ * Use this in type annotations for schema parameters.
182
+ */
183
+ export type AnyEntity = AnyObj | AnyRelation;
168
184
 
169
185
  /**
170
- * Return type of the `Ref` schema constructor.
171
- *
172
- * This typedef avoids `TS4023` error (name from external module cannot be used named).
173
- * See Effect's note on interface types.
186
+ * Type guard to check if a schema is an object schema.
187
+ * NOTE: This checks SCHEMAS, not instances. Use Obj.isObject for instances.
174
188
  */
175
- export interface ref<TargetSchema extends Schema.Schema.Any>
176
- extends EchoSchema.Ref$<Schema.Schema.Type<TargetSchema>> {}
189
+ export const isObjectSchema = (schema: AnyEntity): schema is AnyObj => {
190
+ return (schema as any)[internal.SchemaKindId] === internal.EntityKind.Object;
191
+ };
177
192
 
178
193
  /**
179
- * Ref schema.
194
+ * Type guard to check if a schema is a relation schema.
195
+ * NOTE: This checks SCHEMAS, not instances. Use Relation.isRelation for instances.
180
196
  */
181
- export const Ref: <S extends Obj.Any>(schema: S) => ref<S> = EchoSchema.Ref;
197
+ export const isRelationSchema = (schema: AnyEntity): schema is AnyRelation => {
198
+ return (schema as any)[internal.SchemaKindId] === internal.EntityKind.Relation;
199
+ };
182
200
 
183
- export interface Ref<T> extends Schema.SchemaClass<EchoSchema.Ref<T>, EncodedReference> {}
201
+ /**
202
+ * Type that represents any Ref schema (with unknown target type).
203
+ * This is a schema type, not an instance type.
204
+ */
205
+ export type AnyRef = Schema.Schema<internal.Ref<any>, EncodedReference>;
184
206
 
185
- // TODO(buurdon): Move to Ref?
186
- export namespace Ref {
187
- /**
188
- * Type that represents an arbitrary schema type of a reference.
189
- * NOTE: This is not an instance type.
190
- */
191
- export type Any = Schema.Schema<EchoSchema.Ref<any>, EncodedReference>;
192
- }
207
+ //
208
+ // Schema utility functions
209
+ //
193
210
 
194
211
  /**
195
212
  * Gets the full DXN of the schema.
@@ -197,16 +214,16 @@ export namespace Ref {
197
214
  * @example "dxn:example.com/type/Person:0.1.0"
198
215
  * @example "dxn:echo:SSSSSSSSSS:XXXXXXXXXXXXX"
199
216
  */
200
- export const getDXN = (schema: Obj.Any | Relation.Any): Keys.DXN | undefined => {
201
- return EchoSchema.getSchemaDXN(schema);
217
+ export const getDXN = (schema: AnyEntity): DXN | undefined => {
218
+ return internal.getSchemaDXN(schema);
202
219
  };
203
220
 
204
221
  /**
205
222
  * @param schema - Schema to get the typename from.
206
223
  * @returns The typename of the schema. Example: `example.com/type/Person`.
207
224
  */
208
- export const getTypename = (schema: Obj.Any | Relation.Any): string => {
209
- const typename = EchoSchema.getSchemaTypename(schema);
225
+ export const getTypename = (schema: AnyEntity): string => {
226
+ const typename = internal.getSchemaTypename(schema);
210
227
  invariant(typeof typename === 'string' && !typename.startsWith('dxn:'), 'Invalid typename');
211
228
  return typename;
212
229
  };
@@ -215,8 +232,8 @@ export const getTypename = (schema: Obj.Any | Relation.Any): string => {
215
232
  * Gets the version of the schema.
216
233
  * @example 0.1.0
217
234
  */
218
- export const getVersion = (schema: Obj.Any | Relation.Any): string => {
219
- const version = EchoSchema.getSchemaVersion(schema);
235
+ export const getVersion = (schema: AnyEntity): string => {
236
+ const version = internal.getSchemaVersion(schema);
220
237
  invariant(typeof version === 'string' && version.match(/^\d+\.\d+\.\d+$/), 'Invalid version');
221
238
  return version;
222
239
  };
@@ -224,21 +241,16 @@ export const getVersion = (schema: Obj.Any | Relation.Any): string => {
224
241
  /**
225
242
  * @returns True if the schema is mutable.
226
243
  */
227
- export const isMutable = EchoSchema.isMutable;
244
+ export const isMutable = internal.isMutable;
228
245
 
229
246
  /**
230
247
  * ECHO type metadata.
231
248
  */
232
- export type Meta = EchoSchema.TypeAnnotation;
249
+ export type Meta = internal.TypeAnnotation;
233
250
 
234
251
  /**
235
252
  * Gets the meta data of the schema.
236
253
  */
237
- export const getMeta = (schema: Obj.Any | Relation.Any): Meta | undefined => {
238
- return EchoSchema.getTypeAnnotation(schema);
254
+ export const getMeta = (schema: AnyEntity): Meta | undefined => {
255
+ return internal.getTypeAnnotation(schema);
239
256
  };
240
-
241
- // TODO(dmaretskyi): Remove re-exports.
242
- export { SpaceId, ObjectId, DXN } from '@dxos/keys';
243
-
244
- export { Format, JsonSchemaType as JsonSchema, toEffectSchema, toJsonSchema } from '@dxos/echo-schema';
package/src/View.ts ADDED
@@ -0,0 +1,100 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { QueryAST } from '@dxos/echo-protocol';
8
+ import { JsonPath } from '@dxos/effect';
9
+ import { PublicKey } from '@dxos/keys';
10
+
11
+ import * as Filter from './Filter';
12
+ import * as internal from './internal';
13
+ import * as Obj from './Obj';
14
+ import * as Query from './Query';
15
+ import * as Type from './Type';
16
+
17
+ /**
18
+ * Stored field metadata (e.g., for UX).
19
+ */
20
+ export const FieldSchema = Schema.Struct({
21
+ id: Schema.String,
22
+ path: JsonPath,
23
+ visible: Schema.optional(Schema.Boolean),
24
+
25
+ // TODO(wittjosiah): Presentation-specific?
26
+ referencePath: Schema.optional(JsonPath),
27
+ });
28
+
29
+ export type FieldType = Schema.Schema.Type<typeof FieldSchema>;
30
+
31
+ export const KeyValueProps = Schema.Record({ key: Schema.String, value: Schema.Any });
32
+
33
+ export const createFieldId = () => PublicKey.random().truncate();
34
+
35
+ export const Projection = Schema.Struct({
36
+ /**
37
+ * Optional schema override used to customize the underlying schema.
38
+ */
39
+ schema: internal.JsonSchemaType.pipe(Schema.optional),
40
+
41
+ /**
42
+ * UX metadata associated with displayed fields (in table, form, etc.)
43
+ */
44
+ // TODO(wittjosiah): Should this just be an array of JsonPath?
45
+ fields: Schema.Array(FieldSchema),
46
+
47
+ /**
48
+ * The id for the field used to pivot the view.
49
+ * E.g., the field to use for kanban columns or the field to use for map coordinates.
50
+ */
51
+ pivotFieldId: Schema.String.pipe(Schema.optional),
52
+ });
53
+
54
+ export type Projection = Schema.Schema.Type<typeof Projection>;
55
+
56
+ /**
57
+ * Views are generated or user-defined projections of a schema's properties.
58
+ * They are used to configure the visual representation of the data.
59
+ */
60
+ const ViewSchema = Schema.Struct({
61
+ /**
62
+ * Query used to retrieve data.
63
+ * Can be a user-provided query grammar string or a query AST.
64
+ */
65
+ query: Schema.Struct({
66
+ raw: Schema.optional(Schema.String),
67
+ ast: QueryAST.Query,
68
+ }),
69
+
70
+ /**
71
+ * Projection of the data returned from the query.
72
+ */
73
+ projection: Projection,
74
+ }).pipe(
75
+ Type.object({
76
+ typename: 'dxos.org/type/View',
77
+ version: '0.5.0',
78
+ }),
79
+ internal.SystemTypeAnnotation.set(true),
80
+ );
81
+
82
+ export interface View extends Schema.Schema.Type<typeof ViewSchema> {}
83
+
84
+ /**
85
+ * View instance type.
86
+ */
87
+ // NOTE: This interface is explicitly defined rather than derived from the schema to avoid
88
+ // TypeScript "cannot be named" portability errors. The schema contains QueryAST.Query which
89
+ // references internal @dxos/echo-protocol module paths. Without this explicit interface,
90
+ // any schema using Ref.Ref(View) would inherit the non-portable type and fail to compile.
91
+ // TODO(wittjosiah): Find a better solution that doesn't require manually keeping the interface in sync.
92
+ export const View: Type.Obj<View> = ViewSchema as any;
93
+
94
+ export const make = (props: Partial<Obj.MakeProps<typeof View>>): View => {
95
+ return Obj.make(View, {
96
+ query: { ast: Query.select(Filter.nothing()).ast },
97
+ projection: { fields: [] },
98
+ ...props,
99
+ });
100
+ };
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import * as Obj from './Obj';
8
+ import { TestSchema } from './testing';
9
+
10
+ describe('Hierarchy', () => {
11
+ test('setParent and getParent', async () => {
12
+ const parent = Obj.make(TestSchema.Organization, { name: 'parent' });
13
+ const child = Obj.make(TestSchema.Person, { name: 'child' });
14
+ expect(Obj.getParent(child)).toBeUndefined();
15
+
16
+ Obj.setParent(child, parent);
17
+ expect(Obj.getParent(child)).toBe(parent);
18
+
19
+ Obj.setParent(child, undefined);
20
+ expect(Obj.getParent(child)).toBeUndefined();
21
+ });
22
+
23
+ test('create object with Obj.Parent in props', () => {
24
+ const parent = Obj.make(TestSchema.Organization, { name: 'DXOS' });
25
+ const child = Obj.make(TestSchema.Person, {
26
+ [Obj.Parent]: parent,
27
+ name: 'John',
28
+ });
29
+
30
+ expect(child.name).toBe('John');
31
+ expect(Obj.getParent(child)).toBe(parent);
32
+ });
33
+ });
package/src/index.ts CHANGED
@@ -2,12 +2,29 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ export { QueryAST } from '@dxos/echo-protocol';
6
+ // TODO(wittjosiah): Refactor DXN to not use statics similar to Query.
7
+ export { DXN } from '@dxos/keys';
8
+
9
+ export * as Annotation from './Annotation';
10
+ export * as Database from './Database';
11
+ export * as Entity from './Entity';
12
+ export * as Err from './Err';
13
+ export * as Feed from './Feed';
14
+ export * as Filter from './Filter';
15
+ export * as Format from './Format';
16
+ export * as Hypergraph from './Hypergraph';
17
+ export * as JsonSchema from './JsonSchema';
5
18
  export * as Key from './Key';
6
19
  export * as Obj from './Obj';
20
+ export * as Order from './Order';
21
+ export * as Query from './Query';
22
+ export * as QueryResult from './QueryResult';
7
23
  export * as Ref from './Ref';
8
24
  export * as Relation from './Relation';
25
+ export * as SchemaRegistry from './SchemaRegistry';
26
+ export * as Tag from './Tag';
9
27
  export * as Type from './Type';
10
-
11
- export { DXN } from '@dxos/keys';
12
- export { Filter, Query } from './query';
13
- export { type Live } from '@dxos/live-object';
28
+ export * as Collection from './Collection';
29
+ export * as View from './View';
30
+ export * as Dataset from './Dataset';