@dxos/echo 0.8.4-main.937b3ca → 0.8.4-main.9be5663bfe

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