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

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 (533) hide show
  1. package/README.md +1 -2
  2. package/dist/lib/neutral/Annotation.mjs +35 -0
  3. package/dist/lib/neutral/Database.mjs +45 -0
  4. package/dist/lib/neutral/Entity.mjs +51 -0
  5. package/dist/lib/neutral/Err.mjs +10 -0
  6. package/dist/lib/neutral/Filter.mjs +61 -0
  7. package/dist/lib/neutral/Format.mjs +66 -0
  8. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  9. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  10. package/dist/lib/neutral/Key.mjs +12 -0
  11. package/dist/lib/neutral/Key.mjs.map +7 -0
  12. package/dist/lib/neutral/Obj.mjs +96 -0
  13. package/dist/lib/neutral/Obj.mjs.map +7 -0
  14. package/dist/lib/neutral/Order.mjs +12 -0
  15. package/dist/lib/neutral/Order.mjs.map +7 -0
  16. package/dist/lib/neutral/Query.mjs +26 -0
  17. package/dist/lib/neutral/Query.mjs.map +7 -0
  18. package/dist/lib/neutral/QueryResult.mjs +2 -0
  19. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  20. package/dist/lib/neutral/Ref.mjs +22 -0
  21. package/dist/lib/neutral/Ref.mjs.map +7 -0
  22. package/dist/lib/neutral/Relation.mjs +84 -0
  23. package/dist/lib/neutral/Relation.mjs.map +7 -0
  24. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  25. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  26. package/dist/lib/neutral/Tag.mjs +25 -0
  27. package/dist/lib/neutral/Tag.mjs.map +7 -0
  28. package/dist/lib/neutral/Type.mjs +47 -0
  29. package/dist/lib/neutral/Type.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-2AF5GMG6.mjs +171 -0
  31. package/dist/lib/neutral/chunk-2AF5GMG6.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-4L6DOFXP.mjs +7 -0
  33. package/dist/lib/neutral/chunk-4L6DOFXP.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-7WE7SBA2.mjs +402 -0
  35. package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
  37. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-DLPC7DHQ.mjs +56 -0
  39. package/dist/lib/neutral/chunk-DLPC7DHQ.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-EBUAT5ID.mjs +229 -0
  41. package/dist/lib/neutral/chunk-EBUAT5ID.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  43. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-K5K3Z62A.mjs +40 -0
  45. package/dist/lib/neutral/chunk-K5K3Z62A.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-KB7RIVLK.mjs +67 -0
  47. package/dist/lib/neutral/chunk-KB7RIVLK.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-LKFNEFHF.mjs +130 -0
  49. package/dist/lib/neutral/chunk-LKFNEFHF.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-MTEHHY62.mjs +251 -0
  51. package/dist/lib/neutral/chunk-MTEHHY62.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-N2QNHMT5.mjs +73 -0
  53. package/dist/lib/neutral/chunk-N2QNHMT5.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
  55. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-QARLJVDB.mjs +23 -0
  57. package/dist/lib/neutral/chunk-QARLJVDB.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-RIMHNJ3E.mjs +296 -0
  59. package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs +42 -0
  61. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-RPB6V4BE.mjs +38 -0
  63. package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-TLGNKUUG.mjs +3905 -0
  65. package/dist/lib/neutral/chunk-TLGNKUUG.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs +142 -0
  67. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-VUQGRDRI.mjs +97 -0
  69. package/dist/lib/neutral/chunk-VUQGRDRI.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-X2MPMYYN.mjs +13 -0
  71. package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-XAJMXQ4H.mjs +43 -0
  73. package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-ZAHWXGK4.mjs +287 -0
  75. package/dist/lib/neutral/chunk-ZAHWXGK4.mjs.map +7 -0
  76. package/dist/lib/neutral/index.mjs +84 -0
  77. package/dist/lib/neutral/index.mjs.map +7 -0
  78. package/dist/lib/{node-esm → neutral}/internal/index.mjs +251 -125
  79. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  80. package/dist/lib/neutral/meta.json +1 -0
  81. package/dist/lib/neutral/testing/index.mjs +366 -0
  82. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  83. package/dist/types/src/Annotation.d.ts +24 -0
  84. package/dist/types/src/Annotation.d.ts.map +1 -0
  85. package/dist/types/src/Database.d.ts +216 -0
  86. package/dist/types/src/Database.d.ts.map +1 -0
  87. package/dist/types/src/Entity.d.ts +142 -0
  88. package/dist/types/src/Entity.d.ts.map +1 -0
  89. package/dist/types/src/Entity.test.d.ts +2 -0
  90. package/dist/types/src/Entity.test.d.ts.map +1 -0
  91. package/dist/types/src/{errors.d.ts → Err.d.ts} +13 -17
  92. package/dist/types/src/Err.d.ts.map +1 -0
  93. package/dist/types/src/Filter.d.ts +120 -0
  94. package/dist/types/src/Filter.d.ts.map +1 -0
  95. package/dist/types/src/Format.d.ts +4 -0
  96. package/dist/types/src/Format.d.ts.map +1 -0
  97. package/dist/types/src/Hypergraph.d.ts +60 -0
  98. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  99. package/dist/types/src/JsonSchema.d.ts +9 -0
  100. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  101. package/dist/types/src/Key.d.ts +1 -0
  102. package/dist/types/src/Key.d.ts.map +1 -1
  103. package/dist/types/src/Obj.d.ts +325 -99
  104. package/dist/types/src/Obj.d.ts.map +1 -1
  105. package/dist/types/src/Obj.test.d.ts +2 -0
  106. package/dist/types/src/Obj.test.d.ts.map +1 -0
  107. package/dist/types/src/Order.d.ts +16 -0
  108. package/dist/types/src/Order.d.ts.map +1 -0
  109. package/dist/types/src/Query.d.ts +125 -0
  110. package/dist/types/src/Query.d.ts.map +1 -0
  111. package/dist/types/src/Query.test.d.ts +2 -0
  112. package/dist/types/src/Query.test.d.ts.map +1 -0
  113. package/dist/types/src/QueryResult.d.ts +80 -0
  114. package/dist/types/src/QueryResult.d.ts.map +1 -0
  115. package/dist/types/src/Ref.d.ts +13 -11
  116. package/dist/types/src/Ref.d.ts.map +1 -1
  117. package/dist/types/src/Relation.d.ts +243 -23
  118. package/dist/types/src/Relation.d.ts.map +1 -1
  119. package/dist/types/src/Relation.test.d.ts +2 -0
  120. package/dist/types/src/Relation.test.d.ts.map +1 -0
  121. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  122. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  123. package/dist/types/src/Tag.d.ts +7 -7
  124. package/dist/types/src/Tag.d.ts.map +1 -1
  125. package/dist/types/src/Type.d.ts +225 -72
  126. package/dist/types/src/Type.d.ts.map +1 -1
  127. package/dist/types/src/Type.test.d.ts +2 -0
  128. package/dist/types/src/Type.test.d.ts.map +1 -0
  129. package/dist/types/src/hierarchy.test.d.ts +2 -0
  130. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  131. package/dist/types/src/index.d.ts +14 -5
  132. package/dist/types/src/index.d.ts.map +1 -1
  133. package/dist/types/src/internal/annotations/annotations.d.ts +177 -0
  134. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  135. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  136. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  137. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  138. package/dist/types/src/internal/annotations/util.d.ts +39 -0
  139. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  140. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  141. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  142. package/dist/types/src/internal/api/entity.d.ts +13 -0
  143. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  144. package/dist/types/src/internal/api/index.d.ts +15 -0
  145. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  146. package/dist/types/src/internal/api/meta.d.ts +42 -0
  147. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  148. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  149. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  150. package/dist/types/src/internal/api/version.d.ts +42 -0
  151. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  152. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  153. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  154. package/dist/types/src/internal/entities/index.d.ts +6 -0
  155. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  156. package/dist/types/src/internal/entities/model.d.ts +79 -0
  157. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  158. package/dist/types/src/internal/entities/object.d.ts +18 -0
  159. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  160. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  161. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  162. package/dist/types/src/internal/entities/util.d.ts +2 -0
  163. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  164. package/dist/types/src/internal/formats/format.d.ts +4 -2
  165. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  166. package/dist/types/src/internal/formats/select.d.ts +6 -4
  167. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  168. package/dist/types/src/internal/formats/string.d.ts +4 -0
  169. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  170. package/dist/types/src/internal/formats/types.d.ts +13 -9
  171. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  172. package/dist/types/src/internal/index.d.ts +7 -10
  173. package/dist/types/src/internal/index.d.ts.map +1 -1
  174. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  175. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  176. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  177. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  178. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  179. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  180. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  181. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +4 -2
  182. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  183. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  184. package/dist/types/src/internal/object/clone.d.ts +8 -0
  185. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  186. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  187. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +9 -10
  188. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  189. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  190. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  191. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  192. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  193. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  194. package/dist/types/src/internal/object/index.d.ts +6 -11
  195. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  196. package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
  197. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  198. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  199. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  200. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  201. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  202. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  203. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  204. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  205. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  206. package/dist/types/src/internal/object/typed-object.d.ts +8 -14
  207. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  208. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  209. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  210. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  211. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  212. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  213. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  214. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  215. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  216. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  217. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  218. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  219. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  220. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  221. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  222. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  223. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  224. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  225. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  226. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  227. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  228. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  229. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  230. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  231. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  232. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  233. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  234. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  235. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  236. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  237. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  238. package/dist/types/src/internal/proxy/typed-handler.d.ts +16 -12
  239. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  240. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  241. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  242. package/dist/types/src/internal/ref/ref.d.ts +43 -18
  243. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  244. package/dist/types/src/internal/schema/compose.d.ts +7 -0
  245. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  246. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  247. package/dist/types/src/internal/schema/echo-schema.d.ts +25 -12
  248. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  249. package/dist/types/src/internal/schema/index.d.ts +1 -4
  250. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  251. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  252. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  253. package/dist/types/src/internal/types/base.d.ts +26 -0
  254. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  255. package/dist/types/src/internal/types/entity.d.ts +37 -0
  256. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  257. package/dist/types/src/internal/types/index.d.ts +5 -2
  258. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  259. package/dist/types/src/internal/{object → types}/meta.d.ts +17 -16
  260. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  261. package/dist/types/src/internal/types/typename.d.ts +21 -0
  262. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  263. package/dist/types/src/internal/{object → types}/version.d.ts +3 -2
  264. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  265. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  266. package/dist/types/src/testing/index.d.ts +3 -3
  267. package/dist/types/src/testing/index.d.ts.map +1 -1
  268. package/dist/types/src/testing/test-data.d.ts +18 -0
  269. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  270. package/dist/types/src/testing/test-schema.d.ts +303 -0
  271. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  272. package/dist/types/src/testing/util.d.ts +21 -0
  273. package/dist/types/src/testing/util.d.ts.map +1 -0
  274. package/dist/types/tsconfig.tsbuildinfo +1 -1
  275. package/package.json +101 -65
  276. package/src/Annotation.ts +45 -0
  277. package/src/Database.ts +353 -0
  278. package/src/Entity.test.ts +22 -0
  279. package/src/Entity.ts +217 -0
  280. package/src/{errors.ts → Err.ts} +2 -2
  281. package/src/Filter.ts +376 -0
  282. package/src/Format.ts +9 -0
  283. package/src/Hypergraph.ts +74 -0
  284. package/src/JsonSchema.ts +16 -0
  285. package/src/Key.ts +3 -0
  286. package/src/Obj.test.ts +412 -0
  287. package/src/Obj.ts +489 -289
  288. package/src/Order.ts +44 -0
  289. package/src/Query.test.ts +465 -0
  290. package/src/Query.ts +324 -0
  291. package/src/QueryResult.ts +106 -0
  292. package/src/Ref.ts +26 -9
  293. package/src/Relation.test.ts +82 -0
  294. package/src/Relation.ts +414 -61
  295. package/src/SchemaRegistry.ts +105 -0
  296. package/src/Tag.ts +3 -2
  297. package/src/Type.test.ts +52 -0
  298. package/src/Type.ts +361 -114
  299. package/src/hierarchy.test.ts +33 -0
  300. package/src/index.ts +15 -6
  301. package/src/internal/README.md +102 -0
  302. package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
  303. package/src/internal/annotations/annotations.ts +487 -0
  304. package/src/internal/annotations/index.ts +6 -0
  305. package/src/internal/annotations/util.ts +85 -0
  306. package/src/internal/api/annotations.ts +60 -0
  307. package/src/internal/api/entity.ts +29 -0
  308. package/src/internal/api/index.ts +19 -0
  309. package/src/internal/api/meta.ts +88 -0
  310. package/src/internal/api/sorting.ts +53 -0
  311. package/src/internal/api/version.ts +96 -0
  312. package/src/internal/entities/entity.ts +126 -0
  313. package/src/internal/entities/index.ts +9 -0
  314. package/src/internal/entities/model.ts +138 -0
  315. package/src/internal/entities/object.ts +58 -0
  316. package/src/internal/entities/relation.ts +171 -0
  317. package/src/internal/entities/util.ts +33 -0
  318. package/src/internal/formats/date.test.ts +1 -1
  319. package/src/internal/formats/date.ts +5 -5
  320. package/src/internal/formats/format.test.ts +6 -6
  321. package/src/internal/formats/format.ts +8 -6
  322. package/src/internal/formats/number.ts +5 -5
  323. package/src/internal/formats/object.ts +4 -4
  324. package/src/internal/formats/select.ts +6 -4
  325. package/src/internal/formats/string.ts +14 -9
  326. package/src/internal/formats/types.ts +53 -42
  327. package/src/internal/index.ts +30 -13
  328. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  329. package/src/internal/json-schema/index.ts +2 -0
  330. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  331. package/src/internal/json-schema/json-schema-type.ts +35 -35
  332. package/src/internal/{json → json-schema}/json-schema.test.ts +67 -55
  333. package/src/internal/{json → json-schema}/json-schema.ts +27 -14
  334. package/src/internal/object/clone.ts +48 -0
  335. package/src/internal/object/common.ts +3 -4
  336. package/src/internal/object/{create.test.ts → create-object.test.ts} +30 -32
  337. package/src/internal/object/{create.ts → create-object.ts} +35 -36
  338. package/src/internal/object/deleted.ts +6 -6
  339. package/src/internal/object/ids.ts +1 -1
  340. package/src/internal/object/index.ts +6 -11
  341. package/src/internal/object/inspect.ts +5 -7
  342. package/src/internal/object/json-serializer.test.ts +36 -37
  343. package/src/internal/object/json-serializer.ts +74 -102
  344. package/src/internal/object/schema-validator.test.ts +3 -7
  345. package/src/internal/object/schema-validator.ts +2 -237
  346. package/src/internal/object/set-value.test.ts +281 -0
  347. package/src/internal/object/set-value.ts +165 -0
  348. package/src/internal/object/snapshot.ts +93 -0
  349. package/src/internal/object/typed-object.test.ts +11 -11
  350. package/src/internal/object/typed-object.ts +8 -66
  351. package/src/internal/proxy/change-context.ts +138 -0
  352. package/src/internal/proxy/change.test.ts +519 -0
  353. package/src/internal/proxy/define-hidden-property.ts +14 -0
  354. package/src/internal/proxy/errors.ts +42 -0
  355. package/src/internal/proxy/event-batch.ts +44 -0
  356. package/src/internal/proxy/handler.test.ts +51 -91
  357. package/src/internal/proxy/index.ts +17 -0
  358. package/src/internal/proxy/json-serializer.ts +87 -0
  359. package/src/internal/proxy/make-object.ts +106 -0
  360. package/src/internal/proxy/ownership.ts +253 -0
  361. package/src/internal/proxy/proxy-types.ts +23 -0
  362. package/src/internal/proxy/proxy-utils.ts +150 -0
  363. package/src/internal/proxy/reactive-array.ts +71 -0
  364. package/src/internal/proxy/reactive.ts +69 -0
  365. package/src/internal/proxy/schema-validator.ts +244 -0
  366. package/src/internal/proxy/schema.test.ts +27 -18
  367. package/src/internal/proxy/symbols.ts +7 -0
  368. package/src/internal/proxy/typed-handler.test.ts +260 -48
  369. package/src/internal/proxy/typed-handler.ts +280 -58
  370. package/src/internal/proxy/typed-object.test.ts +53 -37
  371. package/src/internal/ref/ref-array.ts +4 -4
  372. package/src/internal/ref/ref.test.ts +9 -8
  373. package/src/internal/ref/ref.ts +107 -56
  374. package/src/internal/{projection → schema}/compose.test.ts +8 -9
  375. package/src/internal/{projection → schema}/compose.ts +13 -8
  376. package/src/internal/schema/echo-schema.ts +74 -33
  377. package/src/internal/schema/index.ts +1 -4
  378. package/src/internal/schema/manipulation.ts +1 -1
  379. package/src/internal/schema/persistent-schema.ts +28 -0
  380. package/src/internal/types/base.ts +43 -0
  381. package/src/internal/types/entity.ts +54 -0
  382. package/src/internal/types/index.ts +5 -2
  383. package/src/internal/types/meta.ts +65 -0
  384. package/src/internal/types/typename.ts +55 -0
  385. package/src/internal/types/version.ts +20 -0
  386. package/src/testing/api.test.ts +126 -0
  387. package/src/testing/index.ts +3 -3
  388. package/src/testing/test-data.ts +130 -0
  389. package/src/testing/test-schema.ts +238 -0
  390. package/src/testing/util.ts +85 -0
  391. package/dist/lib/browser/chunk-BIDAASFK.mjs +0 -3727
  392. package/dist/lib/browser/chunk-BIDAASFK.mjs.map +0 -7
  393. package/dist/lib/browser/chunk-ZDLCWGEW.mjs +0 -410
  394. package/dist/lib/browser/chunk-ZDLCWGEW.mjs.map +0 -7
  395. package/dist/lib/browser/chunk-ZFRJKT4A.mjs +0 -585
  396. package/dist/lib/browser/chunk-ZFRJKT4A.mjs.map +0 -7
  397. package/dist/lib/browser/index.mjs +0 -35
  398. package/dist/lib/browser/internal/index.mjs +0 -336
  399. package/dist/lib/browser/meta.json +0 -1
  400. package/dist/lib/browser/query/index.mjs +0 -13
  401. package/dist/lib/browser/testing/index.mjs +0 -267
  402. package/dist/lib/browser/testing/index.mjs.map +0 -7
  403. package/dist/lib/node-esm/chunk-3SVRRCUU.mjs +0 -3727
  404. package/dist/lib/node-esm/chunk-3SVRRCUU.mjs.map +0 -7
  405. package/dist/lib/node-esm/chunk-CGDHRZWH.mjs +0 -585
  406. package/dist/lib/node-esm/chunk-CGDHRZWH.mjs.map +0 -7
  407. package/dist/lib/node-esm/chunk-HWS6VBQC.mjs +0 -410
  408. package/dist/lib/node-esm/chunk-HWS6VBQC.mjs.map +0 -7
  409. package/dist/lib/node-esm/index.mjs +0 -35
  410. package/dist/lib/node-esm/meta.json +0 -1
  411. package/dist/lib/node-esm/query/index.mjs +0 -13
  412. package/dist/lib/node-esm/testing/index.mjs +0 -267
  413. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  414. package/dist/types/src/errors.d.ts.map +0 -1
  415. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  416. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  417. package/dist/types/src/internal/ast/annotations.d.ts +0 -131
  418. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  419. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  420. package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
  421. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  422. package/dist/types/src/internal/ast/index.d.ts +0 -5
  423. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  424. package/dist/types/src/internal/ast/types.d.ts +0 -6
  425. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  426. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  427. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  428. package/dist/types/src/internal/json/index.d.ts +0 -2
  429. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  430. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  431. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  432. package/dist/types/src/internal/object/accessors.d.ts +0 -37
  433. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  434. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  435. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  436. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  437. package/dist/types/src/internal/object/entity.d.ts +0 -33
  438. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  439. package/dist/types/src/internal/object/expando.d.ts +0 -14
  440. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  441. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  442. package/dist/types/src/internal/object/model.d.ts +0 -117
  443. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  444. package/dist/types/src/internal/object/relation.d.ts +0 -17
  445. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  446. package/dist/types/src/internal/object/typename.d.ts +0 -15
  447. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  448. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  449. package/dist/types/src/internal/projection/compose.d.ts +0 -6
  450. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  451. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  452. package/dist/types/src/internal/projection/index.d.ts +0 -2
  453. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  454. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  455. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  456. package/dist/types/src/internal/query/index.d.ts +0 -2
  457. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  458. package/dist/types/src/internal/query/query.d.ts +0 -17
  459. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  460. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  461. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  462. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  463. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  464. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  465. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  466. package/dist/types/src/internal/testing/index.d.ts +0 -3
  467. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  468. package/dist/types/src/internal/testing/types.d.ts +0 -381
  469. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  470. package/dist/types/src/internal/testing/utils.d.ts +0 -10
  471. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  472. package/dist/types/src/internal/types/types.d.ts +0 -79
  473. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  474. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  475. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  476. package/dist/types/src/internal/types/util.d.ts +0 -5
  477. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  478. package/dist/types/src/query/index.d.ts +0 -2
  479. package/dist/types/src/query/index.d.ts.map +0 -1
  480. package/dist/types/src/query/query.d.ts +0 -248
  481. package/dist/types/src/query/query.d.ts.map +0 -1
  482. package/dist/types/src/query/query.test.d.ts +0 -2
  483. package/dist/types/src/query/query.test.d.ts.map +0 -1
  484. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  485. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  486. package/dist/types/src/testing/types.d.ts +0 -228
  487. package/dist/types/src/testing/types.d.ts.map +0 -1
  488. package/src/internal/ast/annotation-helper.ts +0 -22
  489. package/src/internal/ast/annotations.ts +0 -226
  490. package/src/internal/ast/entity-kind.ts +0 -15
  491. package/src/internal/ast/index.ts +0 -8
  492. package/src/internal/ast/types.ts +0 -17
  493. package/src/internal/json/index.ts +0 -5
  494. package/src/internal/object/accessors.ts +0 -153
  495. package/src/internal/object/entity.ts +0 -248
  496. package/src/internal/object/expando.ts +0 -21
  497. package/src/internal/object/meta.ts +0 -61
  498. package/src/internal/object/model.ts +0 -170
  499. package/src/internal/object/relation.ts +0 -24
  500. package/src/internal/object/typename.ts +0 -61
  501. package/src/internal/object/version.ts +0 -22
  502. package/src/internal/projection/index.ts +0 -5
  503. package/src/internal/proxy/reactive-object.ts +0 -108
  504. package/src/internal/query/index.ts +0 -5
  505. package/src/internal/query/query.ts +0 -23
  506. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  507. package/src/internal/schema/snapshot.ts +0 -25
  508. package/src/internal/schema/stored-schema.ts +0 -26
  509. package/src/internal/testing/index.ts +0 -6
  510. package/src/internal/testing/types.ts +0 -144
  511. package/src/internal/testing/utils.ts +0 -54
  512. package/src/internal/types/types.test.ts +0 -48
  513. package/src/internal/types/types.ts +0 -176
  514. package/src/internal/types/util.ts +0 -9
  515. package/src/query/index.ts +0 -6
  516. package/src/query/query.test.ts +0 -401
  517. package/src/query/query.ts +0 -789
  518. package/src/test/api.test.ts +0 -180
  519. package/src/testing/echo-schema.ts +0 -39
  520. package/src/testing/types.ts +0 -108
  521. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  522. /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
  523. /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
  524. /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
  525. /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Filter.mjs.map} +0 -0
  526. /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Format.mjs.map} +0 -0
  527. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  528. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  529. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  530. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  531. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  532. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  533. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
