@dxos/echo 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb

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 (278) hide show
  1. package/dist/lib/{browser → neutral}/Annotation.mjs +7 -5
  2. package/dist/lib/neutral/Database.mjs +45 -0
  3. package/dist/lib/{browser → neutral}/Entity.mjs +8 -9
  4. package/dist/lib/{browser → neutral}/Err.mjs +4 -3
  5. package/dist/lib/{browser → neutral}/Filter.mjs +9 -10
  6. package/dist/lib/{browser → neutral}/Format.mjs +4 -5
  7. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  8. package/dist/lib/{browser → neutral}/Key.mjs +2 -3
  9. package/dist/lib/{node-esm → neutral}/Obj.mjs +23 -10
  10. package/dist/lib/{browser → neutral}/Order.mjs +2 -3
  11. package/dist/lib/neutral/Query.mjs +26 -0
  12. package/dist/lib/neutral/QueryResult.mjs +2 -0
  13. package/dist/lib/neutral/Ref.mjs +22 -0
  14. package/dist/lib/{browser → neutral}/Relation.mjs +9 -10
  15. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  16. package/dist/lib/neutral/Tag.mjs +25 -0
  17. package/dist/lib/{browser → neutral}/Type.mjs +8 -9
  18. package/dist/lib/{browser/chunk-W5D2GWAW.mjs → neutral/chunk-36GDMODZ.mjs} +5 -6
  19. package/dist/lib/{browser/chunk-W5D2GWAW.mjs.map → neutral/chunk-36GDMODZ.mjs.map} +1 -1
  20. package/dist/lib/{browser/chunk-ZHXZGIXD.mjs → neutral/chunk-4L6DOFXP.mjs} +1 -3
  21. package/dist/lib/{browser/chunk-ZHXZGIXD.mjs.map → neutral/chunk-4L6DOFXP.mjs.map} +1 -1
  22. package/dist/lib/{browser/chunk-NOPVNWPT.mjs → neutral/chunk-5MGEVDUW.mjs} +73 -8
  23. package/dist/lib/neutral/chunk-5MGEVDUW.mjs.map +7 -0
  24. package/dist/lib/{browser/chunk-FRDT7RA4.mjs → neutral/chunk-7WE7SBA2.mjs} +4 -5
  25. package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +7 -0
  26. package/dist/lib/{browser/chunk-INHXFXY5.mjs → neutral/chunk-ANHVGJI4.mjs} +2 -3
  27. package/dist/lib/{node-esm/chunk-AJEMYSIR.mjs.map → neutral/chunk-ANHVGJI4.mjs.map} +1 -1
  28. package/dist/lib/neutral/chunk-B4FLOYG7.mjs +130 -0
  29. package/dist/lib/neutral/chunk-B4FLOYG7.mjs.map +7 -0
  30. package/dist/lib/{browser/chunk-U2J7TA7K.mjs → neutral/chunk-BHR4XVJK.mjs} +5 -6
  31. package/dist/lib/{node-esm/chunk-DMR7OAFK.mjs.map → neutral/chunk-BHR4XVJK.mjs.map} +1 -1
  32. package/dist/lib/{browser/chunk-ZAGAOZVY.mjs → neutral/chunk-CH3HX4Z5.mjs} +4 -5
  33. package/dist/lib/{node-esm/chunk-QYR67VBV.mjs.map → neutral/chunk-CH3HX4Z5.mjs.map} +1 -1
  34. package/dist/lib/{browser/chunk-CGS2ULMK.mjs → neutral/chunk-J5LGTIGS.mjs} +1 -2
  35. package/dist/lib/{browser/chunk-YKTSSMDS.mjs → neutral/chunk-KB7RIVLK.mjs} +1 -3
  36. package/dist/lib/neutral/chunk-KB7RIVLK.mjs.map +7 -0
  37. package/dist/lib/{browser/chunk-2SBB7OWV.mjs → neutral/chunk-KSFI2POM.mjs} +11 -10
  38. package/dist/lib/neutral/chunk-KSFI2POM.mjs.map +7 -0
  39. package/dist/lib/{browser/chunk-6L5HHUVU.mjs → neutral/chunk-LKQBTRJX.mjs} +18 -5
  40. package/dist/lib/neutral/chunk-LKQBTRJX.mjs.map +7 -0
  41. package/dist/lib/{browser/chunk-CJ5YELTO.mjs → neutral/chunk-MXQJZCPY.mjs} +15 -3
  42. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +7 -0
  43. package/dist/lib/{browser/chunk-PQZW3S6L.mjs → neutral/chunk-N2QNHMT5.mjs} +3 -4
  44. package/dist/lib/{node-esm/chunk-Y75VU7LB.mjs.map → neutral/chunk-N2QNHMT5.mjs.map} +1 -1
  45. package/dist/lib/{browser/chunk-IXVWLTG7.mjs → neutral/chunk-OMUPQMLR.mjs} +1 -3
  46. package/dist/lib/{browser/chunk-IXVWLTG7.mjs.map → neutral/chunk-OMUPQMLR.mjs.map} +1 -1
  47. package/dist/lib/{node-esm/chunk-YOLH5KS4.mjs → neutral/chunk-RIMHNJ3E.mjs} +17 -4
  48. package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +7 -0
  49. package/dist/lib/{browser/chunk-JMKVF2YQ.mjs → neutral/chunk-ROKO4RKJ.mjs} +2 -3
  50. package/dist/lib/{node-esm/chunk-K37NA7PO.mjs.map → neutral/chunk-ROKO4RKJ.mjs.map} +1 -1
  51. package/dist/lib/{browser/chunk-KQQGVHFN.mjs → neutral/chunk-SHLKRGRB.mjs} +5 -6
  52. package/dist/lib/{node-esm/chunk-NRN3ZW2T.mjs.map → neutral/chunk-SHLKRGRB.mjs.map} +1 -1
  53. package/dist/lib/{browser/chunk-22JMFST2.mjs → neutral/chunk-UW4T7PAL.mjs} +3 -4
  54. package/dist/lib/{browser/chunk-22JMFST2.mjs.map → neutral/chunk-UW4T7PAL.mjs.map} +1 -1
  55. package/dist/lib/{browser/chunk-XDIUHAAX.mjs → neutral/chunk-WSPASOLU.mjs} +3 -4
  56. package/dist/lib/{node-esm/chunk-QLI2EIJ2.mjs.map → neutral/chunk-WSPASOLU.mjs.map} +1 -1
  57. package/dist/lib/{browser/chunk-MYCCGG2T.mjs → neutral/chunk-X2MPMYYN.mjs} +1 -3
  58. package/dist/lib/{node-esm/chunk-MOWUEW5P.mjs.map → neutral/chunk-X2MPMYYN.mjs.map} +1 -1
  59. package/dist/lib/{browser/chunk-FPOISFQK.mjs → neutral/chunk-XAJMXQ4H.mjs} +7 -4
  60. package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +7 -0
  61. package/dist/lib/{browser/chunk-BJPE6CIC.mjs → neutral/chunk-ZUG3PNXU.mjs} +146 -83
  62. package/dist/lib/neutral/chunk-ZUG3PNXU.mjs.map +7 -0
  63. package/dist/lib/{browser → neutral}/index.mjs +23 -24
  64. package/dist/lib/{browser → neutral}/internal/index.mjs +13 -8
  65. package/dist/lib/neutral/meta.json +1 -0
  66. package/dist/lib/{browser → neutral}/testing/index.mjs +23 -24
  67. package/dist/lib/{node-esm → neutral}/testing/index.mjs.map +1 -1
  68. package/dist/types/src/Annotation.d.ts +22 -0
  69. package/dist/types/src/Annotation.d.ts.map +1 -1
  70. package/dist/types/src/Database.d.ts +72 -50
  71. package/dist/types/src/Database.d.ts.map +1 -1
  72. package/dist/types/src/Err.d.ts +43 -0
  73. package/dist/types/src/Err.d.ts.map +1 -1
  74. package/dist/types/src/Obj.d.ts +84 -4
  75. package/dist/types/src/Obj.d.ts.map +1 -1
  76. package/dist/types/src/Query.d.ts +10 -0
  77. package/dist/types/src/Query.d.ts.map +1 -1
  78. package/dist/types/src/Relation.d.ts +2 -2
  79. package/dist/types/src/Relation.d.ts.map +1 -1
  80. package/dist/types/src/hierarchy.test.d.ts +2 -0
  81. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  82. package/dist/types/src/internal/annotations/annotations.d.ts +13 -6
  83. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -1
  84. package/dist/types/src/internal/annotations/util.d.ts +12 -0
  85. package/dist/types/src/internal/annotations/util.d.ts.map +1 -1
  86. package/dist/types/src/internal/api/meta.d.ts +2 -2
  87. package/dist/types/src/internal/api/meta.d.ts.map +1 -1
  88. package/dist/types/src/internal/entities/model.d.ts +3 -1
  89. package/dist/types/src/internal/entities/model.d.ts.map +1 -1
  90. package/dist/types/src/internal/entities/object.d.ts.map +1 -1
  91. package/dist/types/src/internal/entities/relation.d.ts.map +1 -1
  92. package/dist/types/src/internal/formats/select.d.ts +2 -2
  93. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  94. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  95. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  96. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  97. package/dist/types/src/internal/json-schema/json-schema.d.ts +2 -1
  98. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -1
  99. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  100. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -1
  101. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -1
  102. package/dist/types/src/internal/proxy/typed-handler.d.ts +2 -1
  103. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  104. package/dist/types/src/internal/ref/ref.d.ts +16 -2
  105. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  106. package/dist/types/src/internal/schema/compose.d.ts +2 -1
  107. package/dist/types/src/internal/schema/compose.d.ts.map +1 -1
  108. package/dist/types/src/internal/schema/echo-schema.d.ts +2 -1
  109. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  110. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -1
  111. package/dist/types/src/internal/types/meta.d.ts +5 -5
  112. package/dist/types/src/internal/types/meta.d.ts.map +1 -1
  113. package/dist/types/src/internal/types/typename.d.ts +8 -0
  114. package/dist/types/src/internal/types/typename.d.ts.map +1 -1
  115. package/dist/types/tsconfig.tsbuildinfo +1 -1
  116. package/package.json +34 -113
  117. package/src/Annotation.ts +27 -0
  118. package/src/Database.ts +141 -124
  119. package/src/Err.ts +20 -0
  120. package/src/Obj.test.ts +56 -0
  121. package/src/Obj.ts +140 -11
  122. package/src/Query.ts +28 -0
  123. package/src/Relation.ts +5 -3
  124. package/src/hierarchy.test.ts +33 -0
  125. package/src/internal/annotations/annotations.ts +28 -1
  126. package/src/internal/annotations/util.ts +13 -0
  127. package/src/internal/api/meta.ts +3 -3
  128. package/src/internal/entities/model.ts +4 -0
  129. package/src/internal/entities/object.ts +1 -3
  130. package/src/internal/entities/relation.ts +1 -3
  131. package/src/internal/formats/format.test.ts +1 -1
  132. package/src/internal/formats/select.ts +1 -1
  133. package/src/internal/formats/types.ts +1 -1
  134. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  135. package/src/internal/json-schema/json-schema-type.ts +30 -31
  136. package/src/internal/json-schema/json-schema.ts +10 -6
  137. package/src/internal/object/json-serializer.test.ts +26 -2
  138. package/src/internal/object/json-serializer.ts +25 -9
  139. package/src/internal/object/schema-validator.test.ts +3 -7
  140. package/src/internal/object/set-value.test.ts +9 -9
  141. package/src/internal/object/snapshot.ts +29 -6
  142. package/src/internal/proxy/make-object.ts +12 -2
  143. package/src/internal/proxy/typed-handler.test.ts +8 -12
  144. package/src/internal/proxy/typed-handler.ts +9 -1
  145. package/src/internal/proxy/typed-object.test.ts +11 -11
  146. package/src/internal/ref/ref.test.ts +1 -1
  147. package/src/internal/ref/ref.ts +26 -2
  148. package/src/internal/schema/compose.ts +13 -8
  149. package/src/internal/schema/echo-schema.ts +3 -2
  150. package/src/internal/schema/persistent-schema.ts +2 -1
  151. package/src/internal/types/meta.ts +12 -13
  152. package/src/internal/types/typename.ts +10 -0
  153. package/dist/lib/browser/Database.mjs +0 -18
  154. package/dist/lib/browser/JsonSchema.mjs +0 -20
  155. package/dist/lib/browser/Obj.mjs +0 -91
  156. package/dist/lib/browser/Query.mjs +0 -27
  157. package/dist/lib/browser/QueryResult.mjs +0 -3
  158. package/dist/lib/browser/Ref.mjs +0 -23
  159. package/dist/lib/browser/SchemaRegistry.mjs +0 -3
  160. package/dist/lib/browser/Tag.mjs +0 -26
  161. package/dist/lib/browser/chunk-2SBB7OWV.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-6L5HHUVU.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-7STIBCP7.mjs +0 -133
  164. package/dist/lib/browser/chunk-7STIBCP7.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-BJPE6CIC.mjs.map +0 -7
  166. package/dist/lib/browser/chunk-CJ5YELTO.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-FPOISFQK.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-FRDT7RA4.mjs.map +0 -7
  169. package/dist/lib/browser/chunk-INHXFXY5.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-JMKVF2YQ.mjs.map +0 -7
  171. package/dist/lib/browser/chunk-KQQGVHFN.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-MYCCGG2T.mjs.map +0 -7
  173. package/dist/lib/browser/chunk-NOPVNWPT.mjs.map +0 -7
  174. package/dist/lib/browser/chunk-PQZW3S6L.mjs.map +0 -7
  175. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs +0 -283
  176. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs.map +0 -7
  177. package/dist/lib/browser/chunk-U2J7TA7K.mjs.map +0 -7
  178. package/dist/lib/browser/chunk-XDIUHAAX.mjs.map +0 -7
  179. package/dist/lib/browser/chunk-YKTSSMDS.mjs.map +0 -7
  180. package/dist/lib/browser/chunk-ZAGAOZVY.mjs.map +0 -7
  181. package/dist/lib/browser/meta.json +0 -1
  182. package/dist/lib/browser/testing/index.mjs.map +0 -7
  183. package/dist/lib/node-esm/Annotation.mjs +0 -33
  184. package/dist/lib/node-esm/Annotation.mjs.map +0 -7
  185. package/dist/lib/node-esm/Database.mjs +0 -18
  186. package/dist/lib/node-esm/Database.mjs.map +0 -7
  187. package/dist/lib/node-esm/Entity.mjs +0 -52
  188. package/dist/lib/node-esm/Entity.mjs.map +0 -7
  189. package/dist/lib/node-esm/Err.mjs +0 -11
  190. package/dist/lib/node-esm/Err.mjs.map +0 -7
  191. package/dist/lib/node-esm/Filter.mjs +0 -62
  192. package/dist/lib/node-esm/Filter.mjs.map +0 -7
  193. package/dist/lib/node-esm/Format.mjs +0 -67
  194. package/dist/lib/node-esm/Format.mjs.map +0 -7
  195. package/dist/lib/node-esm/JsonSchema.mjs +0 -20
  196. package/dist/lib/node-esm/JsonSchema.mjs.map +0 -7
  197. package/dist/lib/node-esm/Key.mjs +0 -13
  198. package/dist/lib/node-esm/Key.mjs.map +0 -7
  199. package/dist/lib/node-esm/Obj.mjs.map +0 -7
  200. package/dist/lib/node-esm/Order.mjs +0 -13
  201. package/dist/lib/node-esm/Order.mjs.map +0 -7
  202. package/dist/lib/node-esm/Query.mjs +0 -27
  203. package/dist/lib/node-esm/Query.mjs.map +0 -7
  204. package/dist/lib/node-esm/QueryResult.mjs +0 -3
  205. package/dist/lib/node-esm/QueryResult.mjs.map +0 -7
  206. package/dist/lib/node-esm/Ref.mjs +0 -23
  207. package/dist/lib/node-esm/Ref.mjs.map +0 -7
  208. package/dist/lib/node-esm/Relation.mjs +0 -85
  209. package/dist/lib/node-esm/Relation.mjs.map +0 -7
  210. package/dist/lib/node-esm/SchemaRegistry.mjs +0 -3
  211. package/dist/lib/node-esm/SchemaRegistry.mjs.map +0 -7
  212. package/dist/lib/node-esm/Tag.mjs +0 -26
  213. package/dist/lib/node-esm/Tag.mjs.map +0 -7
  214. package/dist/lib/node-esm/Type.mjs +0 -48
  215. package/dist/lib/node-esm/Type.mjs.map +0 -7
  216. package/dist/lib/node-esm/chunk-4PNXQA64.mjs +0 -250
  217. package/dist/lib/node-esm/chunk-4PNXQA64.mjs.map +0 -7
  218. package/dist/lib/node-esm/chunk-5OBN7GZW.mjs +0 -158
  219. package/dist/lib/node-esm/chunk-5OBN7GZW.mjs.map +0 -7
  220. package/dist/lib/node-esm/chunk-AJEMYSIR.mjs +0 -22
  221. package/dist/lib/node-esm/chunk-ANLVLWME.mjs +0 -98
  222. package/dist/lib/node-esm/chunk-ANLVLWME.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-DMR7OAFK.mjs +0 -57
  224. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs +0 -133
  225. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  227. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-ILMLLM4R.mjs +0 -204
  229. package/dist/lib/node-esm/chunk-ILMLLM4R.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-K37NA7PO.mjs +0 -43
  231. package/dist/lib/node-esm/chunk-LT3H4JOX.mjs +0 -3847
  232. package/dist/lib/node-esm/chunk-LT3H4JOX.mjs.map +0 -7
  233. package/dist/lib/node-esm/chunk-MOLNWFNL.mjs +0 -9
  234. package/dist/lib/node-esm/chunk-MOLNWFNL.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-MOWUEW5P.mjs +0 -15
  236. package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs +0 -40
  237. package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-NRN3ZW2T.mjs +0 -143
  239. package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs +0 -41
  240. package/dist/lib/node-esm/chunk-QYR67VBV.mjs +0 -288
  241. package/dist/lib/node-esm/chunk-UKGVOINP.mjs +0 -9
  242. package/dist/lib/node-esm/chunk-UKGVOINP.mjs.map +0 -7
  243. package/dist/lib/node-esm/chunk-W6QIEBTQ.mjs +0 -403
  244. package/dist/lib/node-esm/chunk-W6QIEBTQ.mjs.map +0 -7
  245. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs +0 -69
  246. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-Y75VU7LB.mjs +0 -74
  248. package/dist/lib/node-esm/chunk-YOLH5KS4.mjs.map +0 -7
  249. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs +0 -39
  250. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs.map +0 -7
  251. package/dist/lib/node-esm/chunk-ZBB67AKD.mjs +0 -24
  252. package/dist/lib/node-esm/chunk-ZBB67AKD.mjs.map +0 -7
  253. package/dist/lib/node-esm/index.mjs +0 -85
  254. package/dist/lib/node-esm/index.mjs.map +0 -7
  255. package/dist/lib/node-esm/internal/index.mjs +0 -457
  256. package/dist/lib/node-esm/internal/index.mjs.map +0 -7
  257. package/dist/lib/node-esm/meta.json +0 -1
  258. package/dist/lib/node-esm/testing/index.mjs +0 -367
  259. /package/dist/lib/{browser → neutral}/Annotation.mjs.map +0 -0
  260. /package/dist/lib/{browser → neutral}/Database.mjs.map +0 -0
  261. /package/dist/lib/{browser → neutral}/Entity.mjs.map +0 -0
  262. /package/dist/lib/{browser → neutral}/Err.mjs.map +0 -0
  263. /package/dist/lib/{browser → neutral}/Filter.mjs.map +0 -0
  264. /package/dist/lib/{browser → neutral}/Format.mjs.map +0 -0
  265. /package/dist/lib/{browser → neutral}/JsonSchema.mjs.map +0 -0
  266. /package/dist/lib/{browser → neutral}/Key.mjs.map +0 -0
  267. /package/dist/lib/{browser → neutral}/Obj.mjs.map +0 -0
  268. /package/dist/lib/{browser → neutral}/Order.mjs.map +0 -0
  269. /package/dist/lib/{browser → neutral}/Query.mjs.map +0 -0
  270. /package/dist/lib/{browser → neutral}/QueryResult.mjs.map +0 -0
  271. /package/dist/lib/{browser → neutral}/Ref.mjs.map +0 -0
  272. /package/dist/lib/{browser → neutral}/Relation.mjs.map +0 -0
  273. /package/dist/lib/{browser → neutral}/SchemaRegistry.mjs.map +0 -0
  274. /package/dist/lib/{browser → neutral}/Tag.mjs.map +0 -0
  275. /package/dist/lib/{browser → neutral}/Type.mjs.map +0 -0
  276. /package/dist/lib/{browser/chunk-CGS2ULMK.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  277. /package/dist/lib/{browser → neutral}/index.mjs.map +0 -0
  278. /package/dist/lib/{browser → neutral}/internal/index.mjs.map +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/echo",
3
- "version": "0.8.4-main.21d9917",
3
+ "version": "0.8.4-main.2244d791bb",
4
4
  "description": "ECHO API",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -16,181 +16,102 @@
16
16
  ".": {
17
17
  "source": "./src/index.ts",
18
18
  "types": "./dist/types/src/index.d.ts",
19
- "browser": "./dist/lib/browser/index.mjs",
20
- "node": "./dist/lib/node-esm/index.mjs"
19
+ "default": "./dist/lib/neutral/index.mjs"
21
20
  },
22
21
  "./internal": {
23
22
  "source": "./src/internal/index.ts",
24
23
  "types": "./dist/types/src/internal/index.d.ts",
25
- "browser": "./dist/lib/browser/internal/index.mjs",
26
- "node": "./dist/lib/node-esm/internal/index.mjs"
24
+ "default": "./dist/lib/neutral/internal/index.mjs"
27
25
  },
28
26
  "./testing": {
29
27
  "source": "./src/testing/index.ts",
30
28
  "types": "./dist/types/src/testing/index.d.ts",
31
- "browser": "./dist/lib/browser/testing/index.mjs",
32
- "node": "./dist/lib/node-esm/testing/index.mjs"
29
+ "default": "./dist/lib/neutral/testing/index.mjs"
33
30
  },
34
31
  "./Annotation": {
35
32
  "source": "./src/Annotation.ts",
36
33
  "types": "./dist/types/src/Annotation.d.ts",
37
- "browser": "./dist/lib/browser/Annotation.mjs",
38
- "node": "./dist/lib/node-esm/Annotation.mjs"
34
+ "default": "./dist/lib/neutral/Annotation.mjs"
39
35
  },
40
36
  "./Database": {
41
37
  "source": "./src/Database.ts",
42
38
  "types": "./dist/types/src/Database.d.ts",
43
- "browser": "./dist/lib/browser/Database.mjs",
44
- "node": "./dist/lib/node-esm/Database.mjs"
39
+ "default": "./dist/lib/neutral/Database.mjs"
45
40
  },
46
41
  "./Entity": {
47
42
  "source": "./src/Entity.ts",
48
43
  "types": "./dist/types/src/Entity.d.ts",
49
- "browser": "./dist/lib/browser/Entity.mjs",
50
- "node": "./dist/lib/node-esm/Entity.mjs"
44
+ "default": "./dist/lib/neutral/Entity.mjs"
51
45
  },
52
46
  "./Err": {
53
47
  "source": "./src/Err.ts",
54
48
  "types": "./dist/types/src/Err.d.ts",
55
- "browser": "./dist/lib/browser/Err.mjs",
56
- "node": "./dist/lib/node-esm/Err.mjs"
49
+ "default": "./dist/lib/neutral/Err.mjs"
57
50
  },
58
51
  "./Filter": {
59
52
  "source": "./src/Filter.ts",
60
53
  "types": "./dist/types/src/Filter.d.ts",
61
- "browser": "./dist/lib/browser/Filter.mjs",
62
- "node": "./dist/lib/node-esm/Filter.mjs"
54
+ "default": "./dist/lib/neutral/Filter.mjs"
63
55
  },
64
56
  "./Format": {
65
57
  "source": "./src/Format.ts",
66
58
  "types": "./dist/types/src/Format.d.ts",
67
- "browser": "./dist/lib/browser/Format.mjs",
68
- "node": "./dist/lib/node-esm/Format.mjs"
59
+ "default": "./dist/lib/neutral/Format.mjs"
69
60
  },
70
61
  "./JsonSchema": {
71
62
  "source": "./src/JsonSchema.ts",
72
63
  "types": "./dist/types/src/JsonSchema.d.ts",
73
- "browser": "./dist/lib/browser/JsonSchema.mjs",
74
- "node": "./dist/lib/node-esm/JsonSchema.mjs"
64
+ "default": "./dist/lib/neutral/JsonSchema.mjs"
75
65
  },
76
66
  "./Key": {
77
67
  "source": "./src/Key.ts",
78
68
  "types": "./dist/types/src/Key.d.ts",
79
- "browser": "./dist/lib/browser/Key.mjs",
80
- "node": "./dist/lib/node-esm/Key.mjs"
69
+ "default": "./dist/lib/neutral/Key.mjs"
81
70
  },
82
71
  "./Obj": {
83
72
  "source": "./src/Obj.ts",
84
73
  "types": "./dist/types/src/Obj.d.ts",
85
- "browser": "./dist/lib/browser/Obj.mjs",
86
- "node": "./dist/lib/node-esm/Obj.mjs"
74
+ "default": "./dist/lib/neutral/Obj.mjs"
87
75
  },
88
76
  "./Order": {
89
77
  "source": "./src/Order.ts",
90
78
  "types": "./dist/types/src/Order.d.ts",
91
- "browser": "./dist/lib/browser/Order.mjs",
92
- "node": "./dist/lib/node-esm/Order.mjs"
79
+ "default": "./dist/lib/neutral/Order.mjs"
93
80
  },
94
81
  "./Query": {
95
82
  "source": "./src/Query.ts",
96
83
  "types": "./dist/types/src/Query.d.ts",
97
- "browser": "./dist/lib/browser/Query.mjs",
98
- "node": "./dist/lib/node-esm/Query.mjs"
84
+ "default": "./dist/lib/neutral/Query.mjs"
99
85
  },
100
86
  "./QueryResult": {
101
87
  "source": "./src/QueryResult.ts",
102
88
  "types": "./dist/types/src/QueryResult.d.ts",
103
- "browser": "./dist/lib/browser/QueryResult.mjs",
104
- "node": "./dist/lib/node-esm/QueryResult.mjs"
89
+ "default": "./dist/lib/neutral/QueryResult.mjs"
105
90
  },
106
91
  "./Ref": {
107
92
  "source": "./src/Ref.ts",
108
93
  "types": "./dist/types/src/Ref.d.ts",
109
- "browser": "./dist/lib/browser/Ref.mjs",
110
- "node": "./dist/lib/node-esm/Ref.mjs"
94
+ "default": "./dist/lib/neutral/Ref.mjs"
111
95
  },
112
96
  "./Relation": {
113
97
  "source": "./src/Relation.ts",
114
98
  "types": "./dist/types/src/Relation.d.ts",
115
- "browser": "./dist/lib/browser/Relation.mjs",
116
- "node": "./dist/lib/node-esm/Relation.mjs"
99
+ "default": "./dist/lib/neutral/Relation.mjs"
117
100
  },
118
101
  "./SchemaRegistry": {
119
102
  "source": "./src/SchemaRegistry.ts",
120
103
  "types": "./dist/types/src/SchemaRegistry.d.ts",
121
- "browser": "./dist/lib/browser/SchemaRegistry.mjs",
122
- "node": "./dist/lib/node-esm/SchemaRegistry.mjs"
104
+ "default": "./dist/lib/neutral/SchemaRegistry.mjs"
123
105
  },
124
106
  "./Tag": {
125
107
  "source": "./src/Tag.ts",
126
108
  "types": "./dist/types/src/Tag.d.ts",
127
- "browser": "./dist/lib/browser/Tag.mjs",
128
- "node": "./dist/lib/node-esm/Tag.mjs"
109
+ "default": "./dist/lib/neutral/Tag.mjs"
129
110
  },
130
111
  "./Type": {
131
112
  "source": "./src/Type.ts",
132
113
  "types": "./dist/types/src/Type.d.ts",
133
- "browser": "./dist/lib/browser/Type.mjs",
134
- "node": "./dist/lib/node-esm/Type.mjs"
135
- }
136
- },
137
- "types": "dist/types/src/index.d.ts",
138
- "typesVersions": {
139
- "*": {
140
- "internal": [
141
- "dist/types/src/internal/index.d.ts"
142
- ],
143
- "testing": [
144
- "dist/types/src/testing/index.d.ts"
145
- ],
146
- "Annotation": [
147
- "dist/types/src/Annotation.d.ts"
148
- ],
149
- "Database": [
150
- "dist/types/src/Database.d.ts"
151
- ],
152
- "Entity": [
153
- "dist/types/src/Entity.d.ts"
154
- ],
155
- "Err": [
156
- "dist/types/src/Err.d.ts"
157
- ],
158
- "Filter": [
159
- "dist/types/src/Filter.d.ts"
160
- ],
161
- "Format": [
162
- "dist/types/src/Format.d.ts"
163
- ],
164
- "JsonSchema": [
165
- "dist/types/src/JsonSchema.d.ts"
166
- ],
167
- "Key": [
168
- "dist/types/src/Key.d.ts"
169
- ],
170
- "Obj": [
171
- "dist/types/src/Obj.d.ts"
172
- ],
173
- "Order": [
174
- "dist/types/src/Order.d.ts"
175
- ],
176
- "Query": [
177
- "dist/types/src/Query.d.ts"
178
- ],
179
- "QueryResult": [
180
- "dist/types/src/QueryResult.d.ts"
181
- ],
182
- "Ref": [
183
- "dist/types/src/Ref.d.ts"
184
- ],
185
- "Relation": [
186
- "dist/types/src/Relation.d.ts"
187
- ],
188
- "Tag": [
189
- "dist/types/src/Tag.d.ts"
190
- ],
191
- "Type": [
192
- "dist/types/src/Type.d.ts"
193
- ]
114
+ "default": "./dist/lib/neutral/Type.mjs"
194
115
  }
195
116
  },
