@dxos/echo 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (328) hide show
  1. package/dist/lib/browser/chunk-7GH6RXJ3.mjs +3683 -0
  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 +24 -1
  6. package/dist/lib/browser/internal/index.mjs +336 -0
  7. package/dist/lib/browser/internal/index.mjs.map +7 -0
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/testing/index.mjs +289 -31
  10. package/dist/lib/browser/testing/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +1111 -0
  12. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +7 -0
  13. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs +3683 -0
  14. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +24 -1
  16. package/dist/lib/node-esm/internal/index.mjs +336 -0
  17. package/dist/lib/node-esm/internal/index.mjs.map +7 -0
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/testing/index.mjs +289 -31
  20. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  21. package/dist/types/src/Annotation.d.ts +2 -0
  22. package/dist/types/src/Annotation.d.ts.map +1 -0
  23. package/dist/types/src/Database.d.ts +137 -0
  24. package/dist/types/src/Database.d.ts.map +1 -0
  25. package/dist/types/src/Entity.d.ts +36 -0
  26. package/dist/types/src/Entity.d.ts.map +1 -0
  27. package/dist/types/src/Format.d.ts +4 -0
  28. package/dist/types/src/Format.d.ts.map +1 -0
  29. package/dist/types/src/JsonSchema.d.ts +9 -0
  30. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  31. package/dist/types/src/Key.d.ts +1 -0
  32. package/dist/types/src/Key.d.ts.map +1 -1
  33. package/dist/types/src/Obj.d.ts +121 -50
  34. package/dist/types/src/Obj.d.ts.map +1 -1
  35. package/dist/types/src/Ref.d.ts +10 -10
  36. package/dist/types/src/Ref.d.ts.map +1 -1
  37. package/dist/types/src/Relation.d.ts +18 -14
  38. package/dist/types/src/Relation.d.ts.map +1 -1
  39. package/dist/types/src/Tag.d.ts +17 -0
  40. package/dist/types/src/Tag.d.ts.map +1 -0
  41. package/dist/types/src/Type.d.ts +39 -50
  42. package/dist/types/src/Type.d.ts.map +1 -1
  43. package/dist/types/src/errors.d.ts +68 -0
  44. package/dist/types/src/errors.d.ts.map +1 -0
  45. package/dist/types/src/index.d.ts +9 -3
  46. package/dist/types/src/index.d.ts.map +1 -1
  47. package/dist/types/src/internal/annotations/annotations.d.ts +174 -0
  48. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  49. package/dist/types/src/internal/annotations/annotations.test.d.ts +2 -0
  50. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  51. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  52. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  53. package/dist/types/src/internal/annotations/util.d.ts +26 -0
  54. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  55. package/dist/types/src/internal/entities/entity.d.ts +10 -0
  56. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  57. package/dist/types/src/internal/entities/expando.d.ts +16 -0
  58. package/dist/types/src/internal/entities/expando.d.ts.map +1 -0
  59. package/dist/types/src/internal/entities/index.d.ts +6 -0
  60. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  61. package/dist/types/src/internal/entities/model.d.ts +70 -0
  62. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  63. package/dist/types/src/internal/entities/object.d.ts +11 -0
  64. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  65. package/dist/types/src/internal/entities/relation.d.ts +55 -0
  66. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  67. package/dist/types/src/internal/entities/util.d.ts +2 -0
  68. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  69. package/dist/types/src/internal/formats/date.d.ts +63 -0
  70. package/dist/types/src/internal/formats/date.d.ts.map +1 -0
  71. package/dist/types/src/internal/formats/date.test.d.ts +2 -0
  72. package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
  73. package/dist/types/src/internal/formats/format.d.ts +32 -0
  74. package/dist/types/src/internal/formats/format.d.ts.map +1 -0
  75. package/dist/types/src/internal/formats/format.test.d.ts +2 -0
  76. package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
  77. package/dist/types/src/internal/formats/index.d.ts +8 -0
  78. package/dist/types/src/internal/formats/index.d.ts.map +1 -0
  79. package/dist/types/src/internal/formats/number.d.ts +31 -0
  80. package/dist/types/src/internal/formats/number.d.ts.map +1 -0
  81. package/dist/types/src/internal/formats/object.d.ts +35 -0
  82. package/dist/types/src/internal/formats/object.d.ts.map +1 -0
  83. package/dist/types/src/internal/formats/select.d.ts +11 -0
  84. package/dist/types/src/internal/formats/select.d.ts.map +1 -0
  85. package/dist/types/src/internal/formats/string.d.ts +38 -0
  86. package/dist/types/src/internal/formats/string.d.ts.map +1 -0
  87. package/dist/types/src/internal/formats/types.d.ts +68 -0
  88. package/dist/types/src/internal/formats/types.d.ts.map +1 -0
  89. package/dist/types/src/internal/index.d.ts +11 -0
  90. package/dist/types/src/internal/index.d.ts.map +1 -0
  91. package/dist/types/src/internal/json-schema/annotations.d.ts +19 -0
  92. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  93. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts +2 -0
  94. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  95. package/dist/types/src/internal/json-schema/index.d.ts +5 -0
  96. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
  97. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
  98. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
  99. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +250 -0
  100. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
  101. package/dist/types/src/internal/json-schema/json-schema.d.ts +29 -0
  102. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  103. package/dist/types/src/internal/json-schema/json-schema.test.d.ts +2 -0
  104. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  105. package/dist/types/src/internal/object/common.d.ts +18 -0
  106. package/dist/types/src/internal/object/common.d.ts.map +1 -0
  107. package/dist/types/src/internal/object/create-object.d.ts +39 -0
  108. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  109. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  110. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  111. package/dist/types/src/internal/object/deleted.d.ts +6 -0
  112. package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
  113. package/dist/types/src/internal/object/ids.d.ts +6 -0
  114. package/dist/types/src/internal/object/ids.d.ts.map +1 -0
  115. package/dist/types/src/internal/object/index.d.ts +8 -0
  116. package/dist/types/src/internal/object/index.d.ts.map +1 -0
  117. package/dist/types/src/internal/object/inspect.d.ts +2 -0
  118. package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
  119. package/dist/types/src/internal/object/json-serializer.d.ts +31 -0
  120. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
  121. package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
  122. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
  123. package/dist/types/src/internal/object/schema-validator.d.ts +15 -0
  124. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
  125. package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
  126. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
  127. package/dist/types/src/internal/object/typed-object.d.ts +31 -0
  128. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
  129. package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
  130. package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
  131. package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
  132. package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
  133. package/dist/types/src/internal/proxy/index.d.ts +3 -0
  134. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  135. package/dist/types/src/internal/proxy/make-object.d.ts +16 -0
  136. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  137. package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
  138. package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
  139. package/dist/types/src/internal/proxy/typed-handler.d.ts +44 -0
  140. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
  141. package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
  142. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
  143. package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
  144. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
  145. package/dist/types/src/internal/ref/index.d.ts +3 -0
  146. package/dist/types/src/internal/ref/index.d.ts.map +1 -0
  147. package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
  148. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
  149. package/dist/types/src/internal/ref/ref.d.ts +209 -0
  150. package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
  151. package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
  152. package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
  153. package/dist/types/src/internal/schema/compose.d.ts +6 -0
  154. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  155. package/dist/types/src/internal/schema/compose.test.d.ts +2 -0
  156. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  157. package/dist/types/src/internal/schema/echo-schema.d.ts +168 -0
  158. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
  159. package/dist/types/src/internal/schema/index.d.ts +6 -0
  160. package/dist/types/src/internal/schema/index.d.ts.map +1 -0
  161. package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
  162. package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
  163. package/dist/types/src/internal/schema/persistent-schema.d.ts +18 -0
  164. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  165. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +18 -0
  166. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -0
  167. package/dist/types/src/internal/schema/snapshot.d.ts +6 -0
  168. package/dist/types/src/internal/schema/snapshot.d.ts.map +1 -0
  169. package/dist/types/src/internal/types/base.d.ts +37 -0
  170. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  171. package/dist/types/src/internal/types/entity.d.ts +12 -0
  172. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  173. package/dist/types/src/internal/types/index.d.ts +6 -0
  174. package/dist/types/src/internal/types/index.d.ts.map +1 -0
  175. package/dist/types/src/internal/types/meta.d.ts +40 -0
  176. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  177. package/dist/types/src/internal/types/typename.d.ts +13 -0
  178. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  179. package/dist/types/src/internal/types/version.d.ts +15 -0
  180. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  181. package/dist/types/src/query/filter.d.ts +167 -0
  182. package/dist/types/src/query/filter.d.ts.map +1 -0
  183. package/dist/types/src/query/index.d.ts +4 -1
  184. package/dist/types/src/query/index.d.ts.map +1 -1
  185. package/dist/types/src/query/order.d.ts +12 -0
  186. package/dist/types/src/query/order.d.ts.map +1 -0
  187. package/dist/types/src/query/query.d.ts +112 -0
  188. package/dist/types/src/query/query.d.ts.map +1 -0
  189. package/dist/types/src/query/query.test.d.ts +2 -0
  190. package/dist/types/src/query/query.test.d.ts.map +1 -0
  191. package/dist/types/src/query/testing.d.ts +51 -0
  192. package/dist/types/src/query/testing.d.ts.map +1 -0
  193. package/dist/types/src/query/types.d.ts +17 -0
  194. package/dist/types/src/query/types.d.ts.map +1 -0
  195. package/dist/types/src/query/util.d.ts +8 -0
  196. package/dist/types/src/query/util.d.ts.map +1 -0
  197. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  198. package/dist/types/src/testing/index.d.ts +3 -1
  199. package/dist/types/src/testing/index.d.ts.map +1 -1
  200. package/dist/types/src/testing/test-data.d.ts +18 -0
  201. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  202. package/dist/types/src/testing/test-schema.d.ts +337 -0
  203. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  204. package/dist/types/src/testing/util.d.ts +16 -0
  205. package/dist/types/src/testing/util.d.ts.map +1 -0
  206. package/dist/types/tsconfig.tsbuildinfo +1 -1
  207. package/package.json +49 -29
  208. package/src/Annotation.ts +17 -0
  209. package/src/Database.ts +189 -0
  210. package/src/Entity.ts +51 -0
  211. package/src/Format.ts +11 -0
  212. package/src/JsonSchema.ts +16 -0
  213. package/src/Key.ts +3 -0
  214. package/src/Obj.ts +353 -107
  215. package/src/Ref.ts +9 -10
  216. package/src/Relation.ts +68 -43
  217. package/src/Tag.ts +40 -0
  218. package/src/Type.ts +97 -85
  219. package/src/errors.ts +18 -0
  220. package/src/index.ts +13 -4
  221. package/src/internal/README.md +83 -0
  222. package/src/internal/annotations/annotations.test.ts +96 -0
  223. package/src/internal/annotations/annotations.ts +463 -0
  224. package/src/internal/annotations/index.ts +6 -0
  225. package/src/internal/annotations/util.ts +70 -0
  226. package/src/internal/entities/entity.ts +109 -0
  227. package/src/internal/entities/expando.ts +23 -0
  228. package/src/internal/entities/index.ts +9 -0
  229. package/src/internal/entities/model.ts +129 -0
  230. package/src/internal/entities/object.ts +45 -0
  231. package/src/internal/entities/relation.ts +155 -0
  232. package/src/internal/entities/util.ts +33 -0
  233. package/src/internal/formats/date.test.ts +56 -0
  234. package/src/internal/formats/date.ts +217 -0
  235. package/src/internal/formats/format.test.ts +77 -0
  236. package/src/internal/formats/format.ts +55 -0
  237. package/src/internal/formats/index.ts +12 -0
  238. package/src/internal/formats/number.ts +89 -0
  239. package/src/internal/formats/object.ts +80 -0
  240. package/src/internal/formats/select.ts +16 -0
  241. package/src/internal/formats/string.ts +76 -0
  242. package/src/internal/formats/types.ts +180 -0
  243. package/src/internal/index.ts +38 -0
  244. package/src/internal/json-schema/annotations.ts +50 -0
  245. package/src/internal/json-schema/effect-schema.test.ts +143 -0
  246. package/src/internal/json-schema/index.ts +8 -0
  247. package/src/internal/json-schema/json-schema-normalize.ts +109 -0
  248. package/src/internal/json-schema/json-schema-type.ts +404 -0
  249. package/src/internal/json-schema/json-schema.test.ts +859 -0
  250. package/src/internal/json-schema/json-schema.ts +528 -0
  251. package/src/internal/object/common.ts +75 -0
  252. package/src/internal/object/create-object.test.ts +116 -0
  253. package/src/internal/object/create-object.ts +95 -0
  254. package/src/internal/object/deleted.ts +19 -0
  255. package/src/internal/object/ids.ts +12 -0
  256. package/src/internal/object/index.ts +11 -0
  257. package/src/internal/object/inspect.ts +46 -0
  258. package/src/internal/object/json-serializer.test.ts +94 -0
  259. package/src/internal/object/json-serializer.ts +230 -0
  260. package/src/internal/object/schema-validator.test.ts +186 -0
  261. package/src/internal/object/schema-validator.ts +242 -0
  262. package/src/internal/object/typed-object.test.ts +34 -0
  263. package/src/internal/object/typed-object.ts +94 -0
  264. package/src/internal/proxy/handler.test.ts +173 -0
  265. package/src/internal/proxy/index.ts +6 -0
  266. package/src/internal/proxy/make-object.ts +113 -0
  267. package/src/internal/proxy/schema.test.ts +137 -0
  268. package/src/internal/proxy/typed-handler.test.ts +102 -0
  269. package/src/internal/proxy/typed-handler.ts +233 -0
  270. package/src/internal/proxy/typed-object.test.ts +105 -0
  271. package/src/internal/ref/index.ts +6 -0
  272. package/src/internal/ref/ref-array.ts +39 -0
  273. package/src/internal/ref/ref.test.ts +101 -0
  274. package/src/internal/ref/ref.ts +525 -0
  275. package/src/internal/schema/compose.test.ts +42 -0
  276. package/src/internal/schema/compose.ts +37 -0
  277. package/src/internal/schema/echo-schema.ts +385 -0
  278. package/src/internal/schema/index.ts +9 -0
  279. package/src/internal/schema/manipulation.ts +92 -0
  280. package/src/internal/schema/persistent-schema.ts +28 -0
  281. package/src/internal/schema/runtime-schema-registry.ts +78 -0
  282. package/src/internal/schema/snapshot.ts +25 -0
  283. package/src/internal/types/base.ts +58 -0
  284. package/src/internal/types/entity.ts +23 -0
  285. package/src/internal/types/index.ts +9 -0
  286. package/src/internal/types/meta.ts +76 -0
  287. package/src/internal/types/typename.ts +45 -0
  288. package/src/internal/types/version.ts +20 -0
  289. package/src/query/filter.ts +455 -0
  290. package/src/query/index.ts +5 -1
  291. package/src/query/order.ts +34 -0
  292. package/src/query/query.test.ts +334 -0
  293. package/src/query/query.ts +303 -0
  294. package/src/query/testing.ts +64 -0
  295. package/src/query/types.ts +23 -0
  296. package/src/query/util.ts +25 -0
  297. package/src/testing/api.test.ts +100 -0
  298. package/src/testing/index.ts +3 -1
  299. package/src/testing/test-data.ts +130 -0
  300. package/src/testing/test-schema.ts +213 -0
  301. package/src/testing/util.ts +78 -0
  302. package/dist/lib/browser/chunk-2KNTYMIW.mjs +0 -697
  303. package/dist/lib/browser/chunk-2KNTYMIW.mjs.map +0 -7
  304. package/dist/lib/node-esm/chunk-EXNNC62J.mjs +0 -697
  305. package/dist/lib/node-esm/chunk-EXNNC62J.mjs.map +0 -7
  306. package/dist/types/src/experimental/database.d.ts +0 -8
  307. package/dist/types/src/experimental/database.d.ts.map +0 -1
  308. package/dist/types/src/experimental/index.d.ts +0 -1
  309. package/dist/types/src/experimental/index.d.ts.map +0 -1
  310. package/dist/types/src/experimental/queue.d.ts +0 -8
  311. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  312. package/dist/types/src/experimental/space.d.ts +0 -8
  313. package/dist/types/src/experimental/space.d.ts.map +0 -1
  314. package/dist/types/src/query/dsl.d.ts +0 -218
  315. package/dist/types/src/query/dsl.d.ts.map +0 -1
  316. package/dist/types/src/query/dsl.test.d.ts +0 -2
  317. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  318. package/dist/types/src/testing/types.d.ts +0 -113
  319. package/dist/types/src/testing/types.d.ts.map +0 -1
  320. package/src/experimental/database.ts +0 -11
  321. package/src/experimental/index.ts +0 -7
  322. package/src/experimental/queue.ts +0 -11
  323. package/src/experimental/space.ts +0 -11
  324. package/src/query/dsl.test.ts +0 -324
  325. package/src/query/dsl.ts +0 -646
  326. package/src/test/api.test.ts +0 -173
  327. package/src/testing/types.ts +0 -91
  328. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
