@dxos/echo 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (532) hide show
  1. package/README.md +1 -2
  2. package/dist/lib/neutral/Annotation.mjs +32 -0
  3. package/dist/lib/neutral/Database.mjs +17 -0
  4. package/dist/lib/neutral/Entity.mjs +51 -0
  5. package/dist/lib/neutral/Err.mjs +10 -0
  6. package/dist/lib/neutral/Filter.mjs +61 -0
  7. package/dist/lib/neutral/Format.mjs +66 -0
  8. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  9. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  10. package/dist/lib/neutral/Key.mjs +12 -0
  11. package/dist/lib/neutral/Key.mjs.map +7 -0
  12. package/dist/lib/neutral/Obj.mjs +90 -0
  13. package/dist/lib/neutral/Obj.mjs.map +7 -0
  14. package/dist/lib/neutral/Order.mjs +12 -0
  15. package/dist/lib/neutral/Order.mjs.map +7 -0
  16. package/dist/lib/neutral/Query.mjs +26 -0
  17. package/dist/lib/neutral/Query.mjs.map +7 -0
  18. package/dist/lib/neutral/QueryResult.mjs +2 -0
  19. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  20. package/dist/lib/neutral/Ref.mjs +22 -0
  21. package/dist/lib/neutral/Ref.mjs.map +7 -0
  22. package/dist/lib/neutral/Relation.mjs +84 -0
  23. package/dist/lib/neutral/Relation.mjs.map +7 -0
  24. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  25. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  26. package/dist/lib/neutral/Tag.mjs +25 -0
  27. package/dist/lib/neutral/Tag.mjs.map +7 -0
  28. package/dist/lib/neutral/Type.mjs +47 -0
  29. package/dist/lib/neutral/Type.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-2MTHJ5UW.mjs +203 -0
  31. package/dist/lib/neutral/chunk-2MTHJ5UW.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-3ZEAZF7T.mjs +23 -0
  33. package/dist/lib/neutral/chunk-3ZEAZF7T.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-4L6DOFXP.mjs +7 -0
  35. package/dist/lib/neutral/chunk-4L6DOFXP.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-4TT624YA.mjs +73 -0
  37. package/dist/lib/neutral/chunk-4TT624YA.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-62DWJ6CE.mjs +402 -0
  39. package/dist/lib/neutral/chunk-62DWJ6CE.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-6QPSGMEF.mjs +97 -0
  41. package/dist/lib/neutral/chunk-6QPSGMEF.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
  43. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-CUDIBUM4.mjs +282 -0
  45. package/dist/lib/neutral/chunk-CUDIBUM4.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-HMOXCO27.mjs +40 -0
  47. package/dist/lib/neutral/chunk-HMOXCO27.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-IP2GHXWA.mjs +56 -0
  49. package/dist/lib/neutral/chunk-IP2GHXWA.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  51. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-KRHDMXSU.mjs +132 -0
  53. package/dist/lib/neutral/chunk-KRHDMXSU.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-NWUO5FKZ.mjs +39 -0
  55. package/dist/lib/neutral/chunk-NWUO5FKZ.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
  57. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs +42 -0
  59. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-RPB6V4BE.mjs +38 -0
  61. package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-SU2LVM7J.mjs +3846 -0
  63. package/dist/lib/neutral/chunk-SU2LVM7J.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-VB5HVDCA.mjs +287 -0
  65. package/dist/lib/neutral/chunk-VB5HVDCA.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-VR4A4WGG.mjs +249 -0
  67. package/dist/lib/neutral/chunk-VR4A4WGG.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-X2MPMYYN.mjs +13 -0
  69. package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-XK5OUUBY.mjs +157 -0
  71. package/dist/lib/neutral/chunk-XK5OUUBY.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-XMIDBDE6.mjs +142 -0
  73. package/dist/lib/neutral/chunk-XMIDBDE6.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-YQYMWZAD.mjs +67 -0
  75. package/dist/lib/neutral/chunk-YQYMWZAD.mjs.map +7 -0
  76. package/dist/lib/neutral/index.mjs +84 -0
  77. package/dist/lib/neutral/index.mjs.map +7 -0
  78. package/dist/lib/{node-esm → neutral}/internal/index.mjs +245 -125
  79. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  80. package/dist/lib/neutral/meta.json +1 -0
  81. package/dist/lib/neutral/testing/index.mjs +366 -0
  82. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  83. package/dist/types/src/Annotation.d.ts +2 -0
  84. package/dist/types/src/Annotation.d.ts.map +1 -0
  85. package/dist/types/src/Database.d.ts +194 -0
  86. package/dist/types/src/Database.d.ts.map +1 -0
  87. package/dist/types/src/Entity.d.ts +142 -0
  88. package/dist/types/src/Entity.d.ts.map +1 -0
  89. package/dist/types/src/Entity.test.d.ts +2 -0
  90. package/dist/types/src/Entity.test.d.ts.map +1 -0
  91. package/dist/types/src/{errors.d.ts → Err.d.ts} +23 -31
  92. package/dist/types/src/Err.d.ts.map +1 -0
  93. package/dist/types/src/Filter.d.ts +120 -0
  94. package/dist/types/src/Filter.d.ts.map +1 -0
  95. package/dist/types/src/Format.d.ts +4 -0
  96. package/dist/types/src/Format.d.ts.map +1 -0
  97. package/dist/types/src/Hypergraph.d.ts +60 -0
  98. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  99. package/dist/types/src/JsonSchema.d.ts +9 -0
  100. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  101. package/dist/types/src/Key.d.ts +1 -0
  102. package/dist/types/src/Key.d.ts.map +1 -1
  103. package/dist/types/src/Obj.d.ts +302 -99
  104. package/dist/types/src/Obj.d.ts.map +1 -1
  105. package/dist/types/src/Obj.test.d.ts +2 -0
  106. package/dist/types/src/Obj.test.d.ts.map +1 -0
  107. package/dist/types/src/Order.d.ts +16 -0
  108. package/dist/types/src/Order.d.ts.map +1 -0
  109. package/dist/types/src/Query.d.ts +115 -0
  110. package/dist/types/src/Query.d.ts.map +1 -0
  111. package/dist/types/src/Query.test.d.ts +2 -0
  112. package/dist/types/src/Query.test.d.ts.map +1 -0
  113. package/dist/types/src/QueryResult.d.ts +80 -0
  114. package/dist/types/src/QueryResult.d.ts.map +1 -0
  115. package/dist/types/src/Ref.d.ts +13 -11
  116. package/dist/types/src/Ref.d.ts.map +1 -1
  117. package/dist/types/src/Relation.d.ts +242 -22
  118. package/dist/types/src/Relation.d.ts.map +1 -1
  119. package/dist/types/src/Relation.test.d.ts +2 -0
  120. package/dist/types/src/Relation.test.d.ts.map +1 -0
  121. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  122. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  123. package/dist/types/src/Tag.d.ts +17 -0
  124. package/dist/types/src/Tag.d.ts.map +1 -0
  125. package/dist/types/src/Type.d.ts +225 -72
  126. package/dist/types/src/Type.d.ts.map +1 -1
  127. package/dist/types/src/Type.test.d.ts +2 -0
  128. package/dist/types/src/Type.test.d.ts.map +1 -0
  129. package/dist/types/src/index.d.ts +15 -5
  130. package/dist/types/src/index.d.ts.map +1 -1
  131. package/dist/types/src/internal/annotations/annotations.d.ts +170 -0
  132. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  133. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  134. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  135. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  136. package/dist/types/src/internal/annotations/util.d.ts +27 -0
  137. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  138. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  139. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  140. package/dist/types/src/internal/api/entity.d.ts +13 -0
  141. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  142. package/dist/types/src/internal/api/index.d.ts +15 -0
  143. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  144. package/dist/types/src/internal/api/meta.d.ts +42 -0
  145. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  146. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  147. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  148. package/dist/types/src/internal/api/version.d.ts +42 -0
  149. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  150. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  151. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  152. package/dist/types/src/internal/entities/index.d.ts +6 -0
  153. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  154. package/dist/types/src/internal/entities/model.d.ts +77 -0
  155. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  156. package/dist/types/src/internal/entities/object.d.ts +18 -0
  157. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  158. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  159. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  160. package/dist/types/src/internal/entities/util.d.ts +2 -0
  161. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  162. package/dist/types/src/internal/formats/format.d.ts +4 -2
  163. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  164. package/dist/types/src/internal/formats/select.d.ts +6 -4
  165. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  166. package/dist/types/src/internal/formats/string.d.ts +4 -0
  167. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  168. package/dist/types/src/internal/formats/types.d.ts +13 -9
  169. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  170. package/dist/types/src/internal/index.d.ts +7 -10
  171. package/dist/types/src/internal/index.d.ts.map +1 -1
  172. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  173. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  174. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  175. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  176. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  177. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  178. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  179. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +4 -2
  180. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  181. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  182. package/dist/types/src/internal/object/clone.d.ts +8 -0
  183. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  184. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  185. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +10 -11
  186. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  187. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  188. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  189. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  190. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  191. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  192. package/dist/types/src/internal/object/index.d.ts +6 -11
  193. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  194. package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
  195. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  196. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  197. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  198. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  199. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  200. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  201. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  202. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  203. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  204. package/dist/types/src/internal/object/typed-object.d.ts +8 -14
  205. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  206. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  207. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  208. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  209. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  210. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  211. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  212. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  213. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  214. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  215. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  216. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  217. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  218. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  219. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  220. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  221. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  222. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  223. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  224. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  225. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  226. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  227. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  228. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  229. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  230. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  231. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  232. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  233. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  234. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  235. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  236. package/dist/types/src/internal/proxy/typed-handler.d.ts +15 -12
  237. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  238. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  239. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  240. package/dist/types/src/internal/ref/ref.d.ts +29 -17
  241. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  242. package/dist/types/src/internal/schema/compose.d.ts +7 -0
  243. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  244. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  245. package/dist/types/src/internal/schema/echo-schema.d.ts +24 -12
  246. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  247. package/dist/types/src/internal/schema/index.d.ts +1 -4
  248. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  249. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  250. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  251. package/dist/types/src/internal/types/base.d.ts +26 -0
  252. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  253. package/dist/types/src/internal/types/entity.d.ts +37 -0
  254. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  255. package/dist/types/src/internal/types/index.d.ts +5 -2
  256. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  257. package/dist/types/src/internal/{object → types}/meta.d.ts +17 -16
  258. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  259. package/dist/types/src/internal/types/typename.d.ts +13 -0
  260. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  261. package/dist/types/src/internal/{object → types}/version.d.ts +3 -2
  262. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  263. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  264. package/dist/types/src/testing/index.d.ts +3 -3
  265. package/dist/types/src/testing/index.d.ts.map +1 -1
  266. package/dist/types/src/testing/test-data.d.ts +18 -0
  267. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  268. package/dist/types/src/testing/test-schema.d.ts +303 -0
  269. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  270. package/dist/types/src/testing/util.d.ts +21 -0
  271. package/dist/types/src/testing/util.d.ts.map +1 -0
  272. package/dist/types/tsconfig.tsbuildinfo +1 -1
  273. package/package.json +101 -65
  274. package/src/Annotation.ts +18 -0
  275. package/src/Database.ts +336 -0
  276. package/src/Entity.test.ts +22 -0
  277. package/src/Entity.ts +217 -0
  278. package/src/{errors.ts → Err.ts} +2 -2
  279. package/src/Filter.ts +376 -0
  280. package/src/Format.ts +9 -0
  281. package/src/Hypergraph.ts +74 -0
  282. package/src/JsonSchema.ts +16 -0
  283. package/src/Key.ts +3 -0
  284. package/src/Obj.test.ts +386 -0
  285. package/src/Obj.ts +449 -275
  286. package/src/Order.ts +44 -0
  287. package/src/Query.test.ts +465 -0
  288. package/src/Query.ts +296 -0
  289. package/src/QueryResult.ts +106 -0
  290. package/src/Ref.ts +26 -9
  291. package/src/Relation.test.ts +82 -0
  292. package/src/Relation.ts +411 -60
  293. package/src/SchemaRegistry.ts +105 -0
  294. package/src/{query/tag.ts → Tag.ts} +10 -7
  295. package/src/Type.test.ts +52 -0
  296. package/src/Type.ts +361 -114
  297. package/src/index.ts +16 -6
  298. package/src/internal/README.md +102 -0
  299. package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
  300. package/src/internal/annotations/annotations.ts +460 -0
  301. package/src/internal/annotations/index.ts +6 -0
  302. package/src/internal/annotations/util.ts +72 -0
  303. package/src/internal/api/annotations.ts +60 -0
  304. package/src/internal/api/entity.ts +29 -0
  305. package/src/internal/api/index.ts +19 -0
  306. package/src/internal/api/meta.ts +88 -0
  307. package/src/internal/api/sorting.ts +53 -0
  308. package/src/internal/api/version.ts +96 -0
  309. package/src/internal/entities/entity.ts +126 -0
  310. package/src/internal/entities/index.ts +9 -0
  311. package/src/internal/entities/model.ts +134 -0
  312. package/src/internal/entities/object.ts +58 -0
  313. package/src/internal/entities/relation.ts +171 -0
  314. package/src/internal/entities/util.ts +33 -0
  315. package/src/internal/formats/date.test.ts +1 -1
  316. package/src/internal/formats/date.ts +5 -5
  317. package/src/internal/formats/format.test.ts +6 -6
  318. package/src/internal/formats/format.ts +8 -6
  319. package/src/internal/formats/number.ts +5 -5
  320. package/src/internal/formats/object.ts +4 -4
  321. package/src/internal/formats/select.ts +6 -4
  322. package/src/internal/formats/string.ts +14 -9
  323. package/src/internal/formats/types.ts +53 -42
  324. package/src/internal/index.ts +30 -13
  325. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  326. package/src/internal/json-schema/index.ts +2 -0
  327. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  328. package/src/internal/json-schema/json-schema-type.ts +35 -35
  329. package/src/internal/{json → json-schema}/json-schema.test.ts +73 -69
  330. package/src/internal/{json → json-schema}/json-schema.ts +27 -14
  331. package/src/internal/object/clone.ts +48 -0
  332. package/src/internal/object/common.ts +3 -4
  333. package/src/internal/object/{create.test.ts → create-object.test.ts} +31 -33
  334. package/src/internal/object/{create.ts → create-object.ts} +36 -37
  335. package/src/internal/object/deleted.ts +6 -6
  336. package/src/internal/object/ids.ts +1 -1
  337. package/src/internal/object/index.ts +6 -11
  338. package/src/internal/object/inspect.ts +5 -7
  339. package/src/internal/object/json-serializer.test.ts +36 -37
  340. package/src/internal/object/json-serializer.ts +65 -102
  341. package/src/internal/object/schema-validator.test.ts +3 -7
  342. package/src/internal/object/schema-validator.ts +2 -237
  343. package/src/internal/object/set-value.test.ts +281 -0
  344. package/src/internal/object/set-value.ts +165 -0
  345. package/src/internal/object/snapshot.ts +70 -0
  346. package/src/internal/object/typed-object.test.ts +11 -11
  347. package/src/internal/object/typed-object.ts +8 -66
  348. package/src/internal/proxy/change-context.ts +138 -0
  349. package/src/internal/proxy/change.test.ts +519 -0
  350. package/src/internal/proxy/define-hidden-property.ts +14 -0
  351. package/src/internal/proxy/errors.ts +42 -0
  352. package/src/internal/proxy/event-batch.ts +44 -0
  353. package/src/internal/proxy/handler.test.ts +51 -91
  354. package/src/internal/proxy/index.ts +17 -0
  355. package/src/internal/proxy/json-serializer.ts +87 -0
  356. package/src/internal/proxy/make-object.ts +96 -0
  357. package/src/internal/proxy/ownership.ts +253 -0
  358. package/src/internal/proxy/proxy-types.ts +23 -0
  359. package/src/internal/proxy/proxy-utils.ts +150 -0
  360. package/src/internal/proxy/reactive-array.ts +71 -0
  361. package/src/internal/proxy/reactive.ts +69 -0
  362. package/src/internal/proxy/schema-validator.ts +244 -0
  363. package/src/internal/proxy/schema.test.ts +27 -18
  364. package/src/internal/proxy/symbols.ts +7 -0
  365. package/src/internal/proxy/typed-handler.test.ts +260 -48
  366. package/src/internal/proxy/typed-handler.ts +275 -61
  367. package/src/internal/proxy/typed-object.test.ts +54 -38
  368. package/src/internal/ref/ref-array.ts +4 -4
  369. package/src/internal/ref/ref.test.ts +10 -9
  370. package/src/internal/ref/ref.ts +83 -55
  371. package/src/internal/{projection → schema}/compose.test.ts +8 -9
  372. package/src/internal/{projection → schema}/compose.ts +13 -8
  373. package/src/internal/schema/echo-schema.ts +73 -33
  374. package/src/internal/schema/index.ts +1 -4
  375. package/src/internal/schema/manipulation.ts +1 -1
  376. package/src/internal/schema/persistent-schema.ts +27 -0
  377. package/src/internal/types/base.ts +43 -0
  378. package/src/internal/types/entity.ts +54 -0
  379. package/src/internal/types/index.ts +5 -2
  380. package/src/internal/types/meta.ts +65 -0
  381. package/src/internal/types/typename.ts +45 -0
  382. package/src/internal/types/version.ts +20 -0
  383. package/src/testing/api.test.ts +126 -0
  384. package/src/testing/index.ts +3 -3
  385. package/src/testing/test-data.ts +130 -0
  386. package/src/testing/test-schema.ts +238 -0
  387. package/src/testing/util.ts +85 -0
  388. package/dist/lib/browser/chunk-JUTFUT73.mjs +0 -175
  389. package/dist/lib/browser/chunk-JUTFUT73.mjs.map +0 -7
  390. package/dist/lib/browser/chunk-KEBVBR65.mjs +0 -3727
  391. package/dist/lib/browser/chunk-KEBVBR65.mjs.map +0 -7
  392. package/dist/lib/browser/chunk-WO76TDT6.mjs +0 -814
  393. package/dist/lib/browser/chunk-WO76TDT6.mjs.map +0 -7
  394. package/dist/lib/browser/index.mjs +0 -35
  395. package/dist/lib/browser/internal/index.mjs +0 -336
  396. package/dist/lib/browser/meta.json +0 -1
  397. package/dist/lib/browser/query/index.mjs +0 -15
  398. package/dist/lib/browser/testing/index.mjs +0 -283
  399. package/dist/lib/browser/testing/index.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-DWZYQ2UR.mjs +0 -3727
  401. package/dist/lib/node-esm/chunk-DWZYQ2UR.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-KBD3A2I6.mjs +0 -175
  403. package/dist/lib/node-esm/chunk-KBD3A2I6.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-ZSSII3JW.mjs +0 -814
  405. package/dist/lib/node-esm/chunk-ZSSII3JW.mjs.map +0 -7
  406. package/dist/lib/node-esm/index.mjs +0 -35
  407. package/dist/lib/node-esm/meta.json +0 -1
  408. package/dist/lib/node-esm/query/index.mjs +0 -15
  409. package/dist/lib/node-esm/testing/index.mjs +0 -283
  410. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  411. package/dist/types/src/errors.d.ts.map +0 -1
  412. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  413. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  414. package/dist/types/src/internal/ast/annotations.d.ts +0 -131
  415. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  416. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  417. package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
  418. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  419. package/dist/types/src/internal/ast/index.d.ts +0 -5
  420. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  421. package/dist/types/src/internal/ast/types.d.ts +0 -6
  422. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  423. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  424. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  425. package/dist/types/src/internal/json/index.d.ts +0 -2
  426. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  427. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  428. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  429. package/dist/types/src/internal/object/accessors.d.ts +0 -37
  430. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  431. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  432. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  433. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  434. package/dist/types/src/internal/object/entity.d.ts +0 -33
  435. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  436. package/dist/types/src/internal/object/expando.d.ts +0 -14
  437. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  438. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  439. package/dist/types/src/internal/object/model.d.ts +0 -117
  440. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  441. package/dist/types/src/internal/object/relation.d.ts +0 -17
  442. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  443. package/dist/types/src/internal/object/typename.d.ts +0 -15
  444. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  445. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  446. package/dist/types/src/internal/projection/compose.d.ts +0 -6
  447. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  448. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  449. package/dist/types/src/internal/projection/index.d.ts +0 -2
  450. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  451. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  452. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  453. package/dist/types/src/internal/query/index.d.ts +0 -2
  454. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  455. package/dist/types/src/internal/query/query.d.ts +0 -17
  456. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  457. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  458. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  459. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  460. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  461. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  462. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  463. package/dist/types/src/internal/testing/index.d.ts +0 -3
  464. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  465. package/dist/types/src/internal/testing/types.d.ts +0 -455
  466. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  467. package/dist/types/src/internal/testing/utils.d.ts +0 -10
  468. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  469. package/dist/types/src/internal/types/types.d.ts +0 -79
  470. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  471. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  472. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  473. package/dist/types/src/internal/types/util.d.ts +0 -5
  474. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  475. package/dist/types/src/query/index.d.ts +0 -3
  476. package/dist/types/src/query/index.d.ts.map +0 -1
  477. package/dist/types/src/query/query.d.ts +0 -248
  478. package/dist/types/src/query/query.d.ts.map +0 -1
  479. package/dist/types/src/query/query.test.d.ts +0 -2
  480. package/dist/types/src/query/query.test.d.ts.map +0 -1
  481. package/dist/types/src/query/tag.d.ts +0 -17
  482. package/dist/types/src/query/tag.d.ts.map +0 -1
  483. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  484. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  485. package/dist/types/src/testing/types.d.ts +0 -113
  486. package/dist/types/src/testing/types.d.ts.map +0 -1
  487. package/src/internal/ast/annotation-helper.ts +0 -22
  488. package/src/internal/ast/annotations.ts +0 -226
  489. package/src/internal/ast/entity-kind.ts +0 -15
  490. package/src/internal/ast/index.ts +0 -8
  491. package/src/internal/ast/types.ts +0 -17
  492. package/src/internal/json/index.ts +0 -5
  493. package/src/internal/object/accessors.ts +0 -153
  494. package/src/internal/object/entity.ts +0 -248
  495. package/src/internal/object/expando.ts +0 -21
  496. package/src/internal/object/meta.ts +0 -61
  497. package/src/internal/object/model.ts +0 -170
  498. package/src/internal/object/relation.ts +0 -24
  499. package/src/internal/object/typename.ts +0 -61
  500. package/src/internal/object/version.ts +0 -22
  501. package/src/internal/projection/index.ts +0 -5
  502. package/src/internal/proxy/reactive-object.ts +0 -108
  503. package/src/internal/query/index.ts +0 -5
  504. package/src/internal/query/query.ts +0 -23
  505. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  506. package/src/internal/schema/snapshot.ts +0 -25
  507. package/src/internal/schema/stored-schema.ts +0 -26
  508. package/src/internal/testing/index.ts +0 -6
  509. package/src/internal/testing/types.ts +0 -211
  510. package/src/internal/testing/utils.ts +0 -54
  511. package/src/internal/types/types.test.ts +0 -48
  512. package/src/internal/types/types.ts +0 -176
  513. package/src/internal/types/util.ts +0 -9
  514. package/src/query/index.ts +0 -6
  515. package/src/query/query.test.ts +0 -401
  516. package/src/query/query.ts +0 -789
  517. package/src/test/api.test.ts +0 -180
  518. package/src/testing/echo-schema.ts +0 -39
  519. package/src/testing/types.ts +0 -91
  520. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  521. /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
  522. /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
  523. /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
  524. /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Filter.mjs.map} +0 -0
  525. /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Format.mjs.map} +0 -0
  526. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  527. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  528. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  529. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  530. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  531. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  532. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
