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

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 (539) hide show
  1. package/README.md +2 -2
  2. package/dist/lib/neutral/Annotation.mjs +8 -3
  3. package/dist/lib/neutral/Database.mjs +36 -6
  4. package/dist/lib/neutral/Entity.mjs +18 -10
  5. package/dist/lib/neutral/Err.mjs +3 -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 +45 -0
  9. package/dist/lib/neutral/Feed.mjs.map +7 -0
  10. package/dist/lib/neutral/Filter.mjs +19 -10
  11. package/dist/lib/neutral/Format.mjs +3 -3
  12. package/dist/lib/neutral/JsonSchema.mjs +9 -9
  13. package/dist/lib/neutral/Obj.mjs +35 -15
  14. package/dist/lib/neutral/Order.mjs +1 -1
  15. package/dist/lib/neutral/Query.mjs +21 -9
  16. package/dist/lib/neutral/Ref.mjs +9 -7
  17. package/dist/lib/neutral/Relation.mjs +20 -11
  18. package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
  19. package/dist/lib/neutral/Tag.mjs +13 -10
  20. package/dist/lib/neutral/Type.mjs +13 -23
  21. package/dist/lib/neutral/chunk-24XI6DOL.mjs +34 -0
  22. package/dist/lib/neutral/chunk-24XI6DOL.mjs.map +7 -0
  23. package/dist/lib/neutral/{chunk-VB5HVDCA.mjs → chunk-4YAAHG3E.mjs} +53 -5
  24. package/dist/lib/neutral/chunk-4YAAHG3E.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-CUDIBUM4.mjs → chunk-4ZRIO2QF.mjs} +104 -25
  26. package/dist/lib/neutral/chunk-4ZRIO2QF.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-SU2LVM7J.mjs → chunk-7C2A2RP6.mjs} +1731 -2747
  28. package/dist/lib/neutral/chunk-7C2A2RP6.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-4L6DOFXP.mjs → chunk-BNCCGLJN.mjs} +1 -1
  30. package/dist/lib/neutral/{chunk-4L6DOFXP.mjs.map → chunk-BNCCGLJN.mjs.map} +1 -1
  31. package/dist/lib/neutral/{chunk-2MTHJ5UW.mjs → chunk-CAB5PWUF.mjs} +134 -24
  32. package/dist/lib/neutral/chunk-CAB5PWUF.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-62DWJ6CE.mjs → chunk-DQYLD2RB.mjs} +14 -14
  34. package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-XMIDBDE6.mjs → chunk-DUTD5HFU.mjs} +11 -56
  36. package/dist/lib/neutral/chunk-DUTD5HFU.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-EKQJGGA3.mjs +396 -0
  38. package/dist/lib/neutral/chunk-EKQJGGA3.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-VR4A4WGG.mjs → chunk-EOIR5O5I.mjs} +72 -23
  40. package/dist/lib/neutral/chunk-EOIR5O5I.mjs.map +7 -0
  41. package/dist/lib/neutral/{chunk-HMOXCO27.mjs → chunk-GVY6O76A.mjs} +8 -3
  42. package/dist/lib/neutral/chunk-GVY6O76A.mjs.map +7 -0
  43. package/dist/lib/neutral/{chunk-4TT624YA.mjs → chunk-GZQTCRJB.mjs} +2 -2
  44. package/dist/lib/neutral/{chunk-4TT624YA.mjs.map → chunk-GZQTCRJB.mjs.map} +1 -1
  45. package/dist/lib/neutral/chunk-HGHJ36DH.mjs +117 -0
  46. package/dist/lib/neutral/chunk-HGHJ36DH.mjs.map +7 -0
  47. package/dist/lib/neutral/{chunk-3ZEAZF7T.mjs → chunk-IICPQK3M.mjs} +8 -4
  48. package/dist/lib/neutral/chunk-IICPQK3M.mjs.map +7 -0
  49. package/dist/lib/neutral/{chunk-IP2GHXWA.mjs → chunk-NKPWM67P.mjs} +5 -5
  50. package/dist/lib/neutral/chunk-NKPWM67P.mjs.map +7 -0
  51. package/dist/lib/neutral/{chunk-6QPSGMEF.mjs → chunk-OPMZTWI3.mjs} +32 -8
  52. package/dist/lib/neutral/chunk-OPMZTWI3.mjs.map +7 -0
  53. package/dist/lib/neutral/{chunk-NWUO5FKZ.mjs → chunk-OPQEHU36.mjs} +8 -2
  54. package/dist/lib/neutral/chunk-OPQEHU36.mjs.map +7 -0
  55. package/dist/lib/neutral/chunk-QDV7C7VM.mjs +299 -0
  56. package/dist/lib/neutral/chunk-QDV7C7VM.mjs.map +7 -0
  57. package/dist/lib/neutral/{chunk-YQYMWZAD.mjs → chunk-TBKX6JQO.mjs} +4 -4
  58. package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +7 -0
  59. package/dist/lib/neutral/{chunk-RPB6V4BE.mjs → chunk-UBEZSGXY.mjs} +14 -1
  60. package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +7 -0
  61. package/dist/lib/neutral/{chunk-ROKO4RKJ.mjs → chunk-UI6MWK5W.mjs} +2 -2
  62. package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +7 -0
  63. package/dist/lib/neutral/chunk-XV5R2XZH.mjs +133 -0
  64. package/dist/lib/neutral/chunk-XV5R2XZH.mjs.map +7 -0
  65. package/dist/lib/neutral/chunk-YPGDBRPH.mjs +159 -0
  66. package/dist/lib/neutral/chunk-YPGDBRPH.mjs.map +7 -0
  67. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +50 -0
  68. package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +7 -0
  69. package/dist/lib/neutral/chunk-ZCBOJ6I7.mjs +787 -0
  70. package/dist/lib/neutral/chunk-ZCBOJ6I7.mjs.map +7 -0
  71. package/dist/lib/neutral/index.mjs +42 -25
  72. package/dist/lib/neutral/internal/index.mjs +56 -38
  73. package/dist/lib/neutral/meta.json +1 -1
  74. package/dist/lib/neutral/testing/index.mjs +42 -34
  75. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  76. package/dist/types/src/Annotation.d.ts +23 -1
  77. package/dist/types/src/Annotation.d.ts.map +1 -1
  78. package/dist/types/src/Collection.d.ts +16 -0
  79. package/dist/types/src/Collection.d.ts.map +1 -0
  80. package/dist/types/src/Database.d.ts +86 -84
  81. package/dist/types/src/Database.d.ts.map +1 -1
  82. package/dist/types/src/Dataset.d.ts +19 -0
  83. package/dist/types/src/Dataset.d.ts.map +1 -0
  84. package/dist/types/src/Entity.d.ts +41 -15
  85. package/dist/types/src/Entity.d.ts.map +1 -1
  86. package/dist/types/src/Err.d.ts +43 -0
  87. package/dist/types/src/Err.d.ts.map +1 -1
  88. package/dist/types/src/Extension.d.ts +80 -0
  89. package/dist/types/src/Extension.d.ts.map +1 -0
  90. package/dist/types/src/Extension.test.d.ts +2 -0
  91. package/dist/types/src/Extension.test.d.ts.map +1 -0
  92. package/dist/types/src/Feed.d.ts +163 -0
  93. package/dist/types/src/Feed.d.ts.map +1 -0
  94. package/dist/types/src/Filter.d.ts +21 -5
  95. package/dist/types/src/Filter.d.ts.map +1 -1
  96. package/dist/types/src/Filter.test.d.ts +2 -0
  97. package/dist/types/src/Filter.test.d.ts.map +1 -0
  98. package/dist/types/src/Format.d.ts +3 -3
  99. package/dist/types/src/Format.d.ts.map +1 -1
  100. package/dist/types/src/Hypergraph.d.ts +8 -3
  101. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  102. package/dist/types/src/JsonSchema.d.ts +11 -4
  103. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  104. package/dist/types/src/Obj.d.ts +158 -43
  105. package/dist/types/src/Obj.d.ts.map +1 -1
  106. package/dist/types/src/Order.d.ts.map +1 -1
  107. package/dist/types/src/Query.d.ts +109 -15
  108. package/dist/types/src/Query.d.ts.map +1 -1
  109. package/dist/types/src/Ref.d.ts +58 -10
  110. package/dist/types/src/Ref.d.ts.map +1 -1
  111. package/dist/types/src/Relation.d.ts +75 -28
  112. package/dist/types/src/Relation.d.ts.map +1 -1
  113. package/dist/types/src/SchemaRegistry.d.ts +4 -4
  114. package/dist/types/src/SchemaRegistry.d.ts.map +1 -1
  115. package/dist/types/src/Tag.d.ts +4 -3
  116. package/dist/types/src/Tag.d.ts.map +1 -1
  117. package/dist/types/src/Type.d.ts +51 -180
  118. package/dist/types/src/Type.d.ts.map +1 -1
  119. package/dist/types/src/View.d.ts +68 -0
  120. package/dist/types/src/View.d.ts.map +1 -0
  121. package/dist/types/src/hierarchy.test.d.ts +2 -0
  122. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  123. package/dist/types/src/index.d.ts +5 -0
  124. package/dist/types/src/index.d.ts.map +1 -1
  125. package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +69 -8
  126. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  127. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  128. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  129. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  130. package/dist/types/src/internal/{api → Annotation}/sorting.d.ts +1 -1
  131. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  132. package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +13 -1
  133. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  134. package/dist/types/src/internal/{api/entity.d.ts → Entity/api.d.ts} +2 -2
  135. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  136. package/dist/types/src/internal/{entities → Entity}/entity.d.ts +3 -3
  137. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  138. package/dist/types/src/internal/{entities → Entity}/index.d.ts +2 -0
  139. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  140. package/dist/types/src/internal/{entities → Entity}/model.d.ts +4 -26
  141. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  142. package/dist/types/src/internal/{entities → Entity}/object.d.ts +2 -2
  143. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  144. package/dist/types/src/internal/{entities → Entity}/relation.d.ts +3 -30
  145. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  146. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  147. package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
  148. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  149. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  150. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  151. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  152. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  153. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  154. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  155. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  156. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  157. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  158. package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
  159. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  160. package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
  161. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  162. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  163. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  164. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  165. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +19 -19
  166. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  167. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  168. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  169. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  170. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  171. package/dist/types/src/internal/{object → Obj}/create-object.d.ts +2 -2
  172. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  173. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  174. package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
  175. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  176. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  177. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  178. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  179. package/dist/types/src/internal/{object → Obj}/json-serializer.d.ts +12 -5
  180. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  181. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  182. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  183. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  184. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  185. package/dist/types/src/internal/{object → Obj}/set-value.d.ts +1 -1
  186. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  187. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  188. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  189. package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +4 -4
  190. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  191. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  192. package/dist/types/src/internal/Query.d.ts +10 -0
  193. package/dist/types/src/internal/Query.d.ts.map +1 -0
  194. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  195. package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +1 -1
  196. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  197. package/dist/types/src/internal/{ref → Ref}/ref.d.ts +16 -3
  198. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  199. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  200. package/dist/types/src/internal/{schema → Type}/compose.d.ts +1 -1
  201. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  202. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  203. package/dist/types/src/internal/{schema → Type}/echo-schema.d.ts +8 -7
  204. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  205. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  206. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  207. package/dist/types/src/internal/{schema → Type}/persistent-schema.d.ts +2 -2
  208. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  209. package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
  210. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  211. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  212. package/dist/types/src/internal/common/index.d.ts +4 -0
  213. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  214. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  215. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  216. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  217. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  218. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  219. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  220. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  221. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  222. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  223. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  224. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  225. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  226. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  227. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +1 -1
  228. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
  229. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  230. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  231. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  232. package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +2 -1
  233. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  234. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  235. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  236. package/dist/types/src/internal/{types → common/types}/base.d.ts +1 -0
  237. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  238. package/dist/types/src/internal/{types → common/types}/entity.d.ts +2 -2
  239. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  240. package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
  241. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  242. package/dist/types/src/internal/{types → common/types}/meta.d.ts +2 -1
  243. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  244. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  245. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  246. package/dist/types/src/internal/{types → common/types}/typename.d.ts +8 -0
  247. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  248. package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
  249. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  250. package/dist/types/src/internal/index.d.ts +9 -10
  251. package/dist/types/src/internal/index.d.ts.map +1 -1
  252. package/dist/types/src/testing/test-schema.d.ts +19 -18
  253. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  254. package/dist/types/tsconfig.tsbuildinfo +1 -1
  255. package/package.json +24 -14
  256. package/src/Annotation.ts +31 -1
  257. package/src/Collection.ts +37 -0
  258. package/src/Database.ts +167 -173
  259. package/src/Dataset.ts +26 -0
  260. package/src/Entity.ts +73 -54
  261. package/src/Err.ts +22 -0
  262. package/src/Extension.test.ts +235 -0
  263. package/src/Extension.ts +122 -0
  264. package/src/Feed.ts +268 -0
  265. package/src/Filter.test.ts +90 -0
  266. package/src/Filter.ts +55 -7
  267. package/src/Format.ts +3 -3
  268. package/src/Hypergraph.ts +9 -4
  269. package/src/JsonSchema.ts +14 -4
  270. package/src/Obj.test.ts +69 -8
  271. package/src/Obj.ts +285 -140
  272. package/src/Order.ts +3 -1
  273. package/src/Query.test.ts +248 -15
  274. package/src/Query.ts +275 -24
  275. package/src/Ref.ts +64 -11
  276. package/src/Relation.test.ts +8 -2
  277. package/src/Relation.ts +165 -131
  278. package/src/SchemaRegistry.ts +5 -4
  279. package/src/Tag.ts +6 -5
  280. package/src/Type.test.ts +10 -10
  281. package/src/Type.ts +70 -303
  282. package/src/View.ts +107 -0
  283. package/src/hierarchy.test.ts +33 -0
  284. package/src/index.ts +5 -0
  285. package/src/internal/{annotations → Annotation}/annotations.test.ts +56 -6
  286. package/src/internal/{annotations → Annotation}/annotations.ts +134 -15
  287. package/src/internal/{annotations → Annotation}/index.ts +1 -0
  288. package/src/internal/{api → Annotation}/sorting.ts +2 -3
  289. package/src/internal/{annotations → Annotation}/util.ts +14 -1
  290. package/src/internal/{api/entity.ts → Entity/api.ts} +4 -2
  291. package/src/internal/{entities → Entity}/entity.ts +6 -4
  292. package/src/internal/{entities → Entity}/index.ts +2 -0
  293. package/src/internal/{entities → Entity}/model.ts +17 -42
  294. package/src/internal/{entities → Entity}/object.ts +2 -2
  295. package/src/internal/{entities → Entity}/relation.ts +19 -36
  296. package/src/internal/{api → Entity}/version.ts +3 -2
  297. package/src/internal/{formats → Format}/date.test.ts +1 -1
  298. package/src/internal/{formats → Format}/format.test.ts +1 -1
  299. package/src/internal/{formats → Format}/types.ts +3 -3
  300. package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
  301. package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
  302. package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +48 -48
  303. package/src/internal/{json-schema → JsonSchema}/json-schema.ts +6 -4
  304. package/src/internal/{object → Obj}/clone.ts +3 -3
  305. package/src/internal/{object → Obj}/common.ts +2 -2
  306. package/src/internal/{object → Obj}/create-object.test.ts +4 -4
  307. package/src/internal/{object → Obj}/create-object.ts +5 -5
  308. package/src/internal/{object → Obj}/deleted.ts +2 -2
  309. package/src/internal/{object → Obj}/inspect.ts +2 -2
  310. package/src/internal/{object → Obj}/json-serializer.test.ts +31 -8
  311. package/src/internal/{object → Obj}/json-serializer.ts +42 -15
  312. package/src/internal/{object → Obj}/schema-validator.ts +1 -1
  313. package/src/internal/{object → Obj}/set-value.test.ts +24 -24
  314. package/src/internal/{object → Obj}/set-value.ts +2 -2
  315. package/src/internal/Obj/snapshot.ts +105 -0
  316. package/src/internal/{object → Obj}/typed-object.test.ts +3 -3
  317. package/src/internal/{object → Obj}/typed-object.ts +4 -4
  318. package/src/internal/Query.ts +132 -0
  319. package/src/internal/{ref → Ref}/ref-array.ts +1 -1
  320. package/src/internal/{ref → Ref}/ref.test.ts +4 -4
  321. package/src/internal/{ref → Ref}/ref.ts +27 -4
  322. package/src/internal/{schema → Type}/compose.test.ts +5 -5
  323. package/src/internal/{schema → Type}/compose.ts +1 -1
  324. package/src/internal/{schema → Type}/echo-schema.ts +11 -10
  325. package/src/internal/{schema → Type}/manipulation.ts +1 -1
  326. package/src/internal/{schema → Type}/persistent-schema.ts +10 -4
  327. package/src/internal/{README.md → common/README.md} +1 -1
  328. package/src/internal/{api → common/api}/index.ts +0 -4
  329. package/src/internal/common/index.ts +7 -0
  330. package/src/internal/{proxy → common/proxy}/change.test.ts +58 -58
  331. package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -2
  332. package/src/internal/{proxy → common/proxy}/json-serializer.ts +6 -3
  333. package/src/internal/{proxy → common/proxy}/make-object.ts +13 -3
  334. package/src/internal/{proxy → common/proxy}/reactive.ts +1 -1
  335. package/src/internal/{proxy → common/proxy}/schema.test.ts +10 -10
  336. package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +6 -6
  337. package/src/internal/{proxy → common/proxy}/typed-handler.ts +10 -3
  338. package/src/internal/{proxy → common/proxy}/typed-object.test.ts +4 -4
  339. package/src/internal/{types → common/types}/base.ts +1 -1
  340. package/src/internal/{types → common/types}/entity.ts +2 -2
  341. package/src/internal/{types → common/types}/index.ts +1 -0
  342. package/src/internal/{types → common/types}/meta.ts +4 -1
  343. package/src/internal/common/types/model-symbols.ts +69 -0
  344. package/src/internal/{types → common/types}/typename.ts +10 -0
  345. package/src/internal/{types → common/types}/version.ts +2 -3
  346. package/src/internal/index.ts +9 -31
  347. package/src/testing/api.test.ts +4 -4
  348. package/src/testing/test-schema.ts +20 -18
  349. package/dist/lib/neutral/chunk-2MTHJ5UW.mjs.map +0 -7
  350. package/dist/lib/neutral/chunk-3ZEAZF7T.mjs.map +0 -7
  351. package/dist/lib/neutral/chunk-62DWJ6CE.mjs.map +0 -7
  352. package/dist/lib/neutral/chunk-6QPSGMEF.mjs.map +0 -7
  353. package/dist/lib/neutral/chunk-CUDIBUM4.mjs.map +0 -7
  354. package/dist/lib/neutral/chunk-HMOXCO27.mjs.map +0 -7
  355. package/dist/lib/neutral/chunk-IP2GHXWA.mjs.map +0 -7
  356. package/dist/lib/neutral/chunk-KRHDMXSU.mjs +0 -132
  357. package/dist/lib/neutral/chunk-KRHDMXSU.mjs.map +0 -7
  358. package/dist/lib/neutral/chunk-NWUO5FKZ.mjs.map +0 -7
  359. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +0 -7
  360. package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +0 -7
  361. package/dist/lib/neutral/chunk-SU2LVM7J.mjs.map +0 -7
  362. package/dist/lib/neutral/chunk-VB5HVDCA.mjs.map +0 -7
  363. package/dist/lib/neutral/chunk-VR4A4WGG.mjs.map +0 -7
  364. package/dist/lib/neutral/chunk-X2MPMYYN.mjs +0 -13
  365. package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +0 -7
  366. package/dist/lib/neutral/chunk-XK5OUUBY.mjs +0 -157
  367. package/dist/lib/neutral/chunk-XK5OUUBY.mjs.map +0 -7
  368. package/dist/lib/neutral/chunk-XMIDBDE6.mjs.map +0 -7
  369. package/dist/lib/neutral/chunk-YQYMWZAD.mjs.map +0 -7
  370. package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
  371. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
  372. package/dist/types/src/internal/annotations/index.d.ts +0 -3
  373. package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
  374. package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
  375. package/dist/types/src/internal/api/annotations.d.ts +0 -23
  376. package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
  377. package/dist/types/src/internal/api/entity.d.ts.map +0 -1
  378. package/dist/types/src/internal/api/index.d.ts.map +0 -1
  379. package/dist/types/src/internal/api/meta.d.ts.map +0 -1
  380. package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
  381. package/dist/types/src/internal/api/version.d.ts.map +0 -1
  382. package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
  383. package/dist/types/src/internal/entities/index.d.ts.map +0 -1
  384. package/dist/types/src/internal/entities/model.d.ts.map +0 -1
  385. package/dist/types/src/internal/entities/object.d.ts.map +0 -1
  386. package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
  387. package/dist/types/src/internal/entities/util.d.ts.map +0 -1
  388. package/dist/types/src/internal/formats/date.d.ts.map +0 -1
  389. package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
  390. package/dist/types/src/internal/formats/format.d.ts.map +0 -1
  391. package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
  392. package/dist/types/src/internal/formats/index.d.ts.map +0 -1
  393. package/dist/types/src/internal/formats/number.d.ts.map +0 -1
  394. package/dist/types/src/internal/formats/object.d.ts.map +0 -1
  395. package/dist/types/src/internal/formats/select.d.ts.map +0 -1
  396. package/dist/types/src/internal/formats/string.d.ts.map +0 -1
  397. package/dist/types/src/internal/formats/types.d.ts.map +0 -1
  398. package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
  399. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
  400. package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
  401. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
  402. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
  403. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
  404. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
  405. package/dist/types/src/internal/object/clone.d.ts.map +0 -1
  406. package/dist/types/src/internal/object/common.d.ts.map +0 -1
  407. package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
  408. package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
  409. package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
  410. package/dist/types/src/internal/object/ids.d.ts.map +0 -1
  411. package/dist/types/src/internal/object/index.d.ts.map +0 -1
  412. package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
  413. package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
  414. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
  415. package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
  416. package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
  417. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
  418. package/dist/types/src/internal/object/set-value.d.ts.map +0 -1
  419. package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
  420. package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
  421. package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
  422. package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
  423. package/dist/types/src/internal/proxy/change-context.d.ts.map +0 -1
  424. package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
  425. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
  426. package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
  427. package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
  428. package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
  429. package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
  430. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
  431. package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
  432. package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
  433. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
  434. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
  435. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
  436. package/dist/types/src/internal/proxy/reactive.d.ts.map +0 -1
  437. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
  438. package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
  439. package/dist/types/src/internal/proxy/symbols.d.ts.map +0 -1
  440. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
  441. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
  442. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
  443. package/dist/types/src/internal/ref/index.d.ts.map +0 -1
  444. package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
  445. package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
  446. package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
  447. package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
  448. package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
  449. package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
  450. package/dist/types/src/internal/schema/index.d.ts.map +0 -1
  451. package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
  452. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
  453. package/dist/types/src/internal/types/base.d.ts.map +0 -1
  454. package/dist/types/src/internal/types/entity.d.ts.map +0 -1
  455. package/dist/types/src/internal/types/index.d.ts.map +0 -1
  456. package/dist/types/src/internal/types/meta.d.ts.map +0 -1
  457. package/dist/types/src/internal/types/typename.d.ts.map +0 -1
  458. package/dist/types/src/internal/types/version.d.ts.map +0 -1
  459. package/src/internal/api/annotations.ts +0 -60
  460. package/src/internal/object/snapshot.ts +0 -70
  461. /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
  462. /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
  463. /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
  464. /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
  465. /package/dist/types/src/internal/{formats → Format}/format.d.ts +0 -0
  466. /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
  467. /package/dist/types/src/internal/{formats → Format}/index.d.ts +0 -0
  468. /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
  469. /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
  470. /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
  471. /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
  472. /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
  473. /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
  474. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
  475. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +0 -0
  476. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
  477. /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
  478. /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
  479. /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
  480. /package/dist/types/src/internal/{object → Obj}/ids.d.ts +0 -0
  481. /package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -0
  482. /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
  483. /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
  484. /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
  485. /package/dist/types/src/internal/{object → Obj}/set-value.test.d.ts +0 -0
  486. /package/dist/types/src/internal/{object → Obj}/snapshot.d.ts +0 -0
  487. /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
  488. /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
  489. /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
  490. /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
  491. /package/dist/types/src/internal/{schema → Type}/index.d.ts +0 -0
  492. /package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -0
  493. /package/dist/types/src/internal/{api → common/api}/meta.d.ts +0 -0
  494. /package/dist/types/src/internal/{proxy → common/proxy}/change-context.d.ts +0 -0
  495. /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
  496. /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
  497. /package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +0 -0
  498. /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
  499. /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
  500. /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
  501. /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
  502. /package/dist/types/src/internal/{proxy → common/proxy}/make-object.d.ts +0 -0
  503. /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
  504. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
  505. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
  506. /package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +0 -0
  507. /package/dist/types/src/internal/{proxy → common/proxy}/schema-validator.d.ts +0 -0
  508. /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
  509. /package/dist/types/src/internal/{proxy → common/proxy}/symbols.d.ts +0 -0
  510. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
  511. /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
  512. /package/src/internal/{entities → Entity}/util.ts +0 -0
  513. /package/src/internal/{formats → Format}/date.ts +0 -0
  514. /package/src/internal/{formats → Format}/format.ts +0 -0
  515. /package/src/internal/{formats → Format}/index.ts +0 -0
  516. /package/src/internal/{formats → Format}/number.ts +0 -0
  517. /package/src/internal/{formats → Format}/object.ts +0 -0
  518. /package/src/internal/{formats → Format}/select.ts +0 -0
  519. /package/src/internal/{formats → Format}/string.ts +0 -0
  520. /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
  521. /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
  522. /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
  523. /package/src/internal/{object → Obj}/ids.ts +0 -0
  524. /package/src/internal/{object → Obj}/index.ts +0 -0
  525. /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
  526. /package/src/internal/{ref → Ref}/index.ts +0 -0
  527. /package/src/internal/{schema → Type}/index.ts +0 -0
  528. /package/src/internal/{api → common/api}/meta.ts +0 -0
  529. /package/src/internal/{proxy → common/proxy}/change-context.ts +0 -0
  530. /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
  531. /package/src/internal/{proxy → common/proxy}/errors.ts +0 -0
  532. /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
  533. /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
  534. /package/src/internal/{proxy → common/proxy}/ownership.ts +0 -0
  535. /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
  536. /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
  537. /package/src/internal/{proxy → common/proxy}/reactive-array.ts +0 -0
  538. /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
  539. /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