@@ -0,0 +1,109 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import type * as SchemaAST from 'effect/SchemaAST';
7
+ import type * as Types from 'effect/Types';
8
+
9
+ import { type ToMutable } from '@dxos/util';
10
+
11
+ import { type TypeMeta } from '../annotations';
12
+ import { type HasId } from '../types';
13
+
14
+ // TODO(burdon): Define Schema type for `typename` and use consistently for all DXN-like properties.
15
+
16
+ // type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];
17
+ export type EchoTypeSchemaProps<T, ExtraFields = {}> = Types.Simplify<HasId & ToMutable<T> & ExtraFields>;
18
+
19
+ // TODO(burdon): Rename EchoEntitySchema.
20
+ export interface EchoTypeSchema<Self extends Schema.Schema.Any, ExtraFields = {}>
21
+ extends TypeMeta,
22
+ Schema.AnnotableClass<
23
+ EchoTypeSchema<Self, ExtraFields>,
24
+ EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields>,
25
+ EchoTypeSchemaProps<Schema.Schema.Encoded<Self>, ExtraFields>,
26
+ Schema.Schema.Context<Self>
27
+ > {
28
+ // make(
29
+ // props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
30
+ // ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
31
+ // : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
32
+ // options?: MakeOptions,
33
+ // ): Simplify<Schema.TypeLiteral.Type<Fields, []>>;
34
+
35
+ instanceOf(value: unknown): boolean;
36
+ }
37
+
38
+ // type MakeOptions =
39
+ // | boolean
40
+ // | {
41
+ // readonly disableValidation?: boolean;
42
+ // };
43
+
44
+ // NOTE: Utils copied from Effect `Schema.ts`.
45
+ // const _ownKeys = (o: object): Array<PropertyKey> =>
46
+ // (Object.keys(o) as Array<PropertyKey>).concat(Object.getOwnPropertySymbols(o));
47
+
48
+ // const _lazilyMergeDefaults = (
49
+ // fields: Schema.Struct.Fields,
50
+ // out: Record<PropertyKey, unknown>,
51
+ // ): { [x: string | symbol]: unknown } => {
52
+ // const ownKeys = _ownKeys(fields);
53
+ // for (const key of ownKeys) {
54
+ // const field = fields[key];
55
+ // if (out[key] === undefined && Schema.isPropertySignature(field)) {
56
+ // const ast = field.ast;
57
+ // const defaultValue = ast._tag === 'PropertySignatureDeclaration' ? ast.defaultValue : ast.to.defaultValue;
58
+ // if (defaultValue !== undefined) {
59
+ // out[key] = defaultValue();
60
+ // }
61
+ // }
62
+ // }
63
+ // return out;
64
+ // };
65
+
66
+ // const _getDisableValidationMakeOption = (options: MakeOptions | undefined): boolean =>
67
+ // Predicate.isBoolean(options) ? options : options?.disableValidation ?? false;
68
+
69
+ /**
70
+ * @internal
71
+ */
72
+ export const makeEchoTypeSchema = <Self extends Schema.Schema.Any>(
73
+ // fields: Fields,
74
+ ast: SchemaAST.AST,
75
+ typename: string,
76
+ version: string,
77
+ ): EchoTypeSchema<Self> => {
78
+ return class EchoObjectSchemaClass extends Schema.make<
79
+ EchoTypeSchemaProps<Schema.Schema.Type<Self>>,
80
+ EchoTypeSchemaProps<Schema.Schema.Encoded<Self>>,
81
+ Schema.Schema.Context<Self>
82
+ >(ast) {
83
+ static readonly typename = typename;
84
+ static readonly version = version;
85
+
86
+ static override annotations(
87
+ annotations: Schema.Annotations.GenericSchema<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>,
88
+ ): EchoTypeSchema<Self> {
89
+ const schema = Schema.make<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>(ast).annotations(annotations);
90
+ return makeEchoTypeSchema<Self>(/* fields, */ schema.ast, typename, version);
91
+ }
92
+
93
+ // static make(
94
+ // props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
95
+ // ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
96
+ // : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
97
+ // options?: MakeOptions,
98
+ // ): Simplify<Schema.TypeLiteral.Type<Fields, []>> {
99
+ // const propsWithDefaults: any = _lazilyMergeDefaults(fields, { ...(props as any) });
100
+ // return _getDisableValidationMakeOption(options)
101
+ // ? propsWithDefaults
102
+ // : ParseResult.validateSync(this)(propsWithDefaults);
103
+ // }
104
+
105
+ static instanceOf(value: unknown): boolean {
106
+ return Schema.is(this)(value);
107
+ }
108
+ };
109
+ };
@@ -0,0 +1,23 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { EchoObjectSchema } from './object';
8
+
9
+ export const EXPANDO_TYPENAME = 'dxos.org/type/Expando';
10
+
11
+ const ExpandoSchema = Schema.Struct({}, { key: Schema.String, value: Schema.Any }).pipe(
12
+ EchoObjectSchema({
13
+ typename: EXPANDO_TYPENAME,
14
+ version: '0.1.0',
15
+ }),
16
+ );
17
+
18
+ /**
19
+ * Expando object is an object with an arbitrary set of properties.
20
+ */
21
+ export interface Expando extends Schema.Schema.Type<typeof ExpandoSchema> {}
22
+ export interface ExpandoEncoded extends Schema.Schema.Encoded<typeof ExpandoSchema> {}
23
+ export const Expando: Schema.Schema<Expando, ExpandoEncoded> = ExpandoSchema;
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './expando';
6
+ export * from './model'; // TODO(burdon): Rename.
7
+ export * from './object';
8
+ export * from './relation';
9
+ export * from './util';
@@ -0,0 +1,129 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type * as Schema from 'effect/Schema';
6
+
7
+ import { type ForeignKey } from '@dxos/echo-protocol';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { DXN, ObjectId } from '@dxos/keys';
10
+ import { assumeType } from '@dxos/util';
11
+
12
+ import {
13
+ type ATTR_META,
14
+ type ATTR_TYPE,
15
+ EntityKind,
16
+ KindId,
17
+ type MetaId,
18
+ type ObjectMeta,
19
+ type SchemaId,
20
+ TypeId,
21
+ type Version,
22
+ } from '../types';
23
+
24
+ import {
25
+ type ATTR_RELATION_SOURCE,
26
+ type ATTR_RELATION_TARGET,
27
+ RelationSourceDXNId,
28
+ RelationSourceId,
29
+ RelationTargetDXNId,
30
+ RelationTargetId,
31
+ } from './relation';
32
+
33
+ //
34
+ // Defines the internal model of the echo object.
35
+ //
36
+
37
+ /**
38
+ * Property name for self DXN when object is serialized to JSON.
39
+ */
40
+ export const ATTR_SELF_DXN = '@dxn';
41
+
42
+ /**
43
+ * DXN to the object itself.
44
+ */
45
+ export const SelfDXNId = Symbol.for('@dxos/echo/DXN');
46
+
47
+ /**
48
+ * Property name for deleted when object is serialized to JSON.
49
+ */
50
+ export const ATTR_DELETED = '@deleted';
51
+
52
+ /**
53
+ * Deletion marker.
54
+ */
55
+ export const ObjectDeletedId = Symbol.for('@dxos/echo/Deleted');
56
+
57
+ /**
58
+ * Object version accessor symbol.
59
+ */
60
+ export const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/Version');
61
+
62
+ /**
63
+ * Internal runtime representation of an object.
64
+ * The fields are accessed through getter functions.
65
+ */
66
+ export interface InternalObjectProps {
67
+ id: ObjectId;
68
+
69
+ // Echo supports untyped objects O_O.
70
+ readonly [TypeId]?: DXN;
71
+
72
+ //
73
+ readonly [SelfDXNId]?: DXN;
74
+
75
+ /**
76
+ * Returns the schema for the object.
77
+ */
78
+ readonly [SchemaId]?: Schema.Schema.AnyNoContext;
79
+ readonly [KindId]: EntityKind;
80
+ readonly [MetaId]?: ObjectMeta;
81
+ readonly [ObjectDeletedId]?: boolean;
82
+ readonly [ObjectVersionId]?: Version;
83
+ readonly [RelationSourceDXNId]?: DXN;
84
+ readonly [RelationTargetDXNId]?: DXN;
85
+ readonly [RelationSourceId]?: InternalObjectProps;
86
+ readonly [RelationTargetId]?: InternalObjectProps;
87
+ }
88
+
89
+ /**
90
+ * Entity metadata.
91
+ */
92
+ export interface ObjectMetaJSON {
93
+ keys: ForeignKey[];
94
+ tags?: string[];
95
+ }
96
+
97
+ /**
98
+ * JSON representation of an object or relation metadata.
99
+ */
100
+ export interface ObjectJSON {
101
+ id: string;
102
+ [ATTR_TYPE]: DXN.String;
103
+ [ATTR_SELF_DXN]?: DXN.String;
104
+ [ATTR_DELETED]?: boolean;
105
+ [ATTR_META]?: ObjectMetaJSON;
106
+ [ATTR_RELATION_SOURCE]?: DXN.String;
107
+ [ATTR_RELATION_TARGET]?: DXN.String;
108
+ }
109
+
110
+ /**
111
+ * NOTE: Keep as `function` to avoid type inference issues.
112
+ */
113
+ export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
114
+ invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
115
+ assumeType<InternalObjectProps>(obj);
116
+ invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');
117
+ invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');
118
+ invariant(
119
+ obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
120
+ 'Invalid object model: invalid entity kind',
121
+ );
122
+
123
+ if (obj[KindId] === EntityKind.Relation) {
124
+ invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');
125
+ invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');
126
+ invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');
127
+ invariant(!(obj[RelationTargetId] instanceof DXN), 'Invalid object model: target pointer is a DXN');
128
+ }
129
+ }
@@ -0,0 +1,45 @@
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 { invariant } from '@dxos/invariant';
9
+
10
+ import { type TypeAnnotation, TypeAnnotationId, type TypeMeta, makeTypeJsonSchemaAnnotation } from '../annotations';
11
+ import { EntityKind } from '../types';
12
+
13
+ import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
14
+
15
+ /**
16
+ * Schema for Obj entity types.
17
+ * Pipeable function to add ECHO object annotations to a schema.
18
+ */
19
+ export const EchoObjectSchema: {
20
+ // TODO(burdon): Tighten Self type to Schema.TypeLiteral or Schema.Struct to facilitate definition of `make` method.
21
+ // (meta: TypeMeta): <Self extends Schema.Struct<Fields>, Fields extends Schema.Struct.Fields>(self: Self) => EchoObjectSchema<Self, Fields>;
22
+ (meta: TypeMeta): <Self extends Schema.Schema.Any>(self: Self) => EchoTypeSchema<Self>;
23
+ } = ({ typename, version }) => {
24
+ return <Self extends Schema.Schema.Any>(self: Self): EchoTypeSchema<Self> => {
25
+ invariant(typeof TypeAnnotationId === 'symbol', 'Sanity.');
26
+ invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
27
+
28
+ // TODO(dmaretskyi): Does `Schema.mutable` work for deep mutability here?
29
+ // TODO(dmaretskyi): Do not do mutable here.
30
+ const schemaWithId = Schema.extend(Schema.mutable(self), Schema.Struct({ id: Schema.String }));
31
+ const ast = SchemaAST.annotations(schemaWithId.ast, {
32
+ // TODO(dmaretskyi): `extend` kills the annotations.
33
+ ...self.ast.annotations,
34
+ [TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,
35
+ // TODO(dmaretskyi): TypeIdentifierAnnotationId?
36
+ [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
37
+ kind: EntityKind.Object,
38
+ typename,
39
+ version,
40
+ }),
41
+ });
42
+
43
+ return makeEchoTypeSchema<Self>(/* self.fields, */ ast, typename, version);
44
+ };
45
+ };
@@ -0,0 +1,155 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import { raise } from '@dxos/debug';
9
+ import { assertArgument, invariant } from '@dxos/invariant';
10
+ import { DXN } from '@dxos/keys';
11
+
12
+ import {
13
+ type TypeAnnotation,
14
+ TypeAnnotationId,
15
+ type TypeMeta,
16
+ getEntityKind,
17
+ getSchemaTypename,
18
+ getTypeIdentifierAnnotation,
19
+ makeTypeJsonSchemaAnnotation,
20
+ } from '../annotations';
21
+ import { EntityKind } from '../types';
22
+
23
+ import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
24
+
25
+ /**
26
+ * Property name for relation source when object is serialized to JSON.
27
+ */
28
+ export const ATTR_RELATION_SOURCE = '@relationSource';
29
+
30
+ /**
31
+ * Used to access relation source ref on live ECHO objects.
32
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
33
+ */
34
+ export const RelationSourceId: unique symbol = Symbol.for('@dxos/echo/RelationSource');
35
+
36
+ /**
37
+ * Used to access relation source ref on live ECHO objects.
38
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
39
+ */
40
+ export const RelationSourceDXNId: unique symbol = Symbol.for('@dxos/echo/RelationSourceDXN');
41
+
42
+ /**
43
+ * Property name for relation target when object is serialized to JSON.
44
+ */
45
+ export const ATTR_RELATION_TARGET = '@relationTarget';
46
+
47
+ /**
48
+ * Used to access relation target ref on live ECHO objects.
49
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
50
+ */
51
+ export const RelationTargetId: unique symbol = Symbol.for('@dxos/echo/RelationTarget');
52
+
53
+ /**
54
+ * Used to access relation target ref on live ECHO objects.
55
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
56
+ */
57
+ export const RelationTargetDXNId: unique symbol = Symbol.for('@dxos/echo/RelationTargetDXN');
58
+
59
+ /**
60
+ * Source and target props on relations.
61
+ */
62
+ // TODO(burdon): any?
63
+ export type RelationSourceTargetRefs<Source = any, Target = any> = {
64
+ /**
65
+ * Source ECHO live object.
66
+ */
67
+ [RelationSourceId]: Source;
68
+
69
+ /**
70
+ * Target ECHO live object.
71
+ */
72
+ [RelationTargetId]: Target;
73
+ };
74
+
75
+ export type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;
76
+ export type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;
77
+
78
+ export type EchoRelationSchemaOptions<
79
+ TSource extends Schema.Schema.AnyNoContext,
80
+ TTarget extends Schema.Schema.AnyNoContext,
81
+ > = TypeMeta & {
82
+ source: TSource;
83
+ target: TTarget;
84
+ };
85
+
86
+ /**
87
+ * Schema for Relation entity types.
88
+ */
89
+ export const EchoRelationSchema = <
90
+ Source extends Schema.Schema.AnyNoContext,
91
+ Target extends Schema.Schema.AnyNoContext,
92
+ >({
93
+ source,
94
+ target,
95
+ typename,
96
+ version,
97
+ }: EchoRelationSchemaOptions<Source, Target>) => {
98
+ assertArgument(Schema.isSchema(source), 'source');
99
+ assertArgument(Schema.isSchema(target), 'target');
100
+ const sourceDXN = getDXNForRelationSchemaRef(source);
101
+ const targetDXN = getDXNForRelationSchemaRef(target);
102
+ if (getEntityKind(source) !== EntityKind.Object) {
103
+ raise(new Error('Source schema must be an echo object schema.'));
104
+ }
105
+ if (getEntityKind(target) !== EntityKind.Object) {
106
+ raise(new Error('Target schema must be an echo object schema.'));
107
+ }
108
+
109
+ return <Self extends Schema.Schema.Any>(
110
+ self: Self,
111
+ ): EchoTypeSchema<Self, RelationSourceTargetRefs<Schema.Schema.Type<Source>, Schema.Schema.Type<Target>>> => {
112
+ invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
113
+
114
+ // TODO(dmaretskyi): Does `Schema.mutable` work for deep mutability here?
115
+ // TODO(dmaretskyi): Do not do mutable here.
116
+ const schemaWithId = Schema.extend(Schema.mutable(self), Schema.Struct({ id: Schema.String }));
117
+ const ast = SchemaAST.annotations(schemaWithId.ast, {
118
+ // TODO(dmaretskyi): `extend` kills the annotations.
119
+ ...self.ast.annotations,
120
+ [TypeAnnotationId]: {
121
+ kind: EntityKind.Relation,
122
+ typename,
123
+ version,
124
+ sourceSchema: sourceDXN,
125
+ targetSchema: targetDXN,
126
+ } satisfies TypeAnnotation,
127
+ // TODO(dmaretskyi): TypeIdentifierAnnotationId?
128
+
129
+ [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
130
+ kind: EntityKind.Relation,
131
+ typename,
132
+ version,
133
+ relationSource: sourceDXN,
134
+ relationTarget: targetDXN,
135
+ }),
136
+ });
137
+
138
+ return makeEchoTypeSchema<Self>(/* self.fields, */ ast, typename, version);
139
+ };
140
+ };
141
+
142
+ const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): string => {
143
+ assertArgument(Schema.isSchema(schema), 'schema');
144
+ const identifier = getTypeIdentifierAnnotation(schema);
145
+ if (identifier) {
146
+ return identifier;
147
+ }
148
+
149
+ const typename = getSchemaTypename(schema);
150
+ if (!typename) {
151
+ throw new Error('Schema must have a typename');
152
+ }
153
+
154
+ return DXN.fromTypename(typename).toString();
155
+ };
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { assertArgument, invariant } from '@dxos/invariant';
8
+ import { DXN, ObjectId } from '@dxos/keys';
9
+ import { assumeType } from '@dxos/util';
10
+
11
+ import { type InternalObjectProps, SelfDXNId } from './model';
12
+
13
+ /**
14
+ * Returns a DXN for an object or schema.
15
+ *
16
+ * @internal
17
+ */
18
+ export const getObjectDXN = (object: any): DXN | undefined => {
19
+ invariant(!Schema.isSchema(object), 'schema not allowed in this function');
20
+ assertArgument(typeof object === 'object' && object != null, 'object', 'expected object');
21
+ assumeType<InternalObjectProps>(object);
22
+
23
+ if (object[SelfDXNId]) {
24
+ invariant(object[SelfDXNId] instanceof DXN, 'Invalid object model: invalid self dxn');
25
+ return object[SelfDXNId];
26
+ }
27
+
28
+ if (!ObjectId.isValid(object.id)) {
29
+ throw new TypeError('Object id is not valid.');
30
+ }
31
+
32
+ return DXN.fromLocalObjectId(object.id);
33
+ };
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { describe, expect, test } from 'vitest';
7
+
8
+ import { log } from '@dxos/log';
9
+
10
+ import { toJsonSchema } from '../json-schema';
11
+
12
+ import {
13
+ DateOnly,
14
+ DateTime,
15
+ type SimpleDate,
16
+ type SimpleDateTime,
17
+ type SimpleTime,
18
+ TimeOnly,
19
+ toSimpleDate,
20
+ toSimpleTime,
21
+ } from './date';
22
+
23
+ describe.skip('date', () => {
24
+ test('basic', () => {
25
+ const date = new Date('2024-12-31T23:59:59Z');
26
+ expect(toSimpleDate(date)).to.deep.eq({ year: 2024, month: 12, day: 31 });
27
+ expect(toSimpleTime(date)).to.deep.eq({ hours: 23, minutes: 59, seconds: 59 });
28
+ });
29
+
30
+ test('Date', ({ expect }) => {
31
+ const jsonSchema = toJsonSchema(DateOnly);
32
+ log('schema', { jsonSchema });
33
+ const v1: SimpleDate = { year: 1999, month: 12, day: 31 };
34
+ const str = Schema.encodeUnknownSync(DateOnly)(v1);
35
+ const v2 = Schema.decodeUnknownSync(DateOnly)(str);
36
+ expect(v1).to.deep.eq(v2);
37
+ });
38
+
39
+ test('Time', ({ expect }) => {
40
+ const jsonSchema = toJsonSchema(TimeOnly);
41
+ log('schema', { jsonSchema });
42
+ const v1: SimpleTime = { hours: 23, minutes: 59, seconds: 59 };
43
+ const str = Schema.encodeUnknownSync(TimeOnly)(v1);
44
+ const v2 = Schema.decodeUnknownSync(TimeOnly)(str);
45
+ expect(v1).to.deep.eq(v2);
46
+ });
47
+
48
+ test('DateTime', ({ expect }) => {
49
+ const jsonSchema = toJsonSchema(DateTime);
50
+ log('schema', { jsonSchema });
51
+ const v1: SimpleDateTime = { year: 1999, month: 12, day: 31, hours: 23, minutes: 59, seconds: 59 };
52
+ const str = Schema.encodeUnknownSync(DateTime)(v1);
53
+ const v2 = Schema.decodeUnknownSync(DateTime)(str);
54
+ expect(v1).to.deep.eq(v2);
55
+ });
56
+ });