196
117
  "files": [
@@ -198,19 +119,19 @@
198
119
  "src"
199
120
  ],
200
121
  "dependencies": {
201
- "effect": "3.19.11",
202
- "@dxos/async": "0.8.4-main.21d9917",
203
- "@dxos/context": "0.8.4-main.21d9917",
204
- "@dxos/debug": "0.8.4-main.21d9917",
205
- "@dxos/echo-protocol": "0.8.4-main.21d9917",
206
- "@dxos/effect": "0.8.4-main.21d9917",
207
- "@dxos/errors": "0.8.4-main.21d9917",
208
- "@dxos/invariant": "0.8.4-main.21d9917",
209
- "@dxos/log": "0.8.4-main.21d9917",
210
- "@dxos/keys": "0.8.4-main.21d9917",
211
- "@dxos/util": "0.8.4-main.21d9917",
212
- "@dxos/protocols": "0.8.4-main.21d9917",
213
- "@dxos/node-std": "0.8.4-main.21d9917"
122
+ "effect": "3.19.16",
123
+ "@dxos/async": "0.8.4-main.2244d791bb",
124
+ "@dxos/debug": "0.8.4-main.2244d791bb",
125
+ "@dxos/context": "0.8.4-main.2244d791bb",
126
+ "@dxos/effect": "0.8.4-main.2244d791bb",
127
+ "@dxos/echo-protocol": "0.8.4-main.2244d791bb",
128
+ "@dxos/errors": "0.8.4-main.2244d791bb",
129
+ "@dxos/invariant": "0.8.4-main.2244d791bb",
130
+ "@dxos/keys": "0.8.4-main.2244d791bb",
131
+ "@dxos/log": "0.8.4-main.2244d791bb",
132
+ "@dxos/node-std": "0.8.4-main.2244d791bb",
133
+ "@dxos/util": "0.8.4-main.2244d791bb",
134
+ "@dxos/protocols": "0.8.4-main.2244d791bb"
214
135
  },