package/src/Obj.ts CHANGED
@@ -2,81 +2,36 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ // @import-as-namespace
6
+
7
+ import * as Effect from 'effect/Effect';
5
8
  import * as Function from 'effect/Function';
9
+ import * as Option from 'effect/Option';
6
10
  import * as Schema from 'effect/Schema';
7
11
 
8
12
  import type { ForeignKey } from '@dxos/echo-protocol';
9
- import { createJsonPath, getValue as getValue$ } from '@dxos/effect';
13
+ import { createJsonPath } from '@dxos/effect';
10
14
  import { assertArgument } from '@dxos/invariant';
11
15
  import { type DXN, ObjectId } from '@dxos/keys';
12
16
  import { assumeType } from '@dxos/util';
13
17
 
14
18
  import type * as Database from './Database';
15
19
  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';
20
+ import * as Err from './Err';
21
+ import * as objInternal from './internal/Obj';
22
+ import * as internal from './internal';
68
23
  import type * as Ref from './Ref';
69
24
  import type * as Type from './Type';
70
25
 
71
26
  /**
72
27
  * Base type for all ECHO objects.
73
28
  */
74
- interface BaseObj extends AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
29
+ interface BaseObj extends internal.AnyEntity, Entity.OfKind<typeof Entity.Kind.Object> {}
75
30
 
