@dxos/echo 0.8.4-main.40e3dcdf1b → 0.8.4-main.43cb759274

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 (428) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +7 -7
  3. package/dist/lib/neutral/Annotation.mjs +29 -6
  4. package/dist/lib/neutral/Database.mjs +8 -9
  5. package/dist/lib/neutral/Entity.mjs +29 -18
  6. package/dist/lib/neutral/Err.mjs +3 -3
  7. package/dist/lib/neutral/Feed.mjs +27 -19
  8. package/dist/lib/neutral/Filter.mjs +25 -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 +18 -0
  13. package/dist/lib/neutral/Obj.mjs +25 -19
  14. package/dist/lib/neutral/Order.mjs +1 -1
  15. package/dist/lib/neutral/Query.mjs +19 -16
  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/Registry.mjs.map +7 -0
  20. package/dist/lib/neutral/Relation.mjs +26 -24
  21. package/dist/lib/neutral/Scope.mjs +12 -0
  22. package/dist/lib/neutral/Scope.mjs.map +7 -0
  23. package/dist/lib/neutral/Tag.mjs +17 -13
  24. package/dist/lib/neutral/Type.mjs +52 -26
  25. package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
  26. package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
  28. package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-CIRHIEMW.mjs → chunk-4SFPZJVA.mjs} +92 -112
  30. package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-YWXWXIE5.mjs → chunk-4Z6GET2X.mjs} +3 -3
  32. package/dist/lib/neutral/chunk-4Z6GET2X.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
  34. package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-43Y5DOS6.mjs → chunk-7OAFN3OX.mjs} +75 -112
  36. package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
  37. package/dist/lib/neutral/{chunk-BOZZPUXE.mjs → chunk-7PRCIDHH.mjs} +41 -81
  38. package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
  40. package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-BDQGMDIX.mjs +132 -0
  42. package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
  44. package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
  45. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-DKLUHO4T.mjs} +1 -1
  46. package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
  48. package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
  49. package/dist/lib/neutral/{chunk-UTBRYVQC.mjs → chunk-G6CFWUYH.mjs} +2 -2
  50. package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
  51. package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
  52. package/dist/lib/neutral/{chunk-FXEG7EOK.mjs → chunk-J3MNM65T.mjs} +9 -6
  53. package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
  55. package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
  57. package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
  59. package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-WYOKA6AE.mjs → chunk-O6BH7EPN.mjs} +31 -4
  61. package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-KTAWP7GI.mjs → chunk-OIYW7R2G.mjs} +99 -46
  63. package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-TQQZLKB7.mjs → chunk-OYUG4FHF.mjs} +648 -1228
  65. package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-NQRLRYJM.mjs → chunk-Q5FKCVBC.mjs} +173 -60
  67. package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-Q62IHV2N.mjs +41 -0
  69. package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
  70. package/dist/lib/neutral/{chunk-UFDK26FO.mjs → chunk-QVJDDG44.mjs} +69 -34
  71. package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
  72. package/dist/lib/neutral/{chunk-B5OXLWZL.mjs → chunk-TFEWTY5A.mjs} +155 -129
  73. package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
  74. package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-TTCSATUD.mjs} +1 -1
  75. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs → chunk-VKWOFXT2.mjs} +22 -2
  76. package/dist/lib/neutral/{chunk-FZO7LQO7.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
  77. package/dist/lib/neutral/{chunk-NXMFBIT5.mjs → chunk-ZACMEAYV.mjs} +89 -23
  78. package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
  79. package/dist/lib/neutral/index.mjs +58 -38
  80. package/dist/lib/neutral/internal/index.mjs +131 -64
  81. package/dist/lib/neutral/meta.json +1 -1
  82. package/dist/lib/neutral/testing/index.mjs +222 -177
  83. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  84. package/dist/types/src/Annotation.d.ts +108 -4
  85. package/dist/types/src/Annotation.d.ts.map +1 -1
  86. package/dist/types/src/Annotation.test.d.ts +2 -0
  87. package/dist/types/src/Annotation.test.d.ts.map +1 -0
  88. package/dist/types/src/Collection.d.ts +2 -3
  89. package/dist/types/src/Collection.d.ts.map +1 -1
  90. package/dist/types/src/Database.d.ts +56 -24
  91. package/dist/types/src/Database.d.ts.map +1 -1
  92. package/dist/types/src/Dataset.d.ts +17 -6
  93. package/dist/types/src/Dataset.d.ts.map +1 -1
  94. package/dist/types/src/Entity.d.ts +102 -26
  95. package/dist/types/src/Entity.d.ts.map +1 -1
  96. package/dist/types/src/Err.d.ts +27 -27
  97. package/dist/types/src/Err.d.ts.map +1 -1
  98. package/dist/types/src/Feed.d.ts +89 -25
  99. package/dist/types/src/Feed.d.ts.map +1 -1
  100. package/dist/types/src/Filter.d.ts +74 -11
  101. package/dist/types/src/Filter.d.ts.map +1 -1
  102. package/dist/types/src/Filter.test.d.ts +2 -0
  103. package/dist/types/src/Filter.test.d.ts.map +1 -0
  104. package/dist/types/src/Hypergraph.d.ts +14 -9
  105. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  106. package/dist/types/src/Json.d.ts +33 -0
  107. package/dist/types/src/Json.d.ts.map +1 -0
  108. package/dist/types/src/Json.test.d.ts +2 -0
  109. package/dist/types/src/Json.test.d.ts.map +1 -0
  110. package/dist/types/src/JsonSchema.d.ts +2 -2
  111. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  112. package/dist/types/src/Key.d.ts +1 -1
  113. package/dist/types/src/Key.d.ts.map +1 -1
  114. package/dist/types/src/Migration.d.ts +72 -0
  115. package/dist/types/src/Migration.d.ts.map +1 -0
  116. package/dist/types/src/Obj.d.ts +108 -65
  117. package/dist/types/src/Obj.d.ts.map +1 -1
  118. package/dist/types/src/Order.d.ts.map +1 -1
  119. package/dist/types/src/Query.d.ts +35 -10
  120. package/dist/types/src/Query.d.ts.map +1 -1
  121. package/dist/types/src/QueryResult.d.ts +9 -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 +72 -44
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Scope.d.ts +34 -0
  130. package/dist/types/src/Scope.d.ts.map +1 -0
  131. package/dist/types/src/StateMap.d.ts +32 -0
  132. package/dist/types/src/StateMap.d.ts.map +1 -0
  133. package/dist/types/src/StateMap.test.d.ts +2 -0
  134. package/dist/types/src/StateMap.test.d.ts.map +1 -0
  135. package/dist/types/src/Tag.d.ts +21 -5
  136. package/dist/types/src/Tag.d.ts.map +1 -1
  137. package/dist/types/src/TagIndex.d.ts +36 -0
  138. package/dist/types/src/TagIndex.d.ts.map +1 -0
  139. package/dist/types/src/TagIndex.test.d.ts +2 -0
  140. package/dist/types/src/TagIndex.test.d.ts.map +1 -0
  141. package/dist/types/src/Tagging.d.ts +31 -0
  142. package/dist/types/src/Tagging.d.ts.map +1 -0
  143. package/dist/types/src/Type.d.ts +357 -96
  144. package/dist/types/src/Type.d.ts.map +1 -1
  145. package/dist/types/src/View.d.ts +2 -5
  146. package/dist/types/src/View.d.ts.map +1 -1
  147. package/dist/types/src/exemplars.test.d.ts +2 -0
  148. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  149. package/dist/types/src/index.d.ts +8 -2
  150. package/dist/types/src/index.d.ts.map +1 -1
  151. package/dist/types/src/internal/Annotation/annotations.d.ts +79 -37
  152. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
  153. package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
  154. package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
  155. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
  156. package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
  157. package/dist/types/src/internal/Annotation/index.d.ts +4 -2
  158. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
  159. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
  160. package/dist/types/src/internal/Annotation/util.d.ts +14 -5
  161. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
  162. package/dist/types/src/internal/Entity/api.d.ts +3 -3
  163. package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
  164. package/dist/types/src/internal/Entity/entity.d.ts +72 -8
  165. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
  166. package/dist/types/src/internal/Entity/guard.d.ts +10 -0
  167. package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/index.d.ts +2 -0
  169. package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
  170. package/dist/types/src/internal/Entity/model.d.ts +20 -17
  171. package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
  172. package/dist/types/src/internal/Entity/object.d.ts +3 -3
  173. package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
  174. package/dist/types/src/internal/Entity/relation.d.ts +30 -7
  175. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
  176. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  177. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  178. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  179. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  180. package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
  181. package/dist/types/src/internal/Format/date.d.ts.map +1 -1
  182. package/dist/types/src/internal/Format/format.d.ts +3 -2
  183. package/dist/types/src/internal/Format/format.d.ts.map +1 -1
  184. package/dist/types/src/internal/Format/index.d.ts +2 -2
  185. package/dist/types/src/internal/Format/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/Format/number.d.ts.map +1 -1
  187. package/dist/types/src/internal/Format/object.d.ts +3 -1
  188. package/dist/types/src/internal/Format/object.d.ts.map +1 -1
  189. package/dist/types/src/internal/Format/types.d.ts.map +1 -1
  190. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +28 -28
  192. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
  194. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
  195. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
  196. package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
  197. package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
  198. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
  199. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
  200. package/dist/types/src/internal/Obj/index.d.ts +0 -1
  201. package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
  202. package/dist/types/src/internal/Obj/json-serializer.d.ts +11 -10
  203. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
  204. package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
  205. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
  206. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
  207. package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
  208. package/dist/types/src/internal/Query.d.ts +10 -0
  209. package/dist/types/src/internal/Query.d.ts.map +1 -0
  210. package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
  211. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -1
  212. package/dist/types/src/internal/Ref/ref.d.ts +42 -19
  213. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
  214. package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
  215. package/dist/types/src/internal/Type/index.d.ts +1 -2
  216. package/dist/types/src/internal/Type/index.d.ts.map +1 -1
  217. package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
  218. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
  219. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  220. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  221. package/dist/types/src/internal/common/api/meta.d.ts +14 -11
  222. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
  223. package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
  224. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
  225. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
  226. package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
  227. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
  228. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
  229. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
  230. package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
  231. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
  232. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
  233. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
  234. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
  235. package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
  236. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
  237. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  238. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  239. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
  240. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
  241. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
  242. package/dist/types/src/internal/common/types/base.d.ts +4 -4
  243. package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
  244. package/dist/types/src/internal/common/types/entity.d.ts +63 -6
  245. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
  246. package/dist/types/src/internal/common/types/index.d.ts +1 -1
  247. package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
  248. package/dist/types/src/internal/common/types/meta.d.ts +23 -7
  249. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
  250. package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
  251. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
  252. package/dist/types/src/internal/common/types/typename.d.ts +7 -0
  253. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
  254. package/dist/types/src/internal/common/types/version.d.ts +1 -1
  255. package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
  256. package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
  257. package/dist/types/src/internal/index.d.ts +2 -0
  258. package/dist/types/src/internal/index.d.ts.map +1 -1
  259. package/dist/types/src/testing/test-data.d.ts +8 -8
  260. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  261. package/dist/types/src/testing/test-schema.d.ts +83 -89
  262. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  263. package/dist/types/src/testing/util.d.ts +5 -3
  264. package/dist/types/src/testing/util.d.ts.map +1 -1
  265. package/dist/types/tsconfig.tsbuildinfo +1 -1
  266. package/package.json +27 -19
  267. package/src/Annotation.test.ts +439 -0
  268. package/src/Annotation.ts +152 -4
  269. package/src/Collection.ts +6 -5
  270. package/src/Database.ts +117 -57
  271. package/src/Dataset.ts +10 -2
  272. package/src/Entity.test.ts +116 -6
  273. package/src/Entity.ts +130 -31
  274. package/src/Err.ts +4 -4
  275. package/src/Feed.ts +138 -43
  276. package/src/Filter.test.ts +90 -0
  277. package/src/Filter.ts +143 -27
  278. package/src/Hypergraph.ts +14 -9
  279. package/src/Json.test.ts +175 -0
  280. package/src/Json.ts +103 -0
  281. package/src/Key.ts +1 -1
  282. package/src/Migration.ts +114 -0
  283. package/src/Obj.test.ts +122 -19
  284. package/src/Obj.ts +279 -97
  285. package/src/Query.test.ts +317 -131
  286. package/src/Query.ts +181 -73
  287. package/src/QueryResult.ts +11 -0
  288. package/src/Ref.ts +22 -4
  289. package/src/Registry.ts +155 -0
  290. package/src/Relation.test.ts +10 -10
  291. package/src/Relation.ts +112 -71
  292. package/src/Scope.ts +50 -0
  293. package/src/StateMap.test.ts +56 -0
  294. package/src/StateMap.ts +99 -0
  295. package/src/Tag.md +88 -0
  296. package/src/Tag.ts +49 -6
  297. package/src/TagIndex.test.ts +57 -0
  298. package/src/TagIndex.ts +110 -0
  299. package/src/Tagging.ts +83 -0
  300. package/src/Type.test.ts +223 -18
  301. package/src/Type.ts +602 -132
  302. package/src/View.ts +11 -15
  303. package/src/exemplars.test.ts +21 -0
  304. package/src/index.ts +9 -3
  305. package/src/internal/Annotation/annotations.test.ts +82 -13
  306. package/src/internal/Annotation/annotations.ts +153 -115
  307. package/src/internal/Annotation/dictionary.ts +47 -0
  308. package/src/internal/Annotation/entity-dictionary.ts +40 -0
  309. package/src/internal/Annotation/index.ts +4 -2
  310. package/src/internal/Annotation/sorting.ts +0 -1
  311. package/src/internal/Annotation/util.ts +17 -8
  312. package/src/internal/Entity/api.ts +7 -8
  313. package/src/internal/Entity/entity.ts +196 -47
  314. package/src/internal/Entity/guard.ts +26 -0
  315. package/src/internal/Entity/index.ts +2 -0
  316. package/src/internal/Entity/model.ts +37 -28
  317. package/src/internal/Entity/object.ts +21 -6
  318. package/src/internal/Entity/relation.ts +68 -34
  319. package/src/internal/Entity/type-kind.ts +75 -0
  320. package/src/internal/Entity/type-uri.ts +87 -0
  321. package/src/internal/Entity/util.ts +10 -9
  322. package/src/internal/Entity/version.ts +0 -1
  323. package/src/internal/Format/date.test.ts +0 -1
  324. package/src/internal/Format/date.ts +0 -4
  325. package/src/internal/Format/format.test.ts +21 -1
  326. package/src/internal/Format/index.ts +2 -3
  327. package/src/internal/Format/object.ts +21 -4
  328. package/src/internal/Format/types.ts +1 -1
  329. package/src/internal/JsonSchema/annotations.ts +1 -1
  330. package/src/internal/JsonSchema/json-schema-type.ts +1 -1
  331. package/src/internal/JsonSchema/json-schema.test.ts +55 -142
  332. package/src/internal/JsonSchema/json-schema.ts +44 -31
  333. package/src/internal/Obj/clone.ts +9 -4
  334. package/src/internal/Obj/create-object.test.ts +13 -13
  335. package/src/internal/Obj/create-object.ts +68 -24
  336. package/src/internal/Obj/deleted.ts +1 -1
  337. package/src/internal/Obj/index.ts +0 -1
  338. package/src/internal/Obj/inspect.ts +4 -3
  339. package/src/internal/Obj/json-serializer.test.ts +102 -24
  340. package/src/internal/Obj/json-serializer.ts +105 -43
  341. package/src/internal/Obj/set-value.test.ts +31 -54
  342. package/src/internal/Obj/set-value.ts +1 -1
  343. package/src/internal/Obj/snapshot.ts +11 -4
  344. package/src/internal/Obj/typed-object.test.ts +9 -11
  345. package/src/internal/Obj/typed-object.ts +1 -1
  346. package/src/internal/Query.ts +159 -0
  347. package/src/internal/Ref/ref-array.ts +3 -4
  348. package/src/internal/Ref/ref.test.ts +17 -27
  349. package/src/internal/Ref/ref.ts +124 -59
  350. package/src/internal/Type/compose.test.ts +3 -2
  351. package/src/internal/Type/index.ts +1 -2
  352. package/src/internal/Type/manipulation.ts +0 -25
  353. package/src/internal/Type/type-schema.ts +60 -0
  354. package/src/internal/common/README.md +2 -2
  355. package/src/internal/common/api/meta.ts +19 -17
  356. package/src/internal/common/proxy/change-context.ts +1 -1
  357. package/src/internal/common/proxy/change.test.ts +118 -110
  358. package/src/internal/common/proxy/errors.ts +2 -2
  359. package/src/internal/common/proxy/handler.test.ts +1 -3
  360. package/src/internal/common/proxy/json-serializer.ts +26 -16
  361. package/src/internal/common/proxy/make-object.ts +43 -21
  362. package/src/internal/common/proxy/ownership.ts +2 -3
  363. package/src/internal/common/proxy/reactive-array.ts +1 -1
  364. package/src/internal/common/proxy/reactive.test.ts +54 -0
  365. package/src/internal/common/proxy/reactive.ts +11 -3
  366. package/src/internal/common/proxy/schema.test.ts +48 -86
  367. package/src/internal/common/proxy/typed-handler.test.ts +12 -12
  368. package/src/internal/common/proxy/typed-handler.ts +79 -19
  369. package/src/internal/common/proxy/typed-object.test.ts +16 -29
  370. package/src/internal/common/types/base.ts +4 -4
  371. package/src/internal/common/types/entity.ts +81 -2
  372. package/src/internal/common/types/index.ts +6 -1
  373. package/src/internal/common/types/meta.ts +49 -15
  374. package/src/internal/common/types/model-symbols.ts +16 -4
  375. package/src/internal/common/types/typename.ts +39 -3
  376. package/src/internal/common/types/well-known-types.ts +15 -0
  377. package/src/internal/index.ts +6 -0
  378. package/src/testing/api.test.ts +15 -10
  379. package/src/testing/test-data.ts +159 -100
  380. package/src/testing/test-schema.ts +22 -58
  381. package/src/testing/util.ts +14 -11
  382. package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
  383. package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +0 -7
  384. package/dist/lib/neutral/chunk-724GQYEN.mjs +0 -56
  385. package/dist/lib/neutral/chunk-724GQYEN.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  387. package/dist/lib/neutral/chunk-B5OXLWZL.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
  389. package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
  390. package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-CIRHIEMW.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-DYDJBZEG.mjs +0 -102
  393. package/dist/lib/neutral/chunk-DYDJBZEG.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-FXEG7EOK.mjs.map +0 -7
  395. package/dist/lib/neutral/chunk-KTAWP7GI.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-NEGC54NE.mjs +0 -130
  397. package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +0 -7
  398. package/dist/lib/neutral/chunk-NQRLRYJM.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-OENWMTE6.mjs +0 -45
  401. package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +0 -7
  402. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
  403. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs +0 -97
  404. package/dist/lib/neutral/chunk-RMLF7JOZ.mjs.map +0 -7
  405. package/dist/lib/neutral/chunk-SEMVAGBM.mjs +0 -355
  406. package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-TQQZLKB7.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-UFDK26FO.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-VA2F47ZC.mjs +0 -152
  411. package/dist/lib/neutral/chunk-VA2F47ZC.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-WYOKA6AE.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-YWXWXIE5.mjs.map +0 -7
  414. package/dist/types/src/SchemaRegistry.d.ts +0 -84
  415. package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
  416. package/dist/types/src/internal/Obj/ids.d.ts +0 -6
  417. package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
  418. package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
  419. package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
  420. package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
  421. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
  422. package/src/SchemaRegistry.ts +0 -106
  423. package/src/internal/Obj/ids.ts +0 -12
  424. package/src/internal/Type/echo-schema.ts +0 -424
  425. package/src/internal/Type/persistent-schema.ts +0 -33
  426. /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Migration.mjs.map} +0 -0
  427. /package/dist/lib/neutral/{chunk-UTBRYVQC.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
  428. /package/dist/lib/neutral/{chunk-UI6MWK5W.mjs.map → chunk-TTCSATUD.mjs.map} +0 -0
package/src/Query.test.ts CHANGED
@@ -6,7 +6,7 @@ import * as Schema from 'effect/Schema';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
8
  import { QueryAST } from '@dxos/echo-protocol';
9
- import { DXN } from '@dxos/keys';
9
+ import { EID, EntityId, SpaceId } from '@dxos/keys';
10
10
  import { log } from '@dxos/log';
11
11
 
12
12
  import * as Dataset from './Dataset';
@@ -98,7 +98,7 @@ describe('query api', () => {
98
98
  expect(ObjectsReferencingFred.ast).toMatchObject({
99
99
  type: 'incoming-references',
100
100
  property: null,
101
- typename: 'dxn:type:com.example.type.task:0.1.0',
101
+ typename: 'dxn:com.example.type.task:0.1.0',
102
102
  });
103
103
  });
104
104
 
@@ -150,17 +150,17 @@ describe('query api', () => {
150
150
  {
151
151
  "props": {},
152
152
  "type": "object",
153
- "typename": "dxn:type:org.dxos.type.feed:0.1.0",
153
+ "typename": "dxn:org.dxos.type.feed:0.1.0",
154
154
  },
155
155
  {
156
156
  "props": {},
157
157
  "type": "object",
158
- "typename": "dxn:type:org.dxos.type.collection:0.1.0",
158
+ "typename": "dxn:org.dxos.type.collection:0.1.0",
159
159
  },
160
160
  {
161
161
  "props": {},
162
162
  "type": "object",
163
- "typename": "dxn:type:org.dxos.type.view:0.1.0",
163
+ "typename": "dxn:org.dxos.type.view:0.1.0",
164
164
  },
165
165
  ],
166
166
  "type": "or",
@@ -177,30 +177,30 @@ describe('query api', () => {
177
177
  Schema.validateSync(QueryAST.Query)(AllDatasets.ast);
178
178
  log('AllDatasets', { ast: AllDatasets.ast });
179
179
  expect(AllDatasets.ast).toMatchInlineSnapshot(`
180
- {
181
- "filter": {
182
- "filters": [
183
- {
184
- "props": {},
185
- "type": "object",
186
- "typename": "dxn:type:org.dxos.type.feed:0.1.0",
187
- },
188
- {
189
- "props": {},
190
- "type": "object",
191
- "typename": "dxn:type:org.dxos.type.collection:0.1.0",
192
- },
193
180
  {
194
- "props": {},
195
- "type": "object",
196
- "typename": "dxn:type:org.dxos.type.view:0.1.0",
197
- },
198
- ],
199
- "type": "or",
200
- },
201
- "type": "select",
202
- }
203
- `);
181
+ "filter": {
182
+ "filters": [
183
+ {
184
+ "props": {},
185
+ "type": "object",
186
+ "typename": "dxn:org.dxos.type.feed:0.1.0",
187
+ },
188
+ {
189
+ "props": {},
190
+ "type": "object",
191
+ "typename": "dxn:org.dxos.type.collection:0.1.0",
192
+ },
193
+ {
194
+ "props": {},
195
+ "type": "object",
196
+ "typename": "dxn:org.dxos.type.view:0.1.0",
197
+ },
198
+ ],
199
+ "type": "or",
200
+ },
201
+ "type": "select",
202
+ }
203
+ `);
204
204
  });
205
205
 
206
206
  test('get all people not in orgs', () => {
@@ -230,15 +230,15 @@ describe('query api', () => {
230
230
  log('query', { ast: contactFullTextSearch.ast });
231
231
  Schema.validateSync(QueryAST.Query)(contactFullTextSearch.ast);
232
232
  expect(contactFullTextSearch.ast).toMatchInlineSnapshot(`
233
- {
234
- "filter": {
235
- "searchKind": undefined,
236
- "text": "Bill",
237
- "type": "text-search",
238
- },
239
- "type": "select",
240
- }
241
- `);
233
+ {
234
+ "filter": {
235
+ "searchKind": undefined,
236
+ "text": "Bill",
237
+ "type": "text-search",
238
+ },
239
+ "type": "select",
240
+ }
241
+ `);
242
242
  });