package/src/Relation.ts CHANGED
@@ -2,147 +2,500 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import * as Schema from 'effect/Schema';
5
+ import type * as Schema from 'effect/Schema';
6
6
 
7
7
  import { raise } from '@dxos/debug';
8
+ import type { ForeignKey } from '@dxos/echo-protocol';
9
+ import { createJsonPath, getValue as getValue$ } from '@dxos/effect';
8
10
  import { assertArgument, invariant } from '@dxos/invariant';
9
- import { DXN } from '@dxos/keys';
10
- import { type Live } from '@dxos/live-object';
11
+ import { DXN, type ObjectId } from '@dxos/keys';
11
12
  import { assumeType } from '@dxos/util';
12
13
 
13
- import { live } from './internal';
14
- import * as EchoSchema from './internal';
15
- import * as Obj from './Obj';
16
- import * as Type from './Type';
14
+ import type * as Database from './Database';
15
+ import * as Entity from './Entity';
16
+ import {
17
+ type ObjectJSON as APIJSON,
18
+ ATTR_RELATION_SOURCE,
19
+ ATTR_RELATION_TARGET,
20
+ type AnyEntity,
21
+ type Comparator as ApiComparator,
22
+ type Meta as ApiMeta,
23
+ type ReadonlyMeta as ApiReadonlyMeta,
24
+ type EntityVersion as ApiVersion,
25
+ type ChangeCallback,
26
+ EntityKind,
27
+ type InternalObjectProps,
28
+ type KindId,
29
+ MetaId,
30
+ type Mutable,
31
+ type ObjectMeta,
32
+ ParentId,
33
+ RelationSourceDXNId,
34
+ RelationSourceId,
35
+ RelationTargetDXNId,
36
+ RelationTargetId,
37
+ SnapshotKindId,
38
+ VersionTypeId,
39
+ addTag as addTag$,
40
+ change as change$,
41
+ deleteKeys as deleteKeys$,
42
+ getDXN as getDXN$,
43
+ getDatabase as getDatabase$,
44
+ getDescription as getDescription$,
45
+ getKeys as getKeys$,
46
+ getLabel as getLabel$,
47
+ getMetaChecked as getMeta$,
48
+ getObjectDXN,
49
+ getSchema as getSchema$,
50
+ getSnapshot as getSnapshot$,
51
+ getTypeAnnotation,
52
+ getTypeDXN as getTypeDXN$,
53
+ getTypename as getTypename$,
54
+ isDeleted as isDeleted$,
55
+ isVersion,
56
+ makeObject,
57
+ removeTag as removeTag$,
58
+ setDescription as setDescription$,
59
+ setLabel as setLabel$,
60
+ setValue as setValue$,
61
+ sort as sort$,
62
+ sortByLabel as sortByLabel$,
63
+ sortByTypename as sortByTypename$,
64
+ subscribe as subscribe$,
65
+ objectToJSON as toJSON$,
66
+ version as version$,
67
+ } from './internal';
68
+ import type * as Obj from './Obj';
69
+ import type * as Type from './Type';
17
70
 
