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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +45 -0
  4. package/dist/lib/neutral/Entity.mjs +56 -0
  5. package/dist/lib/neutral/Err.mjs +12 -0
  6. package/dist/lib/neutral/Feed.mjs +43 -0
  7. package/dist/lib/neutral/Filter.mjs +61 -0
  8. package/dist/lib/neutral/Format.mjs +66 -0
  9. package/dist/lib/neutral/Format.mjs.map +7 -0
  10. package/dist/lib/neutral/JsonSchema.mjs +18 -0
  11. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  12. package/dist/lib/neutral/Key.mjs +12 -0
  13. package/dist/lib/neutral/Key.mjs.map +7 -0
  14. package/dist/lib/neutral/Obj.mjs +107 -0
  15. package/dist/lib/neutral/Obj.mjs.map +7 -0
  16. package/dist/lib/neutral/Order.mjs +12 -0
  17. package/dist/lib/neutral/Order.mjs.map +7 -0
  18. package/dist/lib/neutral/Query.mjs +32 -0
  19. package/dist/lib/neutral/Query.mjs.map +7 -0
  20. package/dist/lib/neutral/QueryResult.mjs +2 -0
  21. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  22. package/dist/lib/neutral/Ref.mjs +24 -0
  23. package/dist/lib/neutral/Ref.mjs.map +7 -0
  24. package/dist/lib/neutral/Relation.mjs +90 -0
  25. package/dist/lib/neutral/Relation.mjs.map +7 -0
  26. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  27. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  28. package/dist/lib/neutral/Tag.mjs +25 -0
  29. package/dist/lib/neutral/Tag.mjs.map +7 -0
  30. package/dist/lib/neutral/Type.mjs +34 -0
  31. package/dist/lib/neutral/Type.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-4KG6IGL4.mjs +67 -0
  33. package/dist/lib/neutral/chunk-4KG6IGL4.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-5ELDDYWE.mjs +130 -0
  35. package/dist/lib/neutral/chunk-5ELDDYWE.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-ALOGSVBP.mjs +299 -0
  37. package/dist/lib/neutral/chunk-ALOGSVBP.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
  39. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-AQP4QKYP.mjs +283 -0
  41. package/dist/lib/neutral/chunk-AQP4QKYP.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-BRJSLACP.mjs +152 -0
  43. package/dist/lib/neutral/chunk-BRJSLACP.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-DZQSL6RW.mjs +73 -0
  45. package/dist/lib/neutral/chunk-DZQSL6RW.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs +327 -0
  47. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs +56 -0
  49. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-GFNCSK7F.mjs +101 -0
  51. package/dist/lib/neutral/chunk-GFNCSK7F.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  53. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-KGV3QIRX.mjs +313 -0
  55. package/dist/lib/neutral/chunk-KGV3QIRX.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-M2KVTHZM.mjs +402 -0
  57. package/dist/lib/neutral/chunk-M2KVTHZM.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-MXQJZCPY.mjs +51 -0
  59. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-O3TZFQCT.mjs +27 -0
  61. package/dist/lib/neutral/chunk-O3TZFQCT.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
  63. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-OVUBTQLT.mjs +45 -0
  65. package/dist/lib/neutral/chunk-OVUBTQLT.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-PP4DNUZU.mjs +3919 -0
  67. package/dist/lib/neutral/chunk-PP4DNUZU.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-QXF3LGN2.mjs +43 -0
  69. package/dist/lib/neutral/chunk-QXF3LGN2.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs +97 -0
  71. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-T6JEFNP6.mjs +7 -0
  73. package/dist/lib/neutral/chunk-T6JEFNP6.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs +121 -0
  75. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs +42 -0
  77. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs +298 -0
  79. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs.map +7 -0
  80. package/dist/lib/neutral/index.mjs +94 -0
  81. package/dist/lib/neutral/index.mjs.map +7 -0
  82. package/dist/lib/{node-esm → neutral}/internal/index.mjs +260 -122
  83. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  84. package/dist/lib/neutral/meta.json +1 -0
  85. package/dist/lib/neutral/testing/index.mjs +369 -0
  86. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  87. package/dist/types/src/Annotation.d.ts +24 -0
  88. package/dist/types/src/Annotation.d.ts.map +1 -0
  89. package/dist/types/src/Collection.d.ts +16 -0
  90. package/dist/types/src/Collection.d.ts.map +1 -0
  91. package/dist/types/src/Database.d.ts +189 -0
  92. package/dist/types/src/Database.d.ts.map +1 -0
  93. package/dist/types/src/Dataset.d.ts +18 -0
  94. package/dist/types/src/Dataset.d.ts.map +1 -0
  95. package/dist/types/src/Entity.d.ts +168 -0
  96. package/dist/types/src/Entity.d.ts.map +1 -0
  97. package/dist/types/src/Entity.test.d.ts +2 -0
  98. package/dist/types/src/Entity.test.d.ts.map +1 -0
  99. package/dist/types/src/Err.d.ts +107 -0
  100. package/dist/types/src/Err.d.ts.map +1 -0
  101. package/dist/types/src/Feed.d.ts +165 -0
  102. package/dist/types/src/Feed.d.ts.map +1 -0
  103. package/dist/types/src/Filter.d.ts +120 -0
  104. package/dist/types/src/Filter.d.ts.map +1 -0
  105. package/dist/types/src/Format.d.ts +4 -0
  106. package/dist/types/src/Format.d.ts.map +1 -0
  107. package/dist/types/src/Hypergraph.d.ts +60 -0
  108. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +16 -0
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  111. package/dist/types/src/Key.d.ts +1 -0
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Obj.d.ts +423 -95
  114. package/dist/types/src/Obj.d.ts.map +1 -1
  115. package/dist/types/src/Obj.test.d.ts +2 -0
  116. package/dist/types/src/Obj.test.d.ts.map +1 -0
  117. package/dist/types/src/Order.d.ts +16 -0
  118. package/dist/types/src/Order.d.ts.map +1 -0
  119. package/dist/types/src/Query.d.ts +202 -0
  120. package/dist/types/src/Query.d.ts.map +1 -0
  121. package/dist/types/src/Query.test.d.ts +2 -0
  122. package/dist/types/src/Query.test.d.ts.map +1 -0
  123. package/dist/types/src/QueryResult.d.ts +80 -0
  124. package/dist/types/src/QueryResult.d.ts.map +1 -0
  125. package/dist/types/src/Ref.d.ts +61 -11
  126. package/dist/types/src/Ref.d.ts.map +1 -1
  127. package/dist/types/src/Relation.d.ts +287 -21
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Relation.test.d.ts +2 -0
  130. package/dist/types/src/Relation.test.d.ts.map +1 -0
  131. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  132. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  133. package/dist/types/src/Tag.d.ts +18 -0
  134. package/dist/types/src/Tag.d.ts.map +1 -0
  135. package/dist/types/src/Type.d.ts +120 -97
  136. package/dist/types/src/Type.d.ts.map +1 -1
  137. package/dist/types/src/Type.test.d.ts +2 -0
  138. package/dist/types/src/Type.test.d.ts.map +1 -0
  139. package/dist/types/src/View.d.ts +68 -0
  140. package/dist/types/src/View.d.ts.map +1 -0
  141. package/dist/types/src/hierarchy.test.d.ts +2 -0
  142. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  143. package/dist/types/src/index.d.ts +19 -5
  144. package/dist/types/src/index.d.ts.map +1 -1
  145. package/dist/types/src/internal/annotations/annotations.d.ts +209 -0
  146. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  147. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  148. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  149. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  150. package/dist/types/src/internal/annotations/util.d.ts +39 -0
  151. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  152. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  153. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  154. package/dist/types/src/internal/api/entity.d.ts +13 -0
  155. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  156. package/dist/types/src/internal/api/index.d.ts +15 -0
  157. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  158. package/dist/types/src/internal/api/meta.d.ts +42 -0
  159. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  160. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  161. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  162. package/dist/types/src/internal/api/version.d.ts +42 -0
  163. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  164. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  165. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  166. package/dist/types/src/internal/entities/index.d.ts +6 -0
  167. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  168. package/dist/types/src/internal/entities/model.d.ts +79 -0
  169. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  170. package/dist/types/src/internal/entities/object.d.ts +18 -0
  171. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  172. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  173. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  174. package/dist/types/src/internal/entities/util.d.ts +2 -0
  175. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  176. package/dist/types/src/internal/formats/format.d.ts +4 -2
  177. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  178. package/dist/types/src/internal/formats/select.d.ts +6 -4
  179. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  180. package/dist/types/src/internal/formats/string.d.ts +4 -0
  181. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  182. package/dist/types/src/internal/formats/types.d.ts +13 -9
  183. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  184. package/dist/types/src/internal/index.d.ts +7 -10
  185. package/dist/types/src/internal/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  187. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  188. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  189. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  190. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  192. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +4 -6
  194. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  195. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  196. package/dist/types/src/internal/object/clone.d.ts +8 -0
  197. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  198. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  199. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +10 -11
  200. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  201. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  202. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  203. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  204. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  205. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  206. package/dist/types/src/internal/object/index.d.ts +6 -12
  207. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  208. package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
  209. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  210. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  211. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  212. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  213. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  214. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  215. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  216. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  217. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  218. package/dist/types/src/internal/object/typed-object.d.ts +8 -14
  219. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  220. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  221. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  222. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  223. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  224. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  225. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  226. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  227. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  228. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  229. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  230. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  231. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  232. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  233. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  234. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  235. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  236. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  237. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  238. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  239. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  240. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  241. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  242. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  243. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  244. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  245. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  246. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  247. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  248. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  249. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  250. package/dist/types/src/internal/proxy/typed-handler.d.ts +16 -12
  251. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  252. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  253. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  254. package/dist/types/src/internal/ref/ref.d.ts +43 -18
  255. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  256. package/dist/types/src/internal/schema/compose.d.ts +7 -0
  257. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  258. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/schema/echo-schema.d.ts +25 -12
  260. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  261. package/dist/types/src/internal/schema/index.d.ts +1 -4
  262. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  263. package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -1
  264. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  265. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  266. package/dist/types/src/internal/types/base.d.ts +27 -0
  267. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  268. package/dist/types/src/internal/types/entity.d.ts +37 -0
  269. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  270. package/dist/types/src/internal/types/index.d.ts +5 -2
  271. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  272. package/dist/types/src/internal/{object → types}/meta.d.ts +16 -14
  273. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  274. package/dist/types/src/internal/types/typename.d.ts +21 -0
  275. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  276. package/dist/types/src/internal/types/version.d.ts +15 -0
  277. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  278. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  279. package/dist/types/src/testing/index.d.ts +3 -3
  280. package/dist/types/src/testing/index.d.ts.map +1 -1
  281. package/dist/types/src/testing/test-data.d.ts +18 -0
  282. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  283. package/dist/types/src/testing/test-schema.d.ts +304 -0
  284. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  285. package/dist/types/src/testing/util.d.ts +21 -0
  286. package/dist/types/src/testing/util.d.ts.map +1 -0
  287. package/dist/types/tsconfig.tsbuildinfo +1 -1
  288. package/package.json +106 -65
  289. package/src/Annotation.ts +46 -0
  290. package/src/Collection.ts +30 -0
  291. package/src/Database.ts +315 -0
  292. package/src/Dataset.ts +24 -0
  293. package/src/Entity.test.ts +22 -0
  294. package/src/Entity.ts +234 -0
  295. package/src/Err.ts +38 -0
  296. package/src/Feed.ts +254 -0
  297. package/src/Filter.ts +389 -0
  298. package/src/Format.ts +9 -0
  299. package/src/Hypergraph.ts +74 -0
  300. package/src/JsonSchema.ts +24 -0
  301. package/src/Key.ts +3 -0
  302. package/src/Obj.test.ts +447 -0
  303. package/src/Obj.ts +588 -248
  304. package/src/Order.ts +44 -0
  305. package/src/Query.test.ts +632 -0
  306. package/src/Query.ts +520 -0
  307. package/src/QueryResult.ts +106 -0
  308. package/src/Ref.ts +77 -9
  309. package/src/Relation.test.ts +88 -0
  310. package/src/Relation.ts +440 -58
  311. package/src/SchemaRegistry.ts +106 -0
  312. package/src/Tag.ts +39 -0
  313. package/src/Type.test.ts +52 -0
  314. package/src/Type.ts +162 -151
  315. package/src/View.ts +100 -0
  316. package/src/hierarchy.test.ts +33 -0
  317. package/src/index.ts +20 -6
  318. package/src/internal/README.md +102 -0
  319. package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
  320. package/src/internal/annotations/annotations.ts +526 -0
  321. package/src/internal/annotations/index.ts +6 -0
  322. package/src/internal/annotations/util.ts +85 -0
  323. package/src/internal/api/annotations.ts +60 -0
  324. package/src/internal/api/entity.ts +29 -0
  325. package/src/internal/api/index.ts +19 -0
  326. package/src/internal/api/meta.ts +88 -0
  327. package/src/internal/api/sorting.ts +53 -0
  328. package/src/internal/api/version.ts +96 -0
  329. package/src/internal/entities/entity.ts +128 -0
  330. package/src/internal/entities/index.ts +9 -0
  331. package/src/internal/entities/model.ts +138 -0
  332. package/src/internal/entities/object.ts +58 -0
  333. package/src/internal/entities/relation.ts +171 -0
  334. package/src/internal/entities/util.ts +33 -0
  335. package/src/internal/formats/date.test.ts +1 -1
  336. package/src/internal/formats/date.ts +5 -5
  337. package/src/internal/formats/format.test.ts +6 -6
  338. package/src/internal/formats/format.ts +8 -6
  339. package/src/internal/formats/number.ts +5 -5
  340. package/src/internal/formats/object.ts +4 -4
  341. package/src/internal/formats/select.ts +6 -4
  342. package/src/internal/formats/string.ts +14 -9
  343. package/src/internal/formats/types.ts +53 -42
  344. package/src/internal/index.ts +30 -13
  345. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  346. package/src/internal/json-schema/index.ts +2 -0
  347. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  348. package/src/internal/json-schema/json-schema-type.ts +35 -35
  349. package/src/internal/{json → json-schema}/json-schema.test.ts +232 -97
  350. package/src/internal/{json → json-schema}/json-schema.ts +79 -93
  351. package/src/internal/object/clone.ts +48 -0
  352. package/src/internal/object/common.ts +3 -4
  353. package/src/internal/object/{create.test.ts → create-object.test.ts} +31 -33
  354. package/src/internal/object/{create.ts → create-object.ts} +36 -37
  355. package/src/internal/object/deleted.ts +6 -6
  356. package/src/internal/object/ids.ts +1 -1
  357. package/src/internal/object/index.ts +6 -12
  358. package/src/internal/object/inspect.ts +5 -7
  359. package/src/internal/object/json-serializer.test.ts +59 -37
  360. package/src/internal/object/json-serializer.ts +87 -108
  361. package/src/internal/object/schema-validator.test.ts +3 -7
  362. package/src/internal/object/schema-validator.ts +2 -237
  363. package/src/internal/object/set-value.test.ts +281 -0
  364. package/src/internal/object/set-value.ts +165 -0
  365. package/src/internal/object/snapshot.ts +96 -0
  366. package/src/internal/object/typed-object.test.ts +11 -11
  367. package/src/internal/object/typed-object.ts +8 -59
  368. package/src/internal/proxy/change-context.ts +138 -0
  369. package/src/internal/proxy/change.test.ts +519 -0
  370. package/src/internal/proxy/define-hidden-property.ts +14 -0
  371. package/src/internal/proxy/errors.ts +42 -0
  372. package/src/internal/proxy/event-batch.ts +44 -0
  373. package/src/internal/proxy/handler.test.ts +51 -91
  374. package/src/internal/proxy/index.ts +17 -0
  375. package/src/internal/proxy/json-serializer.ts +87 -0
  376. package/src/internal/proxy/make-object.ts +106 -0
  377. package/src/internal/proxy/ownership.ts +253 -0
  378. package/src/internal/proxy/proxy-types.ts +23 -0
  379. package/src/internal/proxy/proxy-utils.ts +150 -0
  380. package/src/internal/proxy/reactive-array.ts +71 -0
  381. package/src/internal/proxy/reactive.ts +69 -0
  382. package/src/internal/proxy/schema-validator.ts +244 -0
  383. package/src/internal/proxy/schema.test.ts +27 -18
  384. package/src/internal/proxy/symbols.ts +7 -0
  385. package/src/internal/proxy/typed-handler.test.ts +260 -48
  386. package/src/internal/proxy/typed-handler.ts +283 -61
  387. package/src/internal/proxy/typed-object.test.ts +54 -38
  388. package/src/internal/ref/ref-array.ts +4 -4
  389. package/src/internal/ref/ref.test.ts +10 -9
  390. package/src/internal/ref/ref.ts +107 -56
  391. package/src/internal/{projection → schema}/compose.test.ts +8 -9
  392. package/src/internal/{projection → schema}/compose.ts +13 -8
  393. package/src/internal/schema/echo-schema.ts +74 -33
  394. package/src/internal/schema/index.ts +1 -4
  395. package/src/internal/schema/manipulation.ts +7 -1
  396. package/src/internal/schema/persistent-schema.ts +33 -0
  397. package/src/internal/types/base.ts +43 -0
  398. package/src/internal/types/entity.ts +54 -0
  399. package/src/internal/types/index.ts +5 -2
  400. package/src/internal/types/meta.ts +68 -0
  401. package/src/internal/types/typename.ts +55 -0
  402. package/src/internal/types/version.ts +19 -0
  403. package/src/testing/api.test.ts +126 -0
  404. package/src/testing/index.ts +3 -3
  405. package/src/testing/test-data.ts +130 -0
  406. package/src/testing/test-schema.ts +240 -0
  407. package/src/testing/util.ts +85 -0
  408. package/dist/lib/browser/chunk-MWLA34S5.mjs +0 -3843
  409. package/dist/lib/browser/chunk-MWLA34S5.mjs.map +0 -7
  410. package/dist/lib/browser/chunk-OAZJQHVO.mjs +0 -453
  411. package/dist/lib/browser/chunk-OAZJQHVO.mjs.map +0 -7
  412. package/dist/lib/browser/chunk-ORIE2FMS.mjs +0 -514
  413. package/dist/lib/browser/chunk-ORIE2FMS.mjs.map +0 -7
  414. package/dist/lib/browser/index.mjs +0 -43
  415. package/dist/lib/browser/internal/index.mjs +0 -326
  416. package/dist/lib/browser/meta.json +0 -1
  417. package/dist/lib/browser/query/index.mjs +0 -23
  418. package/dist/lib/browser/testing/index.mjs +0 -298
  419. package/dist/lib/browser/testing/index.mjs.map +0 -7
  420. package/dist/lib/node-esm/chunk-AXWVDOP7.mjs +0 -453
  421. package/dist/lib/node-esm/chunk-AXWVDOP7.mjs.map +0 -7
  422. package/dist/lib/node-esm/chunk-L4PBAJDP.mjs +0 -514
  423. package/dist/lib/node-esm/chunk-L4PBAJDP.mjs.map +0 -7
  424. package/dist/lib/node-esm/chunk-YTNLFBIK.mjs +0 -3843
  425. package/dist/lib/node-esm/chunk-YTNLFBIK.mjs.map +0 -7
  426. package/dist/lib/node-esm/index.mjs +0 -43
  427. package/dist/lib/node-esm/meta.json +0 -1
  428. package/dist/lib/node-esm/query/index.mjs +0 -23
  429. package/dist/lib/node-esm/testing/index.mjs +0 -298
  430. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  431. package/dist/types/src/errors.d.ts +0 -72
  432. package/dist/types/src/errors.d.ts.map +0 -1
  433. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  434. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  435. package/dist/types/src/internal/ast/annotations.d.ts +0 -119
  436. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  437. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  438. package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
  439. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  440. package/dist/types/src/internal/ast/index.d.ts +0 -5
  441. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  442. package/dist/types/src/internal/ast/types.d.ts +0 -6
  443. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  444. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  445. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  446. package/dist/types/src/internal/json/index.d.ts +0 -2
  447. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  448. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  449. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  450. package/dist/types/src/internal/object/accessors.d.ts +0 -29
  451. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  452. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  453. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  454. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  455. package/dist/types/src/internal/object/entity.d.ts +0 -22
  456. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  457. package/dist/types/src/internal/object/expando.d.ts +0 -14
  458. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  459. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  460. package/dist/types/src/internal/object/model.d.ts +0 -117
  461. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  462. package/dist/types/src/internal/object/relation.d.ts +0 -17
  463. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  464. package/dist/types/src/internal/object/typed-relation.d.ts +0 -32
  465. package/dist/types/src/internal/object/typed-relation.d.ts.map +0 -1
  466. package/dist/types/src/internal/object/typename.d.ts +0 -15
  467. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  468. package/dist/types/src/internal/object/version.d.ts +0 -14
  469. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  470. package/dist/types/src/internal/projection/compose.d.ts +0 -6
  471. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  472. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  473. package/dist/types/src/internal/projection/index.d.ts +0 -2
  474. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  475. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  476. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  477. package/dist/types/src/internal/query/index.d.ts +0 -2
  478. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  479. package/dist/types/src/internal/query/query.d.ts +0 -17
  480. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  481. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  482. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  483. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  484. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  485. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  486. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  487. package/dist/types/src/internal/testing/index.d.ts +0 -3
  488. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  489. package/dist/types/src/internal/testing/types.d.ts +0 -455
  490. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  491. package/dist/types/src/internal/testing/utils.d.ts +0 -10
  492. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  493. package/dist/types/src/internal/types/types.d.ts +0 -79
  494. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  495. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  496. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  497. package/dist/types/src/internal/types/util.d.ts +0 -5
  498. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  499. package/dist/types/src/query/index.d.ts +0 -3
  500. package/dist/types/src/query/index.d.ts.map +0 -1
  501. package/dist/types/src/query/query.d.ts +0 -247
  502. package/dist/types/src/query/query.d.ts.map +0 -1
  503. package/dist/types/src/query/query.test.d.ts +0 -2
  504. package/dist/types/src/query/query.test.d.ts.map +0 -1
  505. package/dist/types/src/query/tag.d.ts +0 -18
  506. package/dist/types/src/query/tag.d.ts.map +0 -1
  507. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  508. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  509. package/dist/types/src/testing/types.d.ts +0 -113
  510. package/dist/types/src/testing/types.d.ts.map +0 -1
  511. package/src/errors.ts +0 -18
  512. package/src/internal/ast/annotation-helper.ts +0 -22
  513. package/src/internal/ast/annotations.ts +0 -212
  514. package/src/internal/ast/entity-kind.ts +0 -15
  515. package/src/internal/ast/index.ts +0 -8
  516. package/src/internal/ast/types.ts +0 -17
  517. package/src/internal/json/index.ts +0 -5
  518. package/src/internal/object/accessors.ts +0 -115
  519. package/src/internal/object/entity.ts +0 -204
  520. package/src/internal/object/expando.ts +0 -21
  521. package/src/internal/object/meta.ts +0 -62
  522. package/src/internal/object/model.ts +0 -170
  523. package/src/internal/object/relation.ts +0 -24
  524. package/src/internal/object/typed-relation.ts +0 -85
  525. package/src/internal/object/typename.ts +0 -61
  526. package/src/internal/object/version.ts +0 -22
  527. package/src/internal/projection/index.ts +0 -5
  528. package/src/internal/proxy/reactive-object.ts +0 -108
  529. package/src/internal/query/index.ts +0 -5
  530. package/src/internal/query/query.ts +0 -23
  531. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  532. package/src/internal/schema/snapshot.ts +0 -25
  533. package/src/internal/schema/stored-schema.ts +0 -26
  534. package/src/internal/testing/index.ts +0 -6
  535. package/src/internal/testing/types.ts +0 -211
  536. package/src/internal/testing/utils.ts +0 -54
  537. package/src/internal/types/types.test.ts +0 -48
  538. package/src/internal/types/types.ts +0 -176
  539. package/src/internal/types/util.ts +0 -9
  540. package/src/query/index.ts +0 -6
  541. package/src/query/query.test.ts +0 -362
  542. package/src/query/query.ts +0 -784
  543. package/src/query/tag.ts +0 -35
  544. package/src/test/api.test.ts +0 -180
  545. package/src/testing/echo-schema.ts +0 -39
  546. package/src/testing/types.ts +0 -91
  547. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  548. /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
  549. /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
  550. /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
  551. /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Feed.mjs.map} +0 -0
  552. /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Filter.mjs.map} +0 -0
  553. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  554. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  555. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  556. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  557. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  558. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  559. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