243
243
 
244
244
  test('typed full-text search', () => {
@@ -247,24 +247,24 @@ describe('query api', () => {
247
247
  log('query', { ast: contactFullTextSearch.ast });
248
248
  Schema.validateSync(QueryAST.Query)(contactFullTextSearch.ast);
249
249
  expect(contactFullTextSearch.ast).toMatchInlineSnapshot(`
250
- {
251
- "filter": {
252
- "searchKind": undefined,
253
- "text": "Bill",
254
- "type": "text-search",
255
- },
256
- "selection": {
250
+ {
257
251
  "filter": {
258
- "id": undefined,
259
- "props": {},
260
- "type": "object",
261
- "typename": "dxn:type:com.example.type.person:0.1.0",
252
+ "searchKind": undefined,
253
+ "text": "Bill",
254
+ "type": "text-search",
262
255
  },
263
- "type": "select",
264
- },
265
- "type": "filter",
266
- }
267
- `);
256
+ "selection": {
257
+ "filter": {
258
+ "id": undefined,
259
+ "props": {},
260
+ "type": "object",
261
+ "typename": "dxn:com.example.type.person:0.1.0",
262
+ },
263
+ "type": "select",
264
+ },
265
+ "type": "filter",
266
+ }
267
+ `);
268
268
  });
269
269
 
270
270
  test('filter by ref', () => {
@@ -276,12 +276,12 @@ describe('query api', () => {
276
276
  operator: 'eq',
277
277
  type: 'compare',
278
278
  value: {
279
- '/': DXN.fromLocalObjectId(fred.id).toString(),
279
+ '/': EID.make({ entityId: fred.id }),
280
280
  },
281
281
  },
282
282
  },
283
283
  type: 'object',
284
- typename: 'dxn:type:com.example.type.task:0.1.0',
284
+ typename: 'dxn:com.example.type.task:0.1.0',
285
285
  });
286
286
  log('tasksByFred', { ast: tasksByFred.ast });
287
287
  });
@@ -293,60 +293,60 @@ describe('query api', () => {
293
293
 
294
294
  Schema.validateSync(QueryAST.Query)(orgsAndPeople.ast);
295
295
  expect(orgsAndPeople.ast).toMatchInlineSnapshot(`
296
- {
297
- "filter": {
298
- "filters": [
299
- {
300
- "id": undefined,
301
- "props": {},
302
- "type": "object",
303
- "typename": "dxn:type:com.example.type.organization:0.1.0",
304
- },
305
- {
306
- "id": undefined,
307
- "props": {},
308
- "type": "object",
309
- "typename": "dxn:type:com.example.type.person:0.1.0",
310
- },
311
- ],
312
- "type": "or",
313
- },
314
- "type": "select",
315
- }
316
- `);
317
- });
318
-
319
- test('select everything but orgs and people', () => {
320
- const everythingButOrgsAndPeople = Query.select(
321
- Filter.not(Filter.or(Filter.type(TestSchema.Organization), Filter.type(TestSchema.Person))),
322
- );
323
-
324
- Schema.validateSync(QueryAST.Query)(everythingButOrgsAndPeople.ast);
325
- expect(everythingButOrgsAndPeople.ast).toMatchInlineSnapshot(`
326
- {
327
- "filter": {
296
+ {
328
297
  "filter": {
329
298
  "filters": [
330
299
  {
331
300
  "id": undefined,
332
301
  "props": {},
333
302
  "type": "object",
334
- "typename": "dxn:type:com.example.type.organization:0.1.0",
303
+ "typename": "dxn:com.example.type.organization:0.1.0",
335
304
  },
336
305
  {
337
306
  "id": undefined,
338
307
  "props": {},
339
308
  "type": "object",
340
- "typename": "dxn:type:com.example.type.person:0.1.0",
309
+ "typename": "dxn:com.example.type.person:0.1.0",
341
310
  },
342
311
  ],
343
312
  "type": "or",
344
313
  },
345
- "type": "not",
346
- },
347
- "type": "select",
348
- }
349
- `);
314
+ "type": "select",
315
+ }
316
+ `);
317
+ });
318
+
319
+ test('select everything but orgs and people', () => {
320
+ const everythingButOrgsAndPeople = Query.select(
321
+ Filter.not(Filter.or(Filter.type(TestSchema.Organization), Filter.type(TestSchema.Person))),
322
+ );
323
+
324
+ Schema.validateSync(QueryAST.Query)(everythingButOrgsAndPeople.ast);
325
+ expect(everythingButOrgsAndPeople.ast).toMatchInlineSnapshot(`
326
+ {
327
+ "filter": {
328
+ "filter": {
329
+ "filters": [
330
+ {
331
+ "id": undefined,
332
+ "props": {},
333
+ "type": "object",
334
+ "typename": "dxn:com.example.type.organization:0.1.0",
335
+ },
336
+ {
337
+ "id": undefined,
338
+ "props": {},
339
+ "type": "object",
340
+ "typename": "dxn:com.example.type.person:0.1.0",
341
+ },
342
+ ],
343
+ "type": "or",
344
+ },
345
+ "type": "not",
346
+ },
347
+ "type": "select",
348
+ }
349
+ `);
350
350
  });
351
351
 
352
352
  test('select deleted tasks', () => {
@@ -356,22 +356,22 @@ describe('query api', () => {
356
356
 
357
357
  Schema.validateSync(QueryAST.Query)(deletedTasks.ast);
358
358
  expect(deletedTasks.ast).toMatchInlineSnapshot(`
359
- {
360
- "options": {
361
- "deleted": "only",
362
- },
363
- "query": {
364
- "filter": {
365
- "id": undefined,
366
- "props": {},
367
- "type": "object",
368
- "typename": "dxn:type:com.example.type.task:0.1.0",
359
+ {
360
+ "options": {
361
+ "deleted": "only",
369
362
  },
370
- "type": "select",
371
- },
372
- "type": "options",
373
- }
374
- `);
363
+ "query": {
364
+ "filter": {
365
+ "id": undefined,
366
+ "props": {},
367
+ "type": "object",
368
+ "typename": "dxn:com.example.type.task:0.1.0",
369
+ },
370
+ "type": "select",
371
+ },
372
+ "type": "options",
373
+ }
374
+ `);
375
375
  });
376
376
 
377
377
  test('filter by tags', () => {
@@ -388,7 +388,7 @@ describe('query api', () => {
388
388
  "id": undefined,
389
389
  "props": {},
390
390
  "type": "object",
391
- "typename": "dxn:type:com.example.type.task:0.1.0",
391
+ "typename": "dxn:com.example.type.task:0.1.0",
392
392
  },
393
393
  "type": "select",
394
394
  },
@@ -408,7 +408,7 @@ describe('query api', () => {
408
408
  "id": undefined,
409
409
  "props": {},
410
410
  "type": "object",
411
- "typename": "dxn:type:com.example.type.task:0.1.0",
411
+ "typename": "dxn:com.example.type.task:0.1.0",
412
412
  },
413
413
  "type": "select",
414
414
  },
@@ -436,7 +436,7 @@ describe('query api', () => {
436
436
  "id": undefined,
437
437
  "props": {},
438
438
  "type": "object",
439
- "typename": "dxn:type:com.example.type.task:0.1.0",
439
+ "typename": "dxn:com.example.type.task:0.1.0",
440
440
  },
441
441
  "type": "select",
442
442
  },
@@ -463,7 +463,7 @@ describe('query api', () => {
463
463
  "id": undefined,
464
464
  "props": {},
465
465
  "type": "object",
466
- "typename": "dxn:type:com.example.type.person:0.1.0",
466
+ "typename": "dxn:com.example.type.person:0.1.0",
467
467
  },
468
468
  "type": "select",
469
469
  },
@@ -476,7 +476,7 @@ describe('query api', () => {
476
476
  "id": undefined,
477
477
  "props": {},
478
478
  "type": "object",
479
- "typename": "dxn:type:com.example.type.organization:0.1.0",
479
+ "typename": "dxn:com.example.type.organization:0.1.0",
480
480
  },
481
481
  "type": "select",
482
482
  },
@@ -496,14 +496,14 @@ describe('query api', () => {
496
496
  {
497
497
  "from": {
498
498
  "_tag": "scope",
499
- "scope": {},
499
+ "scopes": [],
500
500
  },
501
501
  "query": {
502
502
  "filter": {
503
503
  "id": undefined,
504
504
  "props": {},
505
505
  "type": "object",
506
- "typename": "dxn:type:com.example.type.person:0.1.0",
506
+ "typename": "dxn:com.example.type.person:0.1.0",
507
507
  },
508
508
  "type": "select",
509
509
  },
@@ -522,16 +522,14 @@ describe('query api', () => {
522
522
  {
523
523
  "from": {
524
524
  "_tag": "scope",
525
- "scope": {
526
- "allQueuesFromSpaces": true,
527
- },
525
+ "scopes": [],
528
526
  },
529
527
  "query": {
530
528
  "filter": {
531
529
  "id": undefined,
532
530
  "props": {},
533
531
  "type": "object",
534
- "typename": "dxn:type:com.example.type.person:0.1.0",
532
+ "typename": "dxn:com.example.type.person:0.1.0",
535
533
  },
536
534
  "type": "select",
537
535
  },
@@ -549,7 +547,7 @@ describe('query api', () => {
549
547
  Schema.validateSync(QueryAST.Query)(query.ast);
550
548
  expect(query.ast).toMatchObject({
551
549
  type: 'from',
552
- from: { _tag: 'scope', scope: {} },
550
+ from: { _tag: 'scope', scopes: [] },
553
551
  query: {
554
552
  type: 'limit',
555
553
  limit: 10,
@@ -560,12 +558,20 @@ describe('query api', () => {
560
558
  });
561
559
  });
562
560
 
563
- test('Query.type(...).from(feed) sets queue scope', () => {
564
- const feed = Feed.make({ name: 'test-feed' });
565
- const queueDxn = DXN.parse('dxn:echo:test-space:test-queue');
566
- Obj.change(feed, (mutable) => {
567
- Obj.getMeta(mutable).keys.push({ source: Feed.DXN_KEY, id: queueDxn.toString() });
568
- });
561
+ test('Query.type(...).from(feed) sets queue scope', async () => {
562
+ const spaceId = SpaceId.random();
563
+ const feedId = EntityId.random();
564
+ const feedDxn = EID.make({ spaceId: spaceId, entityId: feedId });
565
+ const feed = (await Obj.fromJSON(
566
+ {
567
+ '@type': 'dxn:org.dxos.type.feed:0.1.0',
568
+ id: feedId,
569
+ name: 'test-feed',
570
+ },
571
+ { uri: feedDxn },
572
+ )) as Feed.Feed;
573
+
574
+ const expectedQueueUri = Feed.getQueueUri(feed);
569
575
 
570
576
  const query = Query.type(TestSchema.Person).from(feed);
571
577
  Schema.validateSync(QueryAST.Query)(query.ast);
@@ -573,20 +579,72 @@ describe('query api', () => {
573
579
  type: 'from',
574
580
  from: {
575
581
  _tag: 'scope',
576
- scope: {
577
- queues: [queueDxn.toString()],
578
- },
582
+ scopes: [{ _tag: 'feed', feedUri: expectedQueueUri?.toString() }],
579
583
  },
580
584
  query: {
581
585
  type: 'select',
582
586
  filter: {
583
587
  type: 'object',
584
- typename: 'dxn:type:com.example.type.person:0.1.0',
588
+ typename: 'dxn:com.example.type.person:0.1.0',
585
589
  },
586
590
  },
587
591
  });
588
592
  });
589
593
 
594
+ test('Query.from(non-feed) throws TypeError', () => {
595
+ const person = Obj.make(TestSchema.Person, { name: 'Fred' });
596
+ expect(() => Query.select(Filter.type(TestSchema.Person)).from(person as any)).toThrow(TypeError);
597
+ expect(() => Query.select(Filter.type(TestSchema.Person)).from(person as any)).toThrow(
598
+ /Query\.from\(\) expects Feed objects/,
599
+ );
600
+ });
601
+
602
+ test('Query.from(undefined) throws TypeError', () => {
603
+ expect(() => Query.select(Filter.type(TestSchema.Person)).from(undefined as any)).toThrow(TypeError);
604
+ expect(() => Query.select(Filter.type(TestSchema.Person)).from(undefined as any)).toThrow(
605
+ /Query\.from\(\) requires a valid data source argument/,
606
+ );
607
+ });
608
+
609
+ test('Query.from(null) throws TypeError', () => {
610
+ expect(() => Query.select(Filter.type(TestSchema.Person)).from(null as any)).toThrow(TypeError);
611
+ expect(() => Query.select(Filter.type(TestSchema.Person)).from(null as any)).toThrow(
612
+ /Query\.from\(\) requires a valid data source argument/,
613
+ );
614
+ });
615
+
616
+ test('Query.pretty surfaces debugLabel from options', () => {
617
+ const query = Query.select(Filter.type(TestSchema.Person)).debugLabel('my-label');
618
+ expect(Query.pretty(query)).toContain('debugLabel');
619
+ expect(Query.pretty(query)).toContain('"my-label"');
620
+ });
621
+
622
+ test('Query.debugLabel merges onto existing options clause', () => {
623
+ const query = Query.select(Filter.type(TestSchema.Person))
624
+ .options({ deleted: 'exclude' })
625
+ .debugLabel('timer-probe');
626
+ const pretty = Query.pretty(query);
627
+ expect(pretty).toContain('deleted');
628
+ expect(pretty).toContain('debugLabel');
629
+ expect(pretty).toContain('"timer-probe"');
630
+ });
631
+
632
+ test('Query.pretty returns human-readable query string', () => {
633
+ const query = Query.select(Filter.type(TestSchema.Person, { name: 'Fred' }));
634
+ const pretty = Query.pretty(query);
635
+ expect(pretty).toContain('Query.select');
636
+ expect(pretty).toContain('Filter.type');
637
+ expect(pretty).toContain('com.example.type.person');
638
+ });
639
+
640
+ test('Query.pretty handles complex queries', () => {
641
+ const query = Query.select(Filter.and(Filter.type(TestSchema.Person), Filter.id(EntityId.random()))).limit(10);
642
+ const pretty = Query.pretty(query);
643
+ expect(pretty).toContain('Query.select');
644
+ expect(pretty).toContain('Filter.and');
645
+ expect(pretty).toContain('limit(10)');
646
+ });
647
+
590
648
  test.skip('chain', () => {
591
649
  // NOTE: Can't support props without type since they can't be inferred.
592
650
  // const f1: Filter<Person> = Filter.props({ name: 'Fred' });
@@ -622,11 +680,139 @@ describe('query api', () => {
622
680
  });
623
681
  });
624
682
 
683
+ describe('Filter.childOf', () => {
684
+ test('childOf with Ref', () => {
685
+ const parentDxn = EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() });
686
+ const parentRef = Ref.fromURI(parentDxn);
687
+ const filter = Filter.childOf(parentRef);
688
+
689
+ expect(filter.ast).toMatchObject({
690
+ type: 'child-of',
691
+ parents: [parentDxn],
692
+ transitive: true,
693
+ });
694
+ Schema.validateSync(QueryAST.Filter)(filter.ast);
695
+ });
696
+
697
+ test('childOf with object', () => {
698
+ const parent = Obj.make(TestSchema.Person, { name: 'Parent' });
699
+ const filter = Filter.childOf(parent);
700
+
701
+ expect(filter.ast).toMatchObject({
702
+ type: 'child-of',
703
+ transitive: true,
704
+ });
705
+ expect(filter.ast.type === 'child-of' && filter.ast.parents.length).toBe(1);
706
+ Schema.validateSync(QueryAST.Filter)(filter.ast);
707
+ });
708
+
709
+ test('childOf with array of Refs', () => {
710
+ const dxn1 = EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() });
711
+ const dxn2 = EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() });
712
+ const filter = Filter.childOf([Ref.fromURI(dxn1), Ref.fromURI(dxn2)]);
713
+
714
+ expect(filter.ast).toMatchObject({
715
+ type: 'child-of',
716
+ parents: [dxn1, dxn2],
717
+ transitive: true,
718
+ });
719
+ Schema.validateSync(QueryAST.Filter)(filter.ast);
720
+ });
721
+
722
+ test('childOf with transitive=false', () => {
723
+ const parentRef = Ref.fromURI(EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() }));
724
+ const filter = Filter.childOf(parentRef, { transitive: false });
725
+
726
+ expect(filter.ast).toMatchObject({
727
+ type: 'child-of',
728
+ parents: [parentRef.uri],
729
+ transitive: false,
730
+ });
731
+ Schema.validateSync(QueryAST.Filter)(filter.ast);
732
+ });
733
+
734
+ test('childOf in select query', () => {
735
+ const parentDxn = EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() });
736
+ const parentRef = Ref.fromURI(parentDxn);
737
+ const query = Query.select(Filter.childOf(parentRef));
738
+
739
+ expect(query.ast).toMatchObject({
740
+ type: 'select',
741
+ filter: {
742
+ type: 'child-of',
743
+ parents: [parentDxn],
744
+ transitive: true,
745
+ },
746
+ });
747
+ Schema.validateSync(QueryAST.Query)(query.ast);
748
+ });
749
+
750
+ test('childOf combined with type filter', () => {
751
+ const parentDxn = EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() });
752
+ const parentRef = Ref.fromURI(parentDxn);
753
+ const query = Query.select(Filter.and(Filter.type(TestSchema.Person), Filter.childOf(parentRef)));
754
+
755
+ Schema.validateSync(QueryAST.Query)(query.ast);
756
+ expect(query.ast).toMatchObject({
757
+ type: 'select',
758
+ filter: {
759
+ type: 'and',
760
+ filters: [
761
+ { type: 'object', typename: 'dxn:com.example.type.person:0.1.0' },
762
+ { type: 'child-of', parents: [parentDxn], transitive: true },
763
+ ],
764
+ },
765
+ });
766
+ });
767
+
768
+ test('childOf pretty-prints correctly', () => {
769
+ const parentRef = Ref.fromURI(EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() }));
770
+ const filter = Filter.childOf(parentRef);
771
+ const pretty = Filter.pretty(filter);
772
+ expect(pretty).toContain('Filter.childOf');
773
+ expect(pretty).toContain('transitive: true');
774
+ });
775
+
776
+ test('childOf with mixed objects and Refs', () => {
777
+ const parent = Obj.make(TestSchema.Person, { name: 'Parent' });
778
+ const refDxn = EID.make({ spaceId: SpaceId.random(), entityId: EntityId.random() });
779
+ const parentRef = Ref.fromURI(refDxn);
780
+ const filter = Filter.childOf([parent, parentRef]);
781
+
782
+ expect(filter.ast).toMatchObject({
783
+ type: 'child-of',
784
+ transitive: true,
785
+ });
786
+ expect(filter.ast.type === 'child-of' && filter.ast.parents.length).toBe(2);
787
+ Schema.validateSync(QueryAST.Filter)(filter.ast);
788
+ });
789
+ });
790
+
625
791
  describe('Filter', () => {
626
792
  test('Filter.or(Filter.typename(...))', () => {
627
793
  const filter = Filter.or(Filter.typename('com.example.type.person'));
628
794
  // TODO(dmaretskyi): Give vitest type-tests a try.
629
795
  const _isAssignable: Obj.Unknown = null as any as Filter.Type<typeof filter>;
630
796
  });
797
+
798
+ test('Filter.pretty returns human-readable filter string', () => {
799
+ const filter = Filter.type(TestSchema.Person, { name: 'Fred' });
800
+ const pretty = Filter.pretty(filter);
801
+ expect(pretty).toContain('Filter.type');
802
+ expect(pretty).toContain('com.example.type.person');
803
+ });
804
+
805
+ test('Filter.pretty handles complex filters', () => {
806
+ const filter = Filter.and(Filter.type(TestSchema.Person), Filter.id(EntityId.random()));
807
+ const pretty = Filter.pretty(filter);
808
+ expect(pretty).toContain('Filter.and');
809
+ expect(pretty).toContain('Filter.type');
810
+ });
811
+
812
+ test('Filter.pretty handles or filters', () => {
813
+ const filter = Filter.or(Filter.type(TestSchema.Person), Filter.type(TestSchema.Organization));
814
+ const pretty = Filter.pretty(filter);
815
+ expect(pretty).toContain('Filter.or');
816
+ });
631
817
  });
632
818
  });