215
136
  "publishConfig": {
216
137
  "access": "public"
package/src/Annotation.ts CHANGED
@@ -16,3 +16,30 @@ export {
16
16
  setDescriptionWithSchema,
17
17
  setLabelWithSchema,
18
18
  } from './internal/annotations';
19
+
20
+ import type * as Schema from 'effect/Schema';
21
+
22
+ import * as internalAnnotations from './internal/annotations';
23
+
24
+ interface MakeProps<T> {
25
+ id: string;
26
+ schema: Schema.Schema<T, any, never>;
27
+ }
28
+
29
+ /**
30
+ * Create a new schema annotation.
31
+ * Annotation can be assigned both to fields and to the schema itself.
32
+ * Annotation is serialized with the schema.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const ColorAnnotation = Annotation.make({
37
+ * id: 'dxos.org/annotation/Color',
38
+ * schema: Schema.String,
39
+ * });
40
+ *
41
+ * const schema = Schema.String.annotations(ColorAnnotation.set('red'));
42
+ * ```
43
+ */
44
+ export const make: <T>(props: MakeProps<T>) => internalAnnotations.AnnotationHelper<T> =
45
+ internalAnnotations.makeUserAnnotation;
package/src/Database.ts CHANGED
@@ -186,151 +186,168 @@ export const isDatabase = (obj: unknown): obj is Database => {
186
186
 
187
187
  export const Database: Schema.Schema<Database> = Schema.Any.pipe(Schema.filter((space) => isDatabase(space)));
188
188
 
189
+ /**
190
+ * Effect service tag for Database dependency injection.
191
+ */
189
192
  export class Service extends Context.Tag('@dxos/echo/Database/Service')<
190
193
  Service,
191
194
  {
192
195
  readonly db: Database;
193
196
  }
194
- >() {
195
- static notAvailable = Layer.succeed(Service, {
196
- get db(): Database {
197
- throw new Error('Database not available');
198
- },
199
- });
200
-
201
- static make = (db: Database): Context.Tag.Service<Service> => {
202
- return {
203
- get db() {
204
- return db;
205
- },
206
- };
207
- };
197
+ >() {}
208
198
 
209
- static layer = (db: Database): Layer.Layer<Service> => {
210
- return Layer.succeed(Service, Service.make(db));
199
+ /**
200
+ * Layer that provides a Database service that throws when accessed.
201
+ * Useful as a default layer when no database is available.
202
+ */
203
+ export const notAvailable = Layer.succeed(Service, {
204
+ get db(): Database {
205
+ throw new Error('Database not available');
206
+ },
207
+ });
208
+
209
+ /**
210
+ * Creates a Database service instance from a Database.
211
+ */
212
+ export const makeService = (db: Database): Context.Tag.Service<Service> => {
213
+ return {
214
+ get db() {
215
+ return db;
216
+ },
211
217
  };
218
+ };
212
219
 
213
- // TODO(dmaretskyi): Move all those to the top-level API of Database.ts module.
220
+ /**
221
+ * Creates a Layer that provides the Database service.
222
+ */
223
+ export const layer = (db: Database): Layer.Layer<Service> => {
224
+ return Layer.succeed(Service, makeService(db));
225
+ };
214
226
 
215
- /**
216
- * Returns the space ID of the database.
217
- */
218
- static spaceId = Effect.gen(function* () {
219
- const { db } = yield* Service;
220
- return db.spaceId;
221
- });
227
+ /**
228
+ * Returns the space ID of the database.
229
+ */
230
+ export const spaceId = Effect.gen(function* () {
231
+ const { db } = yield* Service;
232
+ return db.spaceId;
233
+ });
222
234
 
223
- /**
224
- * Resolves an object by its DXN.
225
- */
226
- static resolve: {
227
- // No type check.
228
- (ref: DXN | Ref<any>): Effect.Effect<Entity.Unknown, never, Service>;
229
- // Check matches schema.
230
- <S extends Type.Entity.Any>(
231
- ref: DXN | Ref<any>,
232
- schema: S,
233
- ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service>;
234
- } = (<S extends Type.Entity.Any>(
235
+ /**
236
+ * Resolves an object by its DXN.
237
+ */
238
+ export const resolve: {
239
+ // No type check.
240
+ (ref: DXN | Ref<any>): Effect.Effect<Entity.Unknown, never, Service>;
241
+ // Check matches schema.
242
+ <S extends Type.Entity.Any>(
235
243
  ref: DXN | Ref<any>,
236
- schema?: S,
237
- ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service> =>
238
- Effect.gen(function* () {
239
- const { db } = yield* Service;
240
- const dxn = ref instanceof DXN ? ref : ref.dxn;
241
- const object = yield* promiseWithCauseCapture(() =>
242
- db.graph
243
- .createRefResolver({
244
- context: {
245
- space: db.spaceId,
246
- },
247
- })
248
- .resolve(dxn),
249
- );
250
-
251
- if (!object) {
252
- return yield* Effect.fail(new Err.ObjectNotFoundError(dxn));
253
- }
254
- invariant(!schema || isInstanceOf(schema, object), 'Object type mismatch.');
255
- return object as any;
256
- })) as any;
244
+ schema: S,
245
+ ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service>;
246
+ } = (<S extends Type.Entity.Any>(
247
+ ref: DXN | Ref<any>,
248
+ schema?: S,
249
+ ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Service> =>
250
+ Effect.gen(function* () {
251
+ const { db } = yield* Service;
252
+ const dxn = ref instanceof DXN ? ref : ref.dxn;
253
+ const object = yield* promiseWithCauseCapture(() =>
254
+ db.graph
255
+ .createRefResolver({
256
+ context: {
257
+ space: db.spaceId,
258
+ },
259
+ })
260
+ .resolve(dxn),
261
+ );
257
262
 
258
- /**
259
- * Loads an object reference.
260
- */
261
- static load: <T>(ref: Ref<T>) => Effect.Effect<T, Err.ObjectNotFoundError, never> = Effect.fn(function* (ref) {
262
- const object = yield* promiseWithCauseCapture(() => ref.tryLoad());
263
263
  if (!object) {
264
- return yield* Effect.fail(new Err.ObjectNotFoundError(ref.dxn));
264
+ return yield* Effect.fail(new Err.ObjectNotFoundError(dxn));
265
265
  }
266
- return object;
267
- });
266
+ invariant(!schema || isInstanceOf(schema, object), 'Object type mismatch.');
267
+ return object as any;
268
+ })) as any;
268
269
 
269
- /**
270
- * Loads an object reference option.
271
- */
272
- // TODO(dmaretskyi): Do we need this -- you can just use `Effect.catchTag` in calling code instead.
273
- static loadOption: <T>(ref: Ref<T>) => Effect.Effect<Option.Option<T>, never, never> = Effect.fn(function* (ref) {
274
- const object = yield* Service.load(ref).pipe(
275
- Effect.catchTag('ObjectNotFoundError', () => Effect.succeed(undefined)),
276
- );
270
+ /**
271
+ * Loads an object reference.
272
+ */
273
+ export const load: <T>(ref: Ref<T>) => Effect.Effect<T, Err.ObjectNotFoundError, never> = Effect.fn(function* (ref) {
274
+ const object = yield* promiseWithCauseCapture(() => ref.tryLoad());
275
+ if (!object) {
276
+ return yield* Effect.fail(new Err.ObjectNotFoundError(ref.dxn));
277
+ }
278
+ return object;
279
+ });
277
280
 
278
- return Option.fromNullable(object);
279
- });
281
+ /**
282
+ * Loads an object reference option.
283
+ */
284
+ // TODO(dmaretskyi): Do we need this -- you can just use `Effect.catchTag` in calling code instead.
285
+ export const loadOption: <T>(ref: Ref<T>) => Effect.Effect<Option.Option<T>, never, never> = Effect.fn(function* (ref) {
286
+ const object = yield* load(ref).pipe(Effect.catchTag('ObjectNotFoundError', () => Effect.succeed(undefined)));
280
287
 
281
- /**
282
- * @link EchoDatabase.add
283
- */
284
- static add = <T extends Entity.Unknown>(obj: T): Effect.Effect<T, never, Service> =>
285
- Service.pipe(Effect.map(({ db }) => db.add(obj)));
288
+ return Option.fromNullable(object);
289
+ });
286
290
 
287
- /**
288
- * @link EchoDatabase.remove
289
- */
290
- static remove = <T extends Entity.Unknown>(obj: T): Effect.Effect<void, never, Service> =>
291
- Service.pipe(Effect.map(({ db }) => db.remove(obj)));
291
+ /**
292
+ * Adds an object to the database.
293
+ * @see {@link Database.add}
294
+ */
295
+ export const add = <T extends Entity.Unknown>(obj: T): Effect.Effect<T, never, Service> =>
296
+ Service.pipe(Effect.map(({ db }) => db.add(obj)));
292
297
 
293
- /**
294
- * @link EchoDatabase.flush
295
- */
296
- static flush = (opts?: FlushOptions) =>
297
- Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts))));
298
+ /**
299
+ * Removes an object from the database.
300
+ * @see {@link Database.remove}
301
+ */
302
+ export const remove = <T extends Entity.Unknown>(obj: T): Effect.Effect<void, never, Service> =>
303
+ Service.pipe(Effect.map(({ db }) => db.remove(obj)));
298
304
 
299
- /**
300
- * Creates a `QueryResult` object that can be subscribed to.
301
- */
302
- static query: {
303
- <Q extends Query.Any>(query: Q): Effect.Effect<QueryResult.QueryResult<Query.Type<Q>>, never, Service>;
304
- <F extends Filter.Any>(filter: F): Effect.Effect<QueryResult.QueryResult<Filter.Type<F>>, never, Service>;
305
- } = (queryOrFilter: Query.Any | Filter.Any) =>
306
- Service.pipe(
307
- Effect.map(({ db }) => db.query(queryOrFilter as any) as QueryResult.QueryResult<any>),
308
- Effect.withSpan('Service.query'),
309
- );
305
+ /**
306
+ * Flushes pending changes to disk.
307
+ * @see {@link Database.flush}
308
+ */
309
+ export const flush = (opts?: FlushOptions) =>
310
+ Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts))));
310
311
 
