@dxos/echo 0.8.4-main.dedc0f3 → 0.8.4-main.ead640a

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 (310) hide show
  1. package/dist/lib/browser/chunk-HKFCK2GL.mjs +175 -0
  2. package/dist/lib/browser/chunk-HKFCK2GL.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-MTR3E5S2.mjs → chunk-MAAYELT7.mjs} +501 -457
  4. package/dist/lib/browser/chunk-MAAYELT7.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-MB6MMNFP.mjs +3857 -0
  6. package/dist/lib/browser/chunk-MB6MMNFP.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +14 -5
  8. package/dist/lib/browser/internal/index.mjs +332 -0
  9. package/dist/lib/browser/internal/index.mjs.map +7 -0
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/query/index.mjs +15 -0
  12. package/dist/lib/browser/query/index.mjs.map +7 -0
  13. package/dist/lib/browser/testing/index.mjs +260 -32
  14. package/dist/lib/browser/testing/index.mjs.map +4 -4
  15. package/dist/lib/node-esm/{chunk-MYZLAJSR.mjs → chunk-5NWDGIBT.mjs} +501 -457
  16. package/dist/lib/node-esm/chunk-5NWDGIBT.mjs.map +7 -0
  17. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs +175 -0
  18. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs.map +7 -0
  19. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs +3857 -0
  20. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs.map +7 -0
  21. package/dist/lib/node-esm/index.mjs +14 -5
  22. package/dist/lib/node-esm/internal/index.mjs +332 -0
  23. package/dist/lib/node-esm/internal/index.mjs.map +7 -0
  24. package/dist/lib/node-esm/meta.json +1 -1
  25. package/dist/lib/node-esm/query/index.mjs +15 -0
  26. package/dist/lib/node-esm/query/index.mjs.map +7 -0
  27. package/dist/lib/node-esm/testing/index.mjs +260 -32
  28. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  29. package/dist/types/src/Obj.d.ts +22 -5
  30. package/dist/types/src/Obj.d.ts.map +1 -1
  31. package/dist/types/src/Ref.d.ts +1 -1
  32. package/dist/types/src/Ref.d.ts.map +1 -1
  33. package/dist/types/src/Relation.d.ts +5 -4
  34. package/dist/types/src/Relation.d.ts.map +1 -1
  35. package/dist/types/src/Type.d.ts +16 -17
  36. package/dist/types/src/Type.d.ts.map +1 -1
  37. package/dist/types/src/errors.d.ts +72 -0
  38. package/dist/types/src/errors.d.ts.map +1 -0
  39. package/dist/types/src/index.d.ts +3 -2
  40. package/dist/types/src/index.d.ts.map +1 -1
  41. package/dist/types/src/internal/ast/annotation-helper.d.ts +8 -0
  42. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +1 -0
  43. package/dist/types/src/internal/ast/annotations.d.ts +125 -0
  44. package/dist/types/src/internal/ast/annotations.d.ts.map +1 -0
  45. package/dist/types/src/internal/ast/annotations.test.d.ts +2 -0
  46. package/dist/types/src/internal/ast/annotations.test.d.ts.map +1 -0
  47. package/dist/types/src/internal/ast/entity-kind.d.ts +10 -0
  48. package/dist/types/src/internal/ast/entity-kind.d.ts.map +1 -0
  49. package/dist/types/src/internal/ast/index.d.ts +5 -0
  50. package/dist/types/src/internal/ast/index.d.ts.map +1 -0
  51. package/dist/types/src/internal/ast/types.d.ts +6 -0
  52. package/dist/types/src/internal/ast/types.d.ts.map +1 -0
  53. package/dist/types/src/internal/formats/date.d.ts +63 -0
  54. package/dist/types/src/internal/formats/date.d.ts.map +1 -0
  55. package/dist/types/src/internal/formats/date.test.d.ts +2 -0
  56. package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
  57. package/dist/types/src/internal/formats/format.d.ts +30 -0
  58. package/dist/types/src/internal/formats/format.d.ts.map +1 -0
  59. package/dist/types/src/internal/formats/format.test.d.ts +2 -0
  60. package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
  61. package/dist/types/src/internal/formats/index.d.ts +8 -0
  62. package/dist/types/src/internal/formats/index.d.ts.map +1 -0
  63. package/dist/types/src/internal/formats/number.d.ts +31 -0
  64. package/dist/types/src/internal/formats/number.d.ts.map +1 -0
  65. package/dist/types/src/internal/formats/object.d.ts +35 -0
  66. package/dist/types/src/internal/formats/object.d.ts.map +1 -0
  67. package/dist/types/src/internal/formats/select.d.ts +11 -0
  68. package/dist/types/src/internal/formats/select.d.ts.map +1 -0
  69. package/dist/types/src/internal/formats/string.d.ts +38 -0
  70. package/dist/types/src/internal/formats/string.d.ts.map +1 -0
  71. package/dist/types/src/internal/formats/types.d.ts +68 -0
  72. package/dist/types/src/internal/formats/types.d.ts.map +1 -0
  73. package/dist/types/src/internal/index.d.ts +15 -0
  74. package/dist/types/src/internal/index.d.ts.map +1 -0
  75. package/dist/types/src/internal/json/annotations.d.ts +19 -0
  76. package/dist/types/src/internal/json/annotations.d.ts.map +1 -0
  77. package/dist/types/src/internal/json/effect-schema.test.d.ts +2 -0
  78. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +1 -0
  79. package/dist/types/src/internal/json/index.d.ts +2 -0
  80. package/dist/types/src/internal/json/index.d.ts.map +1 -0
  81. package/dist/types/src/internal/json/json-schema.d.ts +28 -0
  82. package/dist/types/src/internal/json/json-schema.d.ts.map +1 -0
  83. package/dist/types/src/internal/json/json-schema.test.d.ts +2 -0
  84. package/dist/types/src/internal/json/json-schema.test.d.ts.map +1 -0
  85. package/dist/types/src/internal/json-schema/index.d.ts +3 -0
  86. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
  87. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
  88. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
  89. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +250 -0
  90. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
  91. package/dist/types/src/internal/object/accessors.d.ts +37 -0
  92. package/dist/types/src/internal/object/accessors.d.ts.map +1 -0
  93. package/dist/types/src/internal/object/common.d.ts +18 -0
  94. package/dist/types/src/internal/object/common.d.ts.map +1 -0
  95. package/dist/types/src/internal/object/create.d.ts +40 -0
  96. package/dist/types/src/internal/object/create.d.ts.map +1 -0
  97. package/dist/types/src/internal/object/create.test.d.ts +2 -0
  98. package/dist/types/src/internal/object/create.test.d.ts.map +1 -0
  99. package/dist/types/src/internal/object/deleted.d.ts +6 -0
  100. package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
  101. package/dist/types/src/internal/object/entity.d.ts +33 -0
  102. package/dist/types/src/internal/object/entity.d.ts.map +1 -0
  103. package/dist/types/src/internal/object/expando.d.ts +14 -0
  104. package/dist/types/src/internal/object/expando.d.ts.map +1 -0
  105. package/dist/types/src/internal/object/ids.d.ts +6 -0
  106. package/dist/types/src/internal/object/ids.d.ts.map +1 -0
  107. package/dist/types/src/internal/object/index.d.ts +16 -0
  108. package/dist/types/src/internal/object/index.d.ts.map +1 -0
  109. package/dist/types/src/internal/object/inspect.d.ts +2 -0
  110. package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
  111. package/dist/types/src/internal/object/json-serializer.d.ts +32 -0
  112. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
  113. package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
  114. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
  115. package/dist/types/src/internal/object/meta.d.ts +31 -0
  116. package/dist/types/src/internal/object/meta.d.ts.map +1 -0
  117. package/dist/types/src/internal/object/model.d.ts +117 -0
  118. package/dist/types/src/internal/object/model.d.ts.map +1 -0
  119. package/dist/types/src/internal/object/relation.d.ts +17 -0
  120. package/dist/types/src/internal/object/relation.d.ts.map +1 -0
  121. package/dist/types/src/internal/object/schema-validator.d.ts +15 -0
  122. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
  123. package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
  124. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
  125. package/dist/types/src/internal/object/typed-object.d.ts +31 -0
  126. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
  127. package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
  128. package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
  129. package/dist/types/src/internal/object/typename.d.ts +15 -0
  130. package/dist/types/src/internal/object/typename.d.ts.map +1 -0
  131. package/dist/types/src/internal/object/version.d.ts +14 -0
  132. package/dist/types/src/internal/object/version.d.ts.map +1 -0
  133. package/dist/types/src/internal/projection/compose.d.ts +6 -0
  134. package/dist/types/src/internal/projection/compose.d.ts.map +1 -0
  135. package/dist/types/src/internal/projection/compose.test.d.ts +2 -0
  136. package/dist/types/src/internal/projection/compose.test.d.ts.map +1 -0
  137. package/dist/types/src/internal/projection/index.d.ts +2 -0
  138. package/dist/types/src/internal/projection/index.d.ts.map +1 -0
  139. package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
  140. package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
  141. package/dist/types/src/internal/proxy/reactive-object.d.ts +15 -0
  142. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +1 -0
  143. package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
  144. package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
  145. package/dist/types/src/internal/proxy/typed-handler.d.ts +44 -0
  146. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
  147. package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
  148. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
  149. package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
  150. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
  151. package/dist/types/src/internal/query/index.d.ts +2 -0
  152. package/dist/types/src/internal/query/index.d.ts.map +1 -0
  153. package/dist/types/src/internal/query/query.d.ts +17 -0
  154. package/dist/types/src/internal/query/query.d.ts.map +1 -0
  155. package/dist/types/src/internal/ref/index.d.ts +3 -0
  156. package/dist/types/src/internal/ref/index.d.ts.map +1 -0
  157. package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
  158. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
  159. package/dist/types/src/internal/ref/ref.d.ts +206 -0
  160. package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
  161. package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
  162. package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
  163. package/dist/types/src/internal/schema/echo-schema.d.ts +168 -0
  164. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
  165. package/dist/types/src/internal/schema/index.d.ts +7 -0
  166. package/dist/types/src/internal/schema/index.d.ts.map +1 -0
  167. package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
  168. package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
  169. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +18 -0
  170. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -0
  171. package/dist/types/src/internal/schema/snapshot.d.ts +6 -0
  172. package/dist/types/src/internal/schema/snapshot.d.ts.map +1 -0
  173. package/dist/types/src/internal/schema/stored-schema.d.ts +13 -0
  174. package/dist/types/src/internal/schema/stored-schema.d.ts.map +1 -0
  175. package/dist/types/src/internal/testing/index.d.ts +3 -0
  176. package/dist/types/src/internal/testing/index.d.ts.map +1 -0
  177. package/dist/types/src/internal/testing/types.d.ts +455 -0
  178. package/dist/types/src/internal/testing/types.d.ts.map +1 -0
  179. package/dist/types/src/internal/testing/utils.d.ts +10 -0
  180. package/dist/types/src/internal/testing/utils.d.ts.map +1 -0
  181. package/dist/types/src/internal/types/index.d.ts +3 -0
  182. package/dist/types/src/internal/types/index.d.ts.map +1 -0
  183. package/dist/types/src/internal/types/types.d.ts +79 -0
  184. package/dist/types/src/internal/types/types.d.ts.map +1 -0
  185. package/dist/types/src/internal/types/types.test.d.ts +2 -0
  186. package/dist/types/src/internal/types/types.test.d.ts.map +1 -0
  187. package/dist/types/src/internal/types/util.d.ts +5 -0
  188. package/dist/types/src/internal/types/util.d.ts.map +1 -0
  189. package/dist/types/src/query/index.d.ts +2 -1
  190. package/dist/types/src/query/index.d.ts.map +1 -1
  191. package/dist/types/src/query/{dsl.d.ts → query.d.ts} +34 -24
  192. package/dist/types/src/query/query.d.ts.map +1 -0
  193. package/dist/types/src/query/query.test.d.ts +2 -0
  194. package/dist/types/src/query/query.test.d.ts.map +1 -0
  195. package/dist/types/src/query/tag.d.ts +17 -0
  196. package/dist/types/src/query/tag.d.ts.map +1 -0
  197. package/dist/types/src/testing/echo-schema.d.ts +7 -0
  198. package/dist/types/src/testing/echo-schema.d.ts.map +1 -0
  199. package/dist/types/src/testing/index.d.ts +2 -0
  200. package/dist/types/src/testing/index.d.ts.map +1 -1
  201. package/dist/types/src/testing/types.d.ts +18 -18
  202. package/dist/types/src/testing/types.d.ts.map +1 -1
  203. package/dist/types/tsconfig.tsbuildinfo +1 -1
  204. package/package.json +29 -17
  205. package/src/Obj.ts +77 -12
  206. package/src/Ref.ts +1 -2
  207. package/src/Relation.ts +15 -5
  208. package/src/Type.ts +29 -30
  209. package/src/errors.ts +18 -0
  210. package/src/index.ts +4 -2
  211. package/src/internal/ast/annotation-helper.ts +22 -0
  212. package/src/internal/ast/annotations.test.ts +98 -0
  213. package/src/internal/ast/annotations.ts +219 -0
  214. package/src/internal/ast/entity-kind.ts +15 -0
  215. package/src/internal/ast/index.ts +8 -0
  216. package/src/internal/ast/types.ts +17 -0
  217. package/src/internal/formats/date.test.ts +56 -0
  218. package/src/internal/formats/date.ts +217 -0
  219. package/src/internal/formats/format.test.ts +77 -0
  220. package/src/internal/formats/format.ts +52 -0
  221. package/src/internal/formats/index.ts +12 -0
  222. package/src/internal/formats/number.ts +89 -0
  223. package/src/internal/formats/object.ts +80 -0
  224. package/src/internal/formats/select.ts +16 -0
  225. package/src/internal/formats/string.ts +76 -0
  226. package/src/internal/formats/types.ts +175 -0
  227. package/src/internal/index.ts +22 -0
  228. package/src/internal/json/annotations.ts +50 -0
  229. package/src/internal/json/effect-schema.test.ts +143 -0
  230. package/src/internal/json/index.ts +5 -0
  231. package/src/internal/json/json-schema.test.ts +857 -0
  232. package/src/internal/json/json-schema.ts +519 -0
  233. package/src/internal/json-schema/index.ts +6 -0
  234. package/src/internal/json-schema/json-schema-normalize.ts +109 -0
  235. package/src/internal/json-schema/json-schema-type.ts +403 -0
  236. package/src/internal/object/accessors.ts +153 -0
  237. package/src/internal/object/common.ts +76 -0
  238. package/src/internal/object/create.test.ts +118 -0
  239. package/src/internal/object/create.ts +96 -0
  240. package/src/internal/object/deleted.ts +19 -0
  241. package/src/internal/object/entity.ts +248 -0
  242. package/src/internal/object/expando.ts +21 -0
  243. package/src/internal/object/ids.ts +12 -0
  244. package/src/internal/object/index.ts +19 -0
  245. package/src/internal/object/inspect.ts +48 -0
  246. package/src/internal/object/json-serializer.test.ts +99 -0
  247. package/src/internal/object/json-serializer.ts +225 -0
  248. package/src/internal/object/meta.ts +61 -0
  249. package/src/internal/object/model.ts +170 -0
  250. package/src/internal/object/relation.ts +24 -0
  251. package/src/internal/object/schema-validator.test.ts +186 -0
  252. package/src/internal/object/schema-validator.ts +241 -0
  253. package/src/internal/object/typed-object.test.ts +34 -0
  254. package/src/internal/object/typed-object.ts +88 -0
  255. package/src/internal/object/typename.ts +61 -0
  256. package/src/internal/object/version.ts +22 -0
  257. package/src/internal/projection/compose.test.ts +43 -0
  258. package/src/internal/projection/compose.ts +36 -0
  259. package/src/internal/projection/index.ts +5 -0
  260. package/src/internal/proxy/handler.test.ts +163 -0
  261. package/src/internal/proxy/reactive-object.ts +108 -0
  262. package/src/internal/proxy/schema.test.ts +136 -0
  263. package/src/internal/proxy/typed-handler.test.ts +102 -0
  264. package/src/internal/proxy/typed-handler.ts +228 -0
  265. package/src/internal/proxy/typed-object.test.ts +100 -0
  266. package/src/internal/query/index.ts +5 -0
  267. package/src/internal/query/query.ts +23 -0
  268. package/src/internal/ref/index.ts +6 -0
  269. package/src/internal/ref/ref-array.ts +39 -0
  270. package/src/internal/ref/ref.test.ts +100 -0
  271. package/src/internal/ref/ref.ts +521 -0
  272. package/src/internal/schema/echo-schema.ts +383 -0
  273. package/src/internal/schema/index.ts +10 -0
  274. package/src/internal/schema/manipulation.ts +92 -0
  275. package/src/internal/schema/runtime-schema-registry.ts +78 -0
  276. package/src/internal/schema/snapshot.ts +25 -0
  277. package/src/internal/schema/stored-schema.ts +26 -0
  278. package/src/internal/testing/index.ts +6 -0
  279. package/src/internal/testing/types.ts +211 -0
  280. package/src/internal/testing/utils.ts +54 -0
  281. package/src/internal/types/index.ts +6 -0
  282. package/src/internal/types/types.test.ts +48 -0
  283. package/src/internal/types/types.ts +176 -0
  284. package/src/internal/types/util.ts +9 -0
  285. package/src/query/index.ts +2 -1
  286. package/src/query/query.test.ts +401 -0
  287. package/src/query/{dsl.ts → query.ts} +131 -46
  288. package/src/query/tag.ts +37 -0
  289. package/src/test/api.test.ts +9 -9
  290. package/src/testing/echo-schema.ts +39 -0
  291. package/src/testing/index.ts +2 -0
  292. package/src/testing/types.ts +1 -1
  293. package/dist/lib/browser/chunk-MTR3E5S2.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-MYZLAJSR.mjs.map +0 -7
  295. package/dist/types/src/experimental/database.d.ts +0 -8
  296. package/dist/types/src/experimental/database.d.ts.map +0 -1
  297. package/dist/types/src/experimental/index.d.ts +0 -1
  298. package/dist/types/src/experimental/index.d.ts.map +0 -1
  299. package/dist/types/src/experimental/queue.d.ts +0 -8
  300. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  301. package/dist/types/src/experimental/space.d.ts +0 -8
  302. package/dist/types/src/experimental/space.d.ts.map +0 -1
  303. package/dist/types/src/query/dsl.d.ts.map +0 -1
  304. package/dist/types/src/query/dsl.test.d.ts +0 -2
  305. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  306. package/src/experimental/database.ts +0 -11
  307. package/src/experimental/index.ts +0 -7
  308. package/src/experimental/queue.ts +0 -11
  309. package/src/experimental/space.ts +0 -11
  310. package/src/query/dsl.test.ts +0 -332
