@dxos/echo 0.8.4-main.72ec0f3 → 0.8.4-main.7ace549

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 (332) hide show
  1. package/dist/lib/browser/{chunk-BIDAASFK.mjs → chunk-7GH6RXJ3.mjs} +2246 -2290
  2. package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-E4UTVJNF.mjs +1111 -0
  4. package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +18 -8
  6. package/dist/lib/browser/internal/index.mjs +45 -45
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +252 -191
  9. package/dist/lib/browser/testing/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +1111 -0
  11. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +7 -0
  12. package/dist/lib/node-esm/{chunk-3SVRRCUU.mjs → chunk-M4B6BMD2.mjs} +2246 -2290
  13. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
  14. package/dist/lib/node-esm/index.mjs +18 -8
  15. package/dist/lib/node-esm/internal/index.mjs +45 -45
  16. package/dist/lib/node-esm/meta.json +1 -1
  17. package/dist/lib/node-esm/testing/index.mjs +252 -191
  18. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  19. package/dist/types/src/Annotation.d.ts +2 -0
  20. package/dist/types/src/Annotation.d.ts.map +1 -0
  21. package/dist/types/src/Database.d.ts +137 -0
  22. package/dist/types/src/Database.d.ts.map +1 -0
  23. package/dist/types/src/Entity.d.ts +36 -0
  24. package/dist/types/src/Entity.d.ts.map +1 -0
  25. package/dist/types/src/Format.d.ts +4 -0
  26. package/dist/types/src/Format.d.ts.map +1 -0
  27. package/dist/types/src/JsonSchema.d.ts +9 -0
  28. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  29. package/dist/types/src/Key.d.ts +1 -0
  30. package/dist/types/src/Key.d.ts.map +1 -1
  31. package/dist/types/src/Obj.d.ts +79 -70
  32. package/dist/types/src/Obj.d.ts.map +1 -1
  33. package/dist/types/src/Ref.d.ts +10 -10
  34. package/dist/types/src/Ref.d.ts.map +1 -1
  35. package/dist/types/src/Relation.d.ts +14 -11
  36. package/dist/types/src/Relation.d.ts.map +1 -1
  37. package/dist/types/src/Tag.d.ts +1 -1
  38. package/dist/types/src/Tag.d.ts.map +1 -1
  39. package/dist/types/src/Type.d.ts +39 -49
  40. package/dist/types/src/Type.d.ts.map +1 -1
  41. package/dist/types/src/index.d.ts +6 -3
  42. package/dist/types/src/index.d.ts.map +1 -1
  43. package/dist/types/src/internal/annotations/annotations.d.ts +174 -0
  44. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  45. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  46. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  47. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  48. package/dist/types/src/internal/annotations/util.d.ts +26 -0
  49. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  50. package/dist/types/src/internal/entities/entity.d.ts +10 -0
  51. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  52. package/dist/types/src/internal/{object → entities}/expando.d.ts +3 -1
  53. package/dist/types/src/internal/entities/expando.d.ts.map +1 -0
  54. package/dist/types/src/internal/entities/index.d.ts +6 -0
  55. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  56. package/dist/types/src/internal/entities/model.d.ts +70 -0
  57. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  58. package/dist/types/src/internal/entities/object.d.ts +11 -0
  59. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  60. package/dist/types/src/internal/entities/relation.d.ts +55 -0
  61. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  62. package/dist/types/src/internal/entities/util.d.ts +2 -0
  63. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  64. package/dist/types/src/internal/formats/format.d.ts +2 -0
  65. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  66. package/dist/types/src/internal/formats/types.d.ts +7 -7
  67. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  68. package/dist/types/src/internal/index.d.ts +6 -10
  69. package/dist/types/src/internal/index.d.ts.map +1 -1
  70. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  71. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  72. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  73. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  74. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  75. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +2 -1
  76. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  77. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  78. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  79. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +8 -9
  80. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  81. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  82. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  83. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  84. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  85. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  86. package/dist/types/src/internal/object/index.d.ts +3 -11
  87. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  88. package/dist/types/src/internal/object/json-serializer.d.ts +1 -2
  89. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  90. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  91. package/dist/types/src/internal/object/typed-object.d.ts +1 -1
  92. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  93. package/dist/types/src/internal/proxy/index.d.ts +3 -0
  94. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  95. package/dist/types/src/internal/proxy/make-object.d.ts +16 -0
  96. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  97. package/dist/types/src/internal/proxy/typed-handler.d.ts +1 -1
  98. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  99. package/dist/types/src/internal/ref/ref.d.ts +15 -12
  100. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  101. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  102. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  103. package/dist/types/src/internal/schema/echo-schema.d.ts +9 -9
  104. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  105. package/dist/types/src/internal/schema/index.d.ts +3 -4
  106. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  107. package/dist/types/src/internal/schema/persistent-schema.d.ts +18 -0
  108. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  109. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +1 -1
  110. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -1
  111. package/dist/types/src/internal/types/base.d.ts +37 -0
  112. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  113. package/dist/types/src/internal/{ast/entity-kind.d.ts → types/entity.d.ts} +3 -1
  114. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  115. package/dist/types/src/internal/types/index.d.ts +5 -2
  116. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  117. package/dist/types/src/internal/{object → types}/meta.d.ts +20 -11
  118. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  119. package/dist/types/src/internal/types/typename.d.ts +13 -0
  120. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  121. package/dist/types/src/internal/{object → types}/version.d.ts +3 -2
  122. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  123. package/dist/types/src/query/filter.d.ts +167 -0
  124. package/dist/types/src/query/filter.d.ts.map +1 -0
  125. package/dist/types/src/query/index.d.ts +3 -0
  126. package/dist/types/src/query/index.d.ts.map +1 -1
  127. package/dist/types/src/query/order.d.ts +12 -0
  128. package/dist/types/src/query/order.d.ts.map +1 -0
  129. package/dist/types/src/query/query.d.ts +9 -145
  130. package/dist/types/src/query/query.d.ts.map +1 -1
  131. package/dist/types/src/query/testing.d.ts +51 -0
  132. package/dist/types/src/query/testing.d.ts.map +1 -0
  133. package/dist/types/src/{internal/query/query.d.ts → query/types.d.ts} +1 -1
  134. package/dist/types/src/query/types.d.ts.map +1 -0
  135. package/dist/types/src/query/util.d.ts +8 -0
  136. package/dist/types/src/query/util.d.ts.map +1 -0
  137. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  138. package/dist/types/src/testing/index.d.ts +3 -3
  139. package/dist/types/src/testing/index.d.ts.map +1 -1
  140. package/dist/types/src/testing/test-data.d.ts +18 -0
  141. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  142. package/dist/types/src/testing/{types.d.ts → test-schema.d.ts} +166 -57
  143. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  144. package/dist/types/src/{internal/testing/utils.d.ts → testing/util.d.ts} +11 -5
  145. package/dist/types/src/testing/util.d.ts.map +1 -0
  146. package/dist/types/tsconfig.tsbuildinfo +1 -1
  147. package/package.json +46 -38
  148. package/src/Annotation.ts +17 -0
  149. package/src/Database.ts +189 -0
  150. package/src/Entity.ts +51 -0
  151. package/src/Format.ts +11 -0
  152. package/src/JsonSchema.ts +16 -0
  153. package/src/Key.ts +3 -0
  154. package/src/Obj.ts +248 -181
  155. package/src/Ref.ts +9 -9
  156. package/src/Relation.ts +58 -44
  157. package/src/Tag.ts +2 -1
  158. package/src/Type.ts +96 -83
  159. package/src/index.ts +9 -4
  160. package/src/internal/README.md +83 -0
  161. package/src/internal/{ast → annotations}/annotations.test.ts +13 -15
  162. package/src/internal/annotations/annotations.ts +463 -0
  163. package/src/internal/annotations/index.ts +6 -0
  164. package/src/internal/annotations/util.ts +70 -0
  165. package/src/internal/entities/entity.ts +109 -0
  166. package/src/internal/{object → entities}/expando.ts +7 -5
  167. package/src/internal/entities/index.ts +9 -0
  168. package/src/internal/{object → entities}/model.ts +49 -90
  169. package/src/internal/entities/object.ts +45 -0
  170. package/src/internal/entities/relation.ts +155 -0
  171. package/src/internal/entities/util.ts +33 -0
  172. package/src/internal/formats/date.test.ts +1 -1
  173. package/src/internal/formats/date.ts +5 -5
  174. package/src/internal/formats/format.test.ts +5 -5
  175. package/src/internal/formats/format.ts +3 -0
  176. package/src/internal/formats/number.ts +5 -5
  177. package/src/internal/formats/object.ts +2 -2
  178. package/src/internal/formats/string.ts +9 -9
  179. package/src/internal/formats/types.ts +44 -39
  180. package/src/internal/index.ts +29 -13
  181. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  182. package/src/internal/json-schema/index.ts +2 -0
  183. package/src/internal/json-schema/json-schema-type.ts +4 -3
  184. package/src/internal/{json → json-schema}/json-schema.test.ts +48 -38
  185. package/src/internal/{json → json-schema}/json-schema.ts +16 -7
  186. package/src/internal/object/common.ts +3 -4
  187. package/src/internal/object/{create.test.ts → create-object.test.ts} +30 -32
  188. package/src/internal/object/{create.ts → create-object.ts} +33 -34
  189. package/src/internal/object/deleted.ts +6 -6
  190. package/src/internal/object/ids.ts +1 -1
  191. package/src/internal/object/index.ts +3 -11
  192. package/src/internal/object/inspect.ts +3 -5
  193. package/src/internal/object/json-serializer.test.ts +33 -38
  194. package/src/internal/object/json-serializer.ts +43 -38
  195. package/src/internal/object/schema-validator.ts +3 -2
  196. package/src/internal/object/typed-object.test.ts +1 -1
  197. package/src/internal/object/typed-object.ts +11 -5
  198. package/src/internal/proxy/handler.test.ts +30 -20
  199. package/src/internal/proxy/index.ts +6 -0
  200. package/src/internal/proxy/{reactive-object.ts → make-object.ts} +19 -14
  201. package/src/internal/proxy/schema.test.ts +5 -4
  202. package/src/internal/proxy/typed-handler.test.ts +28 -28
  203. package/src/internal/proxy/typed-handler.ts +8 -3
  204. package/src/internal/proxy/typed-object.test.ts +16 -11
  205. package/src/internal/ref/ref.test.ts +8 -7
  206. package/src/internal/ref/ref.ts +24 -20
  207. package/src/internal/{projection → schema}/compose.test.ts +5 -6
  208. package/src/internal/{projection → schema}/compose.ts +2 -1
  209. package/src/internal/schema/echo-schema.ts +30 -28
  210. package/src/internal/schema/index.ts +3 -4
  211. package/src/internal/schema/manipulation.ts +1 -1
  212. package/src/internal/schema/persistent-schema.ts +28 -0
  213. package/src/internal/schema/runtime-schema-registry.ts +4 -4
  214. package/src/internal/types/base.ts +58 -0
  215. package/src/internal/{ast/entity-kind.ts → types/entity.ts} +8 -0
  216. package/src/internal/types/index.ts +5 -2
  217. package/src/internal/{object → types}/meta.ts +32 -17
  218. package/src/internal/types/typename.ts +45 -0
  219. package/src/internal/types/version.ts +20 -0
  220. package/src/query/filter.ts +455 -0
  221. package/src/query/index.ts +4 -1
  222. package/src/query/order.ts +34 -0
  223. package/src/query/query.test.ts +48 -115
  224. package/src/query/query.ts +16 -502
  225. package/src/query/testing.ts +64 -0
  226. package/src/query/util.ts +25 -0
  227. package/src/testing/api.test.ts +100 -0
  228. package/src/testing/index.ts +3 -3
  229. package/src/testing/test-data.ts +130 -0
  230. package/src/testing/test-schema.ts +213 -0
  231. package/src/{internal/testing/utils.ts → testing/util.ts} +38 -14
  232. package/dist/lib/browser/chunk-BIDAASFK.mjs.map +0 -7
  233. package/dist/lib/browser/chunk-ZDLCWGEW.mjs +0 -410
  234. package/dist/lib/browser/chunk-ZDLCWGEW.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-ZFRJKT4A.mjs +0 -585
  236. package/dist/lib/browser/chunk-ZFRJKT4A.mjs.map +0 -7
  237. package/dist/lib/browser/query/index.mjs +0 -13
  238. package/dist/lib/browser/query/index.mjs.map +0 -7
  239. package/dist/lib/node-esm/chunk-3SVRRCUU.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-CGDHRZWH.mjs +0 -585
  241. package/dist/lib/node-esm/chunk-CGDHRZWH.mjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-HWS6VBQC.mjs +0 -410
  243. package/dist/lib/node-esm/chunk-HWS6VBQC.mjs.map +0 -7
  244. package/dist/lib/node-esm/query/index.mjs +0 -13
  245. package/dist/lib/node-esm/query/index.mjs.map +0 -7
  246. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  247. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  248. package/dist/types/src/internal/ast/annotations.d.ts +0 -131
  249. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  250. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  251. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  252. package/dist/types/src/internal/ast/index.d.ts +0 -5
  253. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  254. package/dist/types/src/internal/ast/types.d.ts +0 -6
  255. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  256. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  257. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  258. package/dist/types/src/internal/json/index.d.ts +0 -2
  259. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  260. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  261. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  262. package/dist/types/src/internal/object/accessors.d.ts +0 -37
  263. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  264. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  265. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  266. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  267. package/dist/types/src/internal/object/entity.d.ts +0 -33
  268. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  269. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  270. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  271. package/dist/types/src/internal/object/model.d.ts +0 -117
  272. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  273. package/dist/types/src/internal/object/relation.d.ts +0 -17
  274. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  275. package/dist/types/src/internal/object/typename.d.ts +0 -15
  276. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  277. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  278. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  279. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  280. package/dist/types/src/internal/projection/index.d.ts +0 -2
  281. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  282. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  283. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  284. package/dist/types/src/internal/query/index.d.ts +0 -2
  285. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  286. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  287. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  288. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  289. package/dist/types/src/internal/testing/index.d.ts +0 -3
  290. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  291. package/dist/types/src/internal/testing/types.d.ts +0 -381
  292. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  293. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  294. package/dist/types/src/internal/types/types.d.ts +0 -79
  295. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  296. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  297. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  298. package/dist/types/src/internal/types/util.d.ts +0 -5
  299. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  300. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  301. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  302. package/dist/types/src/testing/types.d.ts.map +0 -1
  303. package/src/internal/ast/annotation-helper.ts +0 -22
  304. package/src/internal/ast/annotations.ts +0 -226
  305. package/src/internal/ast/index.ts +0 -8
  306. package/src/internal/ast/types.ts +0 -17
  307. package/src/internal/json/index.ts +0 -5
  308. package/src/internal/object/accessors.ts +0 -153
  309. package/src/internal/object/entity.ts +0 -248
  310. package/src/internal/object/relation.ts +0 -24
  311. package/src/internal/object/typename.ts +0 -61
  312. package/src/internal/object/version.ts +0 -22
  313. package/src/internal/projection/index.ts +0 -5
  314. package/src/internal/query/index.ts +0 -5
  315. package/src/internal/schema/stored-schema.ts +0 -26
  316. package/src/internal/testing/index.ts +0 -6
  317. package/src/internal/testing/types.ts +0 -144
  318. package/src/internal/types/types.test.ts +0 -48
  319. package/src/internal/types/types.ts +0 -176
  320. package/src/internal/types/util.ts +0 -9
  321. package/src/test/api.test.ts +0 -180
  322. package/src/testing/echo-schema.ts +0 -39
  323. package/src/testing/types.ts +0 -108
  324. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  325. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  326. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  327. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  328. /package/dist/types/src/internal/{projection → schema}/compose.d.ts +0 -0
  329. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  330. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  331. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
  332. /package/src/{internal/query/query.ts → query/types.ts} +0 -0