311
- /**
312
- * Executes the query once and returns the results.
313
- */
314
- static runQuery: {
315
- <Q extends Query.Any>(query: Q): Effect.Effect<Query.Type<Q>[], never, Service>;
316
- <F extends Filter.Any>(filter: F): Effect.Effect<Filter.Type<F>[], never, Service>;
317
- } = (queryOrFilter: Query.Any | Filter.Any) =>
318
- Service.query(queryOrFilter as any).pipe(
319
- Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),
320
- );
312
+ /**
313
+ * Creates a `QueryResult` object that can be subscribed to.
314
+ */
315
+ export const query: {
316
+ <Q extends Query.Any>(query: Q): Effect.Effect<QueryResult.QueryResult<Query.Type<Q>>, never, Service>;
317
+ <F extends Filter.Any>(filter: F): Effect.Effect<QueryResult.QueryResult<Filter.Type<F>>, never, Service>;
318
+ } = (queryOrFilter: Query.Any | Filter.Any) =>
319
+ Service.pipe(
320
+ Effect.map(({ db }) => db.query(queryOrFilter as any) as QueryResult.QueryResult<any>),
321
+ Effect.withSpan('Database.query'),
322
+ );
321
323
 
322
- // TODO(dmaretskyi): Change API to `yield* Service.querySchema(...).first` and `yield* Service.querySchema(...).schema`.
324
+ /**
325
+ * Executes the query once and returns the results.
326
+ */
327
+ export const runQuery: {
328
+ <Q extends Query.Any>(query: Q): Effect.Effect<Query.Type<Q>[], never, Service>;
329
+ <F extends Filter.Any>(filter: F): Effect.Effect<Filter.Type<F>[], never, Service>;
330
+ } = (queryOrFilter: Query.Any | Filter.Any) =>
331
+ query(queryOrFilter as any).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())));
323
332
 
