@dxos/echo 0.8.4-main.3eb6e50203 → 0.8.4-main.3fbcb4aa9b

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 (563) hide show
  1. package/README.md +4 -4
  2. package/dist/lib/neutral/Annotation.mjs +7 -3
  3. package/dist/lib/neutral/Database.mjs +8 -4
  4. package/dist/lib/neutral/Entity.mjs +24 -14
  5. package/dist/lib/neutral/Err.mjs +1 -1
  6. package/dist/lib/neutral/Extension.mjs +18 -0
  7. package/dist/lib/neutral/Extension.mjs.map +7 -0
  8. package/dist/lib/neutral/Feed.mjs +50 -0
  9. package/dist/lib/neutral/Feed.mjs.map +7 -0
  10. package/dist/lib/neutral/Filter.mjs +21 -10
  11. package/dist/lib/neutral/Format.mjs +3 -3
  12. package/dist/lib/neutral/JsonSchema.mjs +9 -9
  13. package/dist/lib/neutral/Key.mjs +1 -1
  14. package/dist/lib/neutral/Migration.mjs +17 -0
  15. package/dist/lib/neutral/Migration.mjs.map +7 -0
  16. package/dist/lib/neutral/Obj.mjs +26 -17
  17. package/dist/lib/neutral/Order.mjs +1 -1
  18. package/dist/lib/neutral/Query.mjs +21 -9
  19. package/dist/lib/neutral/QueryResult.mjs +1 -1
  20. package/dist/lib/neutral/Ref.mjs +9 -7
  21. package/dist/lib/neutral/Relation.mjs +23 -13
  22. package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
  23. package/dist/lib/neutral/Tag.mjs +14 -10
  24. package/dist/lib/neutral/Type.mjs +13 -23
  25. package/dist/lib/neutral/{chunk-N2QNHMT5.mjs → chunk-44HT3MEC.mjs} +2 -2
  26. package/dist/lib/neutral/{chunk-N2QNHMT5.mjs.map → chunk-44HT3MEC.mjs.map} +1 -1
  27. package/dist/lib/neutral/{chunk-XAJMXQ4H.mjs → chunk-5SL5LDLD.mjs} +6 -2
  28. package/dist/lib/neutral/chunk-5SL5LDLD.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-6VIJV543.mjs +34 -0
  30. package/dist/lib/neutral/chunk-6VIJV543.mjs.map +7 -0
  31. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7RVZT53K.mjs} +1 -1
  32. package/dist/lib/neutral/{chunk-4L6DOFXP.mjs → chunk-BICZKPQG.mjs} +1 -1
  33. package/dist/lib/neutral/{chunk-4L6DOFXP.mjs.map → chunk-BICZKPQG.mjs.map} +1 -1
  34. package/dist/lib/neutral/{chunk-B4FLOYG7.mjs → chunk-FHYIM4RD.mjs} +18 -20
  35. package/dist/lib/neutral/chunk-FHYIM4RD.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-FZHVQEHN.mjs +81 -0
  37. package/dist/lib/neutral/chunk-FZHVQEHN.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  39. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  40. package/dist/lib/neutral/{chunk-EXAYCLIM.mjs → chunk-HPNQTEEQ.mjs} +5 -5
  41. package/dist/lib/neutral/chunk-HPNQTEEQ.mjs.map +7 -0
  42. package/dist/lib/neutral/{chunk-YPIP3WGI.mjs → chunk-LVGOVFDV.mjs} +40 -12
  43. package/dist/lib/neutral/chunk-LVGOVFDV.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-MPAI2MHO.mjs +346 -0
  45. package/dist/lib/neutral/chunk-MPAI2MHO.mjs.map +7 -0
  46. package/dist/lib/neutral/{chunk-KB7RIVLK.mjs → chunk-N4B7FHQT.mjs} +4 -4
  47. package/dist/lib/neutral/{chunk-KB7RIVLK.mjs.map → chunk-N4B7FHQT.mjs.map} +2 -2
  48. package/dist/lib/neutral/chunk-O5LRY6CO.mjs +734 -0
  49. package/dist/lib/neutral/chunk-O5LRY6CO.mjs.map +7 -0
  50. package/dist/lib/neutral/{chunk-VYEWMV5U.mjs → chunk-QGMIH2SN.mjs} +8 -4
  51. package/dist/lib/neutral/chunk-QGMIH2SN.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-QXIANHKU.mjs +206 -0
  53. package/dist/lib/neutral/chunk-QXIANHKU.mjs.map +7 -0
  54. package/dist/lib/neutral/{chunk-UMECVTXM.mjs → chunk-RF7ZBZ4A.mjs} +72 -5
  55. package/dist/lib/neutral/chunk-RF7ZBZ4A.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-S7IMFVTB.mjs +132 -0
  57. package/dist/lib/neutral/chunk-S7IMFVTB.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-SJKBWMJY.mjs +2436 -0
  59. package/dist/lib/neutral/chunk-SJKBWMJY.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-SUZMWP3Y.mjs +36 -0
  61. package/dist/lib/neutral/chunk-SUZMWP3Y.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-HQXQWXLH.mjs → chunk-SW5CUSBY.mjs} +183 -32
  63. package/dist/lib/neutral/chunk-SW5CUSBY.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-RIMHNJ3E.mjs → chunk-TNBK56IN.mjs} +98 -44
  65. package/dist/lib/neutral/chunk-TNBK56IN.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-7WE7SBA2.mjs → chunk-TRPZU2HV.mjs} +13 -13
  67. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-ROKO4RKJ.mjs → chunk-TTCSATUD.mjs} +2 -2
  69. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  70. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
  71. package/dist/lib/neutral/chunk-VGKLHHRT.mjs +318 -0
  72. package/dist/lib/neutral/chunk-VGKLHHRT.mjs.map +7 -0
  73. package/dist/lib/neutral/{chunk-TMLVKIMX.mjs → chunk-VYAGNFSJ.mjs} +8 -3
  74. package/dist/lib/neutral/chunk-VYAGNFSJ.mjs.map +7 -0
  75. package/dist/lib/neutral/{chunk-7YWDDFPH.mjs → chunk-WRVRDZDA.mjs} +77 -58
  76. package/dist/lib/neutral/chunk-WRVRDZDA.mjs.map +7 -0
  77. package/dist/lib/neutral/{chunk-MXQJZCPY.mjs → chunk-ZISMEVKD.mjs} +1 -1
  78. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
  79. package/dist/lib/neutral/index.mjs +51 -28
  80. package/dist/lib/neutral/internal/index.mjs +52 -38
  81. package/dist/lib/neutral/meta.json +1 -1
  82. package/dist/lib/neutral/testing/index.mjs +199 -136
  83. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  84. package/dist/types/src/Annotation.d.ts +3 -3
  85. package/dist/types/src/Annotation.d.ts.map +1 -1
  86. package/dist/types/src/Collection.d.ts +16 -0
  87. package/dist/types/src/Collection.d.ts.map +1 -0
  88. package/dist/types/src/Database.d.ts +20 -35
  89. package/dist/types/src/Database.d.ts.map +1 -1
  90. package/dist/types/src/Dataset.d.ts +19 -0
  91. package/dist/types/src/Dataset.d.ts.map +1 -0
  92. package/dist/types/src/Entity.d.ts +54 -22
  93. package/dist/types/src/Entity.d.ts.map +1 -1
  94. package/dist/types/src/Err.d.ts +18 -18
  95. package/dist/types/src/Err.d.ts.map +1 -1
  96. package/dist/types/src/Extension.d.ts +80 -0
  97. package/dist/types/src/Extension.d.ts.map +1 -0
  98. package/dist/types/src/Extension.test.d.ts +2 -0
  99. package/dist/types/src/Extension.test.d.ts.map +1 -0
  100. package/dist/types/src/Feed.d.ts +182 -0
  101. package/dist/types/src/Feed.d.ts.map +1 -0
  102. package/dist/types/src/Filter.d.ts +34 -5
  103. package/dist/types/src/Filter.d.ts.map +1 -1
  104. package/dist/types/src/Filter.test.d.ts +2 -0
  105. package/dist/types/src/Filter.test.d.ts.map +1 -0
  106. package/dist/types/src/Format.d.ts +3 -3
  107. package/dist/types/src/Format.d.ts.map +1 -1
  108. package/dist/types/src/Hypergraph.d.ts +8 -3
  109. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  110. package/dist/types/src/Json.d.ts +33 -0
  111. package/dist/types/src/Json.d.ts.map +1 -0
  112. package/dist/types/src/Json.test.d.ts +2 -0
  113. package/dist/types/src/Json.test.d.ts.map +1 -0
  114. package/dist/types/src/JsonSchema.d.ts +11 -4
  115. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  116. package/dist/types/src/Migration.d.ts +57 -0
  117. package/dist/types/src/Migration.d.ts.map +1 -0
  118. package/dist/types/src/Obj.d.ts +109 -60
  119. package/dist/types/src/Obj.d.ts.map +1 -1
  120. package/dist/types/src/Order.d.ts.map +1 -1
  121. package/dist/types/src/Query.d.ts +105 -17
  122. package/dist/types/src/Query.d.ts.map +1 -1
  123. package/dist/types/src/Ref.d.ts +58 -10
  124. package/dist/types/src/Ref.d.ts.map +1 -1
  125. package/dist/types/src/Relation.d.ts +86 -40
  126. package/dist/types/src/Relation.d.ts.map +1 -1
  127. package/dist/types/src/SchemaRegistry.d.ts +4 -4
  128. package/dist/types/src/SchemaRegistry.d.ts.map +1 -1
  129. package/dist/types/src/Tag.d.ts +2 -1
  130. package/dist/types/src/Tag.d.ts.map +1 -1
  131. package/dist/types/src/Type.d.ts +51 -180
  132. package/dist/types/src/Type.d.ts.map +1 -1
  133. package/dist/types/src/View.d.ts +68 -0
  134. package/dist/types/src/View.d.ts.map +1 -0
  135. package/dist/types/src/exemplars.test.d.ts +2 -0
  136. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  137. package/dist/types/src/index.d.ts +7 -0
  138. package/dist/types/src/index.d.ts.map +1 -1
  139. package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +65 -2
  140. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  141. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  142. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  143. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  144. package/dist/types/src/internal/{api → Annotation}/sorting.d.ts +1 -1
  145. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  146. package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +2 -2
  147. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  148. package/dist/types/src/internal/{api/entity.d.ts → Entity/api.d.ts} +2 -2
  149. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  150. package/dist/types/src/internal/{entities → Entity}/entity.d.ts +3 -3
  151. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  152. package/dist/types/src/internal/{entities → Entity}/index.d.ts +2 -0
  153. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  154. package/dist/types/src/internal/{entities → Entity}/model.d.ts +2 -26
  155. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  156. package/dist/types/src/internal/{entities → Entity}/object.d.ts +2 -2
  157. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  158. package/dist/types/src/internal/{entities → Entity}/relation.d.ts +3 -30
  159. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  160. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  161. package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
  162. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  163. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  164. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  165. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  166. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  167. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  168. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  169. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  170. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  171. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  172. package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
  173. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  174. package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
  175. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  176. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  177. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  178. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  179. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +37 -37
  180. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  181. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +1 -1
  182. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  183. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  184. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  185. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  186. package/dist/types/src/internal/{object → Obj}/create-object.d.ts +2 -2
  187. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  188. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  189. package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
  190. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  191. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  192. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  193. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  194. package/dist/types/src/internal/{object → Obj}/json-serializer.d.ts +13 -5
  195. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  196. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  197. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  198. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  199. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  200. package/dist/types/src/internal/{object → Obj}/set-value.d.ts +2 -2
  201. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  202. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  203. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  204. package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +4 -4
  205. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  206. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  207. package/dist/types/src/internal/Query.d.ts +10 -0
  208. package/dist/types/src/internal/Query.d.ts.map +1 -0
  209. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  210. package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +1 -1
  211. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  212. package/dist/types/src/internal/{ref → Ref}/ref.d.ts +15 -2
  213. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  214. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  215. package/dist/types/src/internal/{schema → Type}/compose.d.ts +1 -1
  216. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  217. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  218. package/dist/types/src/internal/{schema → Type}/echo-schema.d.ts +7 -7
  219. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  220. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  221. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  222. package/dist/types/src/internal/{schema → Type}/persistent-schema.d.ts +2 -2
  223. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  224. package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
  225. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  226. package/dist/types/src/internal/{api → common/api}/meta.d.ts +3 -3
  227. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  228. package/dist/types/src/internal/common/index.d.ts +4 -0
  229. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  230. package/dist/types/src/internal/{proxy → common/proxy}/change-context.d.ts +1 -1
  231. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  232. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  233. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  234. package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +1 -1
  235. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  236. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  237. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  238. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  239. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  240. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  241. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  242. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  243. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  244. package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +1 -1
  245. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  246. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +2 -2
  247. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts.map +1 -1
  248. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  249. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  250. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  251. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  252. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  253. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  254. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  255. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  256. package/dist/types/src/internal/{types → common/types}/base.d.ts +1 -0
  257. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  258. package/dist/types/src/internal/{types → common/types}/entity.d.ts +5 -5
  259. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  260. package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
  261. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  262. package/dist/types/src/internal/{types → common/types}/meta.d.ts +2 -1
  263. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  264. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  265. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  266. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  267. package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
  268. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  269. package/dist/types/src/internal/index.d.ts +9 -10
  270. package/dist/types/src/internal/index.d.ts.map +1 -1
  271. package/dist/types/src/testing/test-data.d.ts +8 -8
  272. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  273. package/dist/types/src/testing/test-schema.d.ts +47 -46
  274. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  275. package/dist/types/src/testing/util.d.ts.map +1 -1
  276. package/dist/types/tsconfig.tsbuildinfo +1 -1
  277. package/package.json +29 -14
  278. package/src/Annotation.ts +7 -3
  279. package/src/Collection.ts +37 -0
  280. package/src/Database.ts +63 -64
  281. package/src/Dataset.ts +26 -0
  282. package/src/Entity.ts +87 -61
  283. package/src/Err.ts +2 -0
  284. package/src/Extension.test.ts +235 -0
  285. package/src/Extension.ts +122 -0
  286. package/src/Feed.ts +304 -0
  287. package/src/Filter.test.ts +90 -0
  288. package/src/Filter.ts +85 -7
  289. package/src/Format.ts +3 -3
  290. package/src/Hypergraph.ts +9 -4
  291. package/src/Json.test.ts +175 -0
  292. package/src/Json.ts +102 -0
  293. package/src/JsonSchema.ts +14 -4
  294. package/src/Migration.ts +94 -0
  295. package/src/Obj.test.ts +112 -15
  296. package/src/Obj.ts +302 -166
  297. package/src/Order.ts +3 -1
  298. package/src/Query.test.ts +372 -15
  299. package/src/Query.ts +269 -26
  300. package/src/Ref.ts +64 -11
  301. package/src/Relation.test.ts +8 -2
  302. package/src/Relation.ts +183 -147
  303. package/src/SchemaRegistry.ts +5 -4
  304. package/src/Tag.ts +6 -5
  305. package/src/Type.test.ts +10 -10
  306. package/src/Type.ts +70 -303
  307. package/src/View.ts +107 -0
  308. package/src/exemplars.test.ts +21 -0
  309. package/src/index.ts +8 -0
  310. package/src/internal/{annotations → Annotation}/annotations.test.ts +56 -7
  311. package/src/internal/{annotations → Annotation}/annotations.ts +122 -19
  312. package/src/internal/{annotations → Annotation}/index.ts +1 -0
  313. package/src/internal/{api → Annotation}/sorting.ts +2 -4
  314. package/src/internal/{annotations → Annotation}/util.ts +1 -1
  315. package/src/internal/{api/entity.ts → Entity/api.ts} +3 -2
  316. package/src/internal/{entities → Entity}/entity.ts +6 -4
  317. package/src/internal/{entities → Entity}/index.ts +2 -0
  318. package/src/internal/{entities → Entity}/model.ts +13 -42
  319. package/src/internal/{entities → Entity}/object.ts +2 -3
  320. package/src/internal/{entities → Entity}/relation.ts +19 -36
  321. package/src/internal/{api → Entity}/version.ts +2 -2
  322. package/src/internal/{formats → Format}/date.test.ts +1 -2
  323. package/src/internal/{formats → Format}/format.test.ts +1 -2
  324. package/src/internal/{formats → Format}/types.ts +2 -2
  325. package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
  326. package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
  327. package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +48 -49
  328. package/src/internal/{json-schema → JsonSchema}/json-schema.ts +6 -5
  329. package/src/internal/{object → Obj}/clone.ts +3 -3
  330. package/src/internal/{object → Obj}/common.ts +2 -2
  331. package/src/internal/{object → Obj}/create-object.test.ts +5 -7
  332. package/src/internal/{object → Obj}/create-object.ts +5 -6
  333. package/src/internal/{object → Obj}/deleted.ts +2 -2
  334. package/src/internal/{object → Obj}/inspect.ts +2 -2
  335. package/src/internal/{object → Obj}/json-serializer.test.ts +31 -9
  336. package/src/internal/{object → Obj}/json-serializer.ts +52 -27
  337. package/src/internal/{object → Obj}/schema-validator.ts +1 -1
  338. package/src/internal/{object → Obj}/set-value.test.ts +24 -24
  339. package/src/internal/{object → Obj}/set-value.ts +3 -3
  340. package/src/internal/{object → Obj}/snapshot.ts +35 -23
  341. package/src/internal/{object → Obj}/typed-object.test.ts +3 -3
  342. package/src/internal/{object → Obj}/typed-object.ts +4 -4
  343. package/src/internal/Query.ts +137 -0
  344. package/src/internal/{ref → Ref}/ref-array.ts +1 -2
  345. package/src/internal/{ref → Ref}/ref.test.ts +4 -5
  346. package/src/internal/{ref → Ref}/ref.ts +20 -3
  347. package/src/internal/{schema → Type}/compose.test.ts +5 -6
  348. package/src/internal/{schema → Type}/compose.ts +1 -1
  349. package/src/internal/{schema → Type}/echo-schema.ts +9 -10
  350. package/src/internal/{schema → Type}/manipulation.ts +1 -1
  351. package/src/internal/{schema → Type}/persistent-schema.ts +9 -4
  352. package/src/internal/{README.md → common/README.md} +2 -2
  353. package/src/internal/{api → common/api}/index.ts +0 -4
  354. package/src/internal/{api → common/api}/meta.ts +3 -3
  355. package/src/internal/common/index.ts +7 -0
  356. package/src/internal/{proxy → common/proxy}/change-context.ts +1 -1
  357. package/src/internal/{proxy → common/proxy}/change.test.ts +97 -97
  358. package/src/internal/{proxy → common/proxy}/errors.ts +2 -2
  359. package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -4
  360. package/src/internal/{proxy → common/proxy}/json-serializer.ts +6 -3
  361. package/src/internal/{proxy → common/proxy}/make-object.ts +1 -2
  362. package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
  363. package/src/internal/{proxy → common/proxy}/reactive-array.ts +1 -1
  364. package/src/internal/common/proxy/reactive.test.ts +54 -0
  365. package/src/internal/{proxy → common/proxy}/reactive.ts +12 -4
  366. package/src/internal/{proxy → common/proxy}/schema.test.ts +10 -10
  367. package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +6 -7
  368. package/src/internal/{proxy → common/proxy}/typed-handler.ts +10 -13
  369. package/src/internal/{proxy → common/proxy}/typed-object.test.ts +5 -6
  370. package/src/internal/{types → common/types}/base.ts +1 -1
  371. package/src/internal/{types → common/types}/entity.ts +2 -2
  372. package/src/internal/{types → common/types}/index.ts +1 -0
  373. package/src/internal/{types → common/types}/meta.ts +3 -1
  374. package/src/internal/common/types/model-symbols.ts +69 -0
  375. package/src/internal/{types → common/types}/version.ts +2 -3
  376. package/src/internal/index.ts +9 -31
  377. package/src/testing/api.test.ts +4 -5
  378. package/src/testing/test-data.ts +157 -98
  379. package/src/testing/test-schema.ts +20 -18
  380. package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +0 -7
  381. package/dist/lib/neutral/chunk-7YWDDFPH.mjs.map +0 -7
  382. package/dist/lib/neutral/chunk-B4FLOYG7.mjs.map +0 -7
  383. package/dist/lib/neutral/chunk-EXAYCLIM.mjs.map +0 -7
  384. package/dist/lib/neutral/chunk-F6BTBXL7.mjs +0 -171
  385. package/dist/lib/neutral/chunk-F6BTBXL7.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-HQXQWXLH.mjs.map +0 -7
  387. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-RCBBZLVM.mjs +0 -142
  389. package/dist/lib/neutral/chunk-RCBBZLVM.mjs.map +0 -7
  390. package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +0 -7
  391. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +0 -7
  392. package/dist/lib/neutral/chunk-TMLVKIMX.mjs.map +0 -7
  393. package/dist/lib/neutral/chunk-UMECVTXM.mjs.map +0 -7
  394. package/dist/lib/neutral/chunk-VJ2H5MOJ.mjs +0 -3905
  395. package/dist/lib/neutral/chunk-VJ2H5MOJ.mjs.map +0 -7
  396. package/dist/lib/neutral/chunk-VYEWMV5U.mjs.map +0 -7
  397. package/dist/lib/neutral/chunk-X2MPMYYN.mjs +0 -13
  398. package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +0 -7
  399. package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +0 -7
  400. package/dist/lib/neutral/chunk-YPIP3WGI.mjs.map +0 -7
  401. package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
  402. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
  403. package/dist/types/src/internal/annotations/index.d.ts +0 -3
  404. package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
  405. package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
  406. package/dist/types/src/internal/api/annotations.d.ts +0 -23
  407. package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
  408. package/dist/types/src/internal/api/entity.d.ts.map +0 -1
  409. package/dist/types/src/internal/api/index.d.ts.map +0 -1
  410. package/dist/types/src/internal/api/meta.d.ts.map +0 -1
  411. package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
  412. package/dist/types/src/internal/api/version.d.ts.map +0 -1
  413. package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
  414. package/dist/types/src/internal/entities/index.d.ts.map +0 -1
  415. package/dist/types/src/internal/entities/model.d.ts.map +0 -1
  416. package/dist/types/src/internal/entities/object.d.ts.map +0 -1
  417. package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
  418. package/dist/types/src/internal/entities/util.d.ts.map +0 -1
  419. package/dist/types/src/internal/formats/date.d.ts.map +0 -1
  420. package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
  421. package/dist/types/src/internal/formats/format.d.ts.map +0 -1
  422. package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
  423. package/dist/types/src/internal/formats/index.d.ts.map +0 -1
  424. package/dist/types/src/internal/formats/number.d.ts.map +0 -1
  425. package/dist/types/src/internal/formats/object.d.ts.map +0 -1
  426. package/dist/types/src/internal/formats/select.d.ts.map +0 -1
  427. package/dist/types/src/internal/formats/string.d.ts.map +0 -1
  428. package/dist/types/src/internal/formats/types.d.ts.map +0 -1
  429. package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
  430. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
  431. package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
  432. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
  433. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
  434. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
  435. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
  436. package/dist/types/src/internal/object/clone.d.ts.map +0 -1
  437. package/dist/types/src/internal/object/common.d.ts.map +0 -1
  438. package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
  439. package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
  440. package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
  441. package/dist/types/src/internal/object/ids.d.ts.map +0 -1
  442. package/dist/types/src/internal/object/index.d.ts.map +0 -1
  443. package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
  444. package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
  445. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
  446. package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
  447. package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
  448. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
  449. package/dist/types/src/internal/object/set-value.d.ts.map +0 -1
  450. package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
  451. package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
  452. package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
  453. package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
  454. package/dist/types/src/internal/proxy/change-context.d.ts.map +0 -1
  455. package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
  456. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
  457. package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
  458. package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
  459. package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
  460. package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
  461. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
  462. package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
  463. package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
  464. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
  465. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
  466. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
  467. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
  468. package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
  469. package/dist/types/src/internal/proxy/symbols.d.ts.map +0 -1
  470. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
  471. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
  472. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
  473. package/dist/types/src/internal/ref/index.d.ts.map +0 -1
  474. package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
  475. package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
  476. package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
  477. package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
  478. package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
  479. package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
  480. package/dist/types/src/internal/schema/index.d.ts.map +0 -1
  481. package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
  482. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
  483. package/dist/types/src/internal/types/base.d.ts.map +0 -1
  484. package/dist/types/src/internal/types/entity.d.ts.map +0 -1
  485. package/dist/types/src/internal/types/index.d.ts.map +0 -1
  486. package/dist/types/src/internal/types/meta.d.ts.map +0 -1
  487. package/dist/types/src/internal/types/typename.d.ts.map +0 -1
  488. package/dist/types/src/internal/types/version.d.ts.map +0 -1
  489. package/src/internal/api/annotations.ts +0 -60
  490. /package/dist/lib/neutral/{chunk-ANHVGJI4.mjs.map → chunk-7RVZT53K.mjs.map} +0 -0
  491. /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
  492. /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
  493. /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
  494. /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
  495. /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
  496. /package/dist/types/src/internal/{formats → Format}/format.d.ts +0 -0
  497. /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
  498. /package/dist/types/src/internal/{formats → Format}/index.d.ts +0 -0
  499. /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
  500. /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
  501. /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
  502. /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
  503. /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
  504. /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
  505. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
  506. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
  507. /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
  508. /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
  509. /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
  510. /package/dist/types/src/internal/{object → Obj}/ids.d.ts +0 -0
  511. /package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -0
  512. /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
  513. /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
  514. /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
  515. /package/dist/types/src/internal/{object → Obj}/set-value.test.d.ts +0 -0
  516. /package/dist/types/src/internal/{object → Obj}/snapshot.d.ts +0 -0
  517. /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
  518. /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
  519. /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
  520. /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
  521. /package/dist/types/src/internal/{schema → Type}/index.d.ts +0 -0
  522. /package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -0
  523. /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
  524. /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
  525. /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
  526. /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
  527. /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
  528. /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
  529. /package/dist/types/src/internal/{proxy → common/proxy}/make-object.d.ts +0 -0
  530. /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
  531. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
  532. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
  533. /package/dist/types/src/internal/{proxy → common/proxy}/schema-validator.d.ts +0 -0
  534. /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
  535. /package/dist/types/src/internal/{proxy → common/proxy}/symbols.d.ts +0 -0
  536. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +0 -0
  537. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
  538. /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
  539. /package/dist/types/src/internal/{types → common/types}/typename.d.ts +0 -0
  540. /package/src/internal/{entities → Entity}/util.ts +0 -0
  541. /package/src/internal/{formats → Format}/date.ts +0 -0
  542. /package/src/internal/{formats → Format}/format.ts +0 -0
  543. /package/src/internal/{formats → Format}/index.ts +0 -0
  544. /package/src/internal/{formats → Format}/number.ts +0 -0
  545. /package/src/internal/{formats → Format}/object.ts +0 -0
  546. /package/src/internal/{formats → Format}/select.ts +0 -0
  547. /package/src/internal/{formats → Format}/string.ts +0 -0
  548. /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
  549. /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
  550. /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
  551. /package/src/internal/{object → Obj}/ids.ts +0 -0
  552. /package/src/internal/{object → Obj}/index.ts +0 -0
  553. /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
  554. /package/src/internal/{ref → Ref}/index.ts +0 -0
  555. /package/src/internal/{schema → Type}/index.ts +0 -0
  556. /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
  557. /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
  558. /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
  559. /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
  560. /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
  561. /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
  562. /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
  563. /package/src/internal/{types → common/types}/typename.ts +0 -0