@@ -4,6 +4,11 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
+ /**
8
+ * Entity kind.
9
+ */
10
+ const EntityKindId = Symbol.for('@dxos/echo/EntityKind');
11
+
7
12
  /**
8
13
  * Kinds of entities stored in ECHO: objects and relations.
9
14
  */
@@ -13,3 +18,6 @@ export enum EntityKind {
13
18
  }
14
19
 
15
20
  export const EntityKindSchema = Schema.Enums(EntityKind);
21
+
22
+ export const KindId: unique symbol = EntityKindId as any;
23
+ export type KindId = typeof KindId;
@@ -2,5 +2,8 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './types';
6
- export type * from './util';
5
+ export * from './base';
6
+ export * from './entity';
7
+ export * from './meta';
8
+ export * from './typename';
9
+ export * from './version';
@@ -8,9 +8,17 @@ import { ForeignKey } from '@dxos/echo-protocol';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { type Comparator, intersection } from '@dxos/util';
10
10
 
11
- import { type BaseObject } from '../types';
11
+ import { type AnyProperties, type WithMeta } from './base';
12
12
 
13
- import { MetaId } from './model';
13
+ /**
14
+ * Property name for meta when object is serialized to JSON.
15
+ */
16
+ export const ATTR_META = '@meta';
17
+
18
+ /**
19
+ * Metadata section.
20
+ */
21
+ export const MetaId = Symbol.for('@dxos/echo/Meta');
14
22
 