18
71
  /**
19
- * NOTE: Don't export: Relation.Relation and Relation.Any form the public API.
72
+ * Base type for all ECHO relations.
73
+ * @private
20
74
  */
21
75
  interface BaseRelation<Source, Target>
22
- extends EchoSchema.HasId,
76
+ extends AnyEntity,
23
77
  Type.Relation.Endpoints<Source, Target>,
24
- Type.OfKind<EchoSchema.EntityKind.Relation> {}
78
+ Entity.OfKind<EntityKind.Relation> {}
25
79
 
26
80
  /**
27
- * Relation type with specific properties.
81
+ * Relation with no known properties beyond id, kind, source, and target.
82
+ * Use this when the relation's schema/properties are not known.
83
+ *
84
+ * NOTE: This is a TypeScript type only, not a schema.
85
+ * To validate that a value is an ECHO relation, use `Relation.isRelation`.
28
86
  */
29
- export type Relation<Source extends Obj.Any, Target extends Obj.Any, Props> = BaseRelation<Source, Target> & Props;
87
+ export interface Unknown extends BaseRelation<Obj.Unknown, Obj.Unknown> {}
30
88
 
31
89
  /**
32
- * Base type for all ECHO relations.
90
+ * Relation type with specific source and target types.
33
91
  */
