@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,385 @@
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
+ import { type ObjectId } from '@dxos/keys';
10
+
11
+ import { type SchemaMeta, SchemaMetaSymbol, type TypeAnnotation, getTypeAnnotation } from '../annotations';
12
+ import { type JsonSchemaType, toEffectSchema, toJsonSchema } from '../json-schema';
13
+ import { type TypedObject, type TypedObjectPrototype } from '../object';
14
+
15
+ import {
16
+ addFieldsToSchema,
17
+ removeFieldsFromSchema,
18
+ setTypenameInSchema,
19
+ updateFieldNameInSchema,
20
+ updateFieldsInSchema,
21
+ } from './manipulation';
22
+ import { PersistentSchema } from './persistent-schema';
23
+ import { getSnapshot } from './snapshot';
24
+
25
+ /**
26
+ * Base schema type.
27
+ */
28
+ // TODO(burdon): Merge with ImmutableSchema.
29
+ export interface BaseSchema<A = any, I = any> extends TypedObject<A, I> {
30
+ // TODO(burdon): Different from mutable?
31
+ get readonly(): boolean;
32
+ // TODO(burdon): Change to external function.
33
+ get mutable(): EchoSchema<A, I>;
34
+ get snapshot(): Schema.Schema<A, I>;
35
+ get jsonSchema(): JsonSchemaType;
36
+ }
37
+
38
+ /**
39
+ * Immutable schema type.
40
+ * @deprecated Use `Schema.Schema.AnyNoContext` instead.
41
+ */
42
+ // TODO(burdon): Common abstract base class?
43
+ export class ImmutableSchema<A = any, I = any> implements BaseSchema<A, I> {
44
+ private readonly _objectAnnotation: TypeAnnotation;
45
+ constructor(private readonly _schema: Schema.Schema<A, I>) {
46
+ this._objectAnnotation = getTypeAnnotation(this._schema)!;
47
+ invariant(this._objectAnnotation);
48
+ }
49
+
50
+ //
51
+ // Effect Schema (push to abstract base class).
52
+ //
53
+
54
+ public get [Schema.TypeId]() {
55
+ return schemaVariance;
56
+ }
57
+
58
+ public get Type() {
59
+ return this._schema.Type;
60
+ }
61
+
62
+ public get Encoded() {
63
+ return this._schema.Encoded;
64
+ }
65
+
66
+ public get Context() {
67
+ return this._schema.Context;
68
+ }
69
+
70
+ public get ast(): SchemaAST.AST {
71
+ return this._schema.ast;
72
+ }
73
+
74
+ public get annotations() {
75
+ return this._schema.annotations;
76
+ }
77
+
78
+ public get pipe() {
79
+ return this._schema.pipe;
80
+ }
81
+
82
+ //
83
+ // TypedObject
84
+ //
85
+
86
+ get typename(): string {
87
+ return this._objectAnnotation.typename;
88
+ }
89
+
90
+ get version(): string {
91
+ return this._objectAnnotation.version;
92
+ }
93
+
94
+ //
95
+ // BaseSchema
96
+ //
97
+
98
+ get readonly(): boolean {
99
+ return true;
100
+ }
101
+
102
+ get snapshot(): Schema.Schema.AnyNoContext {
103
+ return this._schema;
104
+ }
105
+
106
+ // TODO(burdon): Change from getter since this is expensive.
107
+ get jsonSchema(): JsonSchemaType {
108
+ return toJsonSchema(this._schema);
109
+ }
110
+
111
+ get mutable(): EchoSchema {
112
+ throw new Error('Schema is readonly.');
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Defines an effect-schema for the `EchoSchema` type.
118
+ *
119
+ * This is here so that `EchoSchema` class can be used as a part of another schema definition (e.g., `ref(EchoSchema)`).
120
+ */
121
+ const EchoSchemaConstructor = (): TypedObjectPrototype => {
122
+ /**
123
+ * Return class definition satisfying Schema.Schema.
124
+ */
125
+ return class {
126
+ private static get _schema() {
127
+ // The field is DynamicEchoSchema in runtime, but is serialized as PersisentSchema in automerge.
128
+ return Schema.Union(PersistentSchema, Schema.instanceOf(EchoSchema)).annotations(
129
+ PersistentSchema.ast.annotations,
130
+ );
131
+ }
132
+
133
+ static readonly [Schema.TypeId] = schemaVariance;
134
+
135
+ static get ast() {
136
+ const schema = this._schema;
137
+ return schema.ast;
138
+ }
139
+
140
+ static get annotations() {
141
+ const schema = this._schema;
142
+ return schema.annotations.bind(schema);
143
+ }
144
+
145
+ static get pipe() {
146
+ const schema = this._schema;
147
+ return schema.pipe.bind(schema);
148
+ }
149
+ } as any;
150
+ };
151
+
152
+ export const isMutable = (schema: Schema.Schema.AnyNoContext): schema is EchoSchema => {
153
+ return schema instanceof EchoSchema;
154
+ };
155
+
156
+ // NOTE: Keep in this file.
157
+ const schemaVariance = {
158
+ _A: (_: any) => _,
159
+ _I: (_: any) => _,
160
+ _R: (_: never) => _,
161
+ };
162
+
163
+ /**
164
+ * Represents a schema that is persisted in the ECHO database.
165
+ * Schema can me mutable or readonly (specified by the {@link EchoSchema.readonly} field).
166
+ *
167
+ * Schema that can be modified at runtime via the API.
168
+ * Is an instance of effect-schema (`Schema.Schema.AnyNoContext`) so it can be used in the same way as a regular schema.
169
+ * IMPORTANT: The schema AST will change reactively when the schema is updated, including synced updates from remote peers.
170
+ *
171
+ * The class constructor is a schema instance itself, and can be used in the echo object definitions:
172
+ *
173
+ * @example
174
+ * ```ts
175
+ * export class TableType extends Schema.Struct({...}).pipe(Type.Obj({ typename: 'example.org/type/Table', version: '0.1.0' })){
176
+ * title: Schema.String,
177
+ * schema: Schema.optional(ref(EchoSchema)),
178
+ * props: Schema.mutable(S.Array(TablePropSchema)),
179
+ * }) {}
180
+ * ```
181
+ *
182
+ * The ECHO API will translate any references to PersistentSchema objects to be resolved as EchoSchema objects.
183
+ */
184
+ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implements BaseSchema<A, I> {
185
+ private _schema: Schema.Schema.AnyNoContext | undefined;
186
+ private _isDirty = true;
187
+
188
+ constructor(private readonly _persistentSchema: PersistentSchema) {
189
+ super();
190
+ }
191
+
192
+ //
193
+ // Effect Schema (push to abstract base class).
194
+ //
195
+
196
+ public get [Schema.TypeId]() {
197
+ return schemaVariance;
198
+ }
199
+
200
+ public get Type() {
201
+ return this._persistentSchema as A;
202
+ }
203
+
204
+ public get Encoded() {
205
+ return this._persistentSchema as I;
206
+ }
207
+
208
+ public get Context() {
209
+ const schema = this._getSchema();
210
+ return schema.Context;
211
+ }
212
+
213
+ public get ast() {
214
+ const schema = this._getSchema();
215
+ return schema.ast;
216
+ }
217
+
218
+ public get annotations() {
219
+ const schema = this._getSchema();
220
+ return schema.annotations.bind(schema);
221
+ }
222
+
223
+ public get pipe(): Schema.Schema.AnyNoContext['pipe'] {
224
+ const schema = this._getSchema();
225
+ return schema.pipe.bind(schema);
226
+ }
227
+
228
+ //
229
+ // BaseSchema
230
+ //
231
+
232
+ public get typename(): string {
233
+ return this._persistentSchema.typename;
234
+ }
235
+
236
+ public get version(): string {
237
+ return this._persistentSchema.version;
238
+ }
239
+
240
+ public get readonly(): boolean {
241
+ return false;
242
+ }
243
+
244
+ /**
245
+ * Returns an immutable schema snapshot of the current state of the schema.
246
+ */
247
+ public get snapshot(): Schema.Schema.AnyNoContext {
248
+ return this._getSchema();
249
+ }
250
+
251
+ /**
252
+ * @reactive
253
+ */
254
+ public get jsonSchema(): JsonSchemaType {
255
+ return this._persistentSchema.jsonSchema;
256
+ }
257
+
258
+ /**
259
+ * Returns a mutable schema.
260
+ */
261
+ public get mutable(): EchoSchema {
262
+ invariant(!this.readonly, 'Schema is not mutable');
263
+ return this;
264
+ }
265
+
266
+ //
267
+ // Mutable Schema
268
+ //
269
+
270
+ /**
271
+ * Id of the ECHO object containing the schema.
272
+ */
273
+ public get id(): ObjectId {
274
+ return this._persistentSchema.id;
275
+ }
276
+
277
+ /**
278
+ * Short name of the schema.
279
+ */
280
+ public get name(): string | undefined {
281
+ return this._persistentSchema.name;
282
+ }
283
+
284
+ public get [SchemaMetaSymbol](): SchemaMeta {
285
+ return { id: this.id, typename: this.typename, version: this._persistentSchema.version };
286
+ }
287
+
288
+ /**
289
+ * Reference to the underlying persistent schema object.
290
+ */
291
+ public get persistentSchema(): PersistentSchema {
292
+ return this._persistentSchema;
293
+ }
294
+
295
+ public getProperties(): SchemaAST.PropertySignature[] {
296
+ const ast = this._getSchema().ast;
297
+ invariant(SchemaAST.isTypeLiteral(ast));
298
+ return [...ast.propertySignatures].filter((p) => p.name !== 'id').map(unwrapOptionality);
299
+ }
300
+
301
+ //
302
+ // Mutation methods.
303
+ // TODO(burdon): Create separate interface for dynamic schema.
304
+ // TODO(burdon): Deprecate direct manipulation? Use JSONSchema directly.
305
+ //
306
+
307
+ /**
308
+ * @throws Error if the schema is readonly.
309
+ */
310
+ public updateTypename(typename: string): void {
311
+ const updated = setTypenameInSchema(this._getSchema(), typename);
312
+ this._persistentSchema.typename = typename;
313
+ this._persistentSchema.jsonSchema = toJsonSchema(updated);
314
+ }
315
+
316
+ /**
317
+ * @throws Error if the schema is readonly.
318
+ */
319
+ public addFields(fields: Schema.Struct.Fields): void {
320
+ const extended = addFieldsToSchema(this._getSchema(), fields);
321
+ this._persistentSchema.jsonSchema = toJsonSchema(extended);
322
+ }
323
+
324
+ /**
325
+ * @throws Error if the schema is readonly.
326
+ */
327
+ public updateFields(fields: Schema.Struct.Fields): void {
328
+ const updated = updateFieldsInSchema(this._getSchema(), fields);
329
+ this._persistentSchema.jsonSchema = toJsonSchema(updated);
330
+ }
331
+
332
+ /**
333
+ * @throws Error if the schema is readonly.
334
+ */
335
+ public updateFieldPropertyName({ before, after }: { before: PropertyKey; after: PropertyKey }): void {
336
+ const renamed = updateFieldNameInSchema(this._getSchema(), { before, after });
337
+ this._persistentSchema.jsonSchema = toJsonSchema(renamed);
338
+ }
339
+
340
+ /**
341
+ * @throws Error if the schema is readonly.
342
+ */
343
+ public removeFields(fieldNames: string[]): void {
344
+ const removed = removeFieldsFromSchema(this._getSchema(), fieldNames);
345
+ this._persistentSchema.jsonSchema = toJsonSchema(removed);
346
+ }
347
+
348
+ //
349
+ // Internals
350
+ //
351
+
352
+ /**
353
+ * Called by EchoSchemaRegistry on update.
354
+ */
355
+ _invalidate(): void {
356
+ this._isDirty = true;
357
+ }
358
+
359
+ /**
360
+ * Rebuilds this schema if it is dirty.
361
+ */
362
+ _rebuild(): void {
363
+ if (this._isDirty || this._schema == null) {
364
+ this._schema = toEffectSchema(getSnapshot(this._persistentSchema.jsonSchema));
365
+ this._isDirty = false;
366
+ }
367
+ }
368
+
369
+ _getSchema(): Schema.Schema.AnyNoContext {
370
+ this._rebuild();
371
+ return this._schema!;
372
+ }
373
+ }
374
+
375
+ // TODO(burdon): Move to effect.
376
+ const unwrapOptionality = (property: SchemaAST.PropertySignature): SchemaAST.PropertySignature => {
377
+ if (!SchemaAST.isUnion(property.type)) {
378
+ return property;
379
+ }
380
+
381
+ return {
382
+ ...property,
383
+ type: property.type.types.find((type) => !SchemaAST.isUndefinedKeyword(type))!,
384
+ } as any;
385
+ };
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './echo-schema';
6
+ export * from './manipulation';
7
+ export * from './persistent-schema';
8
+ export * from './runtime-schema-registry';
9
+ export * from './snapshot';
@@ -0,0 +1,92 @@
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
+ import { DXN } from '@dxos/keys';
10
+
11
+ import { type TypeAnnotation, TypeAnnotationId, TypeIdentifierAnnotationId } from '../annotations';
12
+
13
+ // TODO(ZaymonFC): Do this one at a time. This might be dangerous.
14
+ export const addFieldsToSchema = (
15
+ schema: Schema.Schema.AnyNoContext,
16
+ fields: Schema.Struct.Fields,
17
+ ): Schema.Schema.AnyNoContext => {
18
+ const schemaExtension = Schema.partial(Schema.Struct(fields));
19
+ return Schema.extend(schema, schemaExtension).annotations(
20
+ schema.ast.annotations,
21
+ ) as any as Schema.Schema.AnyNoContext;
22
+ };
23
+
24
+ export const updateFieldsInSchema = (
25
+ schema: Schema.Schema.AnyNoContext,
26
+ fields: Schema.Struct.Fields,
27
+ ): Schema.Schema.AnyNoContext => {
28
+ const ast = schema.ast as SchemaAST.TypeLiteral;
29
+ invariant(SchemaAST.isTypeLiteral(ast));
30
+
31
+ const updatedProperties = [...ast.propertySignatures];
32
+ const propertiesToUpdate = (Schema.partial(Schema.Struct(fields)).ast as SchemaAST.TypeLiteral).propertySignatures;
33
+ for (const property of propertiesToUpdate) {
34
+ const index = updatedProperties.findIndex((p) => p.name === property.name);
35
+ if (index !== -1) {
36
+ updatedProperties[index] = property;
37
+ } else {
38
+ updatedProperties.push(property);
39
+ }
40
+ }
41
+
42
+ return Schema.make(new SchemaAST.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));
43
+ };
44
+
45
+ export const removeFieldsFromSchema = (
46
+ schema: Schema.Schema.AnyNoContext,
47
+ fieldNames: string[],
48
+ ): Schema.Schema.AnyNoContext => {
49
+ return Schema.make(SchemaAST.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);
50
+ };
51
+
52
+ export const updateFieldNameInSchema = (
53
+ schema: Schema.Schema.AnyNoContext,
54
+ { before, after }: { before: PropertyKey; after: PropertyKey },
55
+ ): Schema.Schema.AnyNoContext => {
56
+ const ast = schema.ast as SchemaAST.TypeLiteral;
57
+ invariant(SchemaAST.isTypeLiteral(ast));
58
+
59
+ return Schema.make(
60
+ new SchemaAST.TypeLiteral(
61
+ ast.propertySignatures.map((p) =>
62
+ p.name === before
63
+ ? new SchemaAST.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations)
64
+ : p,
65
+ ),
66
+ ast.indexSignatures,
67
+ ast.annotations,
68
+ ),
69
+ );
70
+ };
71
+
72
+ export const setTypenameInSchema = (
73
+ schema: Schema.Schema.AnyNoContext,
74
+ typename: string,
75
+ ): Schema.Schema.AnyNoContext => {
76
+ const existingAnnotation = schema.ast.annotations[TypeAnnotationId] as TypeAnnotation;
77
+ invariant(existingAnnotation, `Missing ${String(TypeAnnotationId)}`);
78
+
79
+ return schema.annotations({
80
+ ...schema.ast.annotations,
81
+ [TypeAnnotationId]: {
82
+ kind: existingAnnotation.kind,
83
+ typename,
84
+ version: existingAnnotation.version,
85
+ } satisfies TypeAnnotation,
86
+ [SchemaAST.JSONSchemaAnnotationId]: {
87
+ ...(schema.ast.annotations[SchemaAST.JSONSchemaAnnotationId] ?? {}),
88
+ $id: schema.ast.annotations[TypeIdentifierAnnotationId] ?? DXN.fromTypename(typename).toString(),
89
+ typename,
90
+ },
91
+ });
92
+ };
@@ -0,0 +1,28 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { TypenameSchema, VersionSchema } from '../annotations';
8
+ import { EchoObjectSchema } from '../entities';
9
+ import { JsonSchemaType } from '../json-schema';
10
+
11
+ /**
12
+ * Persistent representation of a schema.
13
+ */
14
+ // TODO(burdon): Move.
15
+ const PersistentEchoSchema = Schema.Struct({
16
+ name: Schema.optional(Schema.String),
17
+ typename: TypenameSchema,
18
+ version: VersionSchema,
19
+ jsonSchema: JsonSchemaType,
20
+ }).pipe(
21
+ EchoObjectSchema({
22
+ typename: 'dxos.org/type/Schema',
23
+ version: '0.1.0',
24
+ }),
25
+ );
26
+ export interface PersistentSchema extends Schema.Schema.Type<typeof PersistentEchoSchema> {}
27
+ export interface PersistentSchemaEncoded extends Schema.Schema.Encoded<typeof PersistentEchoSchema> {}
28
+ export const PersistentSchema: Schema.Schema<PersistentSchema, PersistentSchemaEncoded> = PersistentEchoSchema;
@@ -0,0 +1,78 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import type * as Schema from 'effect/Schema';
6
+
7
+ import { raise } from '@dxos/debug';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { type DXN } from '@dxos/keys';
10
+ import { defaultMap } from '@dxos/util';
11
+
12
+ import { getSchemaTypename, getSchemaVersion } from '../annotations';
13
+
14
+ import { PersistentSchema } from './persistent-schema';
15
+
16
+ /**
17
+ * Runtime registry of static schema objects (i.e., not Dynamic .
18
+ */
19
+ // TODO(burdon): Reconcile with EchoSchemaRegistry.
20
+ export class RuntimeSchemaRegistry {
21
+ private readonly _registry = new Map<string, Schema.Schema.AnyNoContext[]>();
22
+
23
+ constructor() {
24
+ this._registry.set(getSchemaTypename(PersistentSchema)!, [PersistentSchema]);
25
+ }
26
+
27
+ get schemas(): Schema.Schema.AnyNoContext[] {
28
+ return Array.from(this._registry.values()).flat();
29
+ }
30
+
31
+ hasSchema<S extends Schema.Schema.AnyNoContext>(schema: S): boolean {
32
+ const typename = getSchemaTypename(schema);
33
+ const version = getSchemaVersion(schema);
34
+ invariant(typename, 'Invalid schema');
35
+
36
+ const schemas = this._registry.get(typename);
37
+ return schemas?.some((schema) => getSchemaVersion(schema) === version) ?? false;
38
+ }
39
+
40
+ getSchemaByDXN(dxn: DXN): Schema.Schema.AnyNoContext | undefined {
41
+ const components = dxn.asTypeDXN();
42
+ if (!components) {
43
+ return undefined;
44
+ }
45
+
46
+ const { type, version } = components;
47
+ const allSchemas = this._registry.get(type) ?? [];
48
+ if (version) {
49
+ return allSchemas.find((s) => getSchemaVersion(s) === version);
50
+ } else {
51
+ // If no version is specified, return the earliest version for backwards compatibility.
52
+ // TODO(dmaretskyi): Probably not correct to compare lexicographically, but it's good enough for now.
53
+ return allSchemas.sort((a, b) =>
54
+ (getSchemaVersion(a) ?? '0.0.0').localeCompare(getSchemaVersion(b) ?? '0.0.0'),
55
+ )[0];
56
+ }
57
+ }
58
+
59
+ /**
60
+ * @deprecated Use getSchemaByDXN.
61
+ */
62
+ getSchema(typename: string): Schema.Schema.AnyNoContext | undefined {
63
+ return this._registry.get(typename)?.[0];
64
+ }
65
+
66
+ addSchema(types: readonly Schema.Schema.AnyNoContext[]): void {
67
+ types.forEach((schema) => {
68
+ const typename = getSchemaTypename(schema) ?? raise(new TypeError('Schema has no typename'));
69
+ const version = getSchemaVersion(schema) ?? raise(new TypeError('Schema has no version'));
70
+ const versions = defaultMap(this._registry, typename, () => []);
71
+ if (versions.some((schema) => getSchemaVersion(schema) === version)) {
72
+ throw new Error(`Schema version already registered: ${typename}:${version}`);
73
+ }
74
+
75
+ versions.push(schema);
76
+ });
77
+ }
78
+ }
@@ -0,0 +1,25 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Returns a non-reactive snapshot of the given live object.
7
+ * @deprecated Use `getSnapshot` from `@dxos/live-object` instead.
8
+ */
9
+ // TODO(wittjosiah): Types.
10
+ export const getSnapshot = (object: any): any => {
11
+ if (typeof object !== 'object') {
12
+ return object;
13
+ }
14
+
15
+ if (Array.isArray(object)) {
16
+ return object.map(getSnapshot);
17
+ }
18
+
19
+ const result: any = {};
20
+ for (const key in object) {
21
+ result[key] = getSnapshot(object[key]);
22
+ }
23
+
24
+ return result;
25
+ };
@@ -0,0 +1,58 @@
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 { type ObjectId } from '@dxos/keys';
9
+
10
+ import { type ATTR_META, type ObjectMeta } from './meta';
11
+
12
+ /**
13
+ * Marker interface for object with an `id`.
14
+ */
15
+ export interface HasId {
16
+ readonly id: ObjectId;
17
+ }
18
+
19
+ /**
20
+ * Object that has an associated typename.
21
+ * The typename is retrievable using {@link getTypename}.
22
+ * The object can be used with {@link isInstanceOf} to check if it is an instance of a schema.
23
+ */
24
+ export type HasTypename = {};
25
+
26
+ /**
27
+ * Base type for all data objects (reactive, ECHO, and other raw objects).
28
+ * NOTE: This describes the base type for all database objects.
29
+ * It is stricter than `T extends {}` or `T extends object`.
30
+ */
31
+ // TODO(burdon): Make internal.
32
+ // TODO(burdon): Prefer Record<string, unknown>.
33
+ // TODO(burdon): Exclude "id", etc. from keys.
34
+ export type AnyProperties = Record<string, any>;
35
+
36
+ /**
37
+ * Canonical type for all ECHO objects.
38
+ */
39
+ export interface AnyEchoObject extends HasId, HasTypename {}
40
+
41
+ // TODO(dmaretskyi): Remove; this type effectively disables type safety due to `any`.
42
+ export type WithId<T extends AnyProperties = AnyProperties> = T & HasId;
43
+
44
+ export type ExcludeId<T extends AnyProperties> = Omit<T, 'id'>;
45
+
46
+ export type PropertyKey<T extends AnyProperties> = Extract<keyof ExcludeId<T>, string>;
47
+
48
+ // TODO(dmaretskyi): Remove. This should be using the symbol type.
49
+ export type WithMeta = { [ATTR_META]?: ObjectMeta };
50
+
51
+ /**
52
+ * The raw object should not include the ECHO id, but may include metadata.
53
+ */
54
+ export const RawObject = <S extends Schema.Schema.AnyNoContext>(
55
+ schema: S,
56
+ ): Schema.Schema<ExcludeId<Schema.Schema.Type<S>> & WithMeta, Schema.Schema.Encoded<S>> => {
57
+ return Schema.make(SchemaAST.omit(schema.ast, ['id']));
58
+ };
@@ -0,0 +1,23 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ /**
8
+ * Entity kind.
9
+ */
10
+ const EntityKindId = Symbol.for('@dxos/echo/EntityKind');
11
+
12
+ /**
13
+ * Kinds of entities stored in ECHO: objects and relations.
14
+ */
15
+ export enum EntityKind {
16
+ Object = 'object',
17
+ Relation = 'relation',
18
+ }
19
+
20
+ export const EntityKindSchema = Schema.Enums(EntityKind);
21
+
22
+ export const KindId: unique symbol = EntityKindId as any;
23
+ export type KindId = typeof KindId;