@dxos/echo 0.8.4-staging.ac66bdf99f → 0.9.0

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 (437) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +37 -6
  4. package/dist/lib/neutral/Database.mjs +6 -17
  5. package/dist/lib/neutral/Entity.mjs +31 -20
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +23 -19
  8. package/dist/lib/neutral/Filter.mjs +13 -15
  9. package/dist/lib/neutral/Format.mjs +23 -3
  10. package/dist/lib/neutral/JsonSchema.mjs +7 -8
  11. package/dist/lib/neutral/Key.mjs +9 -5
  12. package/dist/lib/neutral/Migration.mjs +11 -10
  13. package/dist/lib/neutral/Obj.mjs +29 -20
  14. package/dist/lib/neutral/Order.mjs +7 -3
  15. package/dist/lib/neutral/Query.mjs +17 -17
  16. package/dist/lib/neutral/QueryResult.mjs +1 -1
  17. package/dist/lib/neutral/Ref.mjs +10 -9
  18. package/dist/lib/neutral/Registry.mjs +14 -0
  19. package/dist/lib/neutral/Relation.mjs +28 -25
  20. package/dist/lib/neutral/Scope.mjs +12 -0
  21. package/dist/lib/neutral/Tag.mjs +17 -14
  22. package/dist/lib/neutral/Type.mjs +54 -26
  23. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-35INCYOE.mjs} +1 -1
  24. package/dist/lib/neutral/chunk-35INCYOE.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-3PBP4V4O.mjs +101 -0
  26. package/dist/lib/neutral/chunk-3PBP4V4O.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-4ZUHOTCG.mjs +184 -0
  28. package/dist/lib/neutral/chunk-4ZUHOTCG.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-5SMDBFVB.mjs +108 -0
  30. package/dist/lib/neutral/chunk-5SMDBFVB.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-OS35K56T.mjs → chunk-5SUJPHAE.mjs} +3 -3
  32. package/dist/lib/neutral/{chunk-OS35K56T.mjs.map → chunk-5SUJPHAE.mjs.map} +2 -2
  33. package/dist/lib/neutral/{chunk-GZQTCRJB.mjs → chunk-6M2Z6WBH.mjs} +22 -2
  34. package/dist/lib/neutral/chunk-6M2Z6WBH.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-V36VO5SS.mjs → chunk-6YDI3J37.mjs} +32 -40
  36. package/dist/lib/neutral/chunk-6YDI3J37.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-MOR5ERFM.mjs → chunk-7FPIAJIV.mjs} +701 -1256
  38. package/dist/lib/neutral/chunk-7FPIAJIV.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  40. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-JUXPFOEI.mjs → chunk-7PI7C4EF.mjs} +48 -88
  42. package/dist/lib/neutral/chunk-7PI7C4EF.mjs.map +7 -0
  43. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  44. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-EVK6XBXO.mjs} +16 -2
  46. package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +7 -0
  47. package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs → chunk-IGK6FN65.mjs} +2 -2
  48. package/dist/lib/neutral/{chunk-HBUZJNZO.mjs → chunk-LWXVKPPW.mjs} +94 -99
  49. package/dist/lib/neutral/chunk-LWXVKPPW.mjs.map +7 -0
  50. package/dist/lib/neutral/{chunk-BVOFLCVF.mjs → chunk-MZ7K3MLL.mjs} +9 -6
  51. package/dist/lib/neutral/chunk-MZ7K3MLL.mjs.map +7 -0
  52. package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-O6BH7EPN.mjs} +30 -3
  53. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  54. package/dist/lib/neutral/{chunk-EAMSSLZC.mjs → chunk-QQIYS74I.mjs} +83 -46
  55. package/dist/lib/neutral/chunk-QQIYS74I.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-R5W6DXR4.mjs +678 -0
  57. package/dist/lib/neutral/chunk-R5W6DXR4.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-WAK4DMFV.mjs → chunk-RIVWNMSF.mjs} +12 -7
  59. package/dist/lib/neutral/chunk-RIVWNMSF.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-T6W2LEZU.mjs → chunk-SBVFRTST.mjs} +73 -38
  61. package/dist/lib/neutral/chunk-SBVFRTST.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-T6E37YIP.mjs +251 -0
  63. package/dist/lib/neutral/chunk-T6E37YIP.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-DQYLD2RB.mjs → chunk-TFEWTY5A.mjs} +155 -129
  65. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-B4BASU6W.mjs → chunk-TYGKCRMK.mjs} +85 -76
  67. package/dist/lib/neutral/chunk-TYGKCRMK.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-4OIBYSXE.mjs → chunk-UUP46KUQ.mjs} +78 -32
  69. package/dist/lib/neutral/chunk-UUP46KUQ.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-WISOH2XH.mjs +36 -0
  71. package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +7 -0
  72. package/dist/lib/neutral/{chunk-G3IQMKF7.mjs → chunk-WTQJHC75.mjs} +111 -112
  73. package/dist/lib/neutral/chunk-WTQJHC75.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-WU3GIANS.mjs +31 -0
  75. package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +7 -0
  76. package/dist/lib/neutral/{chunk-TU3GW67D.mjs → chunk-ZGNNFYHS.mjs} +40 -40
  77. package/dist/lib/neutral/chunk-ZGNNFYHS.mjs.map +7 -0
  78. package/dist/lib/neutral/index.mjs +47 -41
  79. package/dist/lib/neutral/internal/index.mjs +137 -72
  80. package/dist/lib/neutral/meta.json +1 -1
  81. package/dist/lib/neutral/testing/index.mjs +261 -178
  82. package/dist/lib/neutral/testing/index.mjs.map +4 -4
  83. package/dist/types/src/Annotation.d.ts +108 -4
  84. package/dist/types/src/Annotation.d.ts.map +1 -1
  85. package/dist/types/src/Annotation.test.d.ts +2 -0
  86. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  87. package/dist/types/src/Collection.d.ts +2 -3
  88. package/dist/types/src/Collection.d.ts.map +1 -1
  89. package/dist/types/src/Database.d.ts +56 -49
  90. package/dist/types/src/Database.d.ts.map +1 -1
  91. package/dist/types/src/Dataset.d.ts +16 -6
  92. package/dist/types/src/Dataset.d.ts.map +1 -1
  93. package/dist/types/src/Entity.d.ts +101 -28
  94. package/dist/types/src/Entity.d.ts.map +1 -1
  95. package/dist/types/src/Err.d.ts +27 -27
  96. package/dist/types/src/Err.d.ts.map +1 -1
  97. package/dist/types/src/Feed.d.ts +66 -19
  98. package/dist/types/src/Feed.d.ts.map +1 -1
  99. package/dist/types/src/Filter.d.ts +38 -12
  100. package/dist/types/src/Filter.d.ts.map +1 -1
  101. package/dist/types/src/Format.d.ts +0 -2
  102. package/dist/types/src/Format.d.ts.map +1 -1
  103. package/dist/types/src/Hypergraph.d.ts +14 -9
  104. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  105. package/dist/types/src/Json.d.ts +33 -0
  106. package/dist/types/src/Json.d.ts.map +1 -0
  107. package/dist/types/src/Json.test.d.ts +2 -0
  108. package/dist/types/src/Json.test.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +2 -2
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  111. package/dist/types/src/Key.d.ts +1 -1
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Migration.d.ts +26 -11
  114. package/dist/types/src/Migration.d.ts.map +1 -1
  115. package/dist/types/src/Obj.d.ts +104 -61
  116. package/dist/types/src/Obj.d.ts.map +1 -1
  117. package/dist/types/src/Order.d.ts +10 -0
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +34 -12
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +21 -0
  122. package/dist/types/src/QueryResult.d.ts.map +1 -1
  123. package/dist/types/src/Ref.d.ts +15 -7
  124. package/dist/types/src/Ref.d.ts.map +1 -1
  125. package/dist/types/src/Registry.d.ts +131 -0
  126. package/dist/types/src/Registry.d.ts.map +1 -0
  127. package/dist/types/src/Relation.d.ts +73 -41
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +35 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/Tag.d.ts +21 -5
  132. package/dist/types/src/Tag.d.ts.map +1 -1
  133. package/dist/types/src/Type.d.ts +362 -95
  134. package/dist/types/src/Type.d.ts.map +1 -1
  135. package/dist/types/src/View.d.ts +9 -12
  136. package/dist/types/src/View.d.ts.map +1 -1
  137. package/dist/types/src/exemplars.test.d.ts +2 -0
  138. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  139. package/dist/types/src/index.d.ts +4 -3
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/internal/Annotation/annotations.d.ts +79 -38
  142. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  143. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  144. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  145. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  146. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  147. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  148. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  149. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  150. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  151. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  152. package/dist/types/src/internal/Entity/api.d.ts +17 -3
  153. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  154. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  155. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  156. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  157. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  158. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  159. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  160. package/dist/types/src/internal/Entity/model.d.ts +21 -17
  161. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  165. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  167. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/type-uri.d.ts +24 -0
  169. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  170. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  171. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  172. package/dist/types/src/internal/Format/format.d.ts +3 -2
  173. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  174. package/dist/types/src/internal/Format/index.d.ts +2 -2
  175. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  176. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  177. package/dist/types/src/internal/Format/object.d.ts +3 -1
  178. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  179. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  180. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  181. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -34
  182. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  183. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  184. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  185. package/dist/types/src/internal/Obj/atoms.d.ts +38 -0
  186. package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -0
  187. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  188. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  189. package/dist/types/src/internal/Obj/create-object.d.ts +12 -12
  190. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  191. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  192. package/dist/types/src/internal/Obj/index.d.ts +1 -1
  193. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  194. package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
  195. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  197. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  198. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  200. package/dist/types/src/internal/Query/index.d.ts +2 -0
  201. package/dist/types/src/internal/Query/index.d.ts.map +1 -0
  202. package/dist/types/src/internal/{Query.d.ts → Query/pretty.d.ts} +1 -1
  203. package/dist/types/src/internal/Query/pretty.d.ts.map +1 -0
  204. package/dist/types/src/internal/Ref/atoms.d.ts +10 -0
  205. package/dist/types/src/internal/Ref/atoms.d.ts.map +1 -0
  206. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  207. package/dist/types/src/internal/Ref/ref.d.ts +50 -19
  208. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  209. package/dist/types/src/internal/Ref/utils.d.ts +8 -0
  210. package/dist/types/src/internal/Ref/utils.d.ts.map +1 -0
  211. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  212. package/dist/types/src/internal/Type/index.d.ts +1 -2
  213. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  214. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  215. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  216. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  217. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  218. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  219. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  220. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  221. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  222. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  223. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  224. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  225. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  227. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  228. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  231. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  232. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  233. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  235. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  236. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  237. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  238. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  239. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  240. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  241. package/dist/types/src/internal/common/types/entity.d.ts +62 -5
  242. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  243. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  244. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  245. package/dist/types/src/internal/common/types/meta.d.ts +33 -12
  246. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  247. package/dist/types/src/internal/common/types/model-symbols.d.ts +15 -4
  248. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  249. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  250. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  251. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  252. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  253. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  254. package/dist/types/src/internal/index.d.ts +2 -2
  255. package/dist/types/src/internal/index.d.ts.map +1 -1
  256. package/dist/types/src/testing/index.d.ts +1 -0
  257. package/dist/types/src/testing/index.d.ts.map +1 -1
  258. package/dist/types/src/testing/registry.d.ts +9 -0
  259. package/dist/types/src/testing/registry.d.ts.map +1 -0
  260. package/dist/types/src/testing/test-data.d.ts +8 -8
  261. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  262. package/dist/types/src/testing/test-schema.d.ts +83 -89
  263. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  264. package/dist/types/src/testing/util.d.ts +5 -3
  265. package/dist/types/src/testing/util.d.ts.map +1 -1
  266. package/dist/types/tsconfig.tsbuildinfo +1 -1
  267. package/package.json +26 -24
  268. package/src/Annotation.test.ts +439 -0
  269. package/src/Annotation.ts +158 -4
  270. package/src/Collection.ts +5 -9
  271. package/src/Database.ts +93 -100
  272. package/src/Dataset.ts +10 -2
  273. package/src/Entity.test.ts +116 -6
  274. package/src/Entity.ts +134 -32
  275. package/src/Err.ts +4 -4
  276. package/src/Feed.ts +92 -44
  277. package/src/Filter.ts +70 -40
  278. package/src/Format.ts +0 -4
  279. package/src/Hypergraph.ts +14 -9
  280. package/src/Json.test.ts +175 -0
  281. package/src/Json.ts +103 -0
  282. package/src/Key.ts +1 -1
  283. package/src/Migration.ts +39 -19
  284. package/src/Obj.test.ts +122 -20
  285. package/src/Obj.ts +168 -91
  286. package/src/Order.ts +22 -0
  287. package/src/Query.test.ts +183 -154
  288. package/src/Query.ts +172 -85
  289. package/src/QueryResult.ts +26 -0
  290. package/src/Ref.ts +22 -4
  291. package/src/Registry.ts +155 -0
  292. package/src/Relation.test.ts +10 -10
  293. package/src/Relation.ts +116 -69
  294. package/src/Scope.ts +50 -0
  295. package/src/Tag.md +88 -0
  296. package/src/Tag.ts +49 -6
  297. package/src/Type.test.ts +223 -18
  298. package/src/Type.ts +609 -131
  299. package/src/View.ts +14 -23
  300. package/src/exemplars.test.ts +21 -0
  301. package/src/index.ts +4 -4
  302. package/src/internal/Annotation/annotations.test.ts +31 -11
  303. package/src/internal/Annotation/annotations.ts +143 -111
  304. package/src/internal/Annotation/dictionary.ts +47 -0
  305. package/src/internal/Annotation/entity-dictionary.ts +74 -0
  306. package/src/internal/Annotation/index.ts +4 -2
  307. package/src/internal/Annotation/util.ts +17 -8
  308. package/src/internal/Entity/api.ts +54 -7
  309. package/src/internal/Entity/entity.ts +196 -47
  310. package/src/internal/Entity/guard.ts +26 -0
  311. package/src/internal/Entity/index.ts +2 -0
  312. package/src/internal/Entity/model.ts +38 -28
  313. package/src/internal/Entity/object.ts +21 -5
  314. package/src/internal/Entity/relation.ts +68 -34
  315. package/src/internal/Entity/type-kind.ts +75 -0
  316. package/src/internal/Entity/type-uri.ts +92 -0
  317. package/src/internal/Entity/util.ts +9 -9
  318. package/src/internal/Format/date.ts +0 -4
  319. package/src/internal/Format/format.test.ts +21 -0
  320. package/src/internal/Format/index.ts +2 -3
  321. package/src/internal/Format/object.ts +21 -4
  322. package/src/internal/Format/types.ts +1 -1
  323. package/src/internal/JsonSchema/annotations.ts +1 -1
  324. package/src/internal/JsonSchema/json-schema-type.ts +4 -4
  325. package/src/internal/JsonSchema/json-schema.test.ts +71 -145
  326. package/src/internal/JsonSchema/json-schema.ts +49 -35
  327. package/src/internal/Obj/atoms.ts +244 -0
  328. package/src/internal/Obj/clone.ts +9 -4
  329. package/src/internal/Obj/create-object.test.ts +12 -10
  330. package/src/internal/Obj/create-object.ts +68 -22
  331. package/src/internal/Obj/index.ts +1 -1
  332. package/src/internal/Obj/inspect.ts +5 -3
  333. package/src/internal/Obj/json-serializer.test.ts +101 -22
  334. package/src/internal/Obj/json-serializer.ts +89 -33
  335. package/src/internal/Obj/set-value.test.ts +22 -45
  336. package/src/internal/Obj/set-value.ts +12 -19
  337. package/src/internal/Obj/snapshot.ts +13 -4
  338. package/src/internal/Obj/typed-object.test.ts +9 -11
  339. package/src/internal/Obj/typed-object.ts +1 -1
  340. package/src/internal/Query/index.ts +5 -0
  341. package/src/internal/{Query.ts → Query/pretty.ts} +40 -12
  342. package/src/internal/Ref/atoms.ts +20 -0
  343. package/src/internal/Ref/ref-array.ts +3 -3
  344. package/src/internal/Ref/ref.test.ts +18 -27
  345. package/src/internal/Ref/ref.ts +137 -59
  346. package/src/internal/Ref/utils.ts +45 -0
  347. package/src/internal/Type/compose.test.ts +3 -1
  348. package/src/internal/Type/index.ts +1 -2
  349. package/src/internal/Type/manipulation.ts +0 -25
  350. package/src/internal/Type/type-schema.ts +60 -0
  351. package/src/internal/common/README.md +2 -2
  352. package/src/internal/common/api/meta.ts +19 -17
  353. package/src/internal/common/proxy/change-context.ts +1 -1
  354. package/src/internal/common/proxy/change.test.ts +91 -83
  355. package/src/internal/common/proxy/errors.ts +2 -2
  356. package/src/internal/common/proxy/handler.test.ts +1 -1
  357. package/src/internal/common/proxy/json-serializer.ts +27 -16
  358. package/src/internal/common/proxy/make-object.ts +44 -20
  359. package/src/internal/common/proxy/ownership.ts +2 -2
  360. package/src/internal/common/proxy/reactive-array.ts +1 -1
  361. package/src/internal/common/proxy/reactive.test.ts +54 -0
  362. package/src/internal/common/proxy/reactive.ts +11 -2
  363. package/src/internal/common/proxy/schema.test.ts +48 -86
  364. package/src/internal/common/proxy/typed-handler.test.ts +12 -11
  365. package/src/internal/common/proxy/typed-handler.ts +78 -16
  366. package/src/internal/common/proxy/typed-object.test.ts +16 -28
  367. package/src/internal/common/types/base.ts +4 -4
  368. package/src/internal/common/types/entity.ts +80 -1
  369. package/src/internal/common/types/index.ts +6 -1
  370. package/src/internal/common/types/meta.ts +62 -20
  371. package/src/internal/common/types/model-symbols.ts +24 -4
  372. package/src/internal/common/types/typename.ts +39 -3
  373. package/src/internal/common/types/well-known-types.ts +15 -0
  374. package/src/internal/index.ts +6 -4
  375. package/src/testing/api.test.ts +15 -9
  376. package/src/testing/index.ts +1 -0
  377. package/src/testing/registry.ts +44 -0
  378. package/src/testing/test-data.ts +159 -99
  379. package/src/testing/test-schema.ts +22 -58
  380. package/src/testing/util.ts +14 -11
  381. package/dist/lib/neutral/Extension.mjs +0 -18
  382. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  383. package/dist/lib/neutral/chunk-2KHZ36F5.mjs +0 -361
  384. package/dist/lib/neutral/chunk-2KHZ36F5.mjs.map +0 -7
  385. package/dist/lib/neutral/chunk-4OIBYSXE.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-4P3IXBLT.mjs +0 -45
  387. package/dist/lib/neutral/chunk-4P3IXBLT.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  389. package/dist/lib/neutral/chunk-B4BASU6W.mjs.map +0 -7
  390. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  391. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-BVOFLCVF.mjs.map +0 -7
  393. package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-EAMSSLZC.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-G3IQMKF7.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +0 -7
  397. package/dist/lib/neutral/chunk-HBUZJNZO.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-JUXPFOEI.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-MOR5ERFM.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  401. package/dist/lib/neutral/chunk-PHU22NLC.mjs +0 -136
  402. package/dist/lib/neutral/chunk-PHU22NLC.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-ROG4RXXL.mjs +0 -97
  404. package/dist/lib/neutral/chunk-ROG4RXXL.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-T6W2LEZU.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-TU3GW67D.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-V36VO5SS.mjs.map +0 -7
  411. package/dist/lib/neutral/chunk-WAK4DMFV.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-YAHXAYOW.mjs +0 -56
  413. package/dist/lib/neutral/chunk-YAHXAYOW.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +0 -50
  415. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +0 -7
  416. package/dist/types/src/Extension.d.ts +0 -80
  417. package/dist/types/src/Extension.d.ts.map +0 -1
  418. package/dist/types/src/Extension.test.d.ts +0 -2
  419. package/dist/types/src/Extension.test.d.ts.map +0 -1
  420. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  421. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  422. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  423. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  424. package/dist/types/src/internal/Query.d.ts.map +0 -1
  425. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  426. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  427. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  428. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  429. package/src/Extension.test.ts +0 -235
  430. package/src/Extension.ts +0 -122
  431. package/src/SchemaRegistry.ts +0 -106
  432. package/src/internal/Obj/ids.ts +0 -12
  433. package/src/internal/Type/echo-schema.ts +0 -423
  434. package/src/internal/Type/persistent-schema.ts +0 -33
  435. /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
  436. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
  437. /package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs.map → chunk-IGK6FN65.mjs.map} +0 -0
