@dxos/echo 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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 (539) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +49 -0
  4. package/dist/lib/neutral/Entity.mjs +61 -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/Extension.mjs +18 -0
  9. package/dist/lib/neutral/Extension.mjs.map +7 -0
  10. package/dist/lib/neutral/Feed.mjs +50 -0
  11. package/dist/lib/neutral/Feed.mjs.map +7 -0
  12. package/dist/lib/neutral/Filter.mjs +72 -0
  13. package/dist/lib/neutral/Filter.mjs.map +7 -0
  14. package/dist/lib/neutral/Format.mjs +66 -0
  15. package/dist/lib/neutral/Format.mjs.map +7 -0
  16. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  17. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  18. package/dist/lib/neutral/Key.mjs +12 -0
  19. package/dist/lib/neutral/Key.mjs.map +7 -0
  20. package/dist/lib/neutral/Migration.mjs +17 -0
  21. package/dist/lib/neutral/Migration.mjs.map +7 -0
  22. package/dist/lib/neutral/Obj.mjs +113 -0
  23. package/dist/lib/neutral/Obj.mjs.map +7 -0
  24. package/dist/lib/neutral/Order.mjs +12 -0
  25. package/dist/lib/neutral/Order.mjs.map +7 -0
  26. package/dist/lib/neutral/Query.mjs +38 -0
  27. package/dist/lib/neutral/Query.mjs.map +7 -0
  28. package/dist/lib/neutral/QueryResult.mjs +2 -0
  29. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  30. package/dist/lib/neutral/Ref.mjs +24 -0
  31. package/dist/lib/neutral/Ref.mjs.map +7 -0
  32. package/dist/lib/neutral/Relation.mjs +94 -0
  33. package/dist/lib/neutral/Relation.mjs.map +7 -0
  34. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  35. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  36. package/dist/lib/neutral/Tag.mjs +29 -0
  37. package/dist/lib/neutral/Tag.mjs.map +7 -0
  38. package/dist/lib/neutral/Type.mjs +37 -0
  39. package/dist/lib/neutral/Type.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-2T22UGGN.mjs +206 -0
  41. package/dist/lib/neutral/chunk-2T22UGGN.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-44HT3MEC.mjs +73 -0
  43. package/dist/lib/neutral/chunk-44HT3MEC.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-6VC3FI5E.mjs +125 -0
  45. package/dist/lib/neutral/chunk-6VC3FI5E.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-7JFW72MX.mjs +132 -0
  47. package/dist/lib/neutral/chunk-7JFW72MX.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-7RVZT53K.mjs +21 -0
  49. package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-BICZKPQG.mjs +7 -0
  51. package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs +36 -0
  53. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-DUNXPKAC.mjs +56 -0
  55. package/dist/lib/neutral/chunk-DUNXPKAC.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-FAW7PJRO.mjs +34 -0
  57. package/dist/lib/neutral/chunk-FAW7PJRO.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-FAYW32CW.mjs +27 -0
  59. package/dist/lib/neutral/chunk-FAYW32CW.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  61. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-I2MFJ76N.mjs +354 -0
  63. package/dist/lib/neutral/chunk-I2MFJ76N.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  65. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-JALF2CVV.mjs +345 -0
  67. package/dist/lib/neutral/chunk-JALF2CVV.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs +128 -0
  69. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-LOTZLYHB.mjs +420 -0
  71. package/dist/lib/neutral/chunk-LOTZLYHB.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-N4B7FHQT.mjs +67 -0
  73. package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-NKXEKBP5.mjs +81 -0
  75. package/dist/lib/neutral/chunk-NKXEKBP5.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-NSMLBSFS.mjs +270 -0
  77. package/dist/lib/neutral/chunk-NSMLBSFS.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-QBIGOSRF.mjs +45 -0
  79. package/dist/lib/neutral/chunk-QBIGOSRF.mjs.map +7 -0
  80. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs +734 -0
  81. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs.map +7 -0
  82. package/dist/lib/neutral/chunk-QEVM3JUP.mjs +318 -0
  83. package/dist/lib/neutral/chunk-QEVM3JUP.mjs.map +7 -0
  84. package/dist/lib/neutral/chunk-REP7WWAQ.mjs +346 -0
  85. package/dist/lib/neutral/chunk-REP7WWAQ.mjs.map +7 -0
  86. package/dist/lib/neutral/chunk-TRPZU2HV.mjs +402 -0
  87. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
  88. package/dist/lib/neutral/chunk-TTCSATUD.mjs +42 -0
  89. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  90. package/dist/lib/neutral/chunk-TW76K7H5.mjs +45 -0
  91. package/dist/lib/neutral/chunk-TW76K7H5.mjs.map +7 -0
  92. package/dist/lib/neutral/chunk-UYJYDSD7.mjs +2436 -0
  93. package/dist/lib/neutral/chunk-UYJYDSD7.mjs.map +7 -0
  94. package/dist/lib/neutral/chunk-V72DY6LU.mjs +7 -0
  95. package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +7 -0
  96. package/dist/lib/neutral/chunk-ZISMEVKD.mjs +51 -0
  97. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
  98. package/dist/lib/neutral/index.mjs +107 -0
  99. package/dist/lib/neutral/index.mjs.map +7 -0
  100. package/dist/lib/neutral/internal/index.mjs +474 -0
  101. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  102. package/dist/lib/neutral/meta.json +1 -0
  103. package/dist/lib/neutral/testing/index.mjs +375 -0
  104. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  105. package/dist/types/src/Annotation.d.ts +24 -0
  106. package/dist/types/src/Annotation.d.ts.map +1 -0
  107. package/dist/types/src/Collection.d.ts +16 -0
  108. package/dist/types/src/Collection.d.ts.map +1 -0
  109. package/dist/types/src/Database.d.ts +201 -0
  110. package/dist/types/src/Database.d.ts.map +1 -0
  111. package/dist/types/src/Dataset.d.ts +19 -0
  112. package/dist/types/src/Dataset.d.ts.map +1 -0
  113. package/dist/types/src/Entity.d.ts +174 -0
  114. package/dist/types/src/Entity.d.ts.map +1 -0
  115. package/dist/types/src/Entity.test.d.ts +2 -0
  116. package/dist/types/src/Entity.test.d.ts.map +1 -0
  117. package/dist/types/src/Err.d.ts +107 -0
  118. package/dist/types/src/Err.d.ts.map +1 -0
  119. package/dist/types/src/Extension.d.ts +80 -0
  120. package/dist/types/src/Extension.d.ts.map +1 -0
  121. package/dist/types/src/Extension.test.d.ts +2 -0
  122. package/dist/types/src/Extension.test.d.ts.map +1 -0
  123. package/dist/types/src/Feed.d.ts +182 -0
  124. package/dist/types/src/Feed.d.ts.map +1 -0
  125. package/dist/types/src/Filter.d.ts +149 -0
  126. package/dist/types/src/Filter.d.ts.map +1 -0
  127. package/dist/types/src/Filter.test.d.ts +2 -0
  128. package/dist/types/src/Filter.test.d.ts.map +1 -0
  129. package/dist/types/src/Format.d.ts +4 -0
  130. package/dist/types/src/Format.d.ts.map +1 -0
  131. package/dist/types/src/Hypergraph.d.ts +65 -0
  132. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  133. package/dist/types/src/Json.d.ts +33 -0
  134. package/dist/types/src/Json.d.ts.map +1 -0
  135. package/dist/types/src/Json.test.d.ts +2 -0
  136. package/dist/types/src/Json.test.d.ts.map +1 -0
  137. package/dist/types/src/JsonSchema.d.ts +16 -0
  138. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  139. package/dist/types/src/Key.d.ts +1 -0
  140. package/dist/types/src/Key.d.ts.map +1 -1
  141. package/dist/types/src/Migration.d.ts +57 -0
  142. package/dist/types/src/Migration.d.ts.map +1 -0
  143. package/dist/types/src/Obj.d.ts +442 -98
  144. package/dist/types/src/Obj.d.ts.map +1 -1
  145. package/dist/types/src/Obj.test.d.ts +2 -0
  146. package/dist/types/src/Obj.test.d.ts.map +1 -0
  147. package/dist/types/src/Order.d.ts +16 -0
  148. package/dist/types/src/Order.d.ts.map +1 -0
  149. package/dist/types/src/Query.d.ts +213 -0
  150. package/dist/types/src/Query.d.ts.map +1 -0
  151. package/dist/types/src/Query.test.d.ts +2 -0
  152. package/dist/types/src/Query.test.d.ts.map +1 -0
  153. package/dist/types/src/QueryResult.d.ts +80 -0
  154. package/dist/types/src/QueryResult.d.ts.map +1 -0
  155. package/dist/types/src/Ref.d.ts +61 -11
  156. package/dist/types/src/Ref.d.ts.map +1 -1
  157. package/dist/types/src/Relation.d.ts +288 -22
  158. package/dist/types/src/Relation.d.ts.map +1 -1
  159. package/dist/types/src/Relation.test.d.ts +2 -0
  160. package/dist/types/src/Relation.test.d.ts.map +1 -0
  161. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  162. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  163. package/dist/types/src/Tag.d.ts +18 -0
  164. package/dist/types/src/Tag.d.ts.map +1 -0
  165. package/dist/types/src/Type.d.ts +123 -100
  166. package/dist/types/src/Type.d.ts.map +1 -1
  167. package/dist/types/src/Type.test.d.ts +2 -0
  168. package/dist/types/src/Type.test.d.ts.map +1 -0
  169. package/dist/types/src/View.d.ts +68 -0
  170. package/dist/types/src/View.d.ts.map +1 -0
  171. package/dist/types/src/hierarchy.test.d.ts +2 -0
  172. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  173. package/dist/types/src/index.d.ts +22 -5
  174. package/dist/types/src/index.d.ts.map +1 -1
  175. package/dist/types/src/internal/Annotation/annotations.d.ts +231 -0
  176. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  177. package/dist/types/src/internal/Annotation/annotations.test.d.ts +2 -0
  178. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  179. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  180. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  181. package/dist/types/src/internal/Annotation/sorting.d.ts +24 -0
  182. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  183. package/dist/types/src/internal/Annotation/util.d.ts +39 -0
  184. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  185. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  186. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  187. package/dist/types/src/internal/Entity/entity.d.ts +20 -0
  188. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  189. package/dist/types/src/internal/Entity/index.d.ts +8 -0
  190. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  191. package/dist/types/src/internal/Entity/model.d.ts +55 -0
  192. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  193. package/dist/types/src/internal/Entity/object.d.ts +18 -0
  194. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  195. package/dist/types/src/internal/Entity/relation.d.ts +35 -0
  196. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  197. package/dist/types/src/internal/Entity/util.d.ts +2 -0
  198. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  199. package/dist/types/src/internal/Entity/version.d.ts +42 -0
  200. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  201. package/dist/types/src/internal/Format/date.d.ts +63 -0
  202. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  203. package/dist/types/src/internal/Format/date.test.d.ts +2 -0
  204. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  205. package/dist/types/src/internal/Format/format.d.ts +32 -0
  206. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  207. package/dist/types/src/internal/Format/format.test.d.ts +2 -0
  208. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  209. package/dist/types/src/internal/Format/index.d.ts +8 -0
  210. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  211. package/dist/types/src/internal/Format/number.d.ts +31 -0
  212. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  213. package/dist/types/src/internal/Format/object.d.ts +35 -0
  214. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  215. package/dist/types/src/internal/Format/select.d.ts +13 -0
  216. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  217. package/dist/types/src/internal/Format/string.d.ts +42 -0
  218. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  219. package/dist/types/src/internal/Format/types.d.ts +72 -0
  220. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  221. package/dist/types/src/internal/JsonSchema/annotations.d.ts +19 -0
  222. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  223. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts +2 -0
  224. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/JsonSchema/index.d.ts +5 -0
  226. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  227. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts +7 -0
  228. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  229. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +351 -0
  230. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  231. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +30 -0
  232. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  233. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts +2 -0
  234. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  235. package/dist/types/src/internal/Obj/clone.d.ts +8 -0
  236. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  237. package/dist/types/src/internal/Obj/common.d.ts +18 -0
  238. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  239. package/dist/types/src/internal/Obj/create-object.d.ts +39 -0
  240. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  241. package/dist/types/src/internal/Obj/create-object.test.d.ts +2 -0
  242. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  243. package/dist/types/src/internal/Obj/deleted.d.ts +6 -0
  244. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  245. package/dist/types/src/internal/Obj/ids.d.ts +6 -0
  246. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  247. package/dist/types/src/internal/Obj/index.d.ts +11 -0
  248. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  249. package/dist/types/src/internal/Obj/inspect.d.ts +2 -0
  250. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  251. package/dist/types/src/internal/Obj/json-serializer.d.ts +45 -0
  252. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  253. package/dist/types/src/internal/Obj/json-serializer.test.d.ts +2 -0
  254. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  255. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  256. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  257. package/dist/types/src/internal/Obj/schema-validator.test.d.ts +2 -0
  258. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
  260. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  261. package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
  262. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
  264. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  265. package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
  266. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  267. package/dist/types/src/internal/Obj/typed-object.test.d.ts +2 -0
  268. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  269. package/dist/types/src/internal/Query.d.ts +10 -0
  270. package/dist/types/src/internal/Query.d.ts.map +1 -0
  271. package/dist/types/src/internal/Ref/index.d.ts +3 -0
  272. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  273. package/dist/types/src/internal/Ref/ref-array.d.ts +21 -0
  274. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  275. package/dist/types/src/internal/Ref/ref.d.ts +244 -0
  276. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  277. package/dist/types/src/internal/Ref/ref.test.d.ts +2 -0
  278. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  279. package/dist/types/src/internal/Type/compose.d.ts +7 -0
  280. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  281. package/dist/types/src/internal/Type/compose.test.d.ts +2 -0
  282. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  283. package/dist/types/src/internal/Type/echo-schema.d.ts +181 -0
  284. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  285. package/dist/types/src/internal/Type/index.d.ts +4 -0
  286. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  287. package/dist/types/src/internal/Type/manipulation.d.ts +10 -0
  288. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  289. package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
  290. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  291. package/dist/types/src/internal/common/api/index.d.ts +11 -0
  292. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  293. package/dist/types/src/internal/common/api/meta.d.ts +42 -0
  294. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  295. package/dist/types/src/internal/common/index.d.ts +4 -0
  296. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  297. package/dist/types/src/internal/common/proxy/change-context.d.ts +55 -0
  298. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  299. package/dist/types/src/internal/common/proxy/change.test.d.ts +2 -0
  300. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  301. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts +5 -0
  302. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  303. package/dist/types/src/internal/common/proxy/errors.d.ts +19 -0
  304. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  305. package/dist/types/src/internal/common/proxy/event-batch.d.ts +10 -0
  306. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  307. package/dist/types/src/internal/common/proxy/handler.test.d.ts +2 -0
  308. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  309. package/dist/types/src/internal/common/proxy/index.d.ts +14 -0
  310. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  311. package/dist/types/src/internal/common/proxy/json-serializer.d.ts +6 -0
  312. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  313. package/dist/types/src/internal/common/proxy/make-object.d.ts +14 -0
  314. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  315. package/dist/types/src/internal/common/proxy/ownership.d.ts +57 -0
  316. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  317. package/dist/types/src/internal/common/proxy/proxy-types.d.ts +18 -0
  318. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  319. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +47 -0
  320. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  321. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +8 -0
  322. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  323. package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
  324. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
  325. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  326. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  327. package/dist/types/src/internal/common/proxy/schema-validator.d.ts +15 -0
  328. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  329. package/dist/types/src/internal/common/proxy/schema.test.d.ts +2 -0
  330. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  331. package/dist/types/src/internal/common/proxy/symbols.d.ts +3 -0
  332. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  333. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +48 -0
  334. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  335. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts +2 -0
  336. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  337. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts +2 -0
  338. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  339. package/dist/types/src/internal/common/types/base.d.ts +27 -0
  340. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  341. package/dist/types/src/internal/common/types/entity.d.ts +37 -0
  342. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  343. package/dist/types/src/internal/common/types/index.d.ts +7 -0
  344. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  345. package/dist/types/src/internal/common/types/meta.d.ts +33 -0
  346. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  347. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  348. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  349. package/dist/types/src/internal/common/types/typename.d.ts +21 -0
  350. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  351. package/dist/types/src/internal/common/types/version.d.ts +15 -0
  352. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  353. package/dist/types/src/internal/index.d.ts +11 -0
  354. package/dist/types/src/internal/index.d.ts.map +1 -0
  355. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  356. package/dist/types/src/testing/index.d.ts +3 -1
  357. package/dist/types/src/testing/index.d.ts.map +1 -1
  358. package/dist/types/src/testing/test-data.d.ts +18 -0
  359. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  360. package/dist/types/src/testing/test-schema.d.ts +304 -0
  361. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  362. package/dist/types/src/testing/util.d.ts +21 -0
  363. package/dist/types/src/testing/util.d.ts.map +1 -0
  364. package/dist/types/tsconfig.tsbuildinfo +1 -1
  365. package/package.json +119 -57
  366. package/src/Annotation.ts +48 -0
  367. package/src/Collection.ts +37 -0
  368. package/src/Database.ts +352 -0
  369. package/src/Dataset.ts +26 -0
  370. package/src/Entity.test.ts +22 -0
  371. package/src/Entity.ts +243 -0
  372. package/src/Err.ts +40 -0
  373. package/src/Extension.test.ts +235 -0
  374. package/src/Extension.ts +122 -0
  375. package/src/Feed.ts +304 -0
  376. package/src/Filter.test.ts +90 -0
  377. package/src/Filter.ts +454 -0
  378. package/src/Format.ts +9 -0
  379. package/src/Hypergraph.ts +79 -0
  380. package/src/Json.test.ts +175 -0
  381. package/src/Json.ts +102 -0
  382. package/src/JsonSchema.ts +26 -0
  383. package/src/Key.ts +3 -0
  384. package/src/Migration.ts +94 -0
  385. package/src/Obj.test.ts +539 -0
  386. package/src/Obj.ts +713 -244
  387. package/src/Order.ts +46 -0
  388. package/src/Query.test.ts +822 -0
  389. package/src/Query.ts +567 -0
  390. package/src/QueryResult.ts +106 -0
  391. package/src/Ref.ts +78 -9
  392. package/src/Relation.test.ts +88 -0
  393. package/src/Relation.ts +450 -60
  394. package/src/SchemaRegistry.ts +106 -0
  395. package/src/Tag.ts +41 -0
  396. package/src/Type.test.ts +52 -0
  397. package/src/Type.ts +168 -155
  398. package/src/View.ts +107 -0
  399. package/src/hierarchy.test.ts +33 -0
  400. package/src/index.ts +24 -6
  401. package/src/internal/Annotation/annotations.test.ts +145 -0
  402. package/src/internal/Annotation/annotations.ts +577 -0
  403. package/src/internal/Annotation/index.ts +7 -0
  404. package/src/internal/Annotation/sorting.ts +51 -0
  405. package/src/internal/Annotation/util.ts +85 -0
  406. package/src/internal/Entity/api.ts +30 -0
  407. package/src/internal/Entity/entity.ts +128 -0
  408. package/src/internal/Entity/index.ts +11 -0
  409. package/src/internal/Entity/model.ts +109 -0
  410. package/src/internal/Entity/object.ts +57 -0
  411. package/src/internal/Entity/relation.ts +154 -0
  412. package/src/internal/Entity/util.ts +33 -0
  413. package/src/internal/Entity/version.ts +96 -0
  414. package/src/internal/Format/date.test.ts +55 -0
  415. package/src/internal/Format/date.ts +217 -0
  416. package/src/internal/Format/format.test.ts +76 -0
  417. package/src/internal/Format/format.ts +54 -0
  418. package/src/internal/Format/index.ts +12 -0
  419. package/src/internal/Format/number.ts +89 -0
  420. package/src/internal/Format/object.ts +80 -0
  421. package/src/internal/Format/select.ts +18 -0
  422. package/src/internal/Format/string.ts +81 -0
  423. package/src/internal/Format/types.ts +186 -0
  424. package/src/internal/JsonSchema/annotations.ts +50 -0
  425. package/src/internal/JsonSchema/effect-schema.test.ts +143 -0
  426. package/src/internal/JsonSchema/index.ts +8 -0
  427. package/src/internal/JsonSchema/json-schema-normalize.ts +111 -0
  428. package/src/internal/JsonSchema/json-schema-type.ts +403 -0
  429. package/src/internal/JsonSchema/json-schema.test.ts +860 -0
  430. package/src/internal/JsonSchema/json-schema.ts +533 -0
  431. package/src/internal/Obj/clone.ts +48 -0
  432. package/src/internal/Obj/common.ts +75 -0
  433. package/src/internal/Obj/create-object.test.ts +114 -0
  434. package/src/internal/Obj/create-object.ts +94 -0
  435. package/src/internal/Obj/deleted.ts +19 -0
  436. package/src/internal/Obj/ids.ts +12 -0
  437. package/src/internal/Obj/index.ts +14 -0
  438. package/src/internal/Obj/inspect.ts +46 -0
  439. package/src/internal/Obj/json-serializer.test.ts +120 -0
  440. package/src/internal/Obj/json-serializer.ts +222 -0
  441. package/src/internal/Obj/schema-validator.test.ts +182 -0
  442. package/src/internal/Obj/schema-validator.ts +6 -0
  443. package/src/internal/Obj/set-value.test.ts +281 -0
  444. package/src/internal/Obj/set-value.ts +165 -0
  445. package/src/internal/Obj/snapshot.ts +105 -0
  446. package/src/internal/Obj/typed-object.test.ts +34 -0
  447. package/src/internal/Obj/typed-object.ts +30 -0
  448. package/src/internal/Query.ts +137 -0
  449. package/src/internal/Ref/index.ts +6 -0
  450. package/src/internal/Ref/ref-array.ts +38 -0
  451. package/src/internal/Ref/ref.test.ts +100 -0
  452. package/src/internal/Ref/ref.ts +589 -0
  453. package/src/internal/Type/compose.test.ts +41 -0
  454. package/src/internal/Type/compose.ts +41 -0
  455. package/src/internal/Type/echo-schema.ts +423 -0
  456. package/src/internal/Type/index.ts +7 -0
  457. package/src/internal/Type/manipulation.ts +92 -0
  458. package/src/internal/Type/persistent-schema.ts +33 -0
  459. package/src/internal/common/README.md +102 -0
  460. package/src/internal/common/api/index.ts +15 -0
  461. package/src/internal/common/api/meta.ts +88 -0
  462. package/src/internal/common/index.ts +7 -0
  463. package/src/internal/common/proxy/change-context.ts +138 -0
  464. package/src/internal/common/proxy/change.test.ts +519 -0
  465. package/src/internal/common/proxy/define-hidden-property.ts +14 -0
  466. package/src/internal/common/proxy/errors.ts +42 -0
  467. package/src/internal/common/proxy/event-batch.ts +44 -0
  468. package/src/internal/common/proxy/handler.test.ts +121 -0
  469. package/src/internal/common/proxy/index.ts +17 -0
  470. package/src/internal/common/proxy/json-serializer.ts +90 -0
  471. package/src/internal/common/proxy/make-object.ts +105 -0
  472. package/src/internal/common/proxy/ownership.ts +252 -0
  473. package/src/internal/common/proxy/proxy-types.ts +23 -0
  474. package/src/internal/common/proxy/proxy-utils.ts +150 -0
  475. package/src/internal/common/proxy/reactive-array.ts +71 -0
  476. package/src/internal/common/proxy/reactive.test.ts +54 -0
  477. package/src/internal/common/proxy/reactive.ts +77 -0
  478. package/src/internal/common/proxy/schema-validator.ts +244 -0
  479. package/src/internal/common/proxy/schema.test.ts +145 -0
  480. package/src/internal/common/proxy/symbols.ts +7 -0
  481. package/src/internal/common/proxy/typed-handler.test.ts +313 -0
  482. package/src/internal/common/proxy/typed-handler.ts +447 -0
  483. package/src/internal/common/proxy/typed-object.test.ts +115 -0
  484. package/src/internal/common/types/base.ts +43 -0
  485. package/src/internal/common/types/entity.ts +54 -0
  486. package/src/internal/common/types/index.ts +10 -0
  487. package/src/internal/common/types/meta.ts +67 -0
  488. package/src/internal/common/types/model-symbols.ts +69 -0
  489. package/src/internal/common/types/typename.ts +55 -0
  490. package/src/internal/common/types/version.ts +19 -0
  491. package/src/internal/index.ts +17 -0
  492. package/src/testing/api.test.ts +125 -0
  493. package/src/testing/index.ts +3 -1
  494. package/src/testing/test-data.ts +129 -0
  495. package/src/testing/test-schema.ts +240 -0
  496. package/src/testing/util.ts +85 -0
  497. package/dist/lib/browser/chunk-I4YEWYJA.mjs +0 -882
  498. package/dist/lib/browser/chunk-I4YEWYJA.mjs.map +0 -7
  499. package/dist/lib/browser/index.mjs +0 -30
  500. package/dist/lib/browser/meta.json +0 -1
  501. package/dist/lib/browser/testing/index.mjs +0 -70
  502. package/dist/lib/browser/testing/index.mjs.map +0 -7
  503. package/dist/lib/node-esm/chunk-AWWFAF75.mjs +0 -882
  504. package/dist/lib/node-esm/chunk-AWWFAF75.mjs.map +0 -7
  505. package/dist/lib/node-esm/index.mjs +0 -30
  506. package/dist/lib/node-esm/meta.json +0 -1
  507. package/dist/lib/node-esm/testing/index.mjs +0 -70
  508. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  509. package/dist/types/src/errors.d.ts +0 -72
  510. package/dist/types/src/errors.d.ts.map +0 -1
  511. package/dist/types/src/experimental/database.d.ts +0 -8
  512. package/dist/types/src/experimental/database.d.ts.map +0 -1
  513. package/dist/types/src/experimental/index.d.ts +0 -1
  514. package/dist/types/src/experimental/index.d.ts.map +0 -1
  515. package/dist/types/src/experimental/queue.d.ts +0 -8
  516. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  517. package/dist/types/src/experimental/space.d.ts +0 -8
  518. package/dist/types/src/experimental/space.d.ts.map +0 -1
  519. package/dist/types/src/query/dsl.d.ts +0 -245
  520. package/dist/types/src/query/dsl.d.ts.map +0 -1
  521. package/dist/types/src/query/dsl.test.d.ts +0 -2
  522. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  523. package/dist/types/src/query/index.d.ts +0 -2
  524. package/dist/types/src/query/index.d.ts.map +0 -1
  525. package/dist/types/src/testing/types.d.ts +0 -113
  526. package/dist/types/src/testing/types.d.ts.map +0 -1
  527. package/src/errors.ts +0 -18
  528. package/src/experimental/database.ts +0 -11
  529. package/src/experimental/index.ts +0 -7
  530. package/src/experimental/queue.ts +0 -11
  531. package/src/experimental/space.ts +0 -11
  532. package/src/query/dsl.test.ts +0 -362
  533. package/src/query/dsl.ts +0 -759
  534. package/src/query/index.ts +0 -5
  535. package/src/test/api.test.ts +0 -180
  536. package/src/testing/types.ts +0 -91
  537. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  538. /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
  539. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