76
31
  /**
77
32
  * Object type with specific properties.
78
33
  */
79
- export type Obj<Props> = BaseObj & Props;
34
+ export type OfShape<Props> = BaseObj & Props;
80
35
 
81
36
  /**
82
37
  * Object with no known properties beyond id and kind.
@@ -88,6 +43,46 @@ export type Obj<Props> = BaseObj & Props;
88
43
  */
89
44
  export interface Unknown extends BaseObj {}
90
45
 
46
+ /**
47
+ * Runtime Effect schema for any ECHO object.
48
+ * Use for validation, parsing, or as a reference target for collections.
49
+ *
50
+ * NOTE: `Schema.is(Type.Obj)` does STRUCTURAL validation only (checks for `id` field).
51
+ * Use `Obj.isObject()` for proper ECHO instance type guards that check the KindId brand.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * // Structural type guard (accepts any object with id field)
56
+ * if (Schema.is(Type.Obj)(unknownValue)) { ... }
57
+ *
58
+ * // ECHO instance type guard (checks KindId brand)
59
+ * if (Obj.isObject(unknownValue)) { ... }
60
+ *
61
+ * // Reference to any object type
62
+ * const Collection = Schema.Struct({
63
+ * objects: Schema.Array(Ref.Ref(Obj.Unknown)),
64
+ * }).pipe(Type.object({ typename: 'Collection', version: '0.1.0' }));
65
+ * ```
66
+ */
67
+ // TODO(wittjosiah): Investigate if Schema.filter can validate KindId on ECHO instances.
68
+ // Effect Schema normalizes proxy objects to plain objects before calling filter predicates.
69
+ // Possible approaches: custom Schema.declare, AST manipulation, or upstream contribution.
70
+ export const Unknown: Type.Obj<Unknown> = Schema.Struct({
71
+ id: Schema.String,
72
+ }).pipe(
73
+ Schema.extend(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
74
+ // TODO(dmaretskyi): Clean this up.
75
+ // NOTE: The EchoObjectSchema annotation is required for Ref.Ref(Obj.Unknown) to work.
76
+ // The typename/version only satisfy ECHO schema machinery for reference targets.
77
+ internal.EchoObjectSchema({ typename: internal.ANY_OBJECT_TYPENAME, version: internal.ANY_OBJECT_VERSION }),
78
+ (schema) =>
79
+ Object.assign(schema, {
80
+ [internal.SchemaKindId]: (schema as any)[internal.SchemaKindId],
81
+ }) as unknown as Type.Obj<Unknown>,
82
+ );
83
+
84
+ /**
85
+
91
86
  /**
92
87
  * Object with arbitrary properties.
93
88
  *
@@ -96,13 +91,13 @@ export interface Unknown extends BaseObj {}
96
91
  *
97
92
  * Prefer using `Obj.Unknown` when you don't need to access arbitrary properties.
98
93
  */
99
- export interface Any extends BaseObj, AnyProperties {}
94
+ export interface Any extends BaseObj, internal.AnyProperties {}
100
95
 
101
96
  /**
102
97
  * Base type for snapshot objects (has SnapshotKindId instead of KindId).
103
98
  */
104
- interface BaseSnapshot extends AnyEntity {
105
- readonly [SnapshotKindId]: typeof Entity.Kind.Object;
99
+ interface BaseSnapshot extends internal.AnyEntity {
100
+ readonly [Entity.SnapshotKindId]: typeof Entity.Kind.Object;
106
101
  readonly id: ObjectId;
107
102
  }
108
103
 
@@ -115,16 +110,23 @@ interface BaseSnapshot extends AnyEntity {
115
110
  * Snapshots are structurally identical to reactive objects but have a different brand,
116
111
  * making them distinguishable at the TypeScript level. Neither is assignable to the other.
117
112
  */
118
- export type Snapshot<T extends Unknown = Unknown> = Omit<T, KindId> & BaseSnapshot;
113
+ export type Snapshot<T extends Unknown = Unknown> = Omit<T, Entity.KindId> & BaseSnapshot;
119
114
 
120
- const defaultMeta: ObjectMeta = {
115
+ /**
116
+ * JSON-encoded properties for objects.
117
+ */
118
+ export interface BaseObjJson {
119
+ id: string;
120
+ }
121
+
122
+ const defaultMeta: internal.ObjectMeta = {
121
123
  keys: [],
122
124
  };
123
125
 
124
- type Props<T = any> = {
126
+ type MakePropsInternal<T extends Unknown> = {
125
127
  id?: ObjectId;
126
- [Meta]?: Partial<ObjectMeta>;
127
- } & Type.Properties<T>;
128
+ [Meta]?: Partial<internal.ObjectMeta>;
129
+ } & Entity.Properties<T>;
128
130
 
129
131
  // TODO(burdon): Should we allow the caller to set the id?
130
132
  /**
@@ -132,8 +134,9 @@ type Props<T = any> = {
132
134
  */
133
135
  export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
134
136
  id?: ObjectId;
135
- [Meta]?: Partial<ObjectMeta>;
136
- } & NoInfer<Props<Schema.Schema.Type<S>>>;
137
+ [Meta]?: Partial<internal.ObjectMeta>;
138
+ [Parent]?: Unknown;
139
+ } & MakePropsInternal<Schema.Schema.Type<S>>;
137
140
 
138
141
  /**
139
142
  * Creates a new echo object of the given schema.
@@ -150,29 +153,36 @@ export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
150
153
  *
151
154
  * Note: Only accepts object schemas, not relation schemas. Use `Relation.make` for relations.
152
155
  */
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>(
156
+ export const make = <S extends Type.AnyObj>(
160
157
  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');
158
+ props: NoInfer<MakeProps<S>>,
159
+ ): OfShape<Schema.Schema.Type<S>> => {
160
+ assertArgument(
161
+ internal.getTypeAnnotation(schema)?.kind === Entity.Kind.Object,
162
+ 'schema',
163
+ 'Expected an object schema',
164
+ );
165
+
166
+ let meta: internal.ObjectMeta | undefined = undefined;
165
167
 
166
168
  // Set default fields on meta on creation.
167
- if (props[MetaId] != null) {
168
- meta = { ...structuredClone(defaultMeta), ...props[MetaId] };
169
- delete props[MetaId];
169
+ if (props[internal.MetaId] != null) {
170
+ meta = { ...structuredClone(defaultMeta), ...props[internal.MetaId] };
171
+ delete props[internal.MetaId];
170
172
  }
171
173
 
172
- // Filter undefined values.
173
- const filterUndefined = Object.fromEntries(Object.entries(props).filter(([_, v]) => v !== undefined));
174
+ // Filter undefined values (Object.entries only returns string-keyed properties).
175
+ const filterUndefined: any = Object.fromEntries(Object.entries(props).filter(([_, v]) => v !== undefined));
176
+
177
+ // Copy symbol properties (like ParentId) that Object.entries doesn't include.
178
+ for (const sym of Object.getOwnPropertySymbols(props)) {
179
+ const value = (props as any)[sym];
180
+ if (value !== undefined) {
181
+ filterUndefined[sym] = value;
182
+ }
183
+ }
174
184
 
175
- return makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
185
+ return internal.makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
176
186
  ...defaultMeta,
177
187
  ...meta,
178
188
  });
@@ -182,10 +192,15 @@ export const make: {
182
192
  * Determine if object is an ECHO object.
183
193
  */
184
194
  export const isObject = (obj: unknown): obj is Unknown => {
185
- assumeType<InternalObjectProps>(obj);
195
+ assumeType<internal.InternalObjectProps>(obj);
186
196
  return typeof obj === 'object' && obj !== null && obj[Entity.KindId] === Entity.Kind.Object;
187
197
  };
188
198
 
199
+ export const isSnapshot = (obj: unknown): obj is Snapshot => {
200
+ assumeType<internal.InternalObjectProps>(obj);
201
+ return typeof obj === 'object' && obj !== null && (obj as any)[Entity.SnapshotKindId] === Entity.Kind.Object;
202
+ };
203
+
189
204
  /**
190
205
  * Subscribe to object updates.
191
206
  * The callback is called synchronously when the object is modified.
@@ -193,7 +208,7 @@ export const isObject = (obj: unknown): obj is Unknown => {
193
208
  * @returns Unsubscribe function.
194
209
  */
195
210
  export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
196
- return subscribe$(obj, callback);
211
+ return internal.subscribe(obj, callback);
197
212
  };
198
213
 
199
214
  //
@@ -205,7 +220,61 @@ export const subscribe = (obj: Unknown, callback: () => void): (() => void) => {
205
220
  * The snapshot is branded with SnapshotKindId instead of KindId,
206
221
  * making it distinguishable from the reactive object at the type level.
207
222
  */
208
- export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = getSnapshot$ as any;
223
+ export const getSnapshot: <T extends Unknown>(obj: T) => Snapshot<T> = objInternal.getSnapshot as any;
224
+
225
+ /**
226
+ * Returns the reactive version of an object from the database, given its snapshot.
227
+ * Inverse of `Obj.getSnapshot`.
228
+ *
229
+ * Uses `Obj.getDatabase` internally to get the database from the snapshot,
230
+ * then resolves the reactive object by ID.
231
+ *
232
+ * @param snapshot - A snapshot of the object (from `Obj.getSnapshot`).
233
+ * @returns Effect that succeeds with the reactive object, or fails with `GetReactiveError`.
234
+ * @example
235
+ * ```ts
236
+ * const snapshot = Obj.getSnapshot(obj);
237
+ * const reactive = Obj.getReactive(snapshot).pipe(
238
+ * Effect.runSync
239
+ * );
240
+ * ```
241
+ */
242
+ export const getReactive = <T extends Unknown>(snapshot: Snapshot<T>): Effect.Effect<T, Err.GetReactiveError> =>
243
+ Effect.gen(function* () {
244
+ const db = internal.getDatabase(snapshot);
245
+ if (!db) {
246
+ return yield* Effect.fail(new Err.GetReactiveError({ reason: 'no-database', snapshotId: snapshot.id }));
247
+ }
248
+ const obj = db.getObjectById(snapshot.id);
249
+ if (!obj) {
250
+ return yield* Effect.fail(new Err.GetReactiveError({ reason: 'object-not-found', snapshotId: snapshot.id }));
251
+ }
252
+ return obj as T;
253
+ });
254
+
255
+ /**
256
+ * Like `Obj.getReactive` but returns `Option.none()` instead of failing when the object
257
+ * cannot be resolved (no database, object not found).
258
+ *
259
+ * @param snapshot - A snapshot of the object (from `Obj.getSnapshot`).
260
+ * @returns Effect that succeeds with `Option.some(reactive)` or `Option.none()`.
261
+ */
262
+ export const getReactiveOption = <T extends Unknown>(snapshot: Snapshot<T>): Effect.Effect<Option.Option<T>, never> =>
263
+ getReactive(snapshot).pipe(
264
+ Effect.map(Option.some),
265
+ Effect.catchAll(() => Effect.succeed(Option.none())),
266
+ );
267
+
268
+ /**
269
+ * Synchronous version of `Obj.getReactive`. Returns the reactive object or throws
270
+ * `GetReactiveError` when the object cannot be resolved (no database, object not found).
271
+ *
272
+ * @param snapshot - A snapshot of the object (from `Obj.getSnapshot`).
273
+ * @returns The reactive object.
274
+ * @throws {Err.GetReactiveError} When the object cannot be resolved.
275
+ */
276
+ export const getReactiveOrThrow = <T extends Unknown>(snapshot: Snapshot<T>): T =>
277
+ Effect.runSync(getReactive(snapshot));
209
278
 
210
279
  export type CloneOptions = {
211
280
  /**
@@ -226,7 +295,7 @@ export type CloneOptions = {
226
295
  * This does not clone referenced objects, only the properties in the object.
227
296
  * @returns A new object with the same schema and properties.
228
297
  */
229
- export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clone$;
298
+ export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = objInternal.clone;
230
299
 
231
300
  //
232
301
  // Change
@@ -236,7 +305,7 @@ export const clone: <T extends Unknown>(obj: T, opts?: CloneOptions) => T = clon
236
305
  * Makes all properties mutable recursively.
237
306
  * Used to provide a mutable view of an object within `Obj.change`.
238
307
  */
239
- export type { Mutable };
308
+ export type Mutable<T> = internal.Mutable<T>;
240
309
 
241
310
  /**
242
311
  * Perform mutations on an echo object within a controlled context.
@@ -256,9 +325,9 @@ export type { Mutable };
256
325
  * const person = Obj.make(Person, { name: 'John', age: 25 });
257
326
  *
258
327
  * // Mutate within Obj.change
259
- * Obj.change(person, (p) => {
260
- * p.name = 'Jane';
261
- * p.age = 30;
328
+ * Obj.change(person, (obj) => {
329
+ * obj.name = 'Jane';
330
+ * obj.age = 30;
262
331
  * });
263
332
  * // ONE notification fires here
264
333
  *
@@ -268,8 +337,8 @@ export type { Mutable };
268
337
  *
269
338
  * Note: Only accepts objects. Use `Relation.change` for relations.
270
339
  */
271
- export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>): void => {
272
- change$(obj, callback);
340
+ export const change = <T extends Unknown>(obj: T, callback: internal.ChangeCallback<T>): void => {
341
+ internal.change(obj, callback);
273
342
  };
274
343
 
275
344
  /**
@@ -295,7 +364,7 @@ export const change = <T extends Unknown>(obj: T, callback: ChangeCallback<T>):
295
364
  * ```
296
365
  */
297
366
  export const getValue = (obj: Unknown | Snapshot, path: readonly (string | number)[]): any => {
298
- return getValue$(obj, createJsonPath(path));
367
+ return internal.getValue(obj, createJsonPath(path));
299
368
  };
300
369
 
301
370
  /**
@@ -317,15 +386,15 @@ export const getValue = (obj: Unknown | Snapshot, path: readonly (string | numbe
317
386
  * ```ts
318
387
  * const person = Obj.make(Person, { name: 'John' });
319
388
  * // Person schema has: addresses: Schema.Array(Address)
320
- * Obj.change(person, (p) => {
321
- * Obj.setValue(p, ['addresses', 0, 'street'], '123 Main St');
389
+ * Obj.change(person, (obj) => {
390
+ * Obj.setValue(obj, ['addresses', 0, 'street'], '123 Main St');
322
391
  * });
323
392
  * // Creates: person.addresses = [{ street: '123 Main St' }]
324
393
  * ```
325
394
  */
326
395
  // TODO(wittjosiah): Compute possible path values + type value based on generic object type.
327
396
  export const setValue: (obj: Mutable<Unknown>, path: readonly (string | number)[], value: any) => void =
328
- setValue$ as any;
397
+ objInternal.setValue as any;
329
398
 
330
399
  //
331
400
  // Type
@@ -347,14 +416,44 @@ export type ID = ObjectId;
347
416
  * ```
348
417
  */
349
418
  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]) => {
419
+ <S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
420
+ <S extends Type.AnyEntity>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
421
+ } = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
353
422
  if (args.length === 1) {
354
- return (entity: unknown) => isInstanceOf(args[0], entity);
423
+ return (entity: unknown) => internal.isInstanceOf(args[0], entity);
355
424
  }
356
425
 
357
- return isInstanceOf(args[0], args[1]);
426
+ return internal.isInstanceOf(args[0], args[1]);
427
+ }) as any;
428
+
429
+ /**
430
+ * Test if a snapshot is an instance of a schema.
431
+ * Mirrors `instanceOf` but only accepts values branded with SnapshotKindId.
432
+ * Use when the value is known to be a snapshot (e.g. from `getSnapshot` or `useObject`).
433
+ *
434
+ * @example
435
+ * ```ts
436
+ * const snapshot = Obj.getSnapshot(person);
437
+ * if (Obj.snapshotOf(Person, snapshot)) {
438
+ * // snapshot is Obj.Snapshot<Person>
439
+ * }
440
+ * ```
441
+ */
442
+ export const snapshotOf: {
443
+ <S extends Type.AnyEntity>(schema: S): (value: unknown) => value is Snapshot<Schema.Schema.Type<S>>;
444
+ <S extends Type.AnyEntity>(schema: S, value: unknown): value is Snapshot<Schema.Schema.Type<S>>;
445
+ } = ((...args: [schema: Type.AnyEntity, value: unknown] | [schema: Type.AnyEntity]) => {
446
+ const check = (entity: unknown) =>
447
+ entity != null &&
448
+ typeof entity === 'object' &&
449
+ Entity.SnapshotKindId in entity &&
450
+ internal.isInstanceOf(args[0], entity);
451
+
452
+ if (args.length === 1) {
453
+ return (entity: unknown) => check(entity);
454
+ }
455
+
456
+ return check(args[1]);
358
457
  }) as any;
359
458
 
360
459
  // TODO(dmaretskyi): Allow returning undefined.
@@ -364,29 +463,29 @@ export const instanceOf: {
364
463
  */
365
464
  export const getDXN = (entity: Unknown | Snapshot): DXN => {
366
465
  assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
367
- return getDXN$(entity);
466
+ return internal.getDXN(entity);
368
467
  };
369
468
 
370
469
  /**
371
470
  * @returns The DXN of the object's type.
372
- * @example dxn:example.com/type/Person:1.0.0
471
+ * @example dxn:com.example.type.person:1.0.0
373
472
  */
374
473
  // TODO(wittjosiah): Narrow types.
375
- export const getTypeDXN: (obj: unknown | undefined) => DXN | undefined = getTypeDXN$ as any;
474
+ export const getTypeDXN: (obj: unknown | undefined) => DXN | undefined = internal.getTypeDXN as any;
376
475
 
377
476
  /**
378
477
  * Get the schema of the object.
379
478
  * Returns the branded ECHO schema used to create the object.
380
479
  */
381
480
  // TODO(wittjosiah): Narrow types.
382
- export const getSchema: (obj: unknown | undefined) => Type.Entity.Any | undefined = getSchema$ as any;
481
+ export const getSchema: (obj: unknown | undefined) => Type.AnyEntity | undefined = internal.getSchema as any;
383
482
 
384
483
  /**
385
484
  * @returns The typename of the object's type.
386
485
  * Accepts both reactive objects and snapshots.
387
- * @example `example.com/type/Person`
486
+ * @example `com.example.type.person`
388
487
  */
389
- export const getTypename = (entity: Unknown | Snapshot): string | undefined => getTypename$(entity);
488
+ export const getTypename = (entity: Unknown | Snapshot): string | undefined => internal.getTypename(entity);
390
489
 
391
490
  //
392
491
  // Database
@@ -396,24 +495,30 @@ export const getTypename = (entity: Unknown | Snapshot): string | undefined => g
396
495
  * Get the database the object belongs to.
397
496
  * Accepts both reactive objects and snapshots.
398
497
  */
399
- export const getDatabase = (entity: Unknown | Snapshot): Database.Database | undefined => getDatabase$(entity);
498
+ export const getDatabase = (entity: Entity.Unknown | Entity.Snapshot): Database.Database | undefined =>
499
+ internal.getDatabase(entity);
400
500
 
401
501
  //
402
502
  // Meta
403
503
  //
404
504
 
405
- export const Meta: unique symbol = MetaId as any;
505
+ /**
506
+ * Property that accesses metadata for an entity.
507
+ *
508
+ * Alias for `Entity.Meta`.
509
+ */
510
+ export const Meta = internal.MetaId;
406
511
 
407
512
  /**
408
513
  * Deeply read-only version of ObjectMeta.
409
514
  * Prevents mutation at all nesting levels (e.g., `meta.keys.push()` is a TypeScript error).
410
515
  */
411
- export type ReadonlyMeta = ApiReadonlyMeta;
516
+ export type ReadonlyMeta = internal.ReadonlyMeta;
412
517
 
413
518
  /**
414
519
  * Mutable meta type returned by `Obj.getMeta` inside an `Obj.change` callback.
415
520
  */
416
- export type Meta = ApiMeta;
521
+ export type Meta = internal.Meta;
417
522
 
418
523
  // TODO(burdon): Narrow type.
419
524
  // TODO(dmaretskyi): Allow returning undefined.
@@ -428,8 +533,8 @@ export type Meta = ApiMeta;
428
533
  * const meta = Obj.getMeta(person); // ReadonlyMeta
429
534
  *
430
535
  * // Mutable access inside change callback
431
- * Obj.change(person, (p) => {
432
- * const meta = Obj.getMeta(p); // ObjectMeta (mutable)
536
+ * Obj.change(person, (obj) => {
537
+ * const meta = Obj.getMeta(obj); // ObjectMeta (mutable)
433
538
  * meta.tags ??= [];
434
539
  * meta.tags.push('important');
435
540
  * });
@@ -439,7 +544,7 @@ export type Meta = ApiMeta;
439
544
  export function getMeta(entity: Mutable<Unknown>): Meta;
440
545
  export function getMeta(entity: Unknown | Snapshot): ReadonlyMeta;
441
546
  export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | ReadonlyMeta {
442
- return getMeta$(entity);
547
+ return internal.getMetaChecked(entity);
443
548
  }
444
549
 
445
550
  /**
@@ -449,7 +554,7 @@ export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): Meta | R
449
554
  export const getKeys: {
450
555
  (entity: Unknown | Snapshot, source: string): ForeignKey[];
451
556
  (source: string): (entity: Unknown | Snapshot) => ForeignKey[];
452
- } = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => getKeys$(entity, source!));
557
+ } = Function.dual(2, (entity: Unknown | Snapshot, source?: string): ForeignKey[] => internal.getKeys(entity, source!));
453
558
 
454
559
  /**
455
560
  * Delete all keys from the object for the specified source.
@@ -458,7 +563,7 @@ export const getKeys: {
458
563
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
459
564
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
460
565
  */
461
- export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => deleteKeys$(entity, source);
566
+ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => internal.deleteKeys(entity, source);
462
567
 
463
568
  /**
464
569
  * Add a tag to the object.
@@ -467,7 +572,7 @@ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => de
467
572
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
468
573
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
469
574
  */
470
- export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag$(entity, tag);
575
+ export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.addTag(entity, tag);
471
576
 
472
577
  /**
473
578
  * Remove a tag from the object.
@@ -476,14 +581,14 @@ export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag$(e
476
581
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
477
582
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
478
583
  */
479
- export const removeTag = (entity: Mutable<Unknown>, tag: string): void => removeTag$(entity, tag);
584
+ export const removeTag = (entity: Mutable<Unknown>, tag: string): void => internal.removeTag(entity, tag);
480
585
 
481
586
  /**
482
587
  * Check if the object is deleted.
483
588
  * Accepts both reactive objects and snapshots.
484
589
  */
485
590
  // TODO(dmaretskyi): Default to `false`.
486
- export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(entity);
591
+ export const isDeleted = (entity: Unknown | Snapshot): boolean => objInternal.isDeleted(entity);
487
592
 
488
593
  //
489
594
  // Annotations
@@ -493,7 +598,7 @@ export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(ent
493
598
  * Get the label of the object.
494
599
  * Accepts both reactive objects and snapshots.
495
600
  */
496
- export const getLabel = (entity: Unknown | Snapshot): string | undefined => getLabel$(entity);
601
+ export const getLabel = (entity: Unknown | Snapshot): string | undefined => internal.getLabel(entity);
497
602
 
498
603
  /**
499
604
  * Set the label of the object.
@@ -502,13 +607,13 @@ export const getLabel = (entity: Unknown | Snapshot): string | undefined => getL
502
607
  * NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
503
608
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
504
609
  */
505
- export const setLabel = (entity: Mutable<Unknown>, label: string): void => setLabel$(entity, label);
610
+ export const setLabel = (entity: Mutable<Unknown>, label: string): void => internal.setLabel(entity, label);
506
611
 
507
612
  /**
508
613
  * Get the description of the object.
509
614
  * Accepts both reactive objects and snapshots.
510
615
  */
511
- export const getDescription = (entity: Unknown | Snapshot): string | undefined => getDescription$(entity);
616
+ export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
512
617
 
513
618
  /**
514
619
  * Set the description of the object.
@@ -518,7 +623,44 @@ export const getDescription = (entity: Unknown | Snapshot): string | undefined =
518
623
  * parameters, so there is no compile-time error. Enforcement is runtime-only.
519
624
  */
520
625
  export const setDescription = (entity: Mutable<Unknown>, description: string): void =>
521
- setDescription$(entity, description);
626
+ internal.setDescription(entity, description);
627
+
628
+ /**
629
+ * Symbol to set parent when creating objects with `Obj.make`.
630
+ * @example
631
+ * ```ts
632
+ * Obj.make(TestSchema.Person, {
633
+ * [Obj.Parent]: parentObject,
634
+ * name: 'John',
635
+ * })
636
+ * ```
637
+ */
638
+ export const Parent: unique symbol = internal.ParentId as any;
639
+
640
+ /**
641
+ * Get the parent of an object.
642
+ * The parent is always loaded together with the object.
643
+ * Only objects are allowed to have a parent
644
+ * @returns The parent object, or undefined if the object has no parent.
645
+ */
646
+ export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
647
+ assertArgument(isObject(entity), 'Expected an object');
648
+ assumeType<internal.InternalObjectProps>(entity);
649
+ return entity[internal.ParentId] as Unknown | undefined;
650
+ };
651
+
652
+ /**
653
+ * Sets the parent of an object.
654
+ * If a parent (or any transitive parent) is deleted, the object will be deleted.
655
+ * Only objects are allowed to have a parent.
656
+ */
657
+ export const setParent = (entity: Unknown, parent: Any | undefined) => {
658
+ assertArgument(isObject(entity), 'Expected an object');
659
+ assertArgument(parent === undefined || isObject(parent), 'Expected an object');
660
+ assumeType<internal.InternalObjectProps>(entity);
661
+ assumeType<internal.InternalObjectProps | undefined>(parent);
662
+ entity[internal.ParentId] = parent;
663
+ };
522
664
 
523
665
  //
524
666
  // JSON
@@ -527,7 +669,7 @@ export const setDescription = (entity: Mutable<Unknown>, description: string): v
527
669
  /**
528
670
  * JSON representation of an object.
529
671
  */
530
- export type JSON = APIJSON;
672
+ export type JSON = internal.ObjectJSON;
531
673
 
532
674
  /**
533
675
  * Converts object to its JSON representation.
@@ -535,7 +677,7 @@ export type JSON = APIJSON;
535
677
  *
536
678
  * The same algorithm is used when calling the standard `JSON.stringify(obj)` function.
537
679
  */
538
- export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
680
+ export const toJSON = (entity: Unknown | Snapshot): JSON => objInternal.objectToJSON(entity);
539
681
 
540
682
  /**
541
683
  * Creates an object from its json representation, performing schema validation.
@@ -545,42 +687,45 @@ export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
545
687
  *
546
688
  * @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
547
689
  * @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
690
+ * @param options.database - Database to associate with the object.
548
691
  */
549
- export const fromJSON: (json: unknown, options?: { refResolver?: Ref.Resolver; dxn?: DXN }) => Promise<Unknown> =
550
- objectFromJSON as any;
551
-
552
- //
553
- // Sorting
554
- //
692
+ export const fromJSON: (
693
+ json: unknown,
694
+ options?: { refResolver?: Ref.Resolver; dxn?: DXN; database?: Database.Database },
695
+ ) => Promise<Unknown> = objInternal.objectFromJSON as any;
555
696
 
556
697
  /**
557
698
  * Comparator function type for sorting objects.
558
699
  * Accepts both reactive objects and snapshots.
559
700
  */
560
- export type Comparator = ApiComparator<Unknown | Snapshot>;
701
+ export type Comparator = internal.Comparator<Unknown | Snapshot>;
561
702
 
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;
703
+ export const sortByLabel: Comparator = internal.sortByLabel as Comparator;
704
+ export const sortByTypename: Comparator = internal.sortByTypename as Comparator;
705
+ export const sort = (...comparators: Comparator[]): Comparator => internal.sort(...comparators) as Comparator;
565
706
 
566
707
  //
567
708
  // Version
568
709
  //
569
710
 
570
- export { VersionTypeId };
571
- export type { VersionCompareResult };
711
+ export const VersionTypeId = internal.VersionTypeId;
712
+ export type VersionCompareResult = internal.VersionCompareResult;
572
713
 
573
714
  /**
574
715
  * Represent object version.
575
716
  * May be backed by Automerge.
576
717
  * Objects with no history are not versioned.
577
718
  */
578
- export type Version = ApiVersion;
719
+ export type Version = internal.EntityVersion;
579
720
 
580
- export { isVersion, versionValid, compareVersions, encodeVersion, decodeVersion };
721
+ export const isVersion = internal.isVersion;
722
+ export const versionValid = internal.versionValid;
723
+ export const compareVersions = internal.compareVersions;
724
+ export const encodeVersion = internal.encodeVersion;
725
+ export const decodeVersion = internal.decodeVersion;
581
726
 
582
727
  /**
583
728
  * Returns the version of the object.
584
729
  * Accepts both reactive objects and snapshots.
585
730
  */
586
- export const version = (entity: Unknown | Snapshot): Version => version$(entity);
731
+ export const version = (entity: Unknown | Snapshot): Version => internal.version(entity);