324
- static schemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(
325
- query?: Q & SchemaRegistry.Query,
326
- ): Effect.Effect<QueryResult.QueryResult<SchemaRegistry.ExtractQueryResult<Q>>, never, Service> =>
327
- Service.pipe(
328
- Effect.map(({ db }) => db.schemaRegistry.query(query)),
329
- Effect.withSpan('Service.schemaQuery'),
330
- );
333
+ /**
334
+ * Creates a schema query result that can be subscribed to.
335
+ */
336
+ // TODO(dmaretskyi): Change API to `yield* Database.querySchema(...).first` and `yield* Database.querySchema(...).schema`.
337
+ export const schemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(
338
+ schemaQueryOptions?: Q & SchemaRegistry.Query,
339
+ ): Effect.Effect<QueryResult.QueryResult<SchemaRegistry.ExtractQueryResult<Q>>, never, Service> =>
340
+ Service.pipe(
341
+ Effect.map(({ db }) => db.schemaRegistry.query(schemaQueryOptions)),
342
+ Effect.withSpan('Database.schemaQuery'),
343
+ );
331
344
 
332
- static runSchemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(
333
- query?: Q & SchemaRegistry.Query,
334
- ): Effect.Effect<SchemaRegistry.ExtractQueryResult<Q>[], never, Service> =>
335
- Service.schemaQuery(query).pipe(Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())));
336
- }
345
+ /**
346
+ * Executes a schema query once and returns the results.
347
+ */
348
+ export const runSchemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(
349
+ schemaQueryOptions?: Q & SchemaRegistry.Query,
350
+ ): Effect.Effect<SchemaRegistry.ExtractQueryResult<Q>[], never, Service> =>
351
+ schemaQuery(schemaQueryOptions).pipe(
352
+ Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),
353
+ );
package/src/Err.ts CHANGED
@@ -16,3 +16,23 @@ export class ObjectNotFoundError extends BaseError.extend('ObjectNotFoundError',
16
16
  super({ context: { dxn }, ...options });
17
17
  }