@@ -8,10 +8,11 @@ import * as SchemaAST from 'effect/SchemaAST';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { type ObjectId } from '@dxos/keys';
10
10
 
11
- import { type SchemaMeta, SchemaMetaSymbol, type TypeAnnotation, getTypeAnnotation } from '../ast';
12
- import { toEffectSchema, toJsonSchema } from '../json';
13
- import { type JsonSchemaType } from '../json-schema';
14
- import { type TypedObject, type TypedObjectPrototype } from '../object';
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, getSnapshot } from '../object';
14
+ import { ChangeId } from '../proxy';
15
+ import { EntityKind, SchemaKindId } from '../types';
15
16
 
16
17
  import {
17
18
  addFieldsToSchema,
@@ -20,14 +21,14 @@ import {
20
21
  updateFieldNameInSchema,
21
22
  updateFieldsInSchema,
22
23
  } from './manipulation';
23
- import { getSnapshot } from './snapshot';
24
- import { StoredSchema } from './stored-schema';
24
+ import { PersistentSchema } from './persistent-schema';
25
25
 
26
26
  /**
27
27
  * Base schema type.
28
28
  */
29
29
  // TODO(burdon): Merge with ImmutableSchema.
30
30
  export interface BaseSchema<A = any, I = any> extends TypedObject<A, I> {
31
+ // TODO(burdon): Different from mutable?
31
32
  get readonly(): boolean;
32
33
  // TODO(burdon): Change to external function.
33
34
  get mutable(): EchoSchema<A, I>;
@@ -83,6 +84,10 @@ export class ImmutableSchema<A = any, I = any> implements BaseSchema<A, I> {
83
84
  // TypedObject
84
85
  //
85
86
 
87
+ get kind(): EntityKind {
88
+ return this._objectAnnotation.kind;
89
+ }
90
+
86
91
  get typename(): string {
87
92
  return this._objectAnnotation.typename;
88
93
  }
@@ -124,8 +129,10 @@ const EchoSchemaConstructor = (): TypedObjectPrototype => {
124
129
  */
125
130
  return class {
126
131
  private static get _schema() {
127
- // The field is DynamicEchoSchema in runtime, but is serialized as StoredEchoSchema in automerge.
128
- return Schema.Union(StoredSchema, Schema.instanceOf(EchoSchema)).annotations(StoredSchema.ast.annotations);
132
+ // The field is DynamicEchoSchema in runtime, but is serialized as PersisentSchema in automerge.
133
+ return Schema.Union(PersistentSchema, Schema.instanceOf(EchoSchema)).annotations(
134
+ PersistentSchema.ast.annotations,
135
+ );
129
136
  }
130
137
 
131
138
  static readonly [Schema.TypeId] = schemaVariance;
@@ -159,7 +166,7 @@ const schemaVariance = {
159
166
  };
160
167
 
161
168
  /**
162
- * Represents a schema that is stored in the ECHO database.
169
+ * Represents a schema that is persisted in the ECHO database.
163
170
  * Schema can me mutable or readonly (specified by the {@link EchoSchema.readonly} field).
164
171
  *
165
172
  * Schema that can be modified at runtime via the API.
@@ -170,20 +177,26 @@ const schemaVariance = {
170
177
  *
171
178
  * @example
172
179
  * ```ts
173
- * export class TableType extends Schema.Struct({...}).pipe(Type.Obj({ typename: 'example.org/type/Table', version: '0.1.0' })){
180
+ * export class TableType extends Schema.Struct({...}).pipe(Type.object({ typename: 'example.org/type/Table', version: '0.1.0' })){
174
181
  * title: Schema.String,
175
182
  * schema: Schema.optional(ref(EchoSchema)),
176
183
  * props: Schema.mutable(S.Array(TablePropSchema)),
177
184
  * }) {}
178
185
  * ```
179
186
  *
180
- * The ECHO API will translate any references to StoredSchema objects to be resolved as EchoSchema objects.
187
+ * The ECHO API will translate any references to PersistentSchema objects to be resolved as EchoSchema objects.
181
188
  */
182
189
  export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implements BaseSchema<A, I> {
183
190
  private _schema: Schema.Schema.AnyNoContext | undefined;
184
191
  private _isDirty = true;
185
192
 
186
- constructor(private readonly _storedSchema: StoredSchema) {
193
+ /**
194
+ * Schema kind key that marks this as an ECHO schema.
195
+ * Makes EchoSchema satisfy the Type.Obj.Any type.
196
+ */
197
+ readonly [SchemaKindId]: EntityKind.Object = EntityKind.Object;
198
+
199
+ constructor(private readonly _persistentSchema: PersistentSchema) {
187
200
  super();
188
201
  }
189
202
 
@@ -196,11 +209,11 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
196
209
  }
197
210
 
198
211
  public get Type() {
199
- return this._storedSchema as A;
212
+ return this._persistentSchema as A;
200
213
  }
201
214
 
202
215
  public get Encoded() {
203
- return this._storedSchema as I;
216
+ return this._persistentSchema as I;
204
217
  }
205
218
 
206
219
  public get Context() {
@@ -227,12 +240,17 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
227
240
  // BaseSchema
228
241
  //
229
242
 
243
+ public get kind(): EntityKind.Object {
244
+ // Dynamic schemas are always object schemas.
245
+ return EntityKind.Object;
246
+ }
247
+
230
248
  public get typename(): string {
231
- return this._storedSchema.typename;
249
+ return this._persistentSchema.typename;
232
250
  }
233
251
 
234
252
  public get version(): string {
235
- return this._storedSchema.version;
253
+ return this._persistentSchema.version;
236
254
  }
237
255
 
238
256
  public get readonly(): boolean {
@@ -247,10 +265,10 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
247
265
  }
248
266
 
249
267
  /**
250
- * @reactive
268
+ * Returns the JSON schema for the schema.
251
269
  */
252
270
  public get jsonSchema(): JsonSchemaType {
253
- return this._storedSchema.jsonSchema;
271
+ return this._persistentSchema.jsonSchema;
254
272
  }
255
273
 
256
274
  /**
@@ -269,25 +287,25 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
269
287
  * Id of the ECHO object containing the schema.
270
288
  */
271
289
  public get id(): ObjectId {
272
- return this._storedSchema.id;
290
+ return this._persistentSchema.id;
273
291
  }
274
292
 
275
293
  /**
276
294
  * Short name of the schema.
277
295
  */
278
296
  public get name(): string | undefined {
279
- return this._storedSchema.name;
297
+ return this._persistentSchema.name;
280
298
  }
281
299
 
282
300
  public get [SchemaMetaSymbol](): SchemaMeta {
283
- return { id: this.id, typename: this.typename, version: this._storedSchema.version };
301
+ return { id: this.id, typename: this.typename, version: this._persistentSchema.version };
284
302
  }
285
303
 
286
304
  /**
287
- * Reference to the underlying stored schema object.
305
+ * Reference to the underlying persistent schema object.
288
306
  */
289
- public get storedSchema(): StoredSchema {
290
- return this._storedSchema;
307
+ public get persistentSchema(): PersistentSchema {
308
+ return this._persistentSchema;
291
309
  }
292
310
 
293
311
  public getProperties(): SchemaAST.PropertySignature[] {
@@ -307,8 +325,10 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
307
325
  */
308
326
  public updateTypename(typename: string): void {
309
327
  const updated = setTypenameInSchema(this._getSchema(), typename);
310
- this._storedSchema.typename = typename;
311
- this._storedSchema.jsonSchema = toJsonSchema(updated);
328
+ this._change((schema) => {
329
+ schema.typename = typename;
330
+ schema.jsonSchema = toJsonSchema(updated);
331
+ });
312
332
  }
313
333
 
314
334
  /**
@@ -316,7 +336,9 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
316
336
  */
317
337
  public addFields(fields: Schema.Struct.Fields): void {
318
338
  const extended = addFieldsToSchema(this._getSchema(), fields);
319
- this._storedSchema.jsonSchema = toJsonSchema(extended);
339
+ this._change((schema) => {
340
+ schema.jsonSchema = toJsonSchema(extended);
341
+ });
320
342
  }
321
343
 
322
344
  /**
@@ -324,7 +346,9 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
324
346
  */
325
347
  public updateFields(fields: Schema.Struct.Fields): void {
326
348
  const updated = updateFieldsInSchema(this._getSchema(), fields);
327
- this._storedSchema.jsonSchema = toJsonSchema(updated);
349
+ this._change((schema) => {
350
+ schema.jsonSchema = toJsonSchema(updated);
351
+ });
328
352
  }
329
353
 
330
354
  /**
@@ -332,7 +356,9 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
332
356
  */
333
357
  public updateFieldPropertyName({ before, after }: { before: PropertyKey; after: PropertyKey }): void {
334
358
  const renamed = updateFieldNameInSchema(this._getSchema(), { before, after });
335
- this._storedSchema.jsonSchema = toJsonSchema(renamed);
359
+ this._change((schema) => {
360
+ schema.jsonSchema = toJsonSchema(renamed);
361
+ });
336
362
  }
337
363
 
338
364
  /**
@@ -340,7 +366,21 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
340
366
  */
341
367
  public removeFields(fieldNames: string[]): void {
342
368
  const removed = removeFieldsFromSchema(this._getSchema(), fieldNames);
343
- this._storedSchema.jsonSchema = toJsonSchema(removed);
369
+ this._change((schema) => {
370
+ schema.jsonSchema = toJsonSchema(removed);
371
+ });
372
+ }
373
+
374
+ /**
375
+ * Wrapper for Obj.change that handles the change context for the persistent schema.
376
+ */
377
+ private _change(callback: (schema: PersistentSchema) => void): void {
378
+ const changeFn = (this._persistentSchema as any)[ChangeId];
379
+ if (changeFn) {
380
+ changeFn(callback);
381
+ } else {
382
+ callback(this._persistentSchema);
383
+ }
344
384
  }
345
385
 
346
386
  //
@@ -348,7 +388,7 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
348
388
  //
349
389
 
350
390
  /**
351
- * Called by EchoSchemaRegistry on update.
391
+ * Called by DatabaseSchemaRegistry on update.
352
392
  */
353
393
  _invalidate(): void {
354
394
  this._isDirty = true;
@@ -359,12 +399,12 @@ export class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implem
359
399
  */
360
400
  _rebuild(): void {
361
401
  if (this._isDirty || this._schema == null) {
362
- this._schema = toEffectSchema(getSnapshot(this._storedSchema.jsonSchema));
402
+ this._schema = toEffectSchema(getSnapshot(this._persistentSchema.jsonSchema));
363
403
  this._isDirty = false;
364
404
  }
365
405
  }
366
406
 
367
- private _getSchema(): Schema.Schema.AnyNoContext {
407
+ _getSchema(): Schema.Schema.AnyNoContext {
368
408
  this._rebuild();
369
409
  return this._schema!;
370
410
  }
@@ -3,8 +3,5 @@
3
3
  //
4
4
 
5
5
  export * from './echo-schema';
6
- export * from './snapshot';
7
- export * from './stored-schema';
8
- export * from './runtime-schema-registry';
9
6
  export * from './manipulation';
10
- export * from './echo-schema';
7
+ export * from './persistent-schema';
@@ -8,7 +8,7 @@ import * as SchemaAST from 'effect/SchemaAST';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { DXN } from '@dxos/keys';
10
10
 
11
- import { type TypeAnnotation, TypeAnnotationId, TypeIdentifierAnnotationId } from '../ast';
11
+ import { type TypeAnnotation, TypeAnnotationId, TypeIdentifierAnnotationId } from '../annotations';
12
12
 
13
13
  // TODO(ZaymonFC): Do this one at a time. This might be dangerous.
14
14
  export const addFieldsToSchema = (
@@ -0,0 +1,27 @@
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
+ export const PersistentSchema = 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
+
27
+ export interface PersistentSchema extends Schema.Schema.Type<typeof PersistentSchema> {}
@@ -0,0 +1,43 @@
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
+ * Base type for all data objects (reactive, ECHO, and other raw objects).
14
+ * NOTE: This describes the base type for all database objects.
15
+ * It is stricter than `T extends {}` or `T extends object`.
16
+ */
17
+ // TODO(burdon): Make internal.
18
+ // TODO(burdon): Prefer Record<string, unknown>.
19
+ export type AnyProperties = Record<string, any>;
20
+
21
+ /**
22
+ * Canonical type for all ECHO entities (objects and relations).
23
+ */
24
+ // TODO(wittjosiah): Remove. Prefer higher level types (e.g. Entity.Unknown).
25
+ export interface AnyEntity {
26
+ readonly id: ObjectId;
27
+ }
28
+
29
+ export type ExcludeId<T extends AnyProperties> = Omit<T, 'id'>;
30
+
31
+ export type PropertyKey<T extends AnyProperties> = Extract<keyof ExcludeId<T>, string>;
32
+
33
+ // TODO(dmaretskyi): Remove. This should be using the symbol type.
34
+ type WithMeta = { [ATTR_META]?: ObjectMeta };
35
+
36
+ /**
37
+ * The raw object should not include the ECHO id, but may include metadata.
38
+ */
39
+ export const RawObject = <S extends Schema.Schema.AnyNoContext>(
40
+ schema: S,
41
+ ): Schema.Schema<ExcludeId<Schema.Schema.Type<S>> & WithMeta, Schema.Schema.Encoded<S>> => {
42
+ return Schema.make(SchemaAST.omit(schema.ast, ['id']));
43
+ };
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ // NOTE: String literals are used instead of unique symbols for both KindId and SchemaKindId.
8
+ // Unique symbols cause TS4023 "cannot be named" errors when external packages
9
+ // try to export types that reference this key (e.g., `export const Graph = ...`).
10
+ // TypeScript cannot emit declaration files that reference unique symbols from
11
+ // external modules. Using a string literal allows the type to be inlined in
12
+ // declaration files, making the API portable across package boundaries.
13
+
14
+ /**
15
+ * String key used to identify the kind of an entity instance (object or relation).
16
+ */
17
+ export const KindId = '~@dxos/echo/Kind' as const;
18
+ export type KindId = typeof KindId;
19
+
20
+ /**
21
+ * String key used to identify the kind of a schema (object schema or relation schema).
22
+ * Parallels KindId which identifies instance kinds.
23
+ */
24
+ export const SchemaKindId = '~@dxos/echo/SchemaKind' as const;
25
+ export type SchemaKindId = typeof SchemaKindId;
26
+
27
+ /**
28
+ * String key used to brand snapshot types.
29
+ * Snapshots have SnapshotKindId instead of KindId, making them
30
+ * distinguishable from reactive objects at the type level.
31
+ */
32
+ export const SnapshotKindId = '~@dxos/echo/SnapshotKind' as const;
33
+ export type SnapshotKindId = typeof SnapshotKindId;
34
+
35
+ /**
36
+ * Kinds of entities stored in ECHO: objects and relations.
37
+ */
38
+ export enum EntityKind {
39
+ Object = 'object',
40
+ Relation = 'relation',
41
+ }
42
+
43
+ export const EntityKindSchema = Schema.Enums(EntityKind);
44
+
45
+ /**
46
+ * Typename for generic object references (Type.Obj / Type.Ref(Type.Obj)).
47
+ * Used when referencing any object without a specific schema.
48
+ */
49
+ export const ANY_OBJECT_TYPENAME = 'dxos.org/schema/AnyObject';
50
+
51
+ /**
52
+ * Version for generic object references.
53
+ */
54
+ export const ANY_OBJECT_VERSION = '0.0.0';
@@ -2,5 +2,8 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './types';
6
- export type * from './util';
5
+ export * from './base';
6
+ export * from './entity';
7
+ export * from './meta';
8
+ export * from './typename';
9
+ export * from './version';
@@ -0,0 +1,65 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { ForeignKey } from '@dxos/echo-protocol';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { type Comparator, intersection } from '@dxos/util';
10
+
11
+ import { type AnyProperties } from './base';
12
+
13
+ /**
14
+ * Property name for meta when object is serialized to JSON.
15
+ */
16
+ export const ATTR_META = '@meta';
17
+
18
+ /**
19
+ * Metadata section.
20
+ */
21
+ export const MetaId = Symbol.for('@dxos/echo/Meta');
22
+
23
+ //
24
+ // ObjectMeta
25
+ //
26
+
27
+ // TODO(dmaretskyi): Rename to ObjectMeta
28
+ export const ObjectMetaSchema = Schema.Struct({
29
+ keys: Schema.Array(ForeignKey),
30
+
31
+ /**
32
+ * A set of tags.
33
+ * Tags are arbitrary application-defined strings.
34
+ * ECHO makes no assumptions about the tag structure.
35
+ */
36
+ // TODO(dmaretskyi): Has to be optional for compatibility with old data.
37
+ // Defaulting to an empty array is possible but requires a bit more work.
38
+ tags: Schema.optional(Schema.Array(Schema.String)),
39
+ });
40
+
41
+ export type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;
42
+
43
+ /*
44
+ * Get metadata from object.
45
+ * Only callable on the object root.
46
+ *
47
+ * @internal (use Obj.getMeta or Relation.getMeta)
48
+ */
49
+ // TODO(burdon): Refine type to BaseObj.
50
+ export const getMeta = (obj: AnyProperties): ObjectMeta => {
51
+ const metadata = (obj as any)[MetaId];
52
+ invariant(metadata, 'ObjectMeta not found.');
53
+ return metadata;
54
+ };
55
+
56
+ //
57
+ // Foreign keys
58
+ //
59
+
60
+ export const foreignKey = (source: string, id: string): ForeignKey => ({ source, id });
61
+ export const foreignKeyEquals = (a: ForeignKey, b: ForeignKey) => a.source === b.source && a.id === b.id;
62
+
63
+ // TODO(dmaretskyi): Move to echo-schema.
64
+ export const compareForeignKeys: Comparator<AnyProperties> = (a: AnyProperties, b: AnyProperties) =>
65
+ intersection(getMeta(a).keys, getMeta(b).keys, foreignKeyEquals).length > 0;
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import type * as Schema from 'effect/Schema';
6
+
7
+ /**
8
+ * Property name for typename when object is serialized to JSON.
9
+ */
10
+ export const ATTR_TYPE = '@type';
11
+
12
+ /**
13
+ * DXN to the object type.
14
+ */
15
+ export const TypeId = Symbol.for('@dxos/echo/Type');
16
+
17
+ /**
18
+ * Reference to the object schema.
19
+ */
20
+ export const SchemaId = Symbol.for('@dxos/echo/Schema');
21
+
22
+ /**
23
+ * Returns the schema for the given object if one is defined.
24
+ *
25
+ * @internal (Use Obj.getSchema)
26
+ */
27
+ // TODO(burdon): Narrow type.
28
+ // TODO(dmaretskyi): For echo objects, this always returns the root schema.
29
+ export const getSchema = (obj: unknown | undefined): Schema.Schema.AnyNoContext | undefined => {
30
+ if (obj) {
31
+ return (obj as any)[SchemaId];
32
+ }
33
+ };
34
+
35
+ /**
36
+ * @internal
37
+ */
38
+ export const setSchema = (obj: any, schema: Schema.Schema.AnyNoContext): void => {
39
+ Object.defineProperty(obj, SchemaId, {
40
+ value: schema,
41
+ writable: false,
42
+ enumerable: false,
43
+ configurable: false,
44
+ });
45
+ };
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Version type symbol.
7
+ */
8
+ export const VersionTypeId: unique symbol = Symbol.for('@dxos/echo/VersionTypeId');
9
+
10
+ export type VersionTypeId = typeof VersionTypeId;
11
+
12
+ /**
13
+ * Represents the object version.
14
+ * May be backed by Automerge.
15
+ * Objects with no history are not versioned.
16
+ */
17
+ export interface Version {
18
+ [VersionTypeId]: {};
19
+ automergeHeads?: string[];
20
+ }
@@ -0,0 +1,126 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { describe, test } from 'vitest';
7
+
8
+ import { raise } from '@dxos/debug';
9
+
10
+ import { Entity, Obj, Ref, Relation, Type } from '../index';
11
+
12
+ import { TestSchema } from './test-schema';
13
+
14
+ describe('Experimental API review', () => {
15
+ test('type checks', ({ expect }) => {
16
+ const contact = Obj.make(TestSchema.Person, { name: 'Test' });
17
+ const schema = Obj.getSchema(contact) ?? raise(new Error('No schema found'));
18
+
19
+ expect(Type.getDXN(schema)?.typename).to.eq(TestSchema.Person.typename);
20
+ expect(Type.getTypename(schema)).to.eq('example.com/type/Person');
21
+ expect(Type.getVersion(schema)).to.eq('0.1.0');
22
+ expect(Type.getMeta(schema)).to.deep.eq({
23
+ kind: Entity.Kind.Object,
24
+ typename: 'example.com/type/Person',
25
+ version: '0.1.0',
26
+ });
27
+ });
28
+
29
+ test('instance checks', ({ expect }) => {
30
+ const organization = Obj.make(TestSchema.Organization, { name: 'DXOS' });
31
+ const contact = Obj.make(TestSchema.Person, {
32
+ name: 'Test',
33
+ employer: Ref.make(organization),
34
+ });
35
+
36
+ expect(Schema.is(TestSchema.Person)(contact)).to.be.true;
37
+ expect(Obj.instanceOf(TestSchema.Person, contact)).to.be.true;
38
+ expect(Obj.instanceOf(TestSchema.Organization, organization)).to.be.true;
39
+
40
+ const isPerson = Obj.instanceOf(TestSchema.Person);
41
+ const x: any = {};
42
+ if (isPerson(x)) {
43
+ x.name;
44
+ }
45
+ });
46
+
47
+ test('default props', ({ expect }) => {
48
+ const message = Obj.make(TestSchema.Message, TestSchema.MessageStruct.make({}));
49
+ expect(message.timestamp).to.exist;
50
+ });
51
+
52
+ test('Obj.isObject', ({ expect }) => {
53
+ const guy = Obj.make(TestSchema.Person, { name: 'Test' });
54
+ expect(Obj.isObject(guy)).to.be.true;
55
+ expect(Obj.isObject(null)).to.be.false;
56
+ expect(Obj.isObject(undefined)).to.be.false;
57
+ expect(Obj.isObject(1)).to.be.false;
58
+ expect(Obj.isObject('string')).to.be.false;
59
+ });
60
+
61
+ test('create relation', ({ expect }) => {
62
+ const person = Obj.make(TestSchema.Person, { name: 'Test' });
63
+ const organization = Obj.make(TestSchema.Organization, { name: 'DXOS' });
64
+ const worksFor = Relation.make(TestSchema.EmployedBy, {
65
+ [Relation.Source]: person,
66
+ [Relation.Target]: organization,
67
+ role: 'CEO',
68
+ });
69
+ expect(Relation.getSource(worksFor)).to.eq(person);
70
+ expect(Relation.getTarget(worksFor)).to.eq(organization);
71
+ });
72
+
73
+ test('version', ({ expect }) => {
74
+ const person = Obj.make(TestSchema.Person, { name: 'Test' });
75
+ const version = Obj.version(person);
76
+ expect(Obj.isVersion(version)).to.be.true;
77
+ expect(Obj.versionValid(version)).to.be.false;
78
+ });
79
+
80
+ // TODO(burdon): Implement test.
81
+ test.skip('type narrowing', () => {
82
+ const any: Entity.Unknown = null as any;
83
+
84
+ {
85
+ if (Obj.isObject(any)) {
86
+ any;
87
+ } else {
88
+ any;
89
+ }
90
+ }
91
+
92
+ {
93
+ if (Relation.isRelation(any)) {
94
+ any;
95
+ } else {
96
+ any;
97
+ }
98
+ }
99
+ });
100
+
101
+ /**
102
+ * Test that Obj.make return types are clean and don't expose internal markers like OfKind.
103
+ * The return type of Obj.make(Schema, props) should be assignable to Obj.Obj<InstanceType>.
104
+ */
105
+ describe('Obj.make return type', () => {
106
+ test('Obj.make with custom schema should be assignable to Obj.Obj<Person>', ({ expect }) => {
107
+ {
108
+ const expando = Obj.make(TestSchema.Expando, { content: 'Test' });
109
+ expect(Obj.isObject(expando)).to.be.true;
110
+ expect(expando.content).to.eq('Test');
111
+
112
+ // This should work: assign to Obj.Obj of the schema's instance type
113
+ const _typed: Obj.Obj<TestSchema.Expando> = expando;
114
+ }
115
+
116
+ {
117
+ const person = Obj.make(TestSchema.Person, { name: 'Test' });
118
+ expect(Obj.isObject(person)).to.be.true;
119
+ expect(person.name).to.eq('Test');
120
+
121
+ // This should work: assign to Obj.Obj of the schema's instance type
122
+ const _typed: Obj.Obj<TestSchema.Person> = person;
123
+ }
124
+ });
125
+ });
126
+ });