package/src/Obj.ts CHANGED
@@ -2,86 +2,39 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ // @import-as-namespace
6
+
5
7
  import * as Effect from 'effect/Effect';
8
+ import * as Equal from 'effect/Equal';
6
9
  import * as Function from 'effect/Function';
7
10
  import * as Option from 'effect/Option';
8
11
  import * as Schema from 'effect/Schema';
12
+ import * as Utils from 'effect/Utils';
9
13
 
10
14
  import type { ForeignKey } from '@dxos/echo-protocol';
11
- import { createJsonPath, getValue as getValue$ } from '@dxos/effect';
12
- import { assertArgument } from '@dxos/invariant';
15
+ import { createJsonPath } from '@dxos/effect';
16
+ import { assertArgument, invariant } from '@dxos/invariant';
13
17
  import { type DXN, ObjectId } from '@dxos/keys';
14
- import { assumeType } from '@dxos/util';
18
+ import { assumeType, deepMapValues } from '@dxos/util';
15
19
 
16
20
  import type * as Database from './Database';
17
21
  import * as Entity from './Entity';
18
22
  import * as Err from './Err';
19
- import {
20
- type ObjectJSON as APIJSON,
21
- type AnyEntity,
22
- type AnyProperties,
23
- type Comparator as ApiComparator,
24
- type Meta as ApiMeta,
25
- type ReadonlyMeta as ApiReadonlyMeta,
26
- type EntityVersion as ApiVersion,
27
- type ChangeCallback,
28
- type InternalObjectProps,
29
- type KindId,
30
- MetaId,
31
- type Mutable,
32
- type ObjectMeta,
33
- // TODO(dmaretskyi): Export ParentId?
34
- ParentId,
35
- SnapshotKindId,
36
- type VersionCompareResult,
37
- VersionTypeId,
38
- addTag as addTag$,
39
- change as change$,
40
- clone as clone$,
41
- compareVersions,
42
- decodeVersion,
43
- deleteKeys as deleteKeys$,
44
- encodeVersion,
45
- getDXN as getDXN$,
46
- getDatabase as getDatabase$,
47
- getDescription as getDescription$,
48
- getKeys as getKeys$,
49
- getLabel as getLabel$,
50
- getMetaChecked as getMeta$,
51
- getSchema as getSchema$,
52
- getSnapshot as getSnapshot$,
53
- getTypeAnnotation,
54
- getTypeDXN as getTypeDXN$,
55
- getTypename as getTypename$,
56
- isDeleted as isDeleted$,
57
- isInstanceOf,
58
- isVersion,
59
- makeObject,
60
- objectFromJSON,
61
- removeTag as removeTag$,
62
- setDescription as setDescription$,
63
- setLabel as setLabel$,
64
- setValue as setValue$,
65
- sort as sort$,
66
- sortByLabel as sortByLabel$,
67
- sortByTypename as sortByTypename$,
68
- subscribe as subscribe$,
69
- objectToJSON as toJSON$,
70
- version as version$,
71
- versionValid,
72
- } from './internal';
73
- import type * as Ref from './Ref';
23
+ import * as internal from './internal';
24
+ import { getProxyTarget, isProxy } from './internal/common/proxy/proxy-utils';
25
+ import * as objInternal from './internal/Obj';
26
+ import * as Ref from './Ref';
74
27
  import type * as Type from './Type';