18
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/Obj.test.ts CHANGED
@@ -77,6 +77,62 @@ describe('Obj', () => {
77
77
  });
78
78
  });
79
79
 
80
+ describe('snapshotOf', () => {
81
+ test('returns true for snapshot of matching schema', ({ expect }) => {
82
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
83
+ const snapshot = Obj.getSnapshot(obj);
84
+
85
+ expect(Obj.snapshotOf(TestSchema.Person, snapshot)).toBe(true);
86
+ expect(Obj.snapshotOf(TestSchema.Organization, snapshot)).toBe(false);
87
+ });
88
+
89
+ test('returns false for reactive object', ({ expect }) => {
90
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
91
+
92
+ expect(Obj.snapshotOf(TestSchema.Person, obj)).toBe(false);
93
+ });
94
+
95
+ test('returns false for plain object with matching shape', ({ expect }) => {
96
+ const plain = { id: 'test', name: 'Test' };
97
+
98
+ expect(Obj.snapshotOf(TestSchema.Person, plain)).toBe(false);
99
+ });
100
+
101
+ test('curried form works', ({ expect }) => {
102
+ const snapshot = Obj.getSnapshot(Obj.make(TestSchema.Person, { name: 'Test' }));
103
+ const isPersonSnapshot = Obj.snapshotOf(TestSchema.Person);
104
+
105
+ expect(isPersonSnapshot(snapshot)).toBe(true);
106
+ expect(isPersonSnapshot({})).toBe(false);
107
+ });
108
+ });
109
+
110
+ describe('getKeys', () => {
111
+ const SOURCE = 'test-source';
112
+
113
+ test('returns keys from reactive object and snapshot', ({ expect }) => {
114
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
115
+ Obj.change(obj, (o) => {
116
+ const meta = Obj.getMeta(o);
117
+ meta.keys.push({ source: SOURCE, id: 'key-1' });
118
+ meta.keys.push({ source: SOURCE, id: 'key-2' });
119
+ meta.keys.push({ source: 'other', id: 'key-3' });
120
+ });
121
+
122
+ expect(Obj.getKeys(obj, SOURCE)).toHaveLength(2);
123
+ expect(Obj.getKeys(obj, SOURCE).map((k) => k.id)).toEqual(['key-1', 'key-2']);
124
+
125
+ const snapshot = Obj.getSnapshot(obj);
126
+ expect(Obj.getKeys(snapshot, SOURCE)).toHaveLength(2);
127
+ expect(Obj.getKeys(snapshot, SOURCE).map((k) => k.id)).toEqual(['key-1', 'key-2']);
128
+ });
129
+
130
+ test('throws for plain object without metadata', ({ expect }) => {
131
+ const plain = { id: 'plain-1', name: 'Plain' };
132
+ expect(() => Obj.getKeys(plain as any, SOURCE)).toThrow(/ObjectMeta not found/);
133
+ });
134
+ });
135
+
80
136
  describe('clone', () => {
81
137
  test('clones object with same properties', ({ expect }) => {
82
138
  const original = Obj.make(TestSchema.Person, {