34
- export interface Any extends BaseRelation<Obj.Any, Obj.Any> {}
92
+ export type Relation<Source extends Obj.Unknown, Target extends Obj.Unknown, Props> = BaseRelation<Source, Target> &
93
+ Props;
35
94
 
36
- export const Any = Schema.Struct({}).pipe(
37
- Type.Relation({
38
- typename: 'dxos.org/types/Any',
39
- version: '0.1.0',
40
- source: Obj.Any,
41
- target: Obj.Any,
42
- }),
43
- );
95
+ /**
96
+ * Base type for snapshot relations (has SnapshotKindId instead of KindId).
97
+ */
98
+ interface BaseRelationSnapshot<Source, Target> extends AnyEntity, Type.Relation.Endpoints<Source, Target> {
99
+ readonly [SnapshotKindId]: EntityKind.Relation;
100
+ readonly id: ObjectId;
101
+ }
44
102
 
45
- // TODO(dmaretskyi): Has to be `unique symbol`.
46
- export const Source: unique symbol = EchoSchema.RelationSourceId as any;
103
+ /**
104
+ * Immutable snapshot of an ECHO relation.
105
+ * Branded with SnapshotKindId (not KindId).
106
+ * Property values are frozen at the time the snapshot was created.
107
+ * Returned by getSnapshot() and hooks.
108
+ */
109
+ export type Snapshot<T extends Unknown = Unknown> = Omit<T, KindId> & BaseRelationSnapshot<Obj.Unknown, Obj.Unknown>;
110
+
111
+ export const Source: unique symbol = RelationSourceId as any;
47
112
  export type Source = typeof Source;
48
- export const Target: unique symbol = EchoSchema.RelationTargetId as any;
113
+
114
+ export const Target: unique symbol = RelationTargetId as any;
49
115
  export type Target = typeof Target;
50
116
 
51
- type MakeProps<T extends Any> = {
52
- id?: EchoSchema.ObjectId;
117
+ /**
118
+ * Internal props type for relation instance creation.
119
+ */
120
+ type RelationMakeProps<T extends Unknown> = {
121
+ id?: ObjectId;
122
+ [MetaId]?: ObjectMeta;
53
123
  [Source]: T[Source];
54
124
  [Target]: T[Target];
55
125
  } & Type.Properties<T>;
56
126
 
127
+ /**
128
+ * Props type for relation creation with a given schema.
129
+ * Takes a schema type (created with Type.Relation) and extracts the props type.
130
+ */
131
+ export type MakeProps<S extends Type.Relation.Any> = RelationMakeProps<Schema.Schema.Type<S>>;
132
+
57
133
  /**
58
134
  * Creates new relation.
59
135
  * @param schema - Relation schema.
60
136
  * @param props - Relation properties. Endpoints are passed as [Relation.Source] and [Relation.Target] keys.
61
- * @param meta - Relation metadata.
137
+ * @param meta - Relation metadata. (deprecated; use [Obj.Meta] instead)
62
138
  * @returns
63
139
  */
64
140
  // NOTE: Writing the definition this way (with generic over schema) makes typescript perfer to infer the type from the first param (this schema) rather than the second param (the props).
65
141
  // TODO(dmaretskyi): Move meta into props.
66
142
  export const make = <S extends Type.Relation.Any>(
67
143
  schema: S,
68
- props: NoInfer<MakeProps<Schema.Schema.Type<S>>>,
69
- meta?: EchoSchema.ObjectMeta,
70
- ): Live<Schema.Schema.Type<S> & Type.OfKind<EchoSchema.EntityKind.Relation>> => {
71
- assertArgument(
72
- EchoSchema.getTypeAnnotation(schema)?.kind === EchoSchema.EntityKind.Relation,
73
- 'schema',
74
- 'Expected a relation schema',
75
- );
76
-
77
- if (props[EchoSchema.MetaId] != null) {
78
- meta = props[EchoSchema.MetaId] as any;
79
- delete props[EchoSchema.MetaId];
144
+ props: NoInfer<RelationMakeProps<Schema.Schema.Type<S>>>,
145
+ meta?: ObjectMeta,
146
+ ): Schema.Schema.Type<S> & Entity.OfKind<typeof Entity.Kind.Relation> => {
147
+ assertArgument(getTypeAnnotation(schema)?.kind === EntityKind.Relation, 'schema', 'Expected a relation schema');
148
+ assertArgument(props[ParentId] === undefined, 'props', 'Parent is not allowed for relations');
149
+
150
+ if (props[MetaId] != null) {
151
+ meta = props[MetaId] as any;
152
+ delete props[MetaId];
80
153
  }
81
154
 
82
- const sourceDXN = EchoSchema.getObjectDXN(props[Source]) ?? raise(new Error('Unresolved relation source'));
83
- const targetDXN = EchoSchema.getObjectDXN(props[Target]) ?? raise(new Error('Unresolved relation target'));
84
- (props as any)[EchoSchema.RelationSourceDXNId] = sourceDXN;
85
- (props as any)[EchoSchema.RelationTargetDXNId] = targetDXN;
155
+ const sourceDXN = getObjectDXN(props[Source]) ?? raise(new Error('Unresolved relation source'));
156
+ const targetDXN = getObjectDXN(props[Target]) ?? raise(new Error('Unresolved relation target'));
86
157
 
87
- return live<Schema.Schema.Type<S>>(schema, props as any, meta);
158
+ (props as any)[RelationSourceDXNId] = sourceDXN;
159
+ (props as any)[RelationTargetDXNId] = targetDXN;
160
+
161
+ return makeObject<Schema.Schema.Type<S>>(schema, props as any, meta);
88
162
  };
89
163
 
90
- export const isRelation = (value: unknown): value is Any => {
164
+ /**
165
+ * Type guard for relations.
166
+ * Returns true for both reactive relations and relation snapshots.
167
+ */
168
+ export const isRelation = (value: unknown): value is Unknown => {
91
169
  if (typeof value !== 'object' || value === null) {
92
170
  return false;
93
171
  }
94
- if (EchoSchema.ATTR_RELATION_SOURCE in value || EchoSchema.ATTR_RELATION_TARGET in value) {
172
+ if (ATTR_RELATION_SOURCE in value || ATTR_RELATION_TARGET in value) {
95
173
  return true;
96
174
  }
97
175
 
98
- const kind = (value as any)[EchoSchema.EntityKindId];
99
- return kind === EchoSchema.EntityKind.Relation;
176
+ // Check for reactive relation (KindId) or snapshot (SnapshotKindId).
177
+ const kind = (value as any)[Entity.KindId] ?? (value as any)[SnapshotKindId];
178
+ return kind === EntityKind.Relation;
100
179
  };
101
180
 
102
181
  /**
103
182
  * @returns Relation source DXN.
183
+ * Accepts both reactive relations and snapshots.
104
184
  * @throws If the object is not a relation.
105
185
  */
106
- export const getSourceDXN = (value: Any): DXN => {
186
+ export const getSourceDXN = (value: Unknown | Snapshot): DXN => {
107
187
  assertArgument(isRelation(value), 'Expected a relation');
108
- assumeType<EchoSchema.InternalObjectProps>(value);
109
- const dxn = (value as EchoSchema.InternalObjectProps)[EchoSchema.RelationSourceDXNId];
188
+ assumeType<InternalObjectProps>(value);
189
+ const dxn = (value as InternalObjectProps)[RelationSourceDXNId];
110
190
  invariant(dxn instanceof DXN);
111
191
  return dxn;
112
192
  };
113
193
 
114
194
  /**
115
195
  * @returns Relation target DXN.
196
+ * Accepts both reactive relations and snapshots.
116
197
  * @throws If the object is not a relation.
117
198
  */
118
- export const getTargetDXN = (value: Any): DXN => {
199
+ export const getTargetDXN = (value: Unknown | Snapshot): DXN => {
119
200
  assertArgument(isRelation(value), 'Expected a relation');
120
- assumeType<EchoSchema.InternalObjectProps>(value);
121
- const dxn = (value as EchoSchema.InternalObjectProps)[EchoSchema.RelationTargetDXNId];
201
+ assumeType<InternalObjectProps>(value);
202
+ const dxn = (value as InternalObjectProps)[RelationTargetDXNId];
122
203
  invariant(dxn instanceof DXN);
123
204
  return dxn;
124
205
  };
125
206
 
126
207
  /**
127
208
  * @returns Relation source.
209
+ * Accepts both reactive relations and snapshots.
128
210
  * @throws If the object is not a relation.
129
211
  */
130
- export const getSource = <T extends Any>(relation: T): Type.Relation.Source<T> => {
212
+ export const getSource = <T extends Unknown | Snapshot>(relation: T): Type.Relation.Source<T> => {
131
213
  assertArgument(isRelation(relation), 'Expected a relation');
132
- assumeType<EchoSchema.InternalObjectProps>(relation);
133
- const obj = (relation as EchoSchema.InternalObjectProps)[EchoSchema.RelationSourceId];
214
+ assumeType<InternalObjectProps>(relation);
215
+ const obj = (relation as InternalObjectProps)[RelationSourceId];
134
216
  invariant(obj !== undefined, `Invalid source: ${relation.id}`);
135
217
  return obj as Type.Relation.Source<T>;
136
218
  };
137
219
 
138
220
  /**
139
221
  * @returns Relation target.
222
+ * Accepts both reactive relations and snapshots.
140
223
  * @throws If the object is not a relation.
141
224
  */
142
- export const getTarget = <T extends Any>(relation: T): Type.Relation.Target<T> => {
225
+ export const getTarget = <T extends Unknown | Snapshot>(relation: T): Type.Relation.Target<T> => {
143
226
  assertArgument(isRelation(relation), 'Expected a relation');
144
- assumeType<EchoSchema.InternalObjectProps>(relation);
145
- const obj = (relation as EchoSchema.InternalObjectProps)[EchoSchema.RelationTargetId];
227
+ assumeType<InternalObjectProps>(relation);
228
+ const obj = (relation as InternalObjectProps)[RelationTargetId];
146
229
  invariant(obj !== undefined, `Invalid target: ${relation.id}`);
147
230
  return obj as Type.Relation.Target<T>;
148
231
  };
232
+
233
+ //
234
+ // Change
235
+ //
236
+
237
+ /**
238
+ * Makes all properties mutable recursively.
239
+ * Used to provide a mutable view of a relation within `Relation.change`.
240
+ */
241
+ export type { Mutable };
242
+
243
+ /**
244
+ * Perform mutations on an echo relation within a controlled context.
245
+ *
246
+ * All mutations within the callback are batched and trigger a single notification
247
+ * when the callback completes. Direct mutations outside of `Relation.change` will throw
248
+ * an error for echo relations.
249
+ *
250
+ * @param relation - The echo relation to mutate. Use `Obj.change` for objects.
251
+ * @param callback - The callback that performs mutations on the relation.
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * const worksFor = Relation.make(EmployedBy, {
256
+ * [Relation.Source]: person,
257
+ * [Relation.Target]: company,
258
+ * role: 'Engineer',
259
+ * });
260
+ *
261
+ * // Mutate within Relation.change
262
+ * Relation.change(worksFor, (r) => {
263
+ * r.role = 'Senior Engineer';
264
+ * });
265
+ * ```
266
+ *
267
+ * Note: Only accepts relations. Use `Obj.change` for objects.
268
+ */
269
+ export const change = <T extends Unknown>(relation: T, callback: ChangeCallback<T>): void => {
270
+ change$(relation, callback);
271
+ };
272
+
273
+ //
274
+ // Snapshot
275
+ //
276
+
277
+ /**
278
+ * Returns an immutable snapshot of a relation.
279
+ * The snapshot is branded with SnapshotKindId instead of KindId,
280
+ * making it distinguishable from the reactive relation at the type level.
281
+ */
282
+ export const getSnapshot: <T extends Unknown>(rel: T) => Snapshot<T> = getSnapshot$ as any;
283
+
284
+ //
285
+ // Subscribe
286
+ //
287
+
288
+ /**
289
+ * Subscribe to relation updates.
290
+ * The callback is called synchronously when the relation is modified.
291
+ * Only accepts reactive relations (not snapshots).
292
+ * @returns Unsubscribe function.
293
+ */
294
+ export const subscribe = (rel: Unknown, callback: () => void): (() => void) => {
295
+ return subscribe$(rel, callback);
296
+ };
297
+
298
+ //
299
+ // Property Access
300
+ //
301
+
302
+ /**
303
+ * Get a deeply nested property from a relation.
304
+ * Accepts both reactive relations and snapshots.
305
+ */
306
+ export const getValue = (rel: Unknown | Snapshot, path: readonly (string | number)[]): any => {
307
+ return getValue$(rel, createJsonPath(path));
308
+ };
309
+
310
+ /**
311
+ * Set a deeply nested property on a relation.
312
+ * Must be called within a `Relation.change` callback.
313
+ *
314
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
315
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
316
+ */
317
+ export const setValue: (rel: Mutable<Unknown>, path: readonly (string | number)[], value: any) => void =
318
+ setValue$ as any;
319
+
320
+ //
321
+ // Type
322
+ //
323
+
324
+ /**
325
+ * Get the DXN of the relation.
326
+ * Accepts both reactive relations and snapshots.
327
+ */
328
+ export const getDXN = (entity: Unknown | Snapshot): DXN => getDXN$(entity);
329
+
330
+ /**
331
+ * @returns The DXN of the relation's type.
332
+ */
333
+ export const getTypeDXN = getTypeDXN$;
334
+
335
+ /**
336
+ * Get the schema of the relation.
337
+ * Returns the branded ECHO schema used to create the relation.
338
+ */
339
+ export const getSchema: (rel: unknown | undefined) => Type.Entity.Any | undefined = getSchema$ as any;
340
+
341
+ /**
342
+ * @returns The typename of the relation's type.
343
+ * Accepts both reactive relations and snapshots.
344
+ */
345
+ export const getTypename = (entity: Unknown | Snapshot): string | undefined => getTypename$(entity);
346
+
347
+ //
348
+ // Database
349
+ //
350
+
351
+ /**
352
+ * Get the database the relation belongs to.
353
+ * Accepts both reactive relations and snapshots.
354
+ */
355
+ export const getDatabase = (entity: Unknown | Snapshot): Database.Database | undefined => getDatabase$(entity);
356
+
357
+ //
358
+ // Meta
359
+ //
360
+
361
+ /**
362
+ * Deeply read-only version of ObjectMeta.
363
+ */
364
+ export type ReadonlyMeta = ApiReadonlyMeta;
365
+
366
+ /**
367
+ * Mutable meta type returned by `Relation.getMeta` inside a `Relation.change` callback.
368
+ */
369
+ export type Meta = ApiMeta;
370
+
371
+ /**
372
+ * Get the metadata for a relation.
373
+ * Returns mutable meta when passed a mutable relation (inside `Relation.change` callback).
374
+ * Returns read-only meta when passed a regular relation or snapshot.
375
+ */
376
+ // TODO(wittjosiah): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
377
+ export function getMeta(entity: Mutable<Unknown>): Meta;
378
+ export function getMeta(entity: Unknown | Snapshot): ReadonlyMeta;
379
+ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | ReadonlyMeta {
380
+ return getMeta$(entity);
381
+ }
382
+
383
+ /**
384
+ * @returns Foreign keys for the relation from the specified source.
385
+ * Accepts both reactive relations and snapshots.
386
+ */
387
+ export const getKeys = (entity: Unknown | Snapshot, source: string): ForeignKey[] => getKeys$(entity, source);
388
+
389
+ /**
390
+ * Delete all keys from the relation for the specified source.
391
+ * Must be called within a `Relation.change` callback.
392
+ *
393
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
394
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
395
+ */
396
+ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => deleteKeys$(entity, source);
397
+
398
+ /**
399
+ * Add a tag to the relation.
400
+ * Must be called within a `Relation.change` callback.
401
+ *
402
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
403
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
404
+ */
405
+ export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag$(entity, tag);
406
+
407
+ /**
408
+ * Remove a tag from the relation.
409
+ * Must be called within a `Relation.change` callback.
410
+ *
411
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
412
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
413
+ */
414
+ export const removeTag = (entity: Mutable<Unknown>, tag: string): void => removeTag$(entity, tag);
415
+
416
+ /**
417
+ * Check if the relation is deleted.
418
+ * Accepts both reactive relations and snapshots.
419
+ */
420
+ export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(entity);
421
+
422
+ //
423
+ // Annotations
424
+ //
425
+
426
+ /**
427
+ * Get the label of the relation.
428
+ * Accepts both reactive relations and snapshots.
429
+ */
430
+ export const getLabel = (entity: Unknown | Snapshot): string | undefined => getLabel$(entity);
431
+
432
+ /**
433
+ * Set the label of the relation.
434
+ * Must be called within a `Relation.change` callback.
435
+ *
436
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
437
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
438
+ */
439
+ export const setLabel = (entity: Mutable<Unknown>, label: string): void => setLabel$(entity, label);
440
+
441
+ /**
442
+ * Get the description of the relation.
443
+ * Accepts both reactive relations and snapshots.
444
+ */
445
+ export const getDescription = (entity: Unknown | Snapshot): string | undefined => getDescription$(entity);
446
+
447
+ /**
448
+ * Set the description of the relation.
449
+ * Must be called within a `Relation.change` callback.
450
+ *
451
+ * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
452
+ * parameters, so there is no compile-time error. Enforcement is runtime-only.
453
+ */
454
+ export const setDescription = (entity: Mutable<Unknown>, description: string): void =>
455
+ setDescription$(entity, description);
456
+
457
+ //
458
+ // JSON
459
+ //
460
+
461
+ /**
462
+ * JSON representation of a relation.
463
+ */
464
+ export type JSON = APIJSON;
465
+
466
+ /**
467
+ * Converts relation to its JSON representation.
468
+ * Accepts both reactive relations and snapshots.
469
+ */
470
+ export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
471
+
472
+ //
473
+ // Sorting
474
+ //
475
+
476
+ /**
477
+ * Comparator function type for sorting relations.
478
+ * Accepts both reactive relations and snapshots.
479
+ */
480
+ export type Comparator = ApiComparator<Unknown | Snapshot>;
481
+
482
+ export const sortByLabel: Comparator = sortByLabel$ as Comparator;
483
+ export const sortByTypename: Comparator = sortByTypename$ as Comparator;
484
+ export const sort = (...comparators: Comparator[]): Comparator => sort$(...comparators) as Comparator;
485
+
486
+ //
487
+ // Version
488
+ //
489
+
490
+ export { VersionTypeId, isVersion };
491
+
492
+ /**
493
+ * Represent relation version.
494
+ */
495
+ export type Version = ApiVersion;
496
+
497
+ /**
498
+ * Returns the version of the relation.
499
+ * Accepts both reactive relations and snapshots.
500
+ */
501
+ export const version = (entity: Unknown | Snapshot): Version => version$(entity);
@@ -0,0 +1,105 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type * as Types from 'effect/Types';
6
+
7
+ import type * as JsonSchema from './JsonSchema';
8
+ import type * as Key from './Key';
9
+ import type * as QueryResult from './QueryResult';
10
+ import type * as Type from './Type';
11
+
12
+ // TODO(wittjosiah): Replace w/ Query.Query.
13
+ export type Query = {
14
+ /**
15
+ * Filter by schema ID.
16
+ * Schema id is a DXN with `echo` or `type` kind.
17
+ */
18
+ id?: string | string[];
19
+
20
+ /**
21
+ * Id of the backing ECHO object.
22
+ */
23
+ backingObjectId?: Key.ObjectId | Key.ObjectId[];
24
+
25
+ /**
26
+ * One or more typenames to filter by.
27
+ */
28
+ typename?: string | string[];
29
+
30
+ /**
31
+ * [Semver Range](https://docs.npmjs.com/cli/v6/using-npm/semver#ranges) for the schema version.
32
+ */
33
+ version?: string;
34
+
35
+ /**
36
+ * Where to look for the schema.
37
+ *
38
+ * Database schema are stored in the database of the current space.
39
+ * Runtime schema are registered in the runtime.
40
+ *
41
+ * @default ['database']
42
+ */
43
+ location?: ('database' | 'runtime')[];
44
+
45
+ /**
46
+ * Include system schemas.
47
+ * @default false
48
+ *
49
+ * The system schema include but are not limited to:
50
+ * - dxos.org/type/Schema
51
+ */
52
+ includeSystem?: boolean;
53
+ };
54
+
55
+ /**
56
+ * Input for schema registration.
57
+ * The typename, version and schema mutability metadata is read from the schema annotations.
58
+ *
59
+ * Accepts:
60
+ * - Branded ECHO schemas created with Type.Obj() or Type.Relation()
61
+ * - JSON schema with typename and version
62
+ */
63
+ export type RegisterSchemaInput =
64
+ | Type.Entity.Any
65
+ | {
66
+ typename: string;
67
+ version: string;
68
+ jsonSchema: JsonSchema.JsonSchema;
69
+ /**
70
+ * Display name of the schema.
71
+ */
72
+ name?: string;
73
+ };
74
+
75
+ export type ExtractQueryResult<Query> = Query extends { location: ('database' | 'runtime')[] }
76
+ ? Type.Entity.Any
77
+ : Type.RuntimeType;
78
+
79
+ export interface SchemaRegistry {
80
+ /**
81
+ * Checks if the provided schema is registered.
82
+ */
83
+ // TODO(burdon): Type?
84
+ hasSchema(schema: Type.Entity.Any): boolean;
85
+
86
+ /**
87
+ * Registers the provided schema.
88
+ *
89
+ * @returns Mutable runtime instances of schemas that were registered.
90
+ *
91
+ * The behavior of this method depends on the state of the database.
92
+ * The general principle is that the schema will be upserted into the space.
93
+ * If an equivalent schema with the same name and version already exists, the method does nothing.
94
+ * If a different schema with the same name and version exists, the method throws an error.
95
+ * If no schema with the same name and version exists, a new schema will be inserted based on semantic versioning rules.
96
+ */
97
+ register(input: RegisterSchemaInput[]): Promise<Type.RuntimeType[]>;
98
+
99
+ /**
100
+ *
101
+ */
102
+ query<Q extends Types.NoExcessProperties<Query, Q>>(
103
+ query?: Q & Query,
104
+ ): QueryResult.QueryResult<ExtractQueryResult<Q>>;
105
+ }
package/src/Tag.ts CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { LabelAnnotation } from './internal';
7
+ import { LabelAnnotation, SystemTypeAnnotation } from './internal';
8
8
  import * as Obj from './Obj';
9
9
  import * as Type from './Type';
10
10
 
@@ -12,11 +12,12 @@ export const Tag = Schema.Struct({
12
12
  label: Schema.String,
13
13
  hue: Schema.optional(Schema.String), // TODO(burdon): Color name?
14
14
  }).pipe(
15
- Type.Obj({
15
+ Type.object({
16
16
  typename: 'dxos.org/type/Tag',
17
17
  version: '0.1.0',
18
18
  }),
19
19
  LabelAnnotation.set(['label']),
20
+ SystemTypeAnnotation.set(true),
20
21
  );
21
22
 
22
23
  export type Tag = Schema.Schema.Type<typeof Tag>;