15
23
  //
16
24
  // ObjectMeta
@@ -33,29 +41,36 @@ export const ObjectMetaSchema = Schema.mutable(
33
41
  );
34
42
  export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
35
43
 
36
- export const foreignKey = (source: string, id: string): ForeignKey => ({ source, id });
37
- export const foreignKeyEquals = (a: ForeignKey, b: ForeignKey) => a.source === b.source && a.id === b.id;
38
-
39
- /**
40
- * Get metadata from object.
41
- * Only callable on the object root.
42
- * @deprecated Use {@link getMeta}.
43
- */
44
- // TODO(dmaretskyi): Remove.
45
- export const getObjectMeta = (obj: any): ObjectMeta => {
46
- return getMeta(obj);
47
- };
48
-
49
44
  /*
50
45
  * Get metadata from object.
51
46
  * Only callable on the object root.
47
+ *
48
+ * @internal (use Obj.getMeta or Relation.getMeta)
52
49
  */
53
- export const getMeta = (obj: BaseObject): ObjectMeta => {
50
+ // TODO(burdon): Refine type to BaseObj.
51
+ export const getMeta = (obj: AnyProperties): ObjectMeta => {
54
52
  const metadata = (obj as any)[MetaId];
55
53
  invariant(metadata, 'ObjectMeta not found.');
56
54
  return metadata;
57
55
  };
58
56
 
57
+ /**
58
+ * Utility to split meta property from raw object.
59
+ * @deprecated Bad API.
60
+ */
61
+ export const splitMeta = <T>(object: T & WithMeta): { object: T; meta?: ObjectMeta } => {
62
+ const meta = object[ATTR_META];
63
+ delete object[ATTR_META];
64
+ return { meta, object };
65
+ };
66
+
67
+ //
68
+ // Foreign keys
69
+ //
70
+
71
+ export const foreignKey = (source: string, id: string): ForeignKey => ({ source, id });
72
+ export const foreignKeyEquals = (a: ForeignKey, b: ForeignKey) => a.source === b.source && a.id === b.id;
73
+
59
74
  // TODO(dmaretskyi): Move to echo-schema.
60
- export const compareForeignKeys: Comparator<BaseObject> = (a: BaseObject, b: BaseObject) =>
75
+ export const compareForeignKeys: Comparator<AnyProperties> = (a: AnyProperties, b: AnyProperties) =>
61
76
  intersection(getMeta(a).keys, getMeta(b).keys, foreignKeyEquals).length > 0;
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import type * as Schema from 'effect/Schema';
6
+
7
+ /**
8
+ * Property name for typename when object is serialized to JSON.
9
+ */
10
+ export const ATTR_TYPE = '@type';
11
+
12
+ /**
13
+ * DXN to the object type.
14
+ */
15
+ export const TypeId = Symbol.for('@dxos/echo/Type');
16
+
17
+ /**
18
+ * Reference to the object schema.
19
+ */
20
+ export const SchemaId = Symbol.for('@dxos/echo/Schema');
21
+
22
+ /**
23
+ * Returns the schema for the given object if one is defined.
24
+ *
25
+ * @internal (Use Obj.getSchema)
26
+ */
27
+ // TODO(burdon): Narrow type.
28
+ // TODO(dmaretskyi): For echo objects, this always returns the root schema.
29
+ export const getSchema = (obj: unknown | undefined): Schema.Schema.AnyNoContext | undefined => {
30
+ if (obj) {
31
+ return (obj as any)[SchemaId];
32
+ }
33
+ };
34
+
35
+ /**
36
+ * @internal
37
+ */
38
+ export const setSchema = (obj: any, schema: Schema.Schema.AnyNoContext): void => {
39
+ Object.defineProperty(obj, SchemaId, {
40
+ value: schema,
41
+ writable: false,
42
+ enumerable: false,
43
+ configurable: false,
44
+ });
45
+ };
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Version type symbol.
7
+ */
8
+ export const VersionTypeId: unique symbol = Symbol.for('@dxos/echo/VersionTypeId');
9
+
10
+ export type VersionTypeId = typeof VersionTypeId;
11
+
12
+ /**
13
+ * Represents the object version.
14
+ * May be backed by Automerge.
15
+ * Objects with no history are not versioned.
16
+ */
17
+ export interface Version {
18
+ [VersionTypeId]: {};
19
+ automergeHeads?: string[];
20
+ }
@@ -0,0 +1,455 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Match from 'effect/Match';
6
+ import * as Schema from 'effect/Schema';
7
+ import type * as Types from 'effect/Types';
8
+
9
+ import { type ForeignKey, type QueryAST } from '@dxos/echo-protocol';
10
+ import { assertArgument } from '@dxos/invariant';
11
+ import { DXN, ObjectId } from '@dxos/keys';
12
+ import { type Intersection } from '@dxos/util';
13
+
14
+ import type * as Entity from '../Entity';
15
+ import { type AnyProperties } from '../internal';
16
+ import type * as Obj from '../Obj';
17
+ import * as Ref from '../Ref';
18
+ import type * as Type from '../Type';
19
+
20
+ import { getTypeDXNFromSpecifier } from './util';
21
+
22
+ export interface Filter<T> {
23
+ // TODO(dmaretskyi): See new effect-schema approach to variance.
24
+ '~Filter': { value: Types.Contravariant<T> };
25
+
26
+ ast: QueryAST.Filter;
27
+ }
28
+
29
+ interface FilterAPI {
30
+ is(value: unknown): value is Filter.Any;
31
+
32
+ /** Construct a filter from an ast. */
33
+ fromAst(ast: QueryAST.Filter): Filter<Obj.Any>;
34
+
35
+ /**
36
+ * Filter that matches all objects.
37
+ */
38
+ // TODO(dmaretskyi): `Entity.Any` would be more type-safe, but causes annoying errors in existing code
39
+ everything(): Filter<Entity.Entity<AnyProperties>>;
40
+
41
+ /**
42
+ * Filter that matches no objects.
43
+ */
44
+ // TODO(dmaretskyi): Filter<never>?
45
+ nothing(): Filter<any>;
46
+
47
+ /**
48
+ * Filter by object IDs.
49
+ */
50
+ // TODO(dmaretskyi): Rename to `Filter.id`.
51
+ ids(...id: ObjectId[]): Filter<Entity.Entity<AnyProperties>>;
52
+
53
+ /**
54
+ * Filter by type.
55
+ */
56
+ type<S extends Schema.Schema.All>(
57
+ schema: S | string,
58
+ props?: Filter.Props<Schema.Schema.Type<S>>,
59
+ ): Filter<Schema.Schema.Type<S>>;
60
+
61
+ /**
62
+ * Filter by non-qualified typename.
63
+ */
64
+ typename(typename: string): Filter<Obj.AnyProps>;
65
+
66
+ /**
67
+ * Filter by fully qualified type DXN.
68
+ */
69
+ typeDXN(dxn: DXN): Filter<Obj.AnyProps>;
70
+
71
+ /**
72
+ * Filter by tag.
73
+ */
74
+ tag(tag: string): Filter<Obj.Any>;
75
+
76
+ /**
77
+ * Filter by properties.
78
+ */
79
+ props<T>(props: Filter.Props<T>): Filter<T>;
80
+
81
+ /**
82
+ * Full-text or vector search.
83
+ */
84
+ text(
85
+ // TODO(dmaretskyi): Consider passing a vector here, but really the embedding should be done on the query-executor side.
86
+ text: string,
87
+ options?: Filter.TextSearchOptions,
88
+ ): Filter<any>;
89
+
90
+ /**
91
+ * Filter by foreign keys.
92
+ */
93
+ foreignKeys<S extends Schema.Schema.All>(schema: S, keys: ForeignKey[]): Filter<Schema.Schema.Type<S>>;
94
+
95
+ /**
96
+ * Predicate for property to be equal to the provided value.
97
+ */
98
+ eq<T>(value: T): Filter<T>;
99
+
100
+ /**
101
+ * Predicate for property to be not equal to the provided value.
102
+ */
103
+ neq<T>(value: T): Filter<T>;
104
+
105
+ /**
106
+ * Predicate for property to be greater than the provided value.
107
+ */
108
+ gt<T>(value: T): Filter<T>;
109
+
110
+ /**
111
+ * Predicate for property to be greater than the provided value.
112
+ */
113
+ gt<T>(value: T): Filter<T>;
114
+
115
+ /**
116
+ * Predicate for property to be greater than or equal to the provided value.
117
+ */
118
+ gte<T>(value: T): Filter<T>;
119
+
120
+ /**
121
+ * Predicate for property to be less than the provided value.
122
+ */
123
+ lt<T>(value: T): Filter<T>;
124
+
125
+ /**
126
+ * Predicate for property to be less than or equal to the provided value.
127
+ */
128
+ lte<T>(value: T): Filter<T>;
129
+
130
+ /**
131
+ * Predicate for property to be in the provided array.
132
+ * @param values - Values to check against.
133
+ */
134
+ in<T>(...values: T[]): Filter<T>;
135
+
136
+ /**
137
+ * Predicate for an array property to contain the provided value.
138
+ * @param value - Value to check against.
139
+ */
140
+ contains<T>(value: T): Filter<readonly T[] | undefined>;
141
+
142
+ /**
143
+ * Predicate for property to be in the provided range.
144
+ * @param from - Start of the range (inclusive).
145
+ * @param to - End of the range (exclusive).
146
+ */
147
+ between<T>(from: T, to: T): Filter<unknown>;
148
+
149
+ /**
150
+ * Negate the filter.
151
+ */
152
+ not<F extends Filter.Any>(filter: F): Filter<Filter.Type<F>>;
153
+
154
+ /**
155
+ * Combine filters with a logical AND.
156
+ */
157
+ and<FS extends Filter.Any[]>(...filters: FS): Filter<Filter.And<FS>>;
158
+
159
+ /**
160
+ * Combine filters with a logical OR.
161
+ */
162
+ or<FS extends Filter.Any[]>(...filters: FS): Filter<Filter.Or<FS>>;
163
+
164
+ // TODO(dmaretskyi): Add `Filter.match` to support pattern matching on string props.
165
+ }
166
+
167
+ export declare namespace Filter {
168
+ type Props<T> = {
169
+ // Predicate or a value as a shorthand for `eq`.
170
+ [K in keyof T & string]?: Filter<T[K]> | T[K];
171
+ };
172
+
173
+ type Any = Filter<any>;
174
+ type Type<F extends Any> = F extends Filter<infer T> ? T : never;
175
+ type And<FS extends readonly Any[]> = Schema.Simplify<Intersection<{ [K in keyof FS]: Type<FS[K]> }>>;
176
+ type Or<FS extends readonly Any[]> = Schema.Simplify<{ [K in keyof FS]: Type<FS[K]> }[number]>;
177
+
178
+ export type TextSearchOptions = {
179
+ // TODO(dmaretskyi): Hybrid search.
180
+ type?: 'full-text' | 'vector';
181
+ };
182
+ }
183
+
184
+ // TODO(dmaretskyi): Separate object instead of statics for better devex with type errors.
185
+ export class FilterClass implements Filter<any> {
186
+ private static variance: Filter<any>['~Filter'] = {} as Filter<any>['~Filter'];
187
+
188
+ static is(value: unknown): value is Filter<any> {
189
+ return typeof value === 'object' && value !== null && '~Filter' in value;
190
+ }
191
+
192
+ static fromAst(ast: QueryAST.Filter): Filter<any> {
193
+ return new FilterClass(ast);
194
+ }
195
+
196
+ static everything(): FilterClass {
197
+ return new FilterClass({
198
+ type: 'object',
199
+ typename: null,
200
+ props: {},
201
+ });
202
+ }
203
+
204
+ static nothing(): FilterClass {
205
+ return new FilterClass({
206
+ type: 'not',
207
+ filter: {
208
+ type: 'object',
209
+ typename: null,
210
+ props: {},
211
+ },
212
+ });
213
+ }
214
+
215
+ static relation() {
216
+ return new FilterClass({
217
+ type: 'object',
218
+ typename: null,
219
+ props: {},
220
+ });
221
+ }
222
+
223
+ static ids(...ids: ObjectId[]): Filter<any> {
224
+ assertArgument(
225
+ ids.every((id) => ObjectId.isValid(id)),
226
+ 'ids',
227
+ 'ids must be valid',
228
+ );
229
+
230
+ if (ids.length === 0) {
231
+ return Filter.nothing();
232
+ }
233
+
234
+ return new FilterClass({
235
+ type: 'object',
236
+ typename: null,
237
+ id: ids,
238
+ props: {},
239
+ });
240
+ }
241
+
242
+ static type<S extends Schema.Schema.All>(
243
+ schema: S | string,
244
+ props?: Filter.Props<Schema.Schema.Type<S>>,
245
+ ): Filter<Schema.Schema.Type<S>> {
246
+ const dxn = getTypeDXNFromSpecifier(schema);
247
+ return new FilterClass({
248
+ type: 'object',
249
+ typename: dxn.toString(),
250
+ ...propsFilterToAst(props ?? {}),
251
+ });
252
+ }
253
+
254
+ static typename(typename: string): Filter<any> {
255
+ assertArgument(!typename.startsWith('dxn:'), 'typename', 'Typename must no be qualified');
256
+ return new FilterClass({
257
+ type: 'object',
258
+ typename: DXN.fromTypename(typename).toString(),
259
+ props: {},
260
+ });
261
+ }
262
+
263
+ static typeDXN(dxn: DXN): Filter<any> {
264
+ return new FilterClass({
265
+ type: 'object',
266
+ typename: dxn.toString(),
267
+ props: {},
268
+ });
269
+ }
270
+
271
+ static tag(tag: string): Filter<any> {
272
+ return new FilterClass({
273
+ type: 'tag',
274
+ tag,
275
+ });
276
+ }
277
+
278
+ static props<T>(props: Filter.Props<T>): Filter<T> {
279
+ return new FilterClass({
280
+ type: 'object',
281
+ typename: null,
282
+ ...propsFilterToAst(props),
283
+ });
284
+ }
285
+
286
+ static text(text: string, options?: Filter.TextSearchOptions): Filter<any> {
287
+ return new FilterClass({
288
+ type: 'text-search',
289
+ text,
290
+ searchKind: options?.type,
291
+ });
292
+ }
293
+
294
+ static foreignKeys<S extends Schema.Schema.All>(
295
+ schema: S | string,
296
+ keys: ForeignKey[],
297
+ ): Filter<Schema.Schema.Type<S>> {
298
+ const dxn = getTypeDXNFromSpecifier(schema);
299
+ return new FilterClass({
300
+ type: 'object',
301
+ typename: dxn.toString(),
302
+ props: {},
303
+ foreignKeys: keys,
304
+ });
305
+ }
306
+
307
+ static eq<T>(value: T): Filter<T> {
308
+ if (!Ref.isRef(value) && typeof value === 'object' && value !== null) {
309
+ throw new TypeError('Cannot use object as a value for eq filter');
310
+ }
311
+
312
+ return new FilterClass({
313
+ type: 'compare',
314
+ operator: 'eq',
315
+ value: Ref.isRef(value) ? value.noInline().encode() : value,
316
+ });
317
+ }
318
+
319
+ static neq<T>(value: T): Filter<T> {
320
+ return new FilterClass({
321
+ type: 'compare',
322
+ operator: 'neq',
323
+ value,
324
+ });
325
+ }
326
+
327
+ static gt<T>(value: T): Filter<T> {
328
+ return new FilterClass({
329
+ type: 'compare',
330
+ operator: 'gt',
331
+ value,
332
+ });
333
+ }
334
+
335
+ static gte<T>(value: T): Filter<T> {
336
+ return new FilterClass({
337
+ type: 'compare',
338
+ operator: 'gte',
339
+ value,
340
+ });
341
+ }
342
+
343
+ static lt<T>(value: T): Filter<T> {
344
+ return new FilterClass({
345
+ type: 'compare',
346
+ operator: 'lt',
347
+ value,
348
+ });
349
+ }
350
+
351
+ static lte<T>(value: T): Filter<T> {
352
+ return new FilterClass({
353
+ type: 'compare',
354
+ operator: 'lte',
355
+ value,
356
+ });
357
+ }
358
+
359
+ static in<T>(...values: T[]): Filter<T> {
360
+ return new FilterClass({
361
+ type: 'in',
362
+ values,
363
+ });
364
+ }
365
+
366
+ static contains<T>(value: T): Filter<readonly T[] | undefined> {
367
+ return new FilterClass({
368
+ type: 'contains',
369
+ value,
370
+ });
371
+ }
372
+
373
+ static between<T>(from: T, to: T): Filter<unknown> {
374
+ return new FilterClass({
375
+ type: 'range',
376
+ from,
377
+ to,
378
+ });
379
+ }
380
+
381
+ static not<F extends Filter.Any>(filter: F): Filter<Filter.Type<F>> {
382
+ return new FilterClass({
383
+ type: 'not',
384
+ filter: filter.ast,
385
+ });
386
+ }
387
+
388
+ static and<T>(...filters: Filter<T>[]): Filter<T> {
389
+ return new FilterClass({
390
+ type: 'and',
391
+ filters: filters.map((f) => f.ast),
392
+ });
393
+ }
394
+
395
+ static or<T>(...filters: Filter<T>[]): Filter<T> {
396
+ return new FilterClass({
397
+ type: 'or',
398
+ filters: filters.map((f) => f.ast),
399
+ });
400
+ }
401
+
402
+ private constructor(public readonly ast: QueryAST.Filter) {}
403
+
404
+ '~Filter' = FilterClass.variance;
405
+ }
406
+
407
+ export const Filter: FilterAPI = FilterClass;
408
+
409
+ const propsFilterToAst = (predicates: Filter.Props<any>): Pick<QueryAST.FilterObject, 'id' | 'props'> => {
410
+ let idFilter: readonly ObjectId[] | undefined;
411
+ if ('id' in predicates) {
412
+ assertArgument(
413
+ typeof predicates.id === 'string' || Array.isArray(predicates.id),
414
+ 'predicates.id',
415
+ 'invalid id filter',
416
+ );
417
+ idFilter = typeof predicates.id === 'string' ? [predicates.id] : predicates.id;
418
+ Schema.Array(ObjectId).pipe(Schema.validateSync)(idFilter);
419
+ }
420
+
421
+ return {
422
+ id: idFilter,
423
+ props: Object.fromEntries(
424
+ Object.entries(predicates)
425
+ .filter(([prop, _value]) => prop !== 'id')
426
+ .map(([prop, predicate]) => [prop, processPredicate(predicate)]),
427
+ ) as Record<string, QueryAST.Filter>,
428
+ };
429
+ };
430
+
431
+ const processPredicate = (predicate: any): QueryAST.Filter => {
432
+ return Match.value(predicate).pipe(
433
+ Match.withReturnType<QueryAST.Filter>(),
434
+ Match.when(Filter.is, (predicate) => predicate.ast),
435
+ // TODO(wittjosiah): Add support for array predicates.
436
+ Match.when(Array.isArray, (_predicate) => {
437
+ throw new Error('Array predicates are not yet supported.');
438
+ }),
439
+ Match.when(
440
+ (predicate: any) => !Ref.isRef(predicate) && typeof predicate === 'object' && predicate !== null,
441
+ (predicate) => {
442
+ const nestedProps = Object.fromEntries(
443
+ Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]),
444
+ );
445
+
446
+ return {
447
+ type: 'object',
448
+ typename: null,
449
+ props: nestedProps,
450
+ };
451
+ },
452
+ ),
453
+ Match.orElse((value) => Filter.eq(value).ast),
454
+ );
455
+ };
@@ -2,5 +2,8 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- // TODO(burdon): Export namespace.
5
+ export { QueryAST } from '@dxos/echo-protocol';
6
+
7
+ export * from './filter';
8
+ export * from './order';
6
9
  export * from './query';
@@ -0,0 +1,34 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type QueryAST } from '@dxos/echo-protocol';
6
+
7
+ export interface Order<T> {
8
+ // TODO(dmaretskyi): See new effect-schema approach to variance.
9
+ '~Order': { value: T };
10
+
11
+ ast: QueryAST.Order;
12
+ }
13
+
14
+ class OrderClass implements Order<any> {
15
+ private static variance: Order<any>['~Order'] = {} as Order<any>['~Order'];
16
+
17
+ static is(value: unknown): value is Order<any> {
18
+ return typeof value === 'object' && value !== null && '~Order' in value;
19
+ }
20
+
21
+ constructor(public readonly ast: QueryAST.Order) {}
22
+
23
+ '~Order' = OrderClass.variance;
24
+ }
25
+
26
+ export namespace Order {
27
+ export const natural: Order<any> = new OrderClass({ kind: 'natural' });
28
+ export const property = <T>(property: keyof T & string, direction: QueryAST.OrderDirection): Order<T> =>
29
+ new OrderClass({
30
+ kind: 'property',
31
+ property,
32
+ direction,
33
+ });
34
+ }