@@ -0,0 +1,211 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { EchoObject, EchoRelation, Expando, TypedObject } from '../object';
8
+ import { Ref, type Ref$ } from '../ref';
9
+
10
+ // TODO(burdon): These are non-canonical test types, so we really shouldn't export and use in other classes (compare with @dxos/sdk/testing).
11
+ export namespace Testing {
12
+ //
13
+ // Primitives
14
+ //
15
+
16
+ const Circle = Schema.Struct({ type: Schema.Literal('circle'), radius: Schema.Number });
17
+ const Square = Schema.Struct({ type: Schema.Literal('square'), side: Schema.Number });
18
+ const Shape = Schema.Union(Circle, Square);
19
+
20
+ //
21
+ // Simple types
22
+ //
23
+
24
+ const TestNestedSchema = Schema.mutable(Schema.Struct({ field: Schema.String }));
25
+ export type TestNestedSchema = Schema.Schema.Type<typeof TestNestedSchema>;
26
+ export const TestNestedType = TestNestedSchema.pipe(
27
+ EchoObject({ typename: 'example.com/type/TestNested', version: '0.1.0' }),
28
+ );
29
+
30
+ //
31
+ // Complex types
32
+ // TODO(burdon): Change to Type.Obj.
33
+ //
34
+
35
+ export class EmptySchemaType extends TypedObject({
36
+ typename: 'example.com/type/Empty',
37
+ version: '0.1.0',
38
+ })({}) {}
39
+
40
+ const fields = {
41
+ string: Schema.String,
42
+ number: Schema.Number,
43
+ nullableShapeArray: Schema.mutable(Schema.Array(Schema.Union(Shape, Schema.Null))),
44
+ boolean: Schema.Boolean,
45
+ null: Schema.Null,
46
+ undefined: Schema.Undefined,
47
+ stringArray: Schema.mutable(Schema.Array(Schema.String)),
48
+ twoDimNumberArray: Schema.mutable(Schema.Array(Schema.mutable(Schema.Array(Schema.Number)))),
49
+ object: TestNestedSchema,
50
+ objectArray: Schema.mutable(Schema.Array(TestNestedSchema)),
51
+ nested: Schema.optional(Ref(TestNestedType)),
52
+ other: Schema.Any,
53
+ };
54
+
55
+ export const TestSchema = Schema.mutable(Schema.partial(Schema.Struct(fields)));
56
+ export type TestSchema = Schema.Schema.Type<typeof TestSchema>;
57
+
58
+ export class TestSchemaType extends TypedObject({
59
+ typename: 'example.com/type/Test',
60
+ version: '0.1.0',
61
+ })(fields, { partial: true }) {} // TODO(burdon): Partial?
62
+
63
+ // TODO(burdon): Why do we use need this rather then TestSchemaType?
64
+ export const TestType = TestSchema.pipe(
65
+ EchoObject({
66
+ typename: 'example.com/type/Test',
67
+ version: '0.1.0',
68
+ }),
69
+ );
70
+
71
+ export class TestClass {
72
+ field = 'value';
73
+ toJSON() {
74
+ return { field: this.field };
75
+ }
76
+ }
77
+
78
+ // TODO(dmaretskyi): Another top-level Schema.mutable call as a workaround for the regression in the last minor.
79
+ export const TestSchemaWithClass = Schema.mutable(
80
+ Schema.extend(
81
+ TestSchema,
82
+ Schema.mutable(
83
+ Schema.Struct({
84
+ classInstance: Schema.optional(Schema.instanceOf(TestClass)),
85
+ }),
86
+ ),
87
+ ),
88
+ );
89
+
90
+ export type TestSchemaWithClass = Schema.Schema.Type<typeof TestSchemaWithClass>;
91
+
92
+ export class Contact extends TypedObject({
93
+ typename: 'example.com/type/Contact',
94
+ version: '0.1.0',
95
+ })(
96
+ {
97
+ name: Schema.String,
98
+ username: Schema.String,
99
+ email: Schema.String,
100
+ phoneNumbers: Schema.optional(Schema.Array(Schema.Struct({ label: Schema.String, number: Schema.String }))),
101
+ tasks: Schema.suspend((): Schema.mutable<Schema.Array$<Ref$<Task>>> => Schema.mutable(Schema.Array(Ref(Task)))),
102
+ address: Schema.Struct({
103
+ city: Schema.optional(Schema.String),
104
+ state: Schema.optional(Schema.String),
105
+ zip: Schema.optional(Schema.String),
106
+ coordinates: Schema.Struct({
107
+ lat: Schema.optional(Schema.Number),
108
+ lng: Schema.optional(Schema.Number),
109
+ }),
110
+ }),
111
+ },
112
+ { partial: true },
113
+ ) {}
114
+
115
+ export class Task extends TypedObject({
116
+ typename: 'example.com/type/Task',
117
+ version: '0.1.0',
118
+ })(
119
+ {
120
+ title: Schema.optional(Schema.String),
121
+ completed: Schema.optional(Schema.Boolean),
122
+ assignee: Schema.optional(Ref(Contact)),
123
+ previous: Schema.optional(Schema.suspend((): Ref$<Task> => Ref(Task))),
124
+ subTasks: Schema.optional(Schema.mutable(Schema.Array(Schema.suspend((): Ref$<Task> => Ref(Task))))),
125
+ description: Schema.optional(Schema.String),
126
+ },
127
+ { partial: true },
128
+ ) {}
129
+
130
+ // TOOD(burdon): Ref$ breaks if using new syntax (since ID is not declared).
131
+
132
+ // export const Task = Schema.Struct({
133
+ // title: Schema.String,
134
+ // completed: Schema.Boolean,
135
+ // assignee: Schema.optional(Ref(Schema.suspend((): Ref$<Contact> => Ref(Contact)))),
136
+ // previous: Schema.optional(Ref(Schema.suspend((): Ref$<Task> => Ref(Task)))),
137
+ // subTasks: Schema.optional(Schema.Array(Ref(Schema.suspend((): Ref$<Task> => Ref(Task))))),
138
+ // description: Schema.optional(Schema.String),
139
+ // }).pipe(
140
+ // EchoObject({
141
+ // typename: 'example.com/type/Task',
142
+ // version: '0.1.0',
143
+ // }),
144
+ // );
145
+
146
+ // export type Task = Schema.Schema.Type<typeof Task>;
147
+
148
+ // export const Contact = Schema.Struct({
149
+ // name: Schema.String,
150
+ // username: Schema.String,
151
+ // email: Schema.String,
152
+ // // TOOD(burdon): Should model via relations?
153
+ // // tasks: Schema.mutable(Schema.Array(Ref(Task))),
154
+ // address: Schema.Struct({
155
+ // city: Schema.optional(Schema.String),
156
+ // state: Schema.optional(Schema.String),
157
+ // zip: Schema.optional(Schema.String),
158
+ // coordinates: Schema.Struct({
159
+ // lat: Schema.optional(Schema.Number),
160
+ // lng: Schema.optional(Schema.Number),
161
+ // }),
162
+ // }),
163
+ // }).pipe(
164
+ // EchoObject({
165
+ // typename: 'example.com/type/Contact',
166
+ // version: '0.1.0',
167
+ // }),
168
+ // );
169
+
170
+ // export type Contact = Schema.Schema.Type<typeof Contact>;
171
+
172
+ export enum RecordType {
173
+ UNDEFINED = 0,
174
+ PERSONAL = 1,
175
+ WORK = 2,
176
+ }
177
+
178
+ export class Container extends TypedObject({
179
+ typename: 'example.com/type/Container',
180
+ version: '0.1.0',
181
+ })(
182
+ {
183
+ objects: Schema.mutable(Schema.Array(Ref(Expando))),
184
+ records: Schema.mutable(
185
+ Schema.Array(
186
+ Schema.partial(
187
+ Schema.Struct({
188
+ title: Schema.String,
189
+ description: Schema.String,
190
+ contacts: Schema.mutable(Schema.Array(Ref(Contact))),
191
+ type: Schema.Enums(RecordType),
192
+ }),
193
+ ),
194
+ ),
195
+ ),
196
+ },
197
+ { partial: true },
198
+ ) {}
199
+
200
+ export const HasManager = Schema.Struct({
201
+ since: Schema.optional(Schema.String),
202
+ }).pipe(
203
+ EchoRelation({
204
+ typename: 'example.com/type/HasManager',
205
+ version: '0.1.0',
206
+ source: Contact,
207
+ target: Contact,
208
+ }),
209
+ );
210
+ export interface HasManager extends Schema.Schema.Type<typeof HasManager> {}
211
+ }
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { effect } from '@preact/signals-core';
6
+ import type * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import { registerSignalsRuntime } from '@dxos/echo-signals';
9
+ import { deepMapValues } from '@dxos/util';
10
+
11
+ registerSignalsRuntime();
12
+
13
+ // TODO(burdon): Move to util.
14
+ export const updateCounter = (touch: () => void) => {
15
+ let updateCount = -1;
16
+ const unsubscribe = effect(() => {
17
+ touch();
18
+ updateCount++;
19
+ });
20
+
21
+ return {
22
+ // https://github.com/tc39/proposal-explicit-resource-management
23
+ [Symbol.dispose]: unsubscribe,
24
+ get count() {
25
+ return updateCount;
26
+ },
27
+ };
28
+ };
29
+
30
+ /**
31
+ * Converts AST to a format that can be compared with test matchers.
32
+ */
33
+ export const prepareAstForCompare = (obj: SchemaAST.AST): any =>
34
+ deepMapValues(obj, (value: any, recurse, key) => {
35
+ if (typeof value === 'function') {
36
+ return null;
37
+ }
38
+
39
+ if (value instanceof RegExp) {
40
+ return value;
41
+ }
42
+
43
+ // Convert symbols to strings.
44
+ if (typeof value === 'object') {
45
+ const clone = { ...value };
46
+ for (const sym of Object.getOwnPropertySymbols(clone as any)) {
47
+ clone[sym.toString()] = clone[sym];
48
+ delete clone[sym];
49
+ }
50
+ return recurse(clone);
51
+ }
52
+
53
+ return recurse(value);
54
+ });
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './types';
6
+ export type * from './util';
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { describe, test } from 'vitest';
6
+
7
+ import { type JsonPath } from '@dxos/effect';
8
+
9
+ import { type BaseObject, getValue, setValue } from './types';
10
+
11
+ describe('Types', () => {
12
+ test('checks sanity', async ({ expect }) => {
13
+ const obj: BaseObject = {};
14
+ expect(obj).to.exist;
15
+ });
16
+ });
17
+
18
+ describe('get/set deep', () => {
19
+ test('get/set operations', ({ expect }) => {
20
+ const obj = {
21
+ name: 'test',
22
+ items: ['a', 'b', 'c'],
23
+ nested: {
24
+ prop: 'value',
25
+ arr: [1, 2, 3],
26
+ },
27
+ };
28
+
29
+ // Basic property access.
30
+ expect(getValue(obj, 'name' as JsonPath)).toBe('test');
31
+
32
+ // Array index access.
33
+ expect(getValue(obj, 'items[1]' as JsonPath)).toBe('b');
34
+
35
+ // Nested property access.
36
+ expect(getValue(obj, 'nested.prop' as JsonPath)).toBe('value');
37
+
38
+ // Nested array access.
39
+ expect(getValue(obj, 'nested.arr[2]' as JsonPath)).toBe(3);
40
+
41
+ // Setting values.
42
+ const updated1 = setValue(obj, 'items[1]' as JsonPath, 'x');
43
+ expect(updated1.items[1]).toBe('x');
44
+
45
+ const updated2 = setValue(obj, 'nested.arr[0]' as JsonPath, 99);
46
+ expect(updated2.nested.arr[0]).toBe(99);
47
+ });
48
+ });
@@ -0,0 +1,176 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import { Reference } from '@dxos/echo-protocol';
9
+ import { type JsonPath, splitJsonPath } from '@dxos/effect';
10
+ import { DXN, type ObjectId } from '@dxos/keys';
11
+ import { getDeep, setDeep } from '@dxos/util';
12
+
13
+ import { getSchemaDXN } from '../ast';
14
+ import { type EntityKindId, type ObjectMeta, getType, getTypename } from '../object';
15
+ import { ATTR_META } from '../object/model';
16
+
17
+ /**
18
+ * Base type for all data objects (reactive, ECHO, and other raw objects).
19
+ * NOTE: This describes the base type for all database objects.
20
+ * It is stricter than `T extends {}` or `T extends object`.
21
+ */
22
+ // TODO(dmaretskyi): Rename AnyProperties.
23
+ // TODO(dmaretskyi): Prefer `Record<string, unknown>` over `any`.
24
+ /**
25
+ * @deprecated use Obj.Any
26
+ */
27
+ export type BaseObject = Record<string, any>;
28
+
29
+ /**
30
+ * Marker interface for object with an `id`.
31
+ */
32
+ export interface HasId {
33
+ readonly id: ObjectId;
34
+ }
35
+
36
+ // TODO(dmaretskyi): Remove; this type effectively disables type safety due to `any`.
37
+ export type WithId<T extends BaseObject = BaseObject> = T & HasId;
38
+
39
+ export type ExcludeId<T extends BaseObject> = Omit<T, 'id'>;
40
+
41
+ /**
42
+ * Properties that are required for object creation.
43
+ */
44
+ // TODO(dmaretskyi): Rename `MakeProps`?
45
+ export type CreationProps<T extends BaseObject> = Omit<T, 'id' | typeof EntityKindId>;
46
+
47
+ export type PropertyKey<T extends BaseObject> = Extract<keyof ExcludeId<T>, string>;
48
+
49
+ // TODO(dmaretskyi): Remove. This should be using the symbol type.
50
+ export type WithMeta = { [ATTR_META]?: ObjectMeta };
51
+
52
+ /**
53
+ * The raw object should not include the ECHO id, but may include metadata.
54
+ */
55
+ export const RawObject = <S extends Schema.Schema.AnyNoContext>(
56
+ schema: S,
57
+ ): Schema.Schema<ExcludeId<Schema.Schema.Type<S>> & WithMeta, Schema.Schema.Encoded<S>> => {
58
+ return Schema.make(SchemaAST.omit(schema.ast, ['id']));
59
+ };
60
+
61
+ //
62
+ // Utils
63
+ //
64
+
65
+ /**
66
+ * Utility to split meta property from raw object.
67
+ * @deprecated Bad API.
68
+ */
69
+ export const splitMeta = <T>(object: T & WithMeta): { object: T; meta?: ObjectMeta } => {
70
+ const meta = object[ATTR_META];
71
+ delete object[ATTR_META];
72
+ return { meta, object };
73
+ };
74
+
75
+ // TODO(burdon): Move to `@dxos/util`.
76
+ export const getValue = <T extends object>(obj: T, path: JsonPath): any => {
77
+ return getDeep(
78
+ obj,
79
+ splitJsonPath(path).map((p) => p.replace(/[[\]]/g, '')),
80
+ );
81
+ };
82
+
83
+ // TODO(burdon): Move to `@dxos/util`.
84
+ export const setValue = <T extends object>(obj: T, path: JsonPath, value: any): T => {
85
+ return setDeep(
86
+ obj,
87
+ splitJsonPath(path).map((p) => p.replace(/[[\]]/g, '')),
88
+ value,
89
+ );
90
+ };
91
+
92
+ /**
93
+ * Returns a reference that will be used to point to a schema.
94
+ * @deprecated Use {@link getSchemaDXN} instead.
95
+ */
96
+ export const getTypeReference = (schema: Schema.Schema.All | undefined): Reference | undefined => {
97
+ if (!schema) {
98
+ return undefined;
99
+ }
100
+
101
+ const schemaDXN = getSchemaDXN(schema);
102
+ if (!schemaDXN) {
103
+ return undefined;
104
+ }
105
+ return Reference.fromDXN(schemaDXN);
106
+ };
107
+
108
+ /**
109
+ * Returns a reference that will be used to point to a schema.
110
+ * @throws If it is not possible to reference this schema.
111
+ *
112
+ * @deprecated Use {@link getSchemaDXN} instead.
113
+ */
114
+ export const requireTypeReference = (schema: Schema.Schema.AnyNoContext): Reference => {
115
+ const typeReference = getTypeReference(schema);
116
+ if (typeReference == null) {
117
+ // TODO(burdon): Catalog user-facing errors (this is too verbose).
118
+ throw new Error('Schema must be defined via TypedObject.');
119
+ }
120
+
121
+ return typeReference;
122
+ };
123
+
124
+ // TODO(burdon): Can we use `Schema.is`?
125
+ /**
126
+ * Checks if the object is an instance of the schema.
127
+ * Only typename is compared, the schema version is ignored.
128
+ *
129
+ * The following cases are considered to mean that the object is an instance of the schema:
130
+ * - Object was created with this exact schema.
131
+ * - Object was created with a different version of this schema.
132
+ * - Object was created with a different schema (maybe dynamic) that has the same typename.
133
+ */
134
+ export const isInstanceOf = <Schema extends Schema.Schema.AnyNoContext>(
135
+ schema: Schema,
136
+ object: any,
137
+ ): object is Schema.Schema.Type<Schema> => {
138
+ if (object == null) {
139
+ return false;
140
+ }
141
+
142
+ const schemaDXN = getSchemaDXN(schema);
143
+ if (!schemaDXN) {
144
+ throw new Error('Schema must have an object annotation.');
145
+ }
146
+
147
+ const type = getType(object);
148
+ if (type && DXN.equals(type, schemaDXN)) {
149
+ return true;
150
+ }
151
+
152
+ const typename = getTypename(object);
153
+ if (!typename) {
154
+ return false;
155
+ }
156
+
157
+ const typeDXN = schemaDXN.asTypeDXN();
158
+ if (!typeDXN) {
159
+ return false;
160
+ }
161
+
162
+ return typeDXN.type === typename;
163
+ };
164
+
165
+ /**
166
+ * Object that has an associated typename.
167
+ * The typename is retrievable using {@link getTypename}.
168
+ * The object can be used with {@link isInstanceOf} to check if it is an instance of a schema.
169
+ */
170
+ export type HasTypename = {};
171
+
172
+ /**
173
+ * Canonical type for all ECHO objects.
174
+ */
175
+ // TODO(burdon): Reconcile with Obj.Any, Relation.Any.
176
+ export interface AnyEchoObject extends HasId, HasTypename {}
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type BaseObject } from './types';
6
+
7
+ export type ToMutable<T> = T extends BaseObject
8
+ ? { -readonly [K in keyof T]: T[K] extends readonly (infer U)[] ? U[] : T[K] }
9
+ : T;
@@ -2,4 +2,5 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './dsl';
5
+ export * from './query';
6
+ export * as Tag from './tag';