package/src/Annotation.ts CHANGED
@@ -6,24 +6,90 @@
6
6
 
7
7
  export {
8
8
  DescriptionAnnotation,
9
+ FieldLookupAnnotationId,
9
10
  FormInputAnnotation,
11
+ FormInlineAnnotation,
10
12
  GeneratorAnnotation,
13
+ GeneratorAnnotationId,
14
+ type GeneratorAnnotationValue,
11
15
  LabelAnnotation,
12
16
  ReferenceAnnotation,
13
- SystemTypeAnnotation,
17
+ ReferenceAnnotationId,
18
+ type ReferenceAnnotationValue,
19
+ HiddenAnnotation,
14
20
  TypeAnnotation,
15
21
  getDescriptionWithSchema,
16
22
  getLabelWithSchema,
17
23
  getTypeAnnotation,
24
+ getTypeIdentifierAnnotation,
18
25
  setDescriptionWithSchema,
19
26
  setLabelWithSchema,
20
27
  IconAnnotation,
28
+ IconFromRefAnnotation,
21
29
  } from './internal/Annotation';
22
30
 
23
- import type * as Schema from 'effect/Schema';
31
+ import * as Function from 'effect/Function';
32
+ import * as Option from 'effect/Option';
33
+ import * as Schema from 'effect/Schema';
34
+ import * as SchemaAST from 'effect/SchemaAST';
35
+ import * as Types from 'effect/Types';
24
36
 