package/src/Entity.ts ADDED
@@ -0,0 +1,234 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type { ForeignKey } from '@dxos/echo-protocol';
6
+ import type { DXN, ObjectId } from '@dxos/keys';
7
+
8
+ import * as internal from './internal';
9
+ import type * as Relation from './Relation';
10
+
11
+ // Re-export KindId and SnapshotKindId from internal.
12
+ export const KindId = internal.KindId;
13
+ export type KindId = typeof internal.KindId;
14
+ export const SnapshotKindId = internal.SnapshotKindId;
15
+ export type SnapshotKindId = typeof internal.SnapshotKindId;
16
+
17
+ // NOTE: Relation does not extend Obj so that, for example, we can prevent Relations from being used as source and target objects.
18
+ // However, we generally refer to Obj and Relation instances as "objects",
19
+ // and many API methods accept both Obj.Unknown and Relation.Unknown (i.e., Entity.Unknown) instances.
20
+
21
+ export const Kind = internal.EntityKind;
22
+ export type Kind = internal.EntityKind;
23
+ export const KindSchema = internal.EntityKindSchema;
24
+
25
+ /**
26
+ * Assigns a kind to an Object or Relation instance.
27
+ * NOTE: Needed to make `isRelation` and `isObject` checks work.
28
+ */
29
+ export interface OfKind<K extends Kind> {
30
+ readonly [KindId]: K;
31
+ readonly id: ObjectId;
32
+ }
33
+
34
+ /**
35
+ * Assigns a snapshot kind to an Object or Relation snapshot.
36
+ */
37
+ export interface SnapshotOfKind<K extends Kind> {
38
+ readonly [SnapshotKindId]: K;
39
+ readonly id: ObjectId;
40
+ }
41
+
42
+ /**
43
+ * Obj or Relation with a specific set of properties.
44
+ */
45
+ export type Entity<Props> = OfKind<Kind> & Props;
46
+
47
+ /**
48
+ * Unknown Obj or Relation (reactive).
49
+ */
50
+ export interface Unknown extends OfKind<Kind> {}
51
+
52
+ /**
53
+ * Snapshot of an Obj or Relation.
54
+ * Branded with SnapshotKindId instead of KindId.
55
+ */
56
+ export interface Snapshot extends SnapshotOfKind<Kind> {}
57
+
58
+ /**
59
+ * Object with arbitrary properties.
60
+ *
61
+ * NOTE: Due to how typescript works, this type is not assignable to a specific schema type.
62
+ * In that case, use `Obj.instanceOf` to check if an object is of a specific type.
63
+ *
64
+ * This type is very permissive and allows accessing any property on the object.
65
+ * We should move to Obj.Unknown that is not permissive and requires explicit instanceof checks..
66
+ */
67
+ export interface Any extends OfKind<Kind> {
68
+ [key: string]: unknown;
69
+ }
70
+
71
+ /**
72
+ * Returns all properties of an object or relation except for the id and kind.
73
+ */
74
+ export type Properties<T> = Omit<T, 'id' | KindId | Relation.Source | Relation.Target>;
75
+
76
+ /**
77
+ * Check if a value is an ECHO entity (object or relation).
78
+ * Returns `false` for snapshots.
79
+ */
80
+ export const isEntity = (value: unknown): value is Unknown => {
81
+ if (typeof value !== 'object' || value === null) {
82
+ return false;
83
+ }
84
+ return (value as any)[KindId] !== undefined;
85
+ };
86
+
87
+ /**
88
+ * Check if a value is an ECHO entity snapshot.
89
+ * Returns `false` for entities.
90
+ */
91
+ export const isSnapshot = (value: unknown): value is Snapshot => {
92
+ if (typeof value !== 'object' || value === null) {
93
+ return false;
94
+ }
95
+ return (value as any)[SnapshotKindId] !== undefined;
96
+ };
97
+
98
+ // TODO(dmaretskyi): Type introspection -- move to kind.
99
+ export const getKind = internal.getEntityKind;
100
+
101
+ /**
102
+ * Property that accesses metadata for an entity.
103
+ */
104
+ export const Meta: unique symbol = internal.MetaId as any;
105
+
106
+ /**
107
+ * Property that accesses metadata for an entity.
108
+ */
109
+ export type Meta = typeof Meta;
110
+
111
+ //
112
+ // Entity-level functions that work on any entity (object or relation).
113
+ // Use these when you don't know or care about the specific entity kind.
114
+ // For kind-specific functions, use Obj.* or Relation.*.
115
+ //
116
+
117
+ /**
118
+ * JSON representation of an entity.
119
+ */
120
+ export type JSON = internal.ObjectJSON;
121
+
122
+ /**
123
+ * Get the DXN of an entity (object or relation).
124
+ */
125
+ export const getDXN = (entity: Unknown | Snapshot): DXN => internal.getDXN(entity);
126
+
127
+ /**
128
+ * Get the DXN of an entity's type.
129
+ */
130
+ export const getTypeDXN = internal.getTypeDXN;
131
+
132
+ /**
133
+ * Get the typename of an entity's type.
134
+ */
135
+ export const getTypename = (entity: Unknown | Snapshot): string | undefined => internal.getTypename(entity);
136
+
137
+ /**
138
+ * Get the database an entity belongs to.
139
+ */
140
+ export const getDatabase = (entity: Unknown | Snapshot): any | undefined => internal.getDatabase(entity);
141
+
142
+ /**
143
+ * Get the metadata for an entity.
144
+ * Returns mutable meta when passed a mutable entity (inside change callback).
145
+ * Returns read-only meta when passed a regular entity or snapshot.
146
+ */
147
+ // TODO(wittjosiah): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
148
+ export function getMeta(entity: Mutable<Unknown>): internal.ObjectMeta;
149
+ export function getMeta(entity: Unknown | Snapshot): internal.ReadonlyMeta;
150
+ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): internal.ObjectMeta | internal.ReadonlyMeta {
151
+ return internal.getMetaChecked(entity);
152
+ }
153
+
154
+ /**
155
+ * Get foreign keys for an entity from the specified source.
156
+ */
157
+ export const getKeys = (entity: Unknown | Snapshot, source: string): ForeignKey[] => internal.getKeys(entity, source);
158
+
159
+ /**
160
+ * Check if an entity is deleted.
161
+ */
162
+ export const isDeleted = (entity: Unknown | Snapshot): boolean => internal.isDeleted(entity);
163
+
164
+ /**
165
+ * Get the label of an entity.
166
+ */
167
+ export const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);
168
+
169
+ /**
170
+ * Get the description of an entity.
171
+ */
172
+ export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
173
+
174
+ /**
175
+ * Convert an entity to its JSON representation.
176
+ */
177
+ export const toJSON = (entity: Unknown | Snapshot): JSON => internal.objectToJSON(entity);
178
+
179
+ /**
180
+ * Subscribe to changes on an entity (object or relation).
181
+ * @returns Unsubscribe function.
182
+ */
183
+ export const subscribe = (entity: Unknown, callback: () => void): (() => void) => {
184
+ return internal.subscribe(entity, callback);
185
+ };
186
+
187
+ //
188
+ // Change
189
+ //
190
+
191
+ /**
192
+ * Used to provide a mutable view of an entity within `Entity.change`.
193
+ */
194
+ export type Mutable<T> = internal.Mutable<T>;
195
+
196
+ /**
197
+ * Perform mutations on an entity (object or relation) within a change context.
198
+ *
199
+ * Entities are read-only by default. Mutations are batched and notifications fire
200
+ * when the callback completes. Direct mutations outside of `Entity.change` will throw
201
+ * at runtime.
202
+ *
203
+ * @param entity - The echo entity (object or relation) to mutate.
204
+ * @param callback - Receives a mutable view of the entity. All mutations must occur here.
205
+ *
206
+ * @example
207
+ * ```typescript
208
+ * // Mutate within Entity.change
209
+ * Entity.change(entity, (e) => {
210
+ * e.name = 'Updated';
211
+ * e.count = 42;
212
+ * });
213
+ *
214
+ * // Direct mutation throws
215
+ * entity.name = 'Bob'; // Error: Cannot modify outside Entity.change()
216
+ * ```
217
+ *
218
+ * Note: For type-specific operations, prefer `Obj.change` or `Relation.change`.
219
+ */
220
+ export const change = <T extends Unknown>(entity: T, callback: internal.ChangeCallback<T>): void => {
221
+ internal.change(entity, callback);
222
+ };
223
+
224
+ /**
225
+ * Add a tag to an entity.
226
+ * Must be called within an `Entity.change`, `Obj.change`, or `Relation.change` callback.
227
+ */
228
+ export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);
229
+
230
+ /**
231
+ * Remove a tag from an entity.
232
+ * Must be called within an `Entity.change`, `Obj.change`, or `Relation.change` callback.
233
+ */
234
+ export const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);
package/src/Err.ts ADDED
@@ -0,0 +1,38 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { BaseError, type BaseErrorOptions } from '@dxos/errors';
6
+ import { type DXN } from '@dxos/keys';
7
+
8
+ export class SchemaNotFoundError extends BaseError.extend('SchemaNotFoundError', 'Schema not found') {
9
+ constructor(schema: string, options?: BaseErrorOptions) {
10
+ super({ context: { schema }, ...options });
11
+ }
12
+ }
13
+
14
+ export class ObjectNotFoundError extends BaseError.extend('ObjectNotFoundError', 'Object not found') {
15
+ constructor(dxn: DXN, options?: BaseErrorOptions) {
16
+ super({ context: { dxn }, ...options });
17
+ }
18
+ }
19
+
20
+ /**
21
+ * Reason why getting a reactive object from a snapshot failed.
22
+ * - `no-database`: The snapshot is not associated with a database.
23
+ * - `object-not-found`: The object was removed or does not exist in the database.
24
+ */
25
+ export type GetReactiveErrorReason = 'no-database' | 'object-not-found';
26
+
27
+ /**
28
+ * Error thrown when a reactive object cannot be resolved from a snapshot.
29
+ * Extends `BaseError` with a `reason` and optional `snapshotId` in its context.
30
+ */
31
+ export class GetReactiveError extends BaseError.extend(
32
+ 'GetReactiveError',
33
+ 'Failed to get reactive object from snapshot',
34
+ ) {
35
+ constructor(options: { reason: GetReactiveErrorReason; snapshotId?: string } & BaseErrorOptions) {
36
+ super({ context: { reason: options.reason, snapshotId: options.snapshotId }, ...options });
37
+ }
38
+ }
package/src/Feed.ts ADDED
@@ -0,0 +1,254 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Context from 'effect/Context';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Layer from 'effect/Layer';
8
+ import type * as Option from 'effect/Option';
9
+ import * as Schema from 'effect/Schema';
10
+
11
+ import { DXN } from '@dxos/keys';
12
+
13
+ import type * as Entity from './Entity';
14
+ import type * as Filter from './Filter';
15
+ import * as internal from './internal';
16
+ import * as Obj from './Obj';
17
+ import type * as Query from './Query';
18
+ import type * as QueryResult from './QueryResult';
19
+ import * as Type from './Type';
20
+
21
+ /**
22
+ * Runtime schema for a Feed object.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * const feed = Obj.make(Feed.Feed, { name: 'notifications', kind: 'dxos.org/plugin/notifications/v1' });
27
+ * ```
28
+ */
29
+ export const Feed = Schema.Struct({
30
+ /** User-facing display name. */
31
+ name: Schema.String.pipe(Schema.optional),
32
+ /** Identifier for the feed's kind (e.g., plugin id). */
33
+ kind: Schema.String.pipe(internal.FormInputAnnotation.set(false), Schema.optional),
34
+ }).pipe(
35
+ Type.object({
36
+ typename: 'dxos.org/type/Feed',
37
+ version: '0.1.0',
38
+ }),
39
+ );
40
+
41
+ /**
42
+ * TypeScript instance type for a Feed object.
43
+ */
44
+ export interface Feed extends Schema.Schema.Type<typeof Feed> {}
45
+
46
+ //
47
+ // Types
48
+ //
49
+
50
+ /**
51
+ * Meta key source for storing the backing DXN bound to a feed object.
52
+ */
53
+ // TODO(dmaretskyi): Enforce that Feed ObjectId = feed storage ID. And remove this key.
54
+ export const DXN_KEY = 'dxos.org/key/feed';
55
+
56
+ /**
57
+ * Opaque cursor for iterating over feed items.
58
+ */
59
+ // TODO(dmaretskyi): T needs to be referenced in the type structure for typescript to respect it during inference and type-checking.
60
+ export interface Cursor<T = Obj.Snapshot> {
61
+ readonly _tag: 'Cursor';
62
+ }
63
+
64
+ /**
65
+ * Retention options for a feed.
66
+ */
67
+ export interface RetentionOptions {
68
+ /** Retain items after this cursor position. */
69
+ // TODO(wittjosiah): Use FeedCursor from @dxos/feed?
70
+ cursor?: string;
71
+ }
72
+
73
+ //
74
+ // Factory
75
+ //
76
+
77
+ /**
78
+ * Creates a new feed object.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const feed = Feed.make({ name: 'notifications', kind: 'dxos.org/plugin/notifications/v1' });
83
+ * ```
84
+ */
85
+ // TODO(wittjosiah): How to control the feed namespace (data/trace)? Why do feeds have namespaces?
86
+ export const make = (props: Obj.MakeProps<typeof Feed>): Feed => Obj.make(Feed, props);
87
+
88
+ /**
89
+ * Reads the queue DXN from feed metadata.
90
+ *
91
+ * @deprecated
92
+ */
93
+ // TODO(wittjosiah): Align backing feed dxn's with object DXN.
94
+ export const getQueueDxn = (feed: Feed): DXN | undefined => {
95
+ const keys = Obj.getKeys(feed, DXN_KEY);
96
+ return keys.length === 0 ? undefined : DXN.parse(keys[0].id);
97
+ };
98
+
99
+ //
100
+ // Service
101
+ //
102
+
103
+ /**
104
+ * Effect service for feed operations.
105
+ * Provides the bridge to the underlying storage implementation.
106
+ * Must be provided by the application layer (e.g., echo-db).
107
+ */
108
+ export class Service extends Context.Tag('@dxos/echo/Feed/Service')<
109
+ Service,
110
+ {
111
+ /**
112
+ * Appends items to a feed.
113
+ */
114
+ append(feed: Feed, items: Entity.Unknown[]): Promise<void>;
115
+
116
+ /**
117
+ * Removes items from a feed by ID.
118
+ */
119
+ // TODO(dmaretskyi): Change type to ObjectId.
120
+ remove(feed: Feed, ids: string[]): Promise<void>;
121
+
122
+ /**
123
+ * Queries items in a feed.
124
+ */
125
+ query: {
126
+ <Q extends Query.Any>(feed: Feed, query: Q): QueryResult.QueryResult<Query.Type<Q>>;
127
+ <F extends Filter.Any>(feed: Feed, filter: F): QueryResult.QueryResult<Filter.Type<F>>;
128
+ };
129
+ }
130
+ >() {}
131
+
132
+ /**
133
+ * Layer that provides a Feed service that throws when accessed.
134
+ * Useful as a default layer when no feed service is available.
135
+ */
136
+ export const notAvailable: Layer.Layer<Service> = Layer.succeed(Service, {
137
+ append: () => {
138
+ throw new Error('Feed.Service not available');
139
+ },
140
+ remove: () => {
141
+ throw new Error('Feed.Service not available');
142
+ },
143
+ query: () => {
144
+ throw new Error('Feed.Service not available');
145
+ },
146
+ } as Context.Tag.Service<Service>);
147
+
148
+ //
149
+ // Operations
150
+ //
151
+
152
+ /**
153
+ * Appends items to a feed.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * yield* Feed.append(feed, [Obj.make(Notification, { title: 'Hello' })]);
158
+ * ```
159
+ */
160
+ export const append = (feed: Feed, items: Entity.Unknown[]): Effect.Effect<void, never, Service> =>
161
+ Effect.gen(function* () {
162
+ const service = yield* Service;
163
+ yield* Effect.promise(() => service.append(feed, items));
164
+ });
165
+
166
+ /**
167
+ * Removes items from a feed.
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * yield* Feed.remove(feed, [item]);
172
+ * ```
173
+ */
174
+ // TODO(dmaretskyi): Should we allow snapshots here? - what does it mean to remove a snapshot?
175
+ export const remove = (feed: Feed, items: (Entity.Unknown | Obj.Snapshot)[]): Effect.Effect<void, never, Service> =>
176
+ Effect.gen(function* () {
177
+ const service = yield* Service;
178
+ const ids = items.map((item) => item.id);
179
+ yield* Effect.promise(() => service.remove(feed, ids));
180
+ });
181
+
182
+ /**
183
+ * Creates a reactive query over items in a feed.
184
+ *
185
+ * @example
186
+ * ```ts
187
+ * const result = yield* Feed.query(feed, Filter.type(Person));
188
+ * ```
189
+ */
190
+ // TODO(dmaretskyi): Suport chained queries:
191
+ // const result = yield* feed.pipe(Feed.query(Filter.type(Person))); result.subscribe(...)
192
+ // const objects = yield* feed.pipe(Feed.query(Filter.type(Person))).run;
193
+ // const object = yield* feed.pipe(Feed.query(Filter.type(Person))).first;
194
+ // ... unify for Database and schema queries.
195
+ export const query: {
196
+ <Q extends Query.Any>(feed: Feed, query: Q): Effect.Effect<QueryResult.QueryResult<Query.Type<Q>>, never, Service>;
197
+ <F extends Filter.Any>(feed: Feed, filter: F): Effect.Effect<QueryResult.QueryResult<Filter.Type<F>>, never, Service>;
198
+ } = (feed: Feed, queryOrFilter: Query.Any | Filter.Any) =>
199
+ Service.pipe(Effect.map((service) => service.query(feed, queryOrFilter as any) as QueryResult.QueryResult<any>));
200
+
201
+ /**
202
+ * Executes a feed query once and returns the results.
203
+ *
204
+ * @example
205
+ * ```ts
206
+ * const items = yield* Feed.runQuery(feed, Filter.type(Person));
207
+ * ```
208
+ */
209
+ export const runQuery: {
210
+ <Q extends Query.Any>(feed: Feed, query: Q): Effect.Effect<Query.Type<Q>[], never, Service>;
211
+ <F extends Filter.Any>(feed: Feed, filter: F): Effect.Effect<Filter.Type<F>[], never, Service>;
212
+ } = (feed: Feed, queryOrFilter: Query.Any | Filter.Any) =>
213
+ query(feed, queryOrFilter as any).pipe(Effect.flatMap((queryResult) => Effect.promise(() => queryResult.run())));
214
+
215
+ /**
216
+ * Creates a cursor for iterating over feed items.
217
+ * Currently stubbed — cursor operations are not yet implemented.
218
+ *
219
+ * @example
220
+ * ```ts
221
+ * const cursor = yield* Feed.cursor<Person>(feed);
222
+ * const item = yield* Feed.next(cursor);
223
+ * ```
224
+ */
225
+ // TODO(wittjosiah): Implement cursor operations. Use Effect streams?
226
+ export const cursor = <T = Obj.Snapshot>(_feed: Feed): Effect.Effect<Cursor<T>, never, Service> =>
227
+ Effect.succeed({ _tag: 'Cursor' } as Cursor<T>);
228
+
229
+ /**
230
+ * Returns the next item from a feed cursor.
231
+ * Currently stubbed — cursor operations are not yet implemented.
232
+ */
233
+ export const next = <T = Obj.Snapshot>(_cursor: Cursor<T>): Effect.Effect<T, never, Service> =>
234
+ Effect.die('Feed.next is not yet implemented');
235
+
236
+ /**
237
+ * Returns the next item from a feed cursor as an Option.
238
+ * Currently stubbed — cursor operations are not yet implemented.
239
+ */
240
+ export const nextOption = <T = Obj.Snapshot>(_cursor: Cursor<T>): Effect.Effect<Option.Option<T>, never, Service> =>
241
+ Effect.die('Feed.nextOption is not yet implemented');
242
+
243
+ /**
244
+ * Sets the local retention policy for a feed.
245
+ * Currently stubbed — queues do not yet support retention.
246
+ *
247
+ * @example
248
+ * ```ts
249
+ * yield* Feed.setRetention(feed, { count: 1000 });
250
+ * ```
251
+ */
252
+ // TODO(feed): Implement when queue retention is supported.
253
+ export const setRetention = (_feed: Feed, _options: RetentionOptions): Effect.Effect<void, never, Service> =>
254
+ Effect.void;