75
28
 
76
29
  /**
77
30
  * Base type for all ECHO objects.
78
31
  */
79
- interface BaseObj extends AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
32
+ interface BaseObj extends internal.AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
80
33
 
81
34
  /**
82
35
  * Object type with specific properties.
83
36
  */
84
- export type Obj<Props> = BaseObj & Props;
37
+ export type OfShape<Props> = BaseObj & Props;
85
38
 
86
39
  /**
87
40
  * Object with no known properties beyond id and kind.
@@ -93,6 +46,44 @@ export type Obj<Props> = BaseObj & Props;
93
46
  */
94
47
  export interface Unknown extends BaseObj {}
95
48
 
49
+ /**
50
+ * Runtime Effect schema for any ECHO object.
51
+ * Use for validation, parsing, or as a reference target for collections.
52
+ *
53
+ * NOTE: `Schema.is(Type.Obj)` does STRUCTURAL validation only (checks for `id` field).
54
+ * Use `Obj.isObject()` for proper ECHO instance type guards that check the KindId brand.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * // Structural type guard (accepts any object with id field)
59
+ * if (Schema.is(Type.Obj)(unknownValue)) { ... }
60
+ *
61
+ * // ECHO instance type guard (checks KindId brand)
62
+ * if (Obj.isObject(unknownValue)) { ... }
63
+ *
64
+ * // Reference to any object type
65
+ * const Collection = Schema.Struct({
66
+ * objects: Schema.Array(Ref.Ref(Obj.Unknown)),
67
+ * }).pipe(Type.object({ typename: 'Collection', version: '0.1.0' }));
68
+ * ```
69
+ */
70
+ // TODO(wittjosiah): Investigate if Schema.filter can validate KindId on ECHO instances.
71
+ // Effect Schema normalizes proxy objects to plain objects before calling filter predicates.
72
+ // Possible approaches: custom Schema.declare, AST manipulation, or upstream contribution.
73
+ export const Unknown: Type.Obj<Unknown> = Schema.Struct({
74
+ id: Schema.String,
75
+ }).pipe(
76
+ Schema.extend(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
77
+ // TODO(dmaretskyi): Clean this up.
78
+ // NOTE: The EchoObjectSchema annotation is required for Ref.Ref(Obj.Unknown) to work.
79
+ // The typename/version only satisfy ECHO schema machinery for reference targets.
80
+ internal.EchoObjectSchema({ typename: internal.ANY_OBJECT_TYPENAME, version: internal.ANY_OBJECT_VERSION }),
81
+ (schema) =>
82
+ Object.assign(schema, {
83
+ [internal.SchemaKindId]: (schema as any)[internal.SchemaKindId],
84
+ }) as unknown as Type.Obj<Unknown>,
85
+ );
86
+
96
87
  /**
97
88
  * Object with arbitrary properties.
98
89
  *
@@ -101,13 +92,13 @@ export interface Unknown extends BaseObj {}
101
92
  *
102
93
  * Prefer using `Obj.Unknown` when you don't need to access arbitrary properties.
103
94
  */
104
- export interface Any extends BaseObj, AnyProperties {}
95
+ export interface Any extends BaseObj, internal.AnyProperties {}
105
96
 
106
97
  /**
107
98
  * Base type for snapshot objects (has SnapshotKindId instead of KindId).
108
99
  */
109
- interface BaseSnapshot extends AnyEntity {
110
- readonly [SnapshotKindId]: typeof Entity.Kind.Object;
100
+ interface BaseSnapshot extends internal.AnyEntity {
101
+ readonly [Entity.SnapshotKindId]: typeof Entity.Kind.Object;
111
102
  readonly id: ObjectId;
112
103
  }
113
104
 
@@ -120,16 +111,23 @@ interface BaseSnapshot extends AnyEntity {
120
111
  * Snapshots are structurally identical to reactive objects but have a different brand,
121
112
  * making them distinguishable at the TypeScript level. Neither is assignable to the other.
122
113
  */
123
- export type Snapshot<T extends Unknown = Unknown> = Omit<T, KindId> & BaseSnapshot;
114
+ export type Snapshot<T extends Unknown = Unknown> = Omit<T, Entity.KindId> & BaseSnapshot;
115
+
116
+ /**
117
+ * JSON-encoded properties for objects.
118
+ */
119
+ export interface BaseObjJson {
120
+ id: string;
121
+ }
124
122
 
125
- const defaultMeta: ObjectMeta = {
123
+ const defaultMeta: internal.ObjectMeta = {
126
124
  keys: [],
127
125
  };
128
126
 
129
- type Props<T = any> = {
127
+ type MakePropsInternal<T extends Unknown> = {
130
128
  id?: ObjectId;
131
- [Meta]?: Partial<ObjectMeta>;
132
- } & Type.Properties<T>;
129
+ [Meta]?: Partial<internal.ObjectMeta>;
130
+ } & Entity.Properties<T>;
133
131
 
134
132
  // TODO(burdon): Should we allow the caller to set the id?
135
133
  /**
@@ -137,9 +135,9 @@ type Props<T = any> = {
137
135
  */
138
136
  export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
139
137
  id?: ObjectId;
140
- [Meta]?: Partial<ObjectMeta>;
138
+ [Meta]?: Partial<internal.ObjectMeta>;
141
139
  [Parent]?: Unknown;
142
- } & NoInfer<Props<Schema.Schema.Type<S>>>;
140
+ } & MakePropsInternal<Schema.Schema.Type<S>>;
143
141
 
144
142
  /**
145
143
  * Creates a new echo object of the given schema.
@@ -156,23 +154,22 @@ export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
156
154
  *
157
155
  * Note: Only accepts object schemas, not relation schemas. Use `Relation.make` for relations.
158
156
  */
159
- export const make: {
160
- <S extends Type.Obj.Any>(schema: S, props: MakeProps<S>): Obj<Schema.Schema.Type<S>>;
161
- /**
162
- * @deprecated Pass meta as in the example: `Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' })`.
163
- */
164
- <S extends Type.Obj.Any>(schema: S, props: MakeProps<S>, meta: Partial<ObjectMeta>): Obj<Schema.Schema.Type<S>>;
165
- } = <S extends Type.Obj.Any>(
157
+ export const make = <S extends Type.AnyObj>(
166
158
  schema: S,
167
- props: MakeProps<S>,
168
- meta?: Partial<ObjectMeta>,
169
- ): Obj<Schema.Schema.Type<S>> => {
170
- assertArgument(getTypeAnnotation(schema)?.kind === Entity.Kind.Object, 'schema', 'Expected an object schema');
159
+ props: NoInfer<MakeProps<S>>,
160
+ ): OfShape<Schema.Schema.Type<S>> => {
161
+ assertArgument(
162
+ internal.getTypeAnnotation(schema)?.kind === Entity.Kind.Object,
163
+ 'schema',
164
+ 'Expected an object schema',
165
+ );
166
+
167
+ let meta: internal.ObjectMeta | undefined = undefined;
171
168
 
172
169
  // Set default fields on meta on creation.
173
- if (props[MetaId] != null) {
174
- meta = { ...structuredClone(defaultMeta), ...props[MetaId] };
175
- delete props[MetaId];
170
+ if (props[internal.MetaId] != null) {
171
+ meta = { ...structuredClone(defaultMeta), ...props[internal.MetaId] };
172
+ delete props[internal.MetaId];
176
173
  }
177
174
 
178
175
  // Filter undefined values (Object.entries only returns string-keyed properties).
@@ -186,7 +183,7 @@ export const make: {
186
183
  }
187
184
  }
188
185
 
189
- return makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
186
+ return internal.makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
190
187
  ...defaultMeta,
191
188
  ...meta,
192
189
  });
@@ -196,10 +193,15 @@ export const make: {
196
193
  * Determine if object is an ECHO object.
197
194
  */
198
195
  export const isObject = (obj: unknown): obj is Unknown => {
199
- assumeType<InternalObjectProps>(obj);
196
+ assumeType<internal.InternalObjectProps>(obj);
200
197
  return typeof obj === 'object' && obj !== null && obj[Entity.KindId] === Entity.Kind.Object;
201
198
  };
202
199
 
200
+ export const isSnapshot = (obj: unknown): obj is Snapshot => {
201
+ assumeType<internal.InternalObjectProps>(obj);
202
+ return typeof obj === 'object' && obj !== null && (obj as any)[Entity.SnapshotKindId] === Entity.Kind.Object;
203
+ };
204
+
203
205
  /**
204
206
  * Subscribe to object updates.
205
207
  * The callback is called synchronously when the object is modified.
@@ -207,7 +209,7 @@ export const isObject = (obj: unknown): obj is Unknown => {
207
209
  * @returns Unsubscribe function.
208
210
  */
209
211
  export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
210
- return subscribe$(obj, callback);
212
+ return internal.subscribe(obj, callback);
211
213
  };
212
214
 
213
215
  //
@@ -219,7 +221,7 @@ export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
219
221
  * The snapshot is branded with SnapshotKindId instead of KindId,
220
222
  * making it distinguishable from the reactive object at the type level.
221
223
  */
222
- export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = getSnapshot$ as any;
224
+ export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = objInternal.getSnapshot as any;
223
225
 
224
226
  /**
225
227
  * Returns the reactive version of an object from the database, given its snapshot.
@@ -240,7 +242,7 @@ export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = getSnapsh
240
242
  */
241
243
  export const getReactive = <T extends Unknown>(snapshot: Snapshot<T>): Effect.Effect<T, Err.GetReactiveError> =>
242
244
  Effect.gen(function* () {
243
- const db = getDatabase$(snapshot);
245
+ const db = internal.getDatabase(snapshot);
244
246
  if (!db) {
245
247
  return yield* Effect.fail(new Err.GetReactiveError({ reason: 'no-database', snapshotId: snapshot.id }));
246
248
  }
@@ -294,7 +296,7 @@ export type CloneOptions = {
294
296
  * This does not clone referenced objects, only the properties in the object.
295
297
  * @returns A new object with the same schema and properties.
296
298
  */
297
- export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clone$;
299
+ export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = objInternal.clone;
298
300
 
299
301
  //
300
302
  // Change
@@ -302,42 +304,42 @@ export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clon
302
304
 
303
305
  /**
304
306
  * Makes all properties mutable recursively.
305
- * Used to provide a mutable view of an object within `Obj.change`.
307
+ * Used to provide a mutable view of an object within `Obj.update`.
306
308
  */
307
- export type { Mutable };
309
+ export type Mutable<T> = internal.Mutable<T>;
308
310
 
309
311
  /**
310
312
  * Perform mutations on an echo object within a controlled context.
311
313
  *
312
314
  * All mutations within the callback are batched and trigger a single notification
313
- * when the callback completes. Direct mutations outside of `Obj.change` will throw
315
+ * when the callback completes. Direct mutations outside of `Obj.update` will throw
314
316
  * an error for echo objects.
315
317
  *
316
318
  * This function also works with nested objects within echo objects (e.g., Template structs)
317
319
  * that are reactive at runtime.
318
320
  *
319
- * @param obj - The echo object to mutate. Use `Relation.change` for relations.
321
+ * @param obj - The echo object to mutate. Use `Relation.update` for relations.
320
322
  * @param callback - The callback that performs mutations on the object.
321
323
  *
322
324
  * @example
323
325
  * ```ts
324
326
  * const person = Obj.make(Person, { name: 'John', age: 25 });
325
327
  *
326
- * // Mutate within Obj.change
327
- * Obj.change(person, (p) => {
328
- * p.name = 'Jane';
329
- * p.age = 30;
328
+ * // Mutate within Obj.update
329
+ * Obj.update(person, (obj) => {
330
+ * obj.name = 'Jane';
331
+ * obj.age = 30;
330
332
  * });
331
333
  * // ONE notification fires here
332
334
  *
333
335
  * // Direct mutation throws
334
- * person.name = 'Bob'; // Error: Cannot modify outside Obj.change()
336
+ * person.name = 'Bob'; // Error: Cannot modify outside Obj.update()
335
337
  * ```
336
338
  *
337
- * Note: Only accepts objects. Use `Relation.change` for relations.
339
+ * Note: Only accepts objects. Use `Relation.update` for relations.
338
340
  */
339
- export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>): void => {
340
- change$(obj, callback);
341
+ export const update = <T extends Unknown>(obj: T, callback: internal.ChangeCallback<T>): void => {
342
+ internal.change(obj, callback);
341
343
  };
342
344
 
343
345
  /**
@@ -363,7 +365,7 @@ export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>):
363
365
  * ```
364
366
  */
365
367
  export const getValue = (obj: Unknown | Snapshot, path: readonly (string | number)[]): any => {
366
- return getValue$(obj, createJsonPath(path));
368
+ return internal.getValue(obj, createJsonPath(path));
367
369
  };
368
370
 
369
371
  /**
@@ -371,7 +373,7 @@ export const getValue = (obj: Unknown | Snapshot, path: readonly (string | numbe
371
373
  * whether to initialize nested data as an empty object or array.
372
374
  *
373
375
  * Similar to lodash.set and setDeep from @dxos/util, but schema-aware.
374
- * Must be called within an `Obj.change` callback.
376
+ * Must be called within an `Obj.update` callback.
375
377
  *
376
378
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
377
379
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
@@ -385,15 +387,15 @@ export const getValue = (obj: Unknown | Snapshot, path: readonly (string | numbe
385
387
  * ```ts
386
388
  * const person = Obj.make(Person, { name: 'John' });
387
389
  * // Person schema has: addresses: Schema.Array(Address)
388
- * Obj.change(person, (p) => {
389
- * Obj.setValue(p, ['addresses', 0, 'street'], '123 Main St');
390
+ * Obj.update(person, (obj) => {
391
+ * Obj.setValue(obj, ['addresses', 0, 'street'], '123 Main St');
390
392
  * });
391
393
  * // Creates: person.addresses = [{ street: '123 Main St' }]
392
394
  * ```
393
395
  */
394
396
  // TODO(wittjosiah): Compute possible path values + type value based on generic object type.
395
397
  export const setValue: (obj: Mutable<Unknown>, path: readonly (string | number)[], value: any) => void =
396
- setValue$ as any;
398
+ objInternal.setValue as any;
397
399
 
398
400
  //
399
401
  // Type
@@ -415,14 +417,14 @@ export type ID = ObjectId;
415
417
  * ```
416
418
  */
417
419
  export const instanceOf: {
418
- <S extends Type.Entity.Any>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
419
- <S extends Type.Entity.Any>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
420
- } = ((...args: [schema: Type.Entity.Any, value: unknown] | [schema: Type.Entity.Any]) => {
420
+ <S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
421
+ <S extends Type.AnyEntity>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
422
+ } = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
421
423
  if (args.length === 1) {
422
- return (entity: unknown) => isInstanceOf(args[0], entity);
424
+ return (entity: unknown) => internal.isInstanceOf(args[0], entity);
423
425
  }
424
426
 
425
- return isInstanceOf(args[0], args[1]);
427
+ return internal.isInstanceOf(args[0], args[1]);
426
428
  }) as any;
427
429
 
428
430
  /**
@@ -439,11 +441,14 @@ export const instanceOf: {
439
441
  * ```
440
442
  */
441
443
  export const snapshotOf: {
442
- <S extends Type.Entity.Any>(schema: S): (value: unknown) => value is Snapshot<Schema.Schema.Type<S>>;
443
- <S extends Type.Entity.Any>(schema: S, value: unknown): value is Snapshot<Schema.Schema.Type<S>>;
444
- } = ((...args: [schema: Type.Entity.Any, value: unknown] | [schema: Type.Entity.Any]) => {
444
+ <S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Snapshot<Schema.Schema.Type<S>>;
445
+ <S extends Type.AnyEntity>(schema: S, value: unknown): value is Snapshot<Schema.Schema.Type<S>>;
446
+ } = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
445
447
  const check = (entity: unknown) =>
446
- entity != null && typeof entity === 'object' && SnapshotKindId in entity && isInstanceOf(args[0], entity);
448
+ entity != null &&
449
+ typeof entity === 'object' &&
450
+ Entity.SnapshotKindId in entity &&
451
+ internal.isInstanceOf(args[0], entity);
447
452
 
448
453
  if (args.length === 1) {
449
454
  return (entity: unknown) => check(entity);
@@ -459,29 +464,32 @@ export const snapshotOf: {
459
464
  */
460
465
  export const getDXN = (entity: Unknown | Snapshot): DXN => {
461
466
  assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
462
- return getDXN$(entity);
467
+ return internal.getDXN(entity);
463
468
  };
464
469
 
465
470
  /**
466
471
  * @returns The DXN of the object's type.
467
- * @example dxn:example.com/type/Person:1.0.0
472
+ * @example dxn:com.example.type.person:1.0.0
473
+ * @throws If the object is missing its type (corrupted object).
468
474
  */
469
- // TODO(wittjosiah): Narrow types.
470
- export const getTypeDXN: (obj: unknown | undefined) => DXN | undefined = getTypeDXN$ as any;
475
+ export const getTypeDXN = (obj: Unknown | Snapshot): DXN => {
476
+ const type = internal.getTypeDXN(obj);
477
+ invariant(type != null, 'Corrupted object: missing type.');
478
+ return type;
479
+ };
471
480
 
472
481
  /**
473
482
  * Get the schema of the object.
474
483
  * Returns the branded ECHO schema used to create the object.
475
484
  */
476
- // TODO(wittjosiah): Narrow types.
477
- export const getSchema: (obj: unknown | undefined) => Type.Entity.Any | undefined = getSchema$ as any;
485
+ export const getSchema: (obj: Unknown | Snapshot) => Type.AnyEntity | undefined = internal.getSchema as any;
478
486
 
479
487
  /**
480
488
  * @returns The typename of the object's type.
481
489
  * Accepts both reactive objects and snapshots.
482
- * @example `example.com/type/Person`
490
+ * @example `com.example.type.person`
483
491
  */
484
- export const getTypename = (entity: Unknown | Snapshot): string | undefined => getTypename$(entity);
492
+ export const getTypename = (entity: Unknown | Snapshot): string | undefined => internal.getTypename(entity);
485
493
 
486
494
  //
487
495
  // Database
@@ -492,30 +500,35 @@ export const getTypename = (entity: Unknown | Snapshot): string | undefined => g
492
500
  * Accepts both reactive objects and snapshots.
493
501
  */
494
502
  export const getDatabase = (entity: Entity.Unknown | Entity.Snapshot): Database.Database | undefined =>
495
- getDatabase$(entity);
503
+ internal.getDatabase(entity);
496
504
 
497
505
  //
498
506
  // Meta
499
507
  //
500
508
 
501
- export const Meta: unique symbol = MetaId as any;
509
+ /**
510
+ * Property that accesses metadata for an entity.
511
+ *
512
+ * Alias for `Entity.Meta`.
513
+ */
514
+ export const Meta = internal.MetaId;
502
515
 
503
516
  /**
504
517
  * Deeply read-only version of ObjectMeta.
505
518
  * Prevents mutation at all nesting levels (e.g., `meta.keys.push()` is a TypeScript error).
506
519
  */
507
- export type ReadonlyMeta = ApiReadonlyMeta;
520
+ export type ReadonlyMeta = internal.ReadonlyMeta;
508
521
 
509
522
  /**
510
- * Mutable meta type returned by `Obj.getMeta` inside an `Obj.change` callback.
523
+ * Mutable meta type returned by `Obj.getMeta` inside an `Obj.update` callback.
511
524
  */
512
- export type Meta = ApiMeta;
525
+ export type Meta = internal.Meta;
513
526
 
514
527
  // TODO(burdon): Narrow type.
515
528
  // TODO(dmaretskyi): Allow returning undefined.
516
529
  /**
517
530
  * Get the metadata for an object.
518
- * Returns mutable meta when passed a mutable object (inside `Obj.change` callback).
531
+ * Returns mutable meta when passed a mutable object (inside `Obj.update` callback).
519
532
  * Returns read-only meta when passed a regular object or snapshot.
520
533
  *
521
534
  * @example
@@ -524,8 +537,8 @@ export type Meta = ApiMeta;
524
537
  * const meta = Obj.getMeta(person); // ReadonlyMeta
525
538
  *
526
539
  * // Mutable access inside change callback
527
- * Obj.change(person, (p) => {
528
- * const meta = Obj.getMeta(p); // ObjectMeta (mutable)
540
+ * Obj.update(person, (obj) => {
541
+ * const meta = Obj.getMeta(obj); // ObjectMeta (mutable)
529
542
  * meta.tags ??= [];
530
543
  * meta.tags.push('important');
531
544
  * });
@@ -535,7 +548,7 @@ export type Meta = ApiMeta;
535
548
  export function getMeta(entity: Mutable<Unknown>): Meta;
536
549
  export function getMeta(entity: Unknown | Snapshot): ReadonlyMeta;
537
550
  export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | ReadonlyMeta {
538
- return getMeta$(entity);
551
+ return internal.getMetaChecked(entity);
539
552
  }
540
553
 
541
554
  /**
@@ -545,41 +558,41 @@ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | R
545
558
  export const getKeys: {
546
559
  (entity: Unknown | Snapshot, source: string): ForeignKey[];
547
560
  (source: string): (entity: Unknown | Snapshot) => ForeignKey[];
548
- } = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => getKeys$(entity, source!));
561
+ } = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => internal.getKeys(entity, source!));
549
562
 
550
563
  /**
551
564
  * Delete all keys from the object for the specified source.
552
- * Must be called within an `Obj.change` callback.
565
+ * Must be called within an `Obj.update` callback.
553
566
  *
554
567
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
555
568
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
556
569
  */
557
- export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => deleteKeys$(entity, source);
570
+ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => internal.deleteKeys(entity, source);
558
571
 
559
572
  /**
560
573
  * Add a tag to the object.
561
- * Must be called within an `Obj.change` callback.
574
+ * Must be called within an `Obj.update` callback.
562
575
  *
563
576
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
564
577
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
565
578
  */
566
- export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag$(entity, tag);
579
+ export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);
567
580
 
568
581
  /**
569
582
  * Remove a tag from the object.
570
- * Must be called within an `Obj.change` callback.
583
+ * Must be called within an `Obj.update` callback.
571
584
  *
572
585
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
573
586
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
574
587
  */
575
- export const removeTag = (entity: Mutable<Unknown>, tag: string): void => removeTag$(entity, tag);
588
+ export const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);
576
589
 
577
590
  /**
578
591
  * Check if the object is deleted.
579
592
  * Accepts both reactive objects and snapshots.
580
593
  */
581
594
  // TODO(dmaretskyi): Default to `false`.
582
- export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(entity);
595
+ export const isDeleted = (entity: Unknown | Snapshot): boolean => objInternal.isDeleted(entity);
583
596
 
584
597
  //
585
598
  // Annotations
@@ -589,32 +602,32 @@ export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(ent
589
602
  * Get the label of the object.
590
603
  * Accepts both reactive objects and snapshots.
591
604
  */
592
- export const getLabel = (entity: Unknown | Snapshot): string | undefined => getLabel$(entity);
605
+ export const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);
593
606
 
594
607
  /**
595
608
  * Set the label of the object.
596
- * Must be called within an `Obj.change` callback.
609
+ * Must be called within an `Obj.update` callback.
597
610
  *
598
611
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
599
612
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
600
613
  */
601
- export const setLabel = (entity: Mutable<Unknown>, label: string): void => setLabel$(entity, label);
614
+ export const setLabel = (entity: Mutable<Unknown>, label: string): void => internal.setLabel(entity, label);
602
615
 
603
616
  /**
604
617
  * Get the description of the object.
605
618
  * Accepts both reactive objects and snapshots.
606
619
  */
607
- export const getDescription = (entity: Unknown | Snapshot): string | undefined => getDescription$(entity);
620
+ export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
608
621
 
609
622
  /**
610
623
  * Set the description of the object.
611
- * Must be called within an `Obj.change` callback.
624
+ * Must be called within an `Obj.update` callback.
612
625
  *
613
626
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
614
627
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
615
628
  */
616
629
  export const setDescription = (entity: Mutable<Unknown>, description: string): void =>
617
- setDescription$(entity, description);
630
+ internal.setDescription(entity, description);
618
631
 
619
632
  /**
620
633
  * Symbol to set parent when creating objects with `Obj.make`.
@@ -626,7 +639,7 @@ export const setDescription = (entity: Mutable<Unknown>, description: string): v
626
639
  * })
627
640
  * ```
628
641
  */
629
- export const Parent: unique symbol = ParentId as any;
642
+ export const Parent: unique symbol = internal.ParentId as any;
630
643
 
631
644
  /**
632
645
  * Get the parent of an object.
@@ -636,8 +649,8 @@ export const Parent: unique symbol = ParentId as any;
636
649
  */
637
650
  export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
638
651
  assertArgument(isObject(entity), 'Expected an object');
639
- assumeType<InternalObjectProps>(entity);
640
- return entity[ParentId] as Unknown | undefined;
652
+ assumeType<internal.InternalObjectProps>(entity);
653
+ return entity[internal.ParentId] as Unknown | undefined;
641
654
  };
642
655
 
643
656
  /**
@@ -648,9 +661,125 @@ export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
648
661
  export const setParent = (entity: Unknown, parent: Any | undefined) => {
649
662
  assertArgument(isObject(entity), 'Expected an object');
650
663
  assertArgument(parent === undefined || isObject(parent), 'Expected an object');
651
- assumeType<InternalObjectProps>(entity);
652
- assumeType<InternalObjectProps | undefined>(parent);
653
- entity[ParentId] = parent;
664
+ assumeType<internal.InternalObjectProps>(entity);
665
+ assumeType<internal.InternalObjectProps | undefined>(parent);
666
+ entity[internal.ParentId] = parent;
667
+ };
668
+
669
+ interface UpdateFromOptions<T> {
670
+ exclude?: (keyof T)[];
671
+ include?: (keyof T)[];
672
+ }
673
+
674
+ const valuesEqual = (left: unknown, right: unknown): boolean => {
675
+ if (left === right) {
676
+ return true;
677
+ }
678
+ if (left === null || right === null) {
679
+ return left === right;
680
+ }
681
+ if (typeof left !== 'object' || typeof right !== 'object') {
682
+ return Utils.structuralRegion(() => Equal.equals(left, right));
683
+ }
684
+ if (Ref.isRef(left) && Ref.isRef(right)) {
685
+ return left.dxn.toString() === right.dxn.toString();
686
+ }
687
+ if (Ref.isRef(left) || Ref.isRef(right)) {
688
+ return false;
689
+ }
690
+ if (Array.isArray(left) && Array.isArray(right)) {
691
+ if (left.length !== right.length) {
692
+ return false;
693
+ }
694
+ for (let index = 0; index < left.length; index++) {
695
+ if (!valuesEqual(left[index], right[index])) {
696
+ return false;
697
+ }
698
+ }
699
+ return true;
700
+ }
701
+ if (Array.isArray(left) || Array.isArray(right)) {
702
+ return false;
703
+ }
704
+ const leftRecord = left as Record<string, unknown>;
705
+ const rightRecord = right as Record<string, unknown>;
706
+ const keys = new Set([
707
+ ...Object.keys(leftRecord).filter((key) => key !== 'id'),
708
+ ...Object.keys(rightRecord).filter((key) => key !== 'id'),
709
+ ]);
710
+ for (const key of keys) {
711
+ const leftHas = Object.hasOwn(leftRecord, key);
712
+ const rightHas = Object.hasOwn(rightRecord, key);
713
+ const leftValue = leftHas ? leftRecord[key] : undefined;
714
+ const rightValue = rightHas ? rightRecord[key] : undefined;
715
+ if (!valuesEqual(leftValue, rightValue)) {
716
+ return false;
717
+ }
718
+ }
719
+ return true;
720
+ };
721
+
722
+ /**
723
+ * Breaks reactive proxies on assigned values so echo-db assignment accepts nested structs (same idea as link assignment).
724
+ */
725
+ const prepareAssignValue = (value: unknown): unknown =>
726
+ deepMapValues(value, (nested, recurse) => {
727
+ if (nested === null || typeof nested !== 'object') {
728
+ return nested;
729
+ }
730
+ if (Ref.isRef(nested)) {
731
+ return nested;
732
+ }
733
+ if (Array.isArray(nested)) {
734
+ return recurse(nested);
735
+ }
736
+ if (isProxy(nested)) {
737
+ return recurse({ ...getProxyTarget(nested) });
738
+ }
739
+ return recurse(nested);
740
+ });
741
+
742
+ /**
743
+ * For each key present on `source` (except `id`), assigns `target[key]` when the current value differs.
744
+ * References are compared by target DXN; other values use Effect `Equal.equals` inside a structural region,
745
+ * with recursive comparison for arrays and plain object-shaped property bags (excluding `id`).
746
+ *
747
+ * Must be called within an `Obj.update` callback.
748
+ *
749
+ * @returns Whether any property was updated.
750
+ */
751
+ export const updateFrom = <T extends Unknown>(
752
+ target: Mutable<T>,
753
+ source: T,
754
+ options?: UpdateFromOptions<T>,
755
+ ): boolean => {
756
+ assertArgument(isObject(target), 'Expected an echo object target.');
757
+ assertArgument(isObject(source), 'Expected an echo object source.');
758
+ let keys = Object.keys(source as Record<string, unknown>).filter((key) => key !== 'id');
759
+ if (options?.include !== undefined) {
760
+ const include = new Set(options.include.map((key) => String(key)));
761
+ keys = keys.filter((key) => include.has(key));
762
+ }
763
+ if (options?.exclude !== undefined) {
764
+ const exclude = new Set(options.exclude.map((key) => String(key)));
765
+ keys = keys.filter((key) => !exclude.has(key));
766
+ }
767
+ let updated = false;
768
+ const sourceRecord = source as Record<string, unknown>;
769
+ const targetRecord = target as Record<string, unknown>;
770
+ for (const key of keys) {
771
+ if (!Object.hasOwn(sourceRecord, key)) {
772
+ continue;
773
+ }
774
+ const nextValue = sourceRecord[key];
775
+ const prevValue = Object.hasOwn(targetRecord, key) ? targetRecord[key] : undefined;
776
+ if (valuesEqual(prevValue, nextValue)) {
777
+ continue;
778
+ }
779
+ targetRecord[key] = prepareAssignValue(nextValue) as never;
780
+ updated = true;
781
+ }
782
+ return updated;
654
783
  };
655
784
 
656
785
  //
@@ -660,7 +789,7 @@ export const setParent = (entity: Unknown, parent: Any | undefined) => {
660
789
  /**
661
790
  * JSON representation of an object.
662
791
  */
663
- export type JSON = APIJSON;
792
+ export type JSON = internal.ObjectJSON;
664
793
 
665
794
  /**
666
795
  * Converts object to its JSON representation.
@@ -668,7 +797,7 @@ export type JSON = APIJSON;
668
797
  *
669
798
  * The same algorithm is used when calling the standard `JSON.stringify(obj)` function.
670
799
  */
671
- export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
800
+ export const toJSON = (entity: Unknown | Snapshot): JSON => objInternal.objectToJSON(entity);
672
801
 
673
802
  /**
674
803
  * Creates an object from its json representation, performing schema validation.
@@ -678,38 +807,45 @@ export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
678
807
  *
679
808
  * @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
680
809
  * @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
810
+ * @param options.database - Database to associate with the object.
681
811
  */
682
- export const fromJSON: (json: unknown, options?: { refResolver?: Ref.Resolver; dxn?: DXN }) => Promise<Unknown> =
683
- objectFromJSON as any;
812
+ export const fromJSON: (
813
+ json: unknown,
814
+ options?: { refResolver?: Ref.Resolver; dxn?: DXN; database?: Database.Database; parent?: Unknown },
815
+ ) => Promise<Unknown> = objInternal.objectFromJSON as any;
684
816
 
685
817
  /**
686
818
  * Comparator function type for sorting objects.
687
819
  * Accepts both reactive objects and snapshots.
688
820
  */
689
- export type Comparator = ApiComparator<Unknown | Snapshot>;
821
+ export type Comparator = internal.Comparator<Unknown | Snapshot>;
690
822
 
691
- export const sortByLabel: Comparator = sortByLabel$ as Comparator;
692
- export const sortByTypename: Comparator = sortByTypename$ as Comparator;
693
- export const sort = (...comparators: Comparator[]): Comparator => sort$(...comparators) as Comparator;
823
+ export const sortByLabel: Comparator = internal.sortByLabel as Comparator;
824
+ export const sortByTypename: Comparator = internal.sortByTypename as Comparator;
825
+ export const sort = (...comparators: Comparator[]): Comparator => internal.sort(...comparators) as Comparator;
694
826
 
695
827
  //
696
828
  // Version
697
829
  //
698
830
 
699
- export { VersionTypeId };
700
- export type { VersionCompareResult };
831
+ export const VersionTypeId = internal.VersionTypeId;
832
+ export type VersionCompareResult = internal.VersionCompareResult;
701
833
 
702
834
  /**
703
835
  * Represent object version.
704
836
  * May be backed by Automerge.
705
837
  * Objects with no history are not versioned.
706
838
  */
707
- export type Version = ApiVersion;
839
+ export type Version = internal.EntityVersion;
708
840
 
709
- export { isVersion, versionValid, compareVersions, encodeVersion, decodeVersion };
841
+ export const isVersion = internal.isVersion;
842
+ export const versionValid = internal.versionValid;
843
+ export const compareVersions = internal.compareVersions;
844
+ export const encodeVersion = internal.encodeVersion;
845
+ export const decodeVersion = internal.decodeVersion;
710
846
 
711
847
  /**
712
848
  * Returns the version of the object.
713
849
  * Accepts both reactive objects and snapshots.
714
850
  */
715
- export const version = (entity: Unknown | Snapshot): Version => version$(entity);
851
+ export const version = (entity: Unknown | Snapshot): Version => internal.version(entity);