37
+ import * as Entity from './Entity';
25
38
  import * as internalAnnotations from './internal/Annotation';
26
39
 
40
+ export const TypeId = '~@dxos/echo/Annotation' as const;
41
+ export type TypeId = typeof TypeId;
42
+
43
+ // TODO(dmaretskyi): Reconcile different get/set styles: mutate in-place, return.
44
+ // TODO(dmaretskyi): Reconcile Annotation methods vs static functions.
45
+ // TODO(dmaretskyi): Reconcile Annotation.Key vs DXN -- work-out approach to versioning.
46
+
47
+ /**
48
+ * Annotation is a typed property that can be assigned to a schema or an entity instance.
49
+ */
50
+ export interface Annotation<T> {
51
+ [TypeId]: {
52
+ _Type: T;
53
+ };
54
+
55
+ // TODO(dmaretskyi): Make this a DXN?
56
+ /**
57
+ * Unique fully-qualified identifier for the annotation.
58
+ * @example "org.dxos.annotation.color"
59
+ */
60
+ readonly key: Key;
61
+
62
+ /**
63
+ * Schema of the annotation value.
64
+ */
65
+ readonly schema: Schema.Schema<T, unknown, never>;
66
+
67
+ /**
68
+ * Get the annotation value from an Effect schema.
69
+ *
70
+ * Only accepts `Schema.Schema.Any` — to read an annotation off a `Type.Type`
71
+ * entity, unwrap it first with `Type.getSchema(entity)`. This keeps the
72
+ * annotation pipeline single-shaped and forces annotations to live on the
73
+ * source schema, not on the post-construction Type entity.
74
+ */
75
+ get: (schema: Schema.Schema.Any) => Option.Option<T>;
76
+ /**
77
+ * Get the annotation value from the AST.
78
+ */
79
+ getFromAst: (ast: SchemaAST.AST) => Option.Option<T>;
80
+ /**
81
+ * Set the annotation on an Effect schema.
82
+ *
83
+ * Only accepts `Schema.Schema.Any` — annotations must be applied to the
84
+ * source schema BEFORE wrapping it with `Type.makeObject` / `Type.makeRelation`.
85
+ * In a pipe, place every `Annotation.X.set(...)` before the `Type.make...` step.
86
+ */
87
+ set: (value: T) => <S extends Schema.Schema.Any>(schema: S) => S;
88
+ }
89
+
90
+ export const Key = internalAnnotations.Key;
91
+ export type Key = Schema.Schema.Type<typeof Key>;
92
+
27
93
  interface MakeProps<T> {
28
94
  id: string;
29
95
  schema: Schema.Schema<T, any, never>;
@@ -44,5 +110,93 @@ interface MakeProps<T> {
44
110
  * const schema = Schema.String.annotations(ColorAnnotation.set('red'));
45
111
  * ```
46
112
  */
47
- export const make: <T>(props: MakeProps<T>) => internalAnnotations.AnnotationHelper<T> =
48
- internalAnnotations.makeUserAnnotation;
113
+ export const make: <T>(props: MakeProps<T>) => Annotation<T> = internalAnnotations.makeUserAnnotation;
114
+
115
+ /**
116
+ * Get the value of an annotation from an entity instance or snapshot.
117
+ * For schema-level reads use the annotation instance method (e.g. `ColorAnnotation.get(schema)`).
118
+ * For getting an annotation value from a dictionary, use `getDictionary`.
119
+ */
120
+ export const get: {
121
+ <T>(annotation: Annotation<T>): (target: Entity.Unknown | Entity.Snapshot) => Option.Option<T>;
122
+ <T>(target: Entity.Unknown | Entity.Snapshot, annotation: Annotation<T>): Option.Option<T>;
123
+ } = Function.dual<
124
+ <T>(annotation: Annotation<T>) => (target: Entity.Unknown | Entity.Snapshot) => Option.Option<T>,
125
+ <T>(target: Entity.Unknown | Entity.Snapshot, annotation: Annotation<T>) => Option.Option<T>
126
+ >(2, (target, annotation) => {
127
+ return internalAnnotations.get(target, annotation);
128
+ });
129
+
130
+ /**
131
+ * Set the value of an annotation on an entity instance.
132
+ * For schema-level writes use the annotation instance method (e.g. `ColorAnnotation.set('red')`).
133
+ * For setting an annotation value on a dictionary, use `setDictionary`.
134
+ */
135
+ export const set: {
136
+ <T>(annotation: Annotation<T>, value: T): (target: Entity.Mutable<Entity.Unknown>) => void;
137
+ <T>(target: Entity.Mutable<Entity.Unknown>, annotation: Annotation<T>, value: T): void;
138
+ } = Function.dual<
139
+ <T>(annotation: Annotation<T>, value: T) => (target: Entity.Mutable<Entity.Unknown>) => void,
140
+ <T>(target: Entity.Mutable<Entity.Unknown>, annotation: Annotation<T>, value: T) => void
141
+ >(3, (target, annotation, value) => {
142
+ return internalAnnotations.set(target, annotation, value);
143
+ });
144
+
145
+ export const getFromAst: {
146
+ <T>(annotation: Annotation<T>): (ast: SchemaAST.AST) => Option.Option<T>;
147
+ <T>(ast: SchemaAST.AST, annotation: Annotation<T>): Option.Option<T>;
148
+ } = Function.dual<
149
+ <T>(annotation: Annotation<T>) => (ast: SchemaAST.AST) => Option.Option<T>,
150
+ <T>(ast: SchemaAST.AST, annotation: Annotation<T>) => Option.Option<T>
151
+ >(2, (ast, annotation) => {
152
+ return internalAnnotations.getFromAst(ast, annotation);
153
+ });
154
+
155
+ /**
156
+ * Set of annotation values.
157
+ *
158
+ * Can be used inside an object/relation schema:
159
+ *
160
+ * ```ts
161
+ * const Person = Schema.Struct({
162
+ * name: Schema.String,
163
+ * extensions: Annotation.Dictionary,
164
+ * });
165
+ * ```
166
+ */
167
+ export const Dictionary = internalAnnotations.Dictionary;
168
+ export interface Dictionary extends Schema.Schema.Type<typeof Dictionary> {}
169
+
170
+ /**
171
+ * Get the value of an annotation from a Dictionary.
172
+ */
173
+ export const getDictionary: {
174
+ <T>(annotation: Annotation<T>): (values: Dictionary) => Option.Option<T>;
175
+ <T>(values: Dictionary, annotation: Annotation<T>): Option.Option<T>;
176
+ } = Function.dual<
177
+ <T>(annotation: Annotation<T>) => (values: Dictionary) => Option.Option<T>,
178
+ <T>(values: Dictionary, annotation: Annotation<T>) => Option.Option<T>
179
+ >(2, (values, annotation) => {
180
+ return internalAnnotations.getDictionary(values, annotation);
181
+ });
182
+
183
+ /**
184
+ * Set the value of an annotation in a Dictionary.
185
+ *
186
+ * Can also be used within Obj.update callback:
187
+ *
188
+ * ```ts
189
+ * Obj.update(obj, (obj) => {
190
+ * Annotation.setDictionary(obj.annotations, ColorAnnotation, 'red');
191
+ * });
192
+ * ```
193
+ */
194
+ export const setDictionary: {
195
+ <T>(annotation: Annotation<T>, value: T): (values: Dictionary) => void;
196
+ <T>(values: Types.Mutable<Dictionary>, annotation: Annotation<T>, value: T): void;
197
+ } = Function.dual<
198
+ <T>(annotation: Annotation<T>, value: T) => (values: Dictionary) => void,
199
+ <T>(values: Types.Mutable<Dictionary>, annotation: Annotation<T>, value: T) => void
200
+ >(3, (values, annotation, value) => {
201
+ return internalAnnotations.setDictionary(values, annotation, value);
202
+ });
package/src/Collection.ts CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  import * as Schema from 'effect/Schema';
8
8
 
9
+ import { DXN } from '@dxos/keys';
10
+
9
11
  import * as Annotation from './Annotation';
10
12
  import * as internal from './internal';
11
13
  import * as Obj from './Obj';
@@ -19,17 +21,11 @@ export const Collection = Schema.Struct({
19
21
  name: Schema.String.pipe(Schema.optional),
20
22
  objects: Schema.Array(Ref.Ref(Obj.Unknown)).pipe(internal.FormInputAnnotation.set(false)),
21
23
  }).pipe(
22
- Type.object({
23
- typename: 'org.dxos.type.collection',
24
- version: '0.1.0',
25
- }),
26
- Annotation.IconAnnotation.set({
27
- icon: 'ph--folder--regular',
28
- hue: 'neutral',
29
- }),
24
+ Annotation.IconAnnotation.set({ icon: 'ph--folder--regular', hue: 'amber' }),
25
+ Type.makeObject(DXN.make('org.dxos.type.collection', '0.1.0')),
30
26
  );
31
27
 
32
- export interface Collection extends Schema.Schema.Type<typeof Collection> {}
28
+ export type Collection = Type.InstanceType<typeof Collection>;
33
29
 
34
30
  export const make = (props: Partial<Obj.MakeProps<typeof Collection>> = {}): Collection =>
35
31
  Obj.make(Collection, { objects: [], ...props });
package/src/Database.ts CHANGED
@@ -6,26 +6,28 @@
6
6
 
7
7
  import * as Context from 'effect/Context';
8
8
  import * as Effect from 'effect/Effect';
9
+ import * as Effectable from 'effect/Effectable';
9
10
  import * as Layer from 'effect/Layer';
10
11
  import * as Option from 'effect/Option';
11
12
  import * as Schema from 'effect/Schema';
12
- import type * as Types from 'effect/Types';
13
13
 
14
- import { promiseWithCauseCapture } from '@dxos/effect';
14
+ import { EffectEx } from '@dxos/effect';
15
15
  import { invariant } from '@dxos/invariant';
16
- import { DXN, type SpaceId } from '@dxos/keys';
16
+ import { type SpaceId, type URI } from '@dxos/keys';
17
17
 
18
18
  import type * as Entity from './Entity';
19
19
  import * as Err from './Err';
20
20
  import type * as Filter from './Filter';
21
21
  import type * as Hypergraph from './Hypergraph';
22
- import { isInstanceOf } from './internal/Annotation';
23
- import { type AnyProperties } from './internal/common/types';
22
+ import { type AnyProperties, EntityKind, KindId } from './internal/common/types';
23
+ // Deep import (not the `./internal/Entity` barrel) to avoid a cycle:
24
+ // Database → internal/Entity → entity → JsonSchema → Ref → Database.
25
+ import { isInstanceOf } from './internal/Entity/type-uri';
24
26
  import type { Ref } from './internal/Ref/ref';
25
27
  import type * as Obj from './Obj';
26
28
  import type * as Query from './Query';
27
29
  import type * as QueryResult from './QueryResult';
28
- import type * as SchemaRegistry from './SchemaRegistry';
30
+ import type * as Registry from './Registry';
29
31
  import type * as Type from './Type';
30
32
 
31
33
  /**
@@ -38,7 +40,7 @@ export interface QueryFn {
38
40
  }
39
41
 
40
42
  /**
41
- * Common interface for Database and Queue.
43
+ * Common interface for Database, Feed, and Hypergraph.
42
44
  */
43
45
  export interface Queryable {
44
46
  query: QueryFn;
@@ -62,6 +64,16 @@ export type AddOptions = {
62
64
  placeIn?: ObjectPlacement;
63
65
  };
64
66
 
67
+ /**
68
+ * Rejects Type entities from {@link Database.add} at compile time via their `[KindId]` brand. Used
69
+ * as `T & RejectTypeEntity<T>` to preserve inference of `T`. Bounding `add` on
70
+ * `Obj.Unknown | Relation.Unknown` instead would reject broadly-typed instance adds (e.g.
71
+ * `Entity.Any`, `Obj.OfShape<T>`), forcing casts repo-wide.
72
+ */
73
+ export type RejectTypeEntity<T> = T extends { readonly [KindId]: EntityKind.Type }
74
+ ? { __error: 'Type entities must be persisted via db.addType(), not db.add().' }
75
+ : T;
76
+
65
77
  export type FlushOptions = {
66
78
  /**
67
79
  * Write any pending changes to disk.
@@ -96,15 +108,20 @@ export interface Database extends Queryable {
96
108
 
97
109
  get spaceId(): SpaceId;
98
110
 
99
- // TODO(burdon): Can we move this into graph?
100
- get schemaRegistry(): SchemaRegistry.SchemaRegistry;
101
-
102
111
  get graph(): Hypergraph.Hypergraph;
103
112
 
113
+ /**
114
+ * Registry for this database. Delegates type lookups to the shared hypergraph registry.
115
+ * To persist a schema so it replicates to other clients, add the type entity with
116
+ * {@link addType} (e.g. `await db.addType(Type.makeObjectFromJsonSchema(...))`).
117
+ */
118
+ readonly registry: Registry.Registry;
119
+
104
120
  toJSON(): object;
105
121
 
106
122
  /**
107
123
  * Return object by local ID.
124
+ * @deprecated Use `db.query(Filter.id(id)).runSync()[0]` for a working-set lookup, or resolve via a {@link Ref}.
108
125
  */
109
126
  getObjectById<T extends Obj.Unknown = Obj.OfShape<AnyProperties>>(
110
127
  id: string,
@@ -120,16 +137,28 @@ export interface Database extends Queryable {
120
137
  * Creates a reference to an existing object in the database.
121
138
  *
122
139
  * NOTE: The reference may be dangling if the object is not present in the database.
123
- * NOTE: Difference from `Ref.fromDXN`
124
- * `Ref.fromDXN(dxn)` returns an unhydrated reference. The `.load` and `.target` APIs will not work.
140
+ * NOTE: Difference from `Ref.fromURI`
141
+ * `Ref.fromURI(dxn)` returns an unhydrated reference. The `.load` and `.target` APIs will not work.
125
142
  * `db.makeRef(dxn)` is preferable in cases with access to the database.
126
143
  */
127
- makeRef<T extends Entity.Unknown = Entity.Unknown>(dxn: DXN): Ref<T>;
144
+ makeRef<T extends Entity.Unknown = Entity.Unknown>(uri: URI.URI): Ref<T>;
128
145
 
129
146
  /**
130
- * Adds object to the database.
147
+ * Adds an object or relation to the database.
148
+ *
149
+ * Only Object and Relation entities are accepted. To persist a Type definition use
150
+ * {@link addType} — passing a Type entity is rejected at compile time (and at runtime).
131
151
  */
132
- add<T extends Entity.Unknown = Entity.Unknown>(obj: T, opts?: AddOptions): T;
152
+ add<T extends Entity.Unknown = Entity.Unknown>(obj: T & RejectTypeEntity<T>, opts?: AddOptions): T;
153
+
154
+ /**
155
+ * Persists a Type definition (clones/forks the entity) so it replicates to other peers.
156
+ *
157
+ * Runs a conflict query first: if a type with the same typename + version already exists in
158
+ * this space, the existing persisted entity is returned and no duplicate is created. This is
159
+ * the only supported way to add Type entities — {@link add} rejects them.
160
+ */
161
+ addType<T extends Type.AnyEntity>(type: T): Promise<T>;
133
162
 
134
163
  /**
135
164
  * Removes object from the database.
@@ -201,20 +230,20 @@ export const spaceId = Effect.gen(function* () {
201
230
  */
202
231
  export const resolve: {
203
232
  // No type check.
204
- (ref: DXN | Ref<any>): Effect.Effect<Entity.Unknown, never, Service>;
233
+ (ref: URI.URI | Ref<any>): Effect.Effect<Entity.Unknown, never, Service>;
205
234
  // Check matches schema.
206
235
  <S extends Type.AnyEntity>(
207
- ref: DXN | Ref<any>,
236
+ ref: URI.URI | Ref<any>,
208
237
  schema: S,
209
- ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service>;
238
+ ): Effect.Effect<Type.InstanceType<S>, Err.EntityNotFoundError, Service>;
210
239
  } = (<S extends Type.AnyEntity>(
211
- ref: DXN | Ref<any>,
240
+ ref: URI.URI | Ref<any>,
212
241
  schema?: S,
213
- ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service> =>
242
+ ): Effect.Effect<Type.InstanceType<S>, Err.EntityNotFoundError, Service> =>
214
243
  Effect.gen(function* () {
215
244
  const { db } = yield* Service;
216
- const dxn = ref instanceof DXN ? ref : ref.dxn;
217
- const object = yield* promiseWithCauseCapture(() =>
245
+ const dxn = typeof ref === 'string' ? ref : ref.uri;
246
+ const object = yield* EffectEx.promiseWithCauseCapture(() =>
218
247
  db.graph
219
248
  .createRefResolver({
220
249
  context: {
@@ -225,43 +254,49 @@ export const resolve: {
225
254
  );
226
255
 
227
256
  if (!object) {
228
- return yield* Effect.fail(new Err.ObjectNotFoundError(dxn));
257
+ return yield* Effect.fail(new Err.EntityNotFoundError(dxn));
229
258
  }
230
- invariant(!schema || isInstanceOf(schema, object), 'Object type mismatch.');
259
+ // `isInstanceOf` uses a conditional generic that TS can't resolve through
260
+ // the local `S extends Type.AnyEntity` parameter — runtime accepts it fine.
261
+ invariant(!schema || isInstanceOf(schema as any, object), 'Object type mismatch.');
231
262
  return object as any;
232
263
  }).pipe(Effect.withSpan('Database.resolve'))) as any;
233
264
 
234
265
  /**
235
266
  * Loads an object reference.
267
+ *
268
+ * Catching not found error:
269
+ *
270
+ * ```ts
271
+ * yield* load(ref).pipe(Effect.catchTag('EntityNotFoundError', () => Effect.succeed(undefined)));
272
+ * ```
273
+ *
236
274
  */
237
- export const load: <T>(ref: Ref<T>) => Effect.Effect<T, Err.ObjectNotFoundError, never> = Effect.fn('Database.load')(
275
+ export const load: <T>(ref: Ref<T>) => Effect.Effect<T, Err.EntityNotFoundError, never> = Effect.fn('Database.load')(
238
276
  function* (ref) {
239
- const object = yield* promiseWithCauseCapture(() => ref.tryLoad());
277
+ const object = yield* EffectEx.promiseWithCauseCapture(() => ref.tryLoad());
240
278
  if (!object) {
241
- return yield* Effect.fail(new Err.ObjectNotFoundError(ref.dxn));
279
+ return yield* Effect.fail(new Err.EntityNotFoundError(ref.uri));
242
280
  }
243
281
  return object;
244
282
  },
245
283
  );
246
284
 
247
285
  /**
248
- * Loads an object reference option.
286
+ * Adds an object or relation to the database.
287
+ * @see {@link Database.add}
249
288
  */
250
- // TODO(dmaretskyi): Do we need this -- you can just use `Effect.catchTag` in calling code instead.
251
- export const loadOption: <T>(ref: Ref<T>) => Effect.Effect<Option.Option<T>, never, never> = Effect.fn(
252
- 'Database.loadOption',
253
- )(function* (ref) {
254
- const object = yield* load(ref).pipe(Effect.catchTag('ObjectNotFoundError', () => Effect.succeed(undefined)));
255
-
256
- return Option.fromNullable(object);
257
- });
289
+ export const add = <T extends Entity.Unknown>(obj: T & RejectTypeEntity<T>): Effect.Effect<T, never, Service> =>
290
+ Service.pipe(Effect.map(({ db }) => db.add<T>(obj))).pipe(Effect.withSpan('Database.add'));
258
291
 
259
292
  /**
260
- * Adds an object to the database.
261
- * @see {@link Database.add}
293
+ * Persists a Type definition to the database.
294
+ * @see {@link Database.addType}
262
295
  */
263
- export const add = <T extends Entity.Unknown>(obj: T): Effect.Effect<T, never, Service> =>
264
- Service.pipe(Effect.map(({ db }) => db.add(obj))).pipe(Effect.withSpan('Database.add'));
296
+ export const addType = <T extends Type.AnyEntity>(type: T): Effect.Effect<T, never, Service> =>
297
+ Service.pipe(Effect.flatMap(({ db }) => EffectEx.promiseWithCauseCapture(() => db.addType(type)))).pipe(
298
+ Effect.withSpan('Database.addType'),
299
+ );
265
300
 
266
301
  /**
267
302
  * Removes an object from the database.
@@ -275,7 +310,7 @@ export const remove = <T extends Entity.Unknown>(obj: T): Effect.Effect<void, ne
275
310
  * @see {@link Database.flush}
276
311
  */
277
312
  export const flush = (opts?: FlushOptions) =>
278
- Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts)))).pipe(
313
+ Service.pipe(Effect.flatMap(({ db }) => EffectEx.promiseWithCauseCapture(() => db.flush(opts)))).pipe(
279
314
  Effect.withSpan('Database.flush'),
280
315
  );
281
316
 
@@ -283,70 +318,28 @@ export const flush = (opts?: FlushOptions) =>
283
318
  * Creates a `QueryResult` object that can be subscribed to.
284
319
  */
285
320
  export const query: {
286
- <Q extends Query.Any>(query: Q): Effect.Effect<QueryResult.QueryResult<Query.Type<Q>>, never, Service>;
287
- <F extends Filter.Any>(filter: F): Effect.Effect<QueryResult.QueryResult<Filter.Type<F>>, never, Service>;
321
+ <Q extends Query.Any>(query: Q): QueryResult.QueryResultEffect<Query.Type<Q>, never, Service>;
322
+ <F extends Filter.Any>(filter: F): QueryResult.QueryResultEffect<Filter.Type<F>, never, Service>;
288
323
  } = (queryOrFilter: Query.Any | Filter.Any) =>
289
324
  Service.pipe(
290
325
  Effect.map(({ db }) => db.query(queryOrFilter as any) as QueryResult.QueryResult<any>),
291
326
  Effect.withSpan('Database.query'),
327
+ makeQueryResultEffect,
292
328
  );
293
329
 
294
- /**
295
- * Executes the query once and returns the results.
296
- */
297
- export const runQuery: {
298
- <Q extends Query.Any>(query: Q): Effect.Effect<Query.Type<Q>[], never, Service>;
299
- <F extends Filter.Any>(filter: F): Effect.Effect<Filter.Type<F>[], never, Service>;
300
- } = (queryOrFilter: Query.Any | Filter.Any) =>
301
- query(queryOrFilter as any).pipe(
302
- Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),
303
- Effect.withSpan('Database.runQuery'),
304
- );
305
-
306
- /**
307
- * Executes the query once and returns the first result as or None.
308
- */
309
- export const runQueryFirst: {
310
- <Q extends Query.Any>(query: Q): Effect.Effect<Option.Option<Query.Type<Q>>, never, Service>;
311
- <F extends Filter.Any>(filter: F): Effect.Effect<Option.Option<Filter.Type<F>>, never, Service>;
312
- } = (queryOrFilter: Query.Any | Filter.Any) =>
313
- query(queryOrFilter as any).pipe(
314
- Effect.flatMap((queryResult) =>
315
- promiseWithCauseCapture(async () => Option.fromNullable(await queryResult.firstOrUndefined())),
330
+ const makeQueryResultEffect = <T>(
331
+ eff: Effect.Effect<QueryResult.QueryResult<T>, never, Service>,
332
+ ): QueryResult.QueryResultEffect<T, never, Service> => {
333
+ return {
334
+ run: Effect.flatMap(eff, (result) => EffectEx.promiseWithCauseCapture(() => result.run())),
335
+ first: Effect.flatMap(eff, (result) =>
336
+ EffectEx.promiseWithCauseCapture(async () => Option.fromNullable(await result.firstOrUndefined())),
316
337
  ),
317
- Effect.withSpan('Database.runQueryFirst'),
318
- );
319
-
320
- /**
321
- * Persists schemas in the database so they replicate to other clients.
322
- * @see {@link SchemaRegistry.SchemaRegistry.register}
323
- */
324
- export const registerSchema = (
325
- input: SchemaRegistry.RegisterSchemaInput[],
326
- ): Effect.Effect<Type.RuntimeType[], never, Service> =>
327
- Service.pipe(
328
- Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.schemaRegistry.register(input))),
329
- Effect.withSpan('Database.registerSchema'),
330
- );
331
338
 
332
- /**
333
- * Creates a schema query result that can be subscribed to.
334
- */
335
- // TODO(dmaretskyi): Change API to `yield* Database.querySchema(...).first` and `yield* Database.querySchema(...).schema`.
336
- export const schemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(
337
- schemaQueryOptions?: Q & SchemaRegistry.Query,
338
- ): Effect.Effect<QueryResult.QueryResult<SchemaRegistry.ExtractQueryResult<Q>>, never, Service> =>
339
- Service.pipe(
340
- Effect.map(({ db }) => db.schemaRegistry.query(schemaQueryOptions)),
341
- Effect.withSpan('Database.schemaQuery'),
342
- );
343
-
344
- /**
345
- * Executes a schema query once and returns the results.
346
- */
347
- export const runSchemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(
348
- schemaQueryOptions?: Q & SchemaRegistry.Query,
349
- ): Effect.Effect<SchemaRegistry.ExtractQueryResult<Q>[], never, Service> =>
350
- schemaQuery(schemaQueryOptions).pipe(
351
- Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),
352
- );
339
+ // Effect internals
340
+ ...Effectable.CommitPrototype,
341
+ commit() {
342
+ return eff;
343
+ },
344
+ } as any;
345
+ };
package/src/Dataset.ts CHANGED
@@ -11,13 +11,21 @@ import * as Schema from 'effect/Schema';
11
11
  import * as Collection from './Collection';
12
12
  import * as Feed from './Feed';
13
13
  import * as Obj from './Obj';
14
+ import * as Type from './Type';
14
15
  import * as View from './View';
15
16
 
16
17
  /**
17
- * Abstart set of objects, represented by a view, feed, or collection.
18
+ * Abstract set of objects, represented by a view, feed, or collection.
19
+ * Schema-level union of the underlying type entities (rebuilt via
20
+ * `Type.getSchema`) so this can still be consumed by Schema-side APIs such
21
+ * as `Filter.type(...)` on a union.
18
22
  */
19
- export const Dataset = Schema.Union(Feed.Feed, Collection.Collection, View.View);
20
23
  export type Dataset = Feed.Feed | Collection.Collection | View.View;
24
+ export const Dataset = Schema.Union(
25
+ Type.getSchema(Feed.Feed),
26
+ Type.getSchema(Collection.Collection),
27
+ Type.getSchema(View.View),
28
+ );
21
29
 
22
30
  export const isDataset: (value: unknown) => value is Dataset = pipe(
23
31
  Obj.instanceOf(Feed.Feed),