@@ -0,0 +1,22 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import type * as Entity from './Entity';
8
+ import * as Obj from './Obj';
9
+ import * as Relation from './Relation';
10
+ import { TestSchema } from './testing';
11
+
12
+ describe('Entity', () => {
13
+ test('Entity.Unknown accepts any object or relation', () => {
14
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
15
+ const rel = Relation.make(TestSchema.HasManager, { [Relation.Source]: obj, [Relation.Target]: obj });
16
+ const doSomething = (entity: Entity.Unknown) => {
17
+ return entity;
18
+ };
19
+ expect(doSomething(obj)).toBe(obj);
20
+ expect(doSomething(rel)).toBe(rel);
21
+ });
22
+ });
package/src/Entity.ts ADDED
@@ -0,0 +1,243 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import type { ForeignKey } from '@dxos/echo-protocol';
8
+ import type { DXN, ObjectId } from '@dxos/keys';
9
+
10
+ import * as internal from './internal';
11
+ import type * as Relation from './Relation';
12
+ import type * as Type from './Type';
13
+
14
+ // Re-export KindId and SnapshotKindId from internal.
15
+ export const KindId = internal.KindId;
16
+ export type KindId = typeof internal.KindId;
17
+ export const SnapshotKindId = internal.SnapshotKindId;
18
+ export type SnapshotKindId = typeof internal.SnapshotKindId;
19
+
20
+ // NOTE: Relation does not extend Obj so that, for example, we can prevent Relations from being used as source and target objects.
21
+ // However, we generally refer to Obj and Relation instances as "objects",
22
+ // and many API methods accept both Obj.Unknown and Relation.Unknown (i.e., Entity.Unknown) instances.
23
+
24
+ export const Kind = internal.EntityKind;
25
+ export type Kind = internal.EntityKind;
26
+ export const KindSchema = internal.EntityKindSchema;
27
+
28
+ /**
29
+ * Assigns a kind to an Object or Relation instance.
30
+ * NOTE: Needed to make `isRelation` and `isObject` checks work.
31
+ */
32
+ export interface OfKind<K extends Kind> {
33
+ readonly [KindId]: K;
34
+ readonly id: ObjectId;
35
+ }
36
+
37
+ /**
38
+ * Assigns a snapshot kind to an Object or Relation snapshot.
39
+ */
40
+ export interface SnapshotOfKind<K extends Kind> {
41
+ readonly [SnapshotKindId]: K;
42
+ readonly id: ObjectId;
43
+ }
44
+
45
+ /**
46
+ * Obj or Relation with a specific set of properties.
47
+ */
48
+ export type Entity<Props> = OfKind<Kind> & Props;
49
+
50
+ /**
51
+ * Unknown Obj or Relation (reactive).
52
+ */
53
+ export interface Unknown extends OfKind<Kind> {}
54
+
55
+ /**
56
+ * Snapshot of an Obj or Relation.
57
+ * Branded with SnapshotKindId instead of KindId.
58
+ */
59
+ export interface Snapshot extends SnapshotOfKind<Kind> {}
60
+
61
+ /**
62
+ * Object with arbitrary properties.
63
+ *
64
+ * NOTE: Due to how typescript works, this type is not assignable to a specific schema type.
65
+ * In that case, use `Obj.instanceOf` to check if an object is of a specific type.
66
+ *
67
+ * This type is very permissive and allows accessing any property on the object.
68
+ * We should move to Obj.Unknown that is not permissive and requires explicit instanceof checks..
69
+ */
70
+ export interface Any extends OfKind<Kind> {
71
+ [key: string]: unknown;
72
+ }
73
+
74
+ /**
75
+ * Returns all properties of an object or relation except for the id and kind.
76
+ */
77
+ export type Properties<T> = Omit<T, 'id' | KindId | Relation.Source | Relation.Target>;
78
+
79
+ /**
80
+ * Check if a value is an ECHO entity (object or relation).
81
+ * Returns `false` for snapshots.
82
+ */
83
+ export const isEntity = (value: unknown): value is Unknown => {
84
+ if (typeof value !== 'object' || value === null) {
85
+ return false;
86
+ }
87
+ return (value as any)[KindId] !== undefined;
88
+ };
89
+
90
+ /**
91
+ * Check if a value is an ECHO entity snapshot.
92
+ * Returns `false` for entities.
93
+ */
94
+ export const isSnapshot = (value: unknown): value is Snapshot => {
95
+ if (typeof value !== 'object' || value === null) {
96
+ return false;
97
+ }
98
+ return (value as any)[SnapshotKindId] !== undefined;
99
+ };
100
+
101
+ // TODO(dmaretskyi): Type introspection -- move to kind.
102
+ export const getKind = internal.getEntityKind;
103
+
104
+ /**
105
+ * Property that accesses metadata for an entity.
106
+ */
107
+ export const Meta: unique symbol = internal.MetaId as any;
108
+
109
+ /**
110
+ * Property that accesses metadata for an entity.
111
+ */
112
+ export type Meta = typeof Meta;
113
+
114
+ //
115
+ // Entity-level functions that work on any entity (object or relation).
116
+ // Use these when you don't know or care about the specific entity kind.
117
+ // For kind-specific functions, use Obj.* or Relation.*.
118
+ //
119
+
120
+ /**
121
+ * JSON representation of an entity.
122
+ */
123
+ export type JSON = internal.ObjectJSON;
124
+
125
+ /**
126
+ * Get the DXN of an entity (object or relation).
127
+ */
128
+ export const getDXN = (entity: Unknown | Snapshot): DXN => internal.getDXN(entity);
129
+
130
+ /**
131
+ * Get the DXN of an entity's type.
132
+ */
133
+ export const getTypeDXN = internal.getTypeDXN;
134
+
135
+ /**
136
+ * Get the schema of an entity.
137
+ * Returns the branded ECHO schema used to create the entity.
138
+ */
139
+ export const getSchema: (entity: Unknown | Snapshot) => Type.AnyEntity | undefined = internal.getSchema as any;
140
+
141
+ /**
142
+ * Get the typename of an entity's type.
143
+ */
144
+ export const getTypename = (entity: Unknown | Snapshot): string | undefined => internal.getTypename(entity);
145
+
146
+ /**
147
+ * Get the database an entity belongs to.
148
+ */
149
+ export const getDatabase = (entity: Unknown | Snapshot): any | undefined => internal.getDatabase(entity);
150
+
151
+ /**
152
+ * Get the metadata for an entity.
153
+ * Returns mutable meta when passed a mutable entity (inside change callback).
154
+ * Returns read-only meta when passed a regular entity or snapshot.
155
+ */
156
+ // TODO(wittjosiah): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
157
+ export function getMeta(entity: Mutable<Unknown>): internal.ObjectMeta;
158
+ export function getMeta(entity: Unknown | Snapshot): internal.ReadonlyMeta;
159
+ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): internal.ObjectMeta | internal.ReadonlyMeta {
160
+ return internal.getMetaChecked(entity);
161
+ }
162
+
163
+ /**
164
+ * Get foreign keys for an entity from the specified source.
165
+ */
166
+ export const getKeys = (entity: Unknown | Snapshot, source: string): ForeignKey[] => internal.getKeys(entity, source);
167
+
168
+ /**
169
+ * Check if an entity is deleted.
170
+ */
171
+ export const isDeleted = (entity: Unknown | Snapshot): boolean => internal.isDeleted(entity);
172
+
173
+ /**
174
+ * Get the label of an entity.
175
+ */
176
+ export const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);
177
+
178
+ /**
179
+ * Get the description of an entity.
180
+ */
181
+ export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
182
+
183
+ /**
184
+ * Convert an entity to its JSON representation.
185
+ */
186
+ export const toJSON = (entity: Unknown | Snapshot): JSON => internal.objectToJSON(entity);
187
+
188
+ /**
189
+ * Subscribe to changes on an entity (object or relation).
190
+ * @returns Unsubscribe function.
191
+ */
192
+ export const subscribe = (entity: Unknown, callback: () => void): (() => void) => {
193
+ return internal.subscribe(entity, callback);
194
+ };
195
+
196
+ //
197
+ // Change
198
+ //
199
+
200
+ /**
201
+ * Used to provide a mutable view of an entity within `Entity.update`.
202
+ */
203
+ export type Mutable<T> = internal.Mutable<T>;
204
+
205
+ /**
206
+ * Perform mutations on an entity (object or relation) within a change context.
207
+ *
208
+ * Entities are read-only by default. Mutations are batched and notifications fire
209
+ * when the callback completes. Direct mutations outside of `Entity.update` will throw
210
+ * at runtime.
211
+ *
212
+ * @param entity - The echo entity (object or relation) to mutate.
213
+ * @param callback - Receives a mutable view of the entity. All mutations must occur here.
214
+ *
215
+ * @example
216
+ * ```typescript
217
+ * // Mutate within Entity.update
218
+ * Entity.update(entity, (obj) => {
219
+ * obj.name = 'Updated';
220
+ * obj.count = 42;
221
+ * });
222
+ *
223
+ * // Direct mutation throws
224
+ * entity.name = 'Bob'; // Error: Cannot modify outside Entity.update()
225
+ * ```
226
+ *
227
+ * Note: For type-specific operations, prefer `Obj.update` or `Relation.update`.
228
+ */
229
+ export const update = <T extends Unknown>(entity: T, callback: internal.ChangeCallback<T>): void => {
230
+ internal.change(entity, callback);
231
+ };
232
+
233
+ /**
234
+ * Add a tag to an entity.
235
+ * Must be called within an `Entity.update`, `Obj.update`, or `Relation.update` callback.
236
+ */
237
+ export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);
238
+
239
+ /**
240
+ * Remove a tag from an entity.
241
+ * Must be called within an `Entity.update`, `Obj.update`, or `Relation.update` callback.
242
+ */
243
+ export const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);
package/src/Err.ts ADDED
@@ -0,0 +1,40 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import { BaseError, type BaseErrorOptions } from '@dxos/errors';
8
+ import { type DXN } from '@dxos/keys';
9
+
10
+ export class SchemaNotFoundError extends BaseError.extend('SchemaNotFoundError', 'Schema not found') {
11
+ constructor(schema: string, options?: BaseErrorOptions) {
12
+ super({ context: { schema }, ...options });
13
+ }
14
+ }
15
+
16
+ export class ObjectNotFoundError extends BaseError.extend('ObjectNotFoundError', 'Object not found') {
17
+ constructor(dxn: DXN, options?: BaseErrorOptions) {
18
+ super({ context: { dxn }, ...options });
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Reason why getting a reactive object from a snapshot failed.
24
+ * - `no-database`: The snapshot is not associated with a database.
25
+ * - `object-not-found`: The object was removed or does not exist in the database.
26
+ */
27
+ export type GetReactiveErrorReason = 'no-database' | 'object-not-found';
28
+
29
+ /**
30
+ * Error thrown when a reactive object cannot be resolved from a snapshot.
31
+ * Extends `BaseError` with a `reason` and optional `snapshotId` in its context.
32
+ */
33
+ export class GetReactiveError extends BaseError.extend(
34
+ 'GetReactiveError',
35
+ 'Failed to get reactive object from snapshot',
36
+ ) {
37
+ constructor(options: { reason: GetReactiveErrorReason; snapshotId?: string } & BaseErrorOptions) {
38
+ super({ context: { reason: options.reason, snapshotId: options.snapshotId }, ...options });
39
+ }
40
+ }
@@ -0,0 +1,235 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Option from 'effect/Option';
6
+ import * as Schema from 'effect/Schema';
7
+ import { describe, test } from 'vitest';
8
+
9
+ import * as Extension from './Extension';
10
+
11
+ describe('Extension', () => {
12
+ describe('make', () => {
13
+ test('creates an extension with a string schema', ({ expect }) => {
14
+ const ColorExtension = Extension.make('color', Schema.String);
15
+
16
+ expect(ColorExtension.key).toBe('color');
17
+ expect(ColorExtension.valueSchema).toBe(Schema.String);
18
+ expect(ColorExtension[Extension.TypeId]).toBeDefined();
19
+ });
20
+
21
+ test('creates an extension with a number schema', ({ expect }) => {
22
+ const PriorityExtension = Extension.make('priority', Schema.Number);
23
+
24
+ expect(PriorityExtension.key).toBe('priority');
25
+ expect(PriorityExtension.valueSchema).toBe(Schema.Number);
26
+ });
27
+
28
+ test('creates an extension with a complex schema', ({ expect }) => {
29
+ const MetadataSchema = Schema.Struct({
30
+ author: Schema.String,
31
+ version: Schema.Number,
32
+ tags: Schema.Array(Schema.String),
33
+ });
34
+ const MetadataExtension = Extension.make('metadata', MetadataSchema);
35
+
36
+ expect(MetadataExtension.key).toBe('metadata');
37
+ expect(MetadataExtension.valueSchema).toBe(MetadataSchema);
38
+ });
39
+ });
40
+
41
+ describe('get and set', () => {
42
+ test('set and get a string value', ({ expect }) => {
43
+ const ColorExtension = Extension.make('color', Schema.String);
44
+ const values: Extension.Values = {};
45
+
46
+ Extension.set(values, ColorExtension, 'red');
47
+ const result = Extension.get(values, ColorExtension);
48
+
49
+ expect(Option.isSome(result)).toBe(true);
50
+ expect(Option.getOrThrow(result)).toBe('red');
51
+ });
52
+
53
+ test('set and get a number value', ({ expect }) => {
54
+ const PriorityExtension = Extension.make('priority', Schema.Number);
55
+ const values: Extension.Values = {};
56
+
57
+ Extension.set(values, PriorityExtension, 42);
58
+ const result = Extension.get(values, PriorityExtension);
59
+
60
+ expect(Option.isSome(result)).toBe(true);
61
+ expect(Option.getOrThrow(result)).toBe(42);
62
+ });
63
+
64
+ test('set and get a boolean value', ({ expect }) => {
65
+ const EnabledExtension = Extension.make('enabled', Schema.Boolean);
66
+ const values: Extension.Values = {};
67
+
68
+ Extension.set(values, EnabledExtension, true);
69
+ const result = Extension.get(values, EnabledExtension);
70
+
71
+ expect(Option.isSome(result)).toBe(true);
72
+ expect(Option.getOrThrow(result)).toBe(true);
73
+ });
74
+
75
+ test('set and get a complex object value', ({ expect }) => {
76
+ const ConfigSchema = Schema.Struct({
77
+ theme: Schema.String,
78
+ fontSize: Schema.Number,
79
+ darkMode: Schema.Boolean,
80
+ });
81
+ const ConfigExtension = Extension.make('config', ConfigSchema);
82
+ const values: Extension.Values = {};
83
+
84
+ const config = { theme: 'modern', fontSize: 14, darkMode: true };
85
+ Extension.set(values, ConfigExtension, config);
86
+ const result = Extension.get(values, ConfigExtension);
87
+
88
+ expect(Option.isSome(result)).toBe(true);
89
+ expect(Option.getOrThrow(result)).toEqual(config);
90
+ });
91
+
92
+ test('set and get an array value', ({ expect }) => {
93
+ const TagsExtension = Extension.make('tags', Schema.Array(Schema.String));
94
+ const values: Extension.Values = {};
95
+
96
+ const tags = ['important', 'urgent', 'review'];
97
+ Extension.set(values, TagsExtension, tags);
98
+ const result = Extension.get(values, TagsExtension);
99
+
100
+ expect(Option.isSome(result)).toBe(true);
101
+ expect(Option.getOrThrow(result)).toEqual(tags);
102
+ });
103
+
104
+ test('get returns None for missing extension', ({ expect }) => {
105
+ const ColorExtension = Extension.make('color', Schema.String);
106
+ const values: Extension.Values = {};
107
+
108
+ const result = Extension.get(values, ColorExtension);
109
+
110
+ expect(Option.isNone(result)).toBe(true);
111
+ });
112
+
113
+ test('overwriting an extension value', ({ expect }) => {
114
+ const ColorExtension = Extension.make('color', Schema.String);
115
+ const values: Extension.Values = {};
116
+
117
+ Extension.set(values, ColorExtension, 'red');
118
+ Extension.set(values, ColorExtension, 'blue');
119
+ const result = Extension.get(values, ColorExtension);
120
+
121
+ expect(Option.isSome(result)).toBe(true);
122
+ expect(Option.getOrThrow(result)).toBe('blue');
123
+ });
124
+
125
+ test('multiple extensions on the same values object', ({ expect }) => {
126
+ const ColorExtension = Extension.make('color', Schema.String);
127
+ const PriorityExtension = Extension.make('priority', Schema.Number);
128
+ const EnabledExtension = Extension.make('enabled', Schema.Boolean);
129
+ const values: Extension.Values = {};
130
+
131
+ Extension.set(values, ColorExtension, 'green');
132
+ Extension.set(values, PriorityExtension, 5);
133
+ Extension.set(values, EnabledExtension, false);
134
+
135
+ expect(Option.getOrThrow(Extension.get(values, ColorExtension))).toBe('green');
136
+ expect(Option.getOrThrow(Extension.get(values, PriorityExtension))).toBe(5);
137
+ expect(Option.getOrThrow(Extension.get(values, EnabledExtension))).toBe(false);
138
+ });
139
+ });
140
+
141
+ describe('curried forms', () => {
142
+ test('get curried form', ({ expect }) => {
143
+ const ColorExtension = Extension.make('color', Schema.String);
144
+ const values: Extension.Values = {};
145
+ Extension.set(values, ColorExtension, 'purple');
146
+
147
+ const getColor = Extension.get(ColorExtension);
148
+ const result = getColor(values);
149
+
150
+ expect(Option.isSome(result)).toBe(true);
151
+ expect(Option.getOrThrow(result)).toBe('purple');
152
+ });
153
+
154
+ test('set curried form', ({ expect }) => {
155
+ const ColorExtension = Extension.make('color', Schema.String);
156
+ const values: Extension.Values = {};
157
+
158
+ const setOrange = Extension.set(ColorExtension, 'orange');
159
+ setOrange(values);
160
+ const result = Extension.get(values, ColorExtension);
161
+
162
+ expect(Option.isSome(result)).toBe(true);
163
+ expect(Option.getOrThrow(result)).toBe('orange');
164
+ });
165
+
166
+ test('curried forms work in pipelines', ({ expect }) => {
167
+ const ColorExtension = Extension.make('color', Schema.String);
168
+ const values: Extension.Values = {};
169
+
170
+ Extension.set(ColorExtension, 'cyan')(values);
171
+ const result = Extension.get(ColorExtension)(values);
172
+
173
+ expect(Option.isSome(result)).toBe(true);
174
+ expect(Option.getOrThrow(result)).toBe('cyan');
175
+ });
176
+ });
177
+
178
+ describe('Key', () => {
179
+ test('Key.make creates a branded key', ({ expect }) => {
180
+ const key = Extension.Key.make('my-extension');
181
+
182
+ expect(key).toBe('my-extension');
183
+ expect(typeof key).toBe('string');
184
+ });
185
+ });
186
+
187
+ describe('Values schema', () => {
188
+ test('Values can be used as a schema', ({ expect }) => {
189
+ const PersonWithExtensions = Schema.Struct({
190
+ name: Schema.String,
191
+ extensions: Extension.Values,
192
+ });
193
+
194
+ const person = Schema.decodeUnknownSync(PersonWithExtensions)({
195
+ name: 'Alice',
196
+ extensions: {},
197
+ });
198
+
199
+ expect(person.name).toBe('Alice');
200
+ expect(person.extensions).toEqual({});
201
+ });
202
+
203
+ test('Values schema accepts extension data', ({ expect }) => {
204
+ const ColorExtension = Extension.make('color', Schema.String);
205
+ const values: Extension.Values = {};
206
+ Extension.set(values, ColorExtension, 'red');
207
+
208
+ const PersonWithExtensions = Schema.Struct({
209
+ name: Schema.String,
210
+ extensions: Extension.Values,
211
+ });
212
+
213
+ const person = Schema.decodeUnknownSync(PersonWithExtensions)({
214
+ name: 'Bob',
215
+ extensions: values,
216
+ });
217
+
218
+ expect(person.name).toBe('Bob');
219
+ const color = Extension.get(person.extensions, ColorExtension);
220
+ expect(Option.getOrThrow(color)).toBe('red');
221
+ });
222
+ });
223
+
224
+ describe('TypeId', () => {
225
+ test('TypeId is a unique symbol-like string', ({ expect }) => {
226
+ expect(Extension.TypeId).toBe('~@dxos/echo/Extension');
227
+ });
228
+
229
+ test('extensions have TypeId property', ({ expect }) => {
230
+ const ColorExtension = Extension.make('color', Schema.String);
231
+
232
+ expect(Extension.TypeId in ColorExtension).toBe(true);
233
+ });
234
+ });
235
+ });
@@ -0,0 +1,122 @@
1
+ // @import-as-namespace
2
+ //
3
+ // Copyright 2026 DXOS.org
4
+ //
5
+
6
+ import * as Function from 'effect/Function';
7
+ import * as Option from 'effect/Option';
8
+ import * as Schema from 'effect/Schema';
9
+ import type * as Types from 'effect/Types';
10
+
11
+ // @import-as-namespace
12
+
13
+ /**
14
+ * Extensions allow objects to contain typed properties that are not part of the schema.
15
+ */
16
+
17
+ export const TypeId = '~@dxos/echo/Extension' as const;
18
+ export type TypeId = typeof TypeId;
19
+
20
+ export interface Extension<T> extends Record<
21
+ TypeId,
22
+ {
23
+ _Type: T;
24
+ }
25
+ > {
26
+ readonly [TypeId]: {
27
+ _Type: T;
28
+ };
29
+
30
+ readonly key: Key;
31
+ readonly valueSchema: Schema.Schema<T>;
32
+ }
33
+
34
+ /**
35
+ * Create a new typed extension.
36
+ *
37
+ * ```ts
38
+ * const ColorExtension = Extension.make('color', Schema.String);
39
+ *
40
+ * const obj = Obj.make(Person, {
41
+ * [Obj.Meta]: { keys: [{ source: 'external', id: '123' }] },
42
+ * name: 'John',
43
+ * email: 'john@example.com',
44
+ * });
45
+ *
46
+ * Obj.update(obj, (obj) => {
47
+ * Extension.set(obj.extensions, ColorExtension, 'red');
48
+ * });
49
+ *
50
+ * console.log(Extension.get(obj.extensions, ColorExtension)); // 'red'
51
+ * ```
52
+ */
53
+ export const make = <S extends Schema.Schema.AnyNoContext>(
54
+ key: string,
55
+ valueSchema: S,
56
+ ): Extension<Schema.Schema.Type<S>> => {
57
+ return {
58
+ [TypeId]: {} as any,
59
+ key: Key.make(key),
60
+ valueSchema,
61
+ };
62
+ };
63
+
64
+ /**
65
+ * Unique identifier for an extension.
66
+ */
67
+ // TODO(dmaretskyi): filter to be fully qualified: (e.g., org.dxos.extension.color)
68
+ export const Key = Schema.String.pipe(Schema.brand('~@dxos/echo/ExtensionKey'));
69
+ export type Key = Schema.Schema.Type<typeof Key>;
70
+
71
+ /**
72
+ * Set of extension values.
73
+ *
74
+ * Can be used inside an object/relation schema:
75
+ *
76
+ * ```ts
77
+ * const Person = Schema.Struct({
78
+ * name: Schema.String,
79
+ * extensions: Extension.Values,
80
+ * });
81
+ * ```
82
+ */
83
+ export const Values = Schema.Record({ key: Key, value: Schema.Unknown });
84
+ export interface Values extends Schema.Schema.Type<typeof Values> {}
85
+
86
+ /**
87
+ * Get the value of an extension from a set of values.
88
+ */
89
+ export const get: {
90
+ <T>(extension: Extension<T>): (values: Values) => Option.Option<T>;
91
+ <T>(values: Values, extension: Extension<T>): Option.Option<T>;
92
+ } = Function.dual<
93
+ <T>(extension: Extension<T>) => (values: Values) => Option.Option<T>,
94
+ <T>(values: Values, extension: Extension<T>) => Option.Option<T>
95
+ >(2, (values, extension) => {
96
+ if (!(extension.key in values)) {
97
+ return Option.none();
98
+ }
99
+
100
+ return Function.pipe(values[extension.key], Schema.decodeUnknownSync(extension.valueSchema), Option.some);
101
+ });
102
+
103
+ /**
104
+ * Set the value of an extension in a set of values.
105
+ *
106
+ * Can also be used within Obj.update callback:
107
+ *
108
+ * ```ts
109
+ * Obj.update(obj, (obj) => {
110
+ * Extension.set(obj.extensions, ColorExtension, 'red');
111
+ * });
112
+ * ```
113
+ */
114
+ export const set: {
115
+ <T>(extension: Extension<T>, value: T): (values: Values) => void;
116
+ <T>(values: Types.Mutable<Values>, extension: Extension<T>, value: T): void;
117
+ } = Function.dual<
118
+ <T>(extension: Extension<T>, value: T) => (values: Values) => void,
119
+ <T>(values: Types.Mutable<Values>, extension: Extension<T>, value: T) => void
120
+ >(3, (values, extension, value) => {
121
+ values[extension.key] = Schema.encodeSync(extension.valueSchema)(value);
122
+ });