@dxos/echo 0.8.4-main.c85a9c8dae → 0.8.4-main.cb12b3f963

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 (554) hide show
  1. package/dist/lib/neutral/Annotation.mjs +3 -3
  2. package/dist/lib/neutral/Database.mjs +8 -4
  3. package/dist/lib/neutral/Entity.mjs +16 -11
  4. package/dist/lib/neutral/Err.mjs +1 -1
  5. package/dist/lib/neutral/Extension.mjs +18 -0
  6. package/dist/lib/neutral/Extension.mjs.map +7 -0
  7. package/dist/lib/neutral/Feed.mjs +21 -14
  8. package/dist/lib/neutral/Filter.mjs +21 -10
  9. package/dist/lib/neutral/Format.mjs +3 -3
  10. package/dist/lib/neutral/JsonSchema.mjs +8 -7
  11. package/dist/lib/neutral/Key.mjs +1 -1
  12. package/dist/lib/neutral/Migration.mjs +17 -0
  13. package/dist/lib/neutral/Migration.mjs.map +7 -0
  14. package/dist/lib/neutral/Obj.mjs +16 -10
  15. package/dist/lib/neutral/Order.mjs +1 -1
  16. package/dist/lib/neutral/Query.mjs +19 -13
  17. package/dist/lib/neutral/QueryResult.mjs +1 -1
  18. package/dist/lib/neutral/Ref.mjs +7 -7
  19. package/dist/lib/neutral/Relation.mjs +15 -11
  20. package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
  21. package/dist/lib/neutral/Tag.mjs +14 -10
  22. package/dist/lib/neutral/Type.mjs +10 -7
  23. package/dist/lib/neutral/{chunk-ALOGSVBP.mjs → chunk-3U5PIVPZ.mjs} +59 -4
  24. package/dist/lib/neutral/chunk-3U5PIVPZ.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-DZQSL6RW.mjs → chunk-44HT3MEC.mjs} +2 -2
  26. package/dist/lib/neutral/{chunk-DZQSL6RW.mjs.map → chunk-44HT3MEC.mjs.map} +1 -1
  27. package/dist/lib/neutral/{chunk-5ELDDYWE.mjs → chunk-4VTRFJV3.mjs} +17 -19
  28. package/dist/lib/neutral/chunk-4VTRFJV3.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-5NR2KWDU.mjs +34 -0
  30. package/dist/lib/neutral/chunk-5NR2KWDU.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-62RJTYOZ.mjs +346 -0
  32. package/dist/lib/neutral/chunk-62RJTYOZ.mjs.map +7 -0
  33. package/dist/lib/neutral/{chunk-OVUBTQLT.mjs → chunk-7OO5B5DD.mjs} +2 -2
  34. package/dist/lib/neutral/chunk-7OO5B5DD.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7RVZT53K.mjs} +1 -1
  36. package/dist/lib/neutral/{chunk-GAWKQ5DZ.mjs → chunk-AG7JS76F.mjs} +5 -5
  37. package/dist/lib/neutral/chunk-AG7JS76F.mjs.map +7 -0
  38. package/dist/lib/neutral/{chunk-PP4DNUZU.mjs → chunk-AVPYX7FF.mjs} +1399 -2882
  39. package/dist/lib/neutral/chunk-AVPYX7FF.mjs.map +7 -0
  40. package/dist/lib/neutral/{chunk-ZWKJ4LZJ.mjs → chunk-BCKTAKBX.mjs} +23 -51
  41. package/dist/lib/neutral/chunk-BCKTAKBX.mjs.map +7 -0
  42. package/dist/lib/neutral/{chunk-T6JEFNP6.mjs → chunk-BICZKPQG.mjs} +1 -1
  43. package/dist/lib/neutral/{chunk-T6JEFNP6.mjs.map → chunk-BICZKPQG.mjs.map} +1 -1
  44. package/dist/lib/neutral/{chunk-F7KMHDPJ.mjs → chunk-GECFB2UL.mjs} +49 -31
  45. package/dist/lib/neutral/chunk-GECFB2UL.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  47. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  48. package/dist/lib/neutral/{chunk-BRJSLACP.mjs → chunk-M7ET73JD.mjs} +71 -17
  49. package/dist/lib/neutral/chunk-M7ET73JD.mjs.map +7 -0
  50. package/dist/lib/neutral/{chunk-4KG6IGL4.mjs → chunk-N4B7FHQT.mjs} +4 -4
  51. package/dist/lib/neutral/{chunk-4KG6IGL4.mjs.map → chunk-N4B7FHQT.mjs.map} +2 -2
  52. package/dist/lib/neutral/{chunk-KGV3QIRX.mjs → chunk-NCSIQP3L.mjs} +124 -17
  53. package/dist/lib/neutral/chunk-NCSIQP3L.mjs.map +7 -0
  54. package/dist/lib/neutral/{chunk-QXF3LGN2.mjs → chunk-NGQNU3KX.mjs} +5 -3
  55. package/dist/lib/neutral/chunk-NGQNU3KX.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-PRCRETDK.mjs +36 -0
  57. package/dist/lib/neutral/chunk-PRCRETDK.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-AQP4QKYP.mjs → chunk-S4JXD2RO.mjs} +44 -9
  59. package/dist/lib/neutral/chunk-S4JXD2RO.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-W7OP5HGZ.mjs → chunk-SVEGO3DJ.mjs} +14 -10
  61. package/dist/lib/neutral/chunk-SVEGO3DJ.mjs.map +7 -0
  62. package/dist/lib/neutral/{chunk-M2KVTHZM.mjs → chunk-TRPZU2HV.mjs} +10 -10
  63. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
  64. package/dist/lib/neutral/{chunk-ZTUBYOGB.mjs → chunk-TTCSATUD.mjs} +1 -1
  65. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-GFNCSK7F.mjs → chunk-TTUIJXGD.mjs} +54 -23
  67. package/dist/lib/neutral/chunk-TTUIJXGD.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
  69. package/dist/lib/neutral/{chunk-T4MPQJ7X.mjs → chunk-WGMPVUUL.mjs} +6 -22
  70. package/dist/lib/neutral/chunk-WGMPVUUL.mjs.map +7 -0
  71. package/dist/lib/neutral/{chunk-O3TZFQCT.mjs → chunk-YDRLYZKW.mjs} +2 -2
  72. package/dist/lib/neutral/chunk-YDRLYZKW.mjs.map +7 -0
  73. package/dist/lib/neutral/chunk-Z25FPDXG.mjs +734 -0
  74. package/dist/lib/neutral/chunk-Z25FPDXG.mjs.map +7 -0
  75. package/dist/lib/neutral/{chunk-MXQJZCPY.mjs → chunk-ZISMEVKD.mjs} +1 -1
  76. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
  77. package/dist/lib/neutral/index.mjs +38 -25
  78. package/dist/lib/neutral/internal/index.mjs +48 -38
  79. package/dist/lib/neutral/meta.json +1 -1
  80. package/dist/lib/neutral/testing/index.mjs +41 -35
  81. package/dist/lib/neutral/testing/index.mjs.map +2 -2
  82. package/dist/types/src/Annotation.d.ts +3 -3
  83. package/dist/types/src/Annotation.d.ts.map +1 -1
  84. package/dist/types/src/Collection.d.ts.map +1 -1
  85. package/dist/types/src/Database.d.ts +15 -3
  86. package/dist/types/src/Database.d.ts.map +1 -1
  87. package/dist/types/src/Dataset.d.ts +2 -1
  88. package/dist/types/src/Dataset.d.ts.map +1 -1
  89. package/dist/types/src/Entity.d.ts +17 -11
  90. package/dist/types/src/Entity.d.ts.map +1 -1
  91. package/dist/types/src/Err.d.ts +18 -18
  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 +40 -23
  98. package/dist/types/src/Feed.d.ts.map +1 -1
  99. package/dist/types/src/Filter.d.ts +33 -4
  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 +1 -1
  104. package/dist/types/src/Format.d.ts.map +1 -1
  105. package/dist/types/src/Hypergraph.d.ts +6 -1
  106. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  107. package/dist/types/src/Json.d.ts +33 -0
  108. package/dist/types/src/Json.d.ts.map +1 -0
  109. package/dist/types/src/Json.test.d.ts +2 -0
  110. package/dist/types/src/Json.test.d.ts.map +1 -0
  111. package/dist/types/src/JsonSchema.d.ts +5 -5
  112. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  113. package/dist/types/src/Migration.d.ts +57 -0
  114. package/dist/types/src/Migration.d.ts.map +1 -0
  115. package/dist/types/src/Obj.d.ts +45 -29
  116. package/dist/types/src/Obj.d.ts.map +1 -1
  117. package/dist/types/src/Order.d.ts.map +1 -1
  118. package/dist/types/src/Query.d.ts +13 -2
  119. package/dist/types/src/Query.d.ts.map +1 -1
  120. package/dist/types/src/Ref.d.ts +11 -11
  121. package/dist/types/src/Ref.d.ts.map +1 -1
  122. package/dist/types/src/Relation.d.ts +16 -16
  123. package/dist/types/src/Relation.d.ts.map +1 -1
  124. package/dist/types/src/SchemaRegistry.d.ts +1 -1
  125. package/dist/types/src/Tag.d.ts +2 -2
  126. package/dist/types/src/Tag.d.ts.map +1 -1
  127. package/dist/types/src/Type.d.ts +10 -9
  128. package/dist/types/src/Type.d.ts.map +1 -1
  129. package/dist/types/src/View.d.ts +1 -1
  130. package/dist/types/src/View.d.ts.map +1 -1
  131. package/dist/types/src/exemplars.test.d.ts +2 -0
  132. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  133. package/dist/types/src/index.d.ts +3 -0
  134. package/dist/types/src/index.d.ts.map +1 -1
  135. package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +24 -2
  136. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  137. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  138. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  139. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  140. package/dist/types/src/internal/{api → Annotation}/sorting.d.ts +1 -1
  141. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  142. package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +2 -2
  143. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  144. package/dist/types/src/internal/{api/entity.d.ts → Entity/api.d.ts} +2 -2
  145. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  146. package/dist/types/src/internal/{entities → Entity}/entity.d.ts +2 -2
  147. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  148. package/dist/types/src/internal/{entities → Entity}/index.d.ts +2 -0
  149. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  150. package/dist/types/src/internal/{entities → Entity}/model.d.ts +2 -26
  151. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  152. package/dist/types/src/internal/{entities → Entity}/object.d.ts +2 -2
  153. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  154. package/dist/types/src/internal/{entities → Entity}/relation.d.ts +3 -30
  155. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  156. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  157. package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
  158. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  159. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  160. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  161. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  162. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  163. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  164. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  165. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  166. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  167. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  168. package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
  169. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  170. package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
  171. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  172. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  173. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  174. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  175. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +23 -23
  176. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  177. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +1 -1
  178. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  179. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  180. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  181. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  182. package/dist/types/src/internal/{object → Obj}/create-object.d.ts +2 -2
  183. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  184. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  185. package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
  186. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  187. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  188. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  189. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  190. package/dist/types/src/internal/{object → Obj}/json-serializer.d.ts +13 -5
  191. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  192. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  193. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  194. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  195. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  196. package/dist/types/src/internal/{object → Obj}/set-value.d.ts +2 -2
  197. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  198. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  199. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  200. package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +2 -2
  201. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  202. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  203. package/dist/types/src/internal/Query.d.ts +10 -0
  204. package/dist/types/src/internal/Query.d.ts.map +1 -0
  205. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  206. package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +1 -1
  207. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  208. package/dist/types/src/internal/{ref → Ref}/ref.d.ts +15 -2
  209. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  210. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  211. package/dist/types/src/internal/{schema → Type}/compose.d.ts +1 -1
  212. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  213. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  214. package/dist/types/src/internal/{schema → Type}/echo-schema.d.ts +6 -6
  215. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  216. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  217. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  218. package/dist/types/src/internal/{schema → Type}/persistent-schema.d.ts +2 -2
  219. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  220. package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
  221. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  222. package/dist/types/src/internal/{api → common/api}/meta.d.ts +3 -3
  223. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  224. package/dist/types/src/internal/common/index.d.ts +4 -0
  225. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  226. package/dist/types/src/internal/{proxy → common/proxy}/change-context.d.ts +1 -1
  227. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  228. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  229. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  230. package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +1 -1
  231. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  232. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  233. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  234. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  235. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  236. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  237. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  238. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  239. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  240. package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +1 -1
  241. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  242. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +2 -2
  243. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts.map +1 -1
  244. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  245. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  246. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  247. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  248. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  249. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  250. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  251. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  252. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  253. package/dist/types/src/internal/{types → common/types}/entity.d.ts +4 -4
  254. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  255. package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
  256. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  257. package/dist/types/src/internal/{types → common/types}/meta.d.ts +3 -3
  258. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  259. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  260. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  261. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  262. package/dist/types/src/internal/{types → common/types}/version.d.ts +1 -1
  263. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  264. package/dist/types/src/internal/index.d.ts +9 -10
  265. package/dist/types/src/internal/index.d.ts.map +1 -1
  266. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  267. package/dist/types/src/testing/test-schema.d.ts +53 -53
  268. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  269. package/dist/types/src/testing/util.d.ts.map +1 -1
  270. package/dist/types/tsconfig.tsbuildinfo +1 -1
  271. package/package.json +24 -14
  272. package/src/Annotation.ts +5 -3
  273. package/src/Collection.ts +8 -1
  274. package/src/Database.ts +54 -17
  275. package/src/Dataset.ts +2 -0
  276. package/src/Entity.ts +20 -11
  277. package/src/Err.ts +2 -0
  278. package/src/Extension.test.ts +235 -0
  279. package/src/Extension.ts +122 -0
  280. package/src/Feed.ts +86 -36
  281. package/src/Filter.test.ts +90 -0
  282. package/src/Filter.ts +68 -3
  283. package/src/Format.ts +1 -1
  284. package/src/Hypergraph.ts +7 -2
  285. package/src/Json.test.ts +175 -0
  286. package/src/Json.ts +102 -0
  287. package/src/JsonSchema.ts +7 -5
  288. package/src/Migration.ts +94 -0
  289. package/src/Obj.test.ts +107 -15
  290. package/src/Obj.ts +166 -40
  291. package/src/Order.ts +2 -0
  292. package/src/Query.test.ts +221 -31
  293. package/src/Query.ts +50 -3
  294. package/src/Ref.ts +14 -12
  295. package/src/Relation.test.ts +2 -2
  296. package/src/Relation.ts +28 -21
  297. package/src/SchemaRegistry.ts +1 -1
  298. package/src/Tag.ts +3 -1
  299. package/src/Type.ts +14 -11
  300. package/src/View.ts +9 -2
  301. package/src/exemplars.test.ts +21 -0
  302. package/src/index.ts +4 -0
  303. package/src/internal/{annotations → Annotation}/annotations.test.ts +56 -7
  304. package/src/internal/{annotations → Annotation}/annotations.ts +71 -20
  305. package/src/internal/{annotations → Annotation}/index.ts +1 -0
  306. package/src/internal/{api → Annotation}/sorting.ts +2 -4
  307. package/src/internal/{annotations → Annotation}/util.ts +1 -1
  308. package/src/internal/{api/entity.ts → Entity/api.ts} +3 -2
  309. package/src/internal/{entities → Entity}/entity.ts +2 -2
  310. package/src/internal/{entities → Entity}/index.ts +2 -0
  311. package/src/internal/{entities → Entity}/model.ts +13 -42
  312. package/src/internal/{entities → Entity}/object.ts +2 -3
  313. package/src/internal/{entities → Entity}/relation.ts +19 -36
  314. package/src/internal/{api → Entity}/version.ts +2 -2
  315. package/src/internal/{formats → Format}/date.test.ts +1 -2
  316. package/src/internal/{formats → Format}/format.test.ts +1 -2
  317. package/src/internal/{formats → Format}/types.ts +2 -2
  318. package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
  319. package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
  320. package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +48 -49
  321. package/src/internal/{json-schema → JsonSchema}/json-schema.ts +3 -4
  322. package/src/internal/{object → Obj}/clone.ts +3 -3
  323. package/src/internal/{object → Obj}/common.ts +2 -2
  324. package/src/internal/{object → Obj}/create-object.test.ts +5 -7
  325. package/src/internal/{object → Obj}/create-object.ts +5 -6
  326. package/src/internal/{object → Obj}/deleted.ts +2 -2
  327. package/src/internal/{object → Obj}/inspect.ts +2 -2
  328. package/src/internal/{object → Obj}/json-serializer.test.ts +8 -9
  329. package/src/internal/{object → Obj}/json-serializer.ts +36 -18
  330. package/src/internal/{object → Obj}/schema-validator.ts +1 -1
  331. package/src/internal/{object → Obj}/set-value.test.ts +24 -24
  332. package/src/internal/{object → Obj}/set-value.ts +3 -3
  333. package/src/internal/{object → Obj}/snapshot.ts +14 -5
  334. package/src/internal/{object → Obj}/typed-object.test.ts +3 -3
  335. package/src/internal/{object → Obj}/typed-object.ts +2 -2
  336. package/src/internal/Query.ts +137 -0
  337. package/src/internal/{ref → Ref}/ref-array.ts +1 -2
  338. package/src/internal/{ref → Ref}/ref.test.ts +4 -5
  339. package/src/internal/{ref → Ref}/ref.ts +20 -3
  340. package/src/internal/{schema → Type}/compose.test.ts +5 -6
  341. package/src/internal/{schema → Type}/compose.ts +1 -1
  342. package/src/internal/{schema → Type}/echo-schema.ts +7 -8
  343. package/src/internal/{schema → Type}/manipulation.ts +1 -1
  344. package/src/internal/{schema → Type}/persistent-schema.ts +7 -7
  345. package/src/internal/{README.md → common/README.md} +1 -1
  346. package/src/internal/{api → common/api}/index.ts +0 -4
  347. package/src/internal/{api → common/api}/meta.ts +3 -3
  348. package/src/internal/common/index.ts +7 -0
  349. package/src/internal/{proxy → common/proxy}/change-context.ts +1 -1
  350. package/src/internal/{proxy → common/proxy}/change.test.ts +97 -97
  351. package/src/internal/{proxy → common/proxy}/errors.ts +2 -2
  352. package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -4
  353. package/src/internal/{proxy → common/proxy}/json-serializer.ts +6 -3
  354. package/src/internal/{proxy → common/proxy}/make-object.ts +1 -2
  355. package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
  356. package/src/internal/{proxy → common/proxy}/reactive-array.ts +1 -1
  357. package/src/internal/common/proxy/reactive.test.ts +54 -0
  358. package/src/internal/{proxy → common/proxy}/reactive.ts +12 -4
  359. package/src/internal/{proxy → common/proxy}/schema.test.ts +10 -10
  360. package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +6 -7
  361. package/src/internal/{proxy → common/proxy}/typed-handler.ts +10 -13
  362. package/src/internal/{proxy → common/proxy}/typed-object.test.ts +5 -6
  363. package/src/internal/{types → common/types}/entity.ts +1 -1
  364. package/src/internal/{types → common/types}/index.ts +1 -0
  365. package/src/internal/{types → common/types}/meta.ts +1 -2
  366. package/src/internal/common/types/model-symbols.ts +69 -0
  367. package/src/internal/index.ts +9 -31
  368. package/src/testing/api.test.ts +2 -3
  369. package/src/testing/test-data.ts +0 -1
  370. package/src/testing/test-schema.ts +9 -9
  371. package/dist/lib/neutral/chunk-5ELDDYWE.mjs.map +0 -7
  372. package/dist/lib/neutral/chunk-ALOGSVBP.mjs.map +0 -7
  373. package/dist/lib/neutral/chunk-AQP4QKYP.mjs.map +0 -7
  374. package/dist/lib/neutral/chunk-BRJSLACP.mjs.map +0 -7
  375. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs.map +0 -7
  376. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs.map +0 -7
  377. package/dist/lib/neutral/chunk-GFNCSK7F.mjs.map +0 -7
  378. package/dist/lib/neutral/chunk-KGV3QIRX.mjs.map +0 -7
  379. package/dist/lib/neutral/chunk-M2KVTHZM.mjs.map +0 -7
  380. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +0 -7
  381. package/dist/lib/neutral/chunk-O3TZFQCT.mjs.map +0 -7
  382. package/dist/lib/neutral/chunk-OVUBTQLT.mjs.map +0 -7
  383. package/dist/lib/neutral/chunk-PP4DNUZU.mjs.map +0 -7
  384. package/dist/lib/neutral/chunk-QXF3LGN2.mjs.map +0 -7
  385. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs.map +0 -7
  386. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs.map +0 -7
  387. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs.map +0 -7
  388. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs.map +0 -7
  389. package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
  390. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
  391. package/dist/types/src/internal/annotations/index.d.ts +0 -3
  392. package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
  393. package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
  394. package/dist/types/src/internal/api/annotations.d.ts +0 -23
  395. package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
  396. package/dist/types/src/internal/api/entity.d.ts.map +0 -1
  397. package/dist/types/src/internal/api/index.d.ts.map +0 -1
  398. package/dist/types/src/internal/api/meta.d.ts.map +0 -1
  399. package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
  400. package/dist/types/src/internal/api/version.d.ts.map +0 -1
  401. package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
  402. package/dist/types/src/internal/entities/index.d.ts.map +0 -1
  403. package/dist/types/src/internal/entities/model.d.ts.map +0 -1
  404. package/dist/types/src/internal/entities/object.d.ts.map +0 -1
  405. package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
  406. package/dist/types/src/internal/entities/util.d.ts.map +0 -1
  407. package/dist/types/src/internal/formats/date.d.ts.map +0 -1
  408. package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
  409. package/dist/types/src/internal/formats/format.d.ts.map +0 -1
  410. package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
  411. package/dist/types/src/internal/formats/index.d.ts.map +0 -1
  412. package/dist/types/src/internal/formats/number.d.ts.map +0 -1
  413. package/dist/types/src/internal/formats/object.d.ts.map +0 -1
  414. package/dist/types/src/internal/formats/select.d.ts.map +0 -1
  415. package/dist/types/src/internal/formats/string.d.ts.map +0 -1
  416. package/dist/types/src/internal/formats/types.d.ts.map +0 -1
  417. package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
  418. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
  419. package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
  420. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
  421. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
  422. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
  423. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
  424. package/dist/types/src/internal/object/clone.d.ts.map +0 -1
  425. package/dist/types/src/internal/object/common.d.ts.map +0 -1
  426. package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
  427. package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
  428. package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
  429. package/dist/types/src/internal/object/ids.d.ts.map +0 -1
  430. package/dist/types/src/internal/object/index.d.ts.map +0 -1
  431. package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
  432. package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
  433. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
  434. package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
  435. package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
  436. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
  437. package/dist/types/src/internal/object/set-value.d.ts.map +0 -1
  438. package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
  439. package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
  440. package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
  441. package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
  442. package/dist/types/src/internal/proxy/change-context.d.ts.map +0 -1
  443. package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
  444. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
  445. package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
  446. package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
  447. package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
  448. package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
  449. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
  450. package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
  451. package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
  452. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
  453. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
  454. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
  455. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
  456. package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
  457. package/dist/types/src/internal/proxy/symbols.d.ts.map +0 -1
  458. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
  459. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
  460. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
  461. package/dist/types/src/internal/ref/index.d.ts.map +0 -1
  462. package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
  463. package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
  464. package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
  465. package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
  466. package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
  467. package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
  468. package/dist/types/src/internal/schema/index.d.ts.map +0 -1
  469. package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
  470. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
  471. package/dist/types/src/internal/types/base.d.ts.map +0 -1
  472. package/dist/types/src/internal/types/entity.d.ts.map +0 -1
  473. package/dist/types/src/internal/types/index.d.ts.map +0 -1
  474. package/dist/types/src/internal/types/meta.d.ts.map +0 -1
  475. package/dist/types/src/internal/types/typename.d.ts.map +0 -1
  476. package/dist/types/src/internal/types/version.d.ts.map +0 -1
  477. package/src/internal/api/annotations.ts +0 -60
  478. /package/dist/lib/neutral/{chunk-ANHVGJI4.mjs.map → chunk-7RVZT53K.mjs.map} +0 -0
  479. /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
  480. /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
  481. /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
  482. /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
  483. /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
  484. /package/dist/types/src/internal/{formats → Format}/format.d.ts +0 -0
  485. /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
  486. /package/dist/types/src/internal/{formats → Format}/index.d.ts +0 -0
  487. /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
  488. /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
  489. /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
  490. /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
  491. /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
  492. /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
  493. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
  494. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
  495. /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
  496. /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
  497. /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
  498. /package/dist/types/src/internal/{object → Obj}/ids.d.ts +0 -0
  499. /package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -0
  500. /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
  501. /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
  502. /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
  503. /package/dist/types/src/internal/{object → Obj}/set-value.test.d.ts +0 -0
  504. /package/dist/types/src/internal/{object → Obj}/snapshot.d.ts +0 -0
  505. /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
  506. /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
  507. /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
  508. /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
  509. /package/dist/types/src/internal/{schema → Type}/index.d.ts +0 -0
  510. /package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -0
  511. /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
  512. /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
  513. /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
  514. /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
  515. /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
  516. /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
  517. /package/dist/types/src/internal/{proxy → common/proxy}/make-object.d.ts +0 -0
  518. /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
  519. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
  520. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
  521. /package/dist/types/src/internal/{proxy → common/proxy}/schema-validator.d.ts +0 -0
  522. /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
  523. /package/dist/types/src/internal/{proxy → common/proxy}/symbols.d.ts +0 -0
  524. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +0 -0
  525. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
  526. /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
  527. /package/dist/types/src/internal/{types → common/types}/base.d.ts +0 -0
  528. /package/dist/types/src/internal/{types → common/types}/typename.d.ts +0 -0
  529. /package/src/internal/{entities → Entity}/util.ts +0 -0
  530. /package/src/internal/{formats → Format}/date.ts +0 -0
  531. /package/src/internal/{formats → Format}/format.ts +0 -0
  532. /package/src/internal/{formats → Format}/index.ts +0 -0
  533. /package/src/internal/{formats → Format}/number.ts +0 -0
  534. /package/src/internal/{formats → Format}/object.ts +0 -0
  535. /package/src/internal/{formats → Format}/select.ts +0 -0
  536. /package/src/internal/{formats → Format}/string.ts +0 -0
  537. /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
  538. /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
  539. /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
  540. /package/src/internal/{object → Obj}/ids.ts +0 -0
  541. /package/src/internal/{object → Obj}/index.ts +0 -0
  542. /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
  543. /package/src/internal/{ref → Ref}/index.ts +0 -0
  544. /package/src/internal/{schema → Type}/index.ts +0 -0
  545. /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
  546. /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
  547. /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
  548. /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
  549. /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
  550. /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
  551. /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
  552. /package/src/internal/{types → common/types}/base.ts +0 -0
  553. /package/src/internal/{types → common/types}/typename.ts +0 -0
  554. /package/src/internal/{types → common/types}/version.ts +0 -0
@@ -4,22 +4,22 @@
4
4
 
5
5
  import { describe, test } from 'vitest';
6
6
 
7
- import * as Obj from '../../Obj';
8
- import * as Relation from '../../Relation';
9
- import { TestSchema } from '../../testing';
7
+ import * as Obj from '../../../Obj';
8
+ import * as Relation from '../../../Relation';
9
+ import { TestSchema } from '../../../testing';
10
10
 
11
11
  /**
12
- * Tests for Obj.change context enforcement and mutator type safety.
12
+ * Tests for Obj.update context enforcement and mutator type safety.
13
13
  *
14
14
  * These tests verify:
15
15
  * 1. Mutator functions require Mutable<T> at compile-time.
16
16
  * 2. getMeta returns ReadonlyMeta outside change callbacks and ObjectMeta inside.
17
- * 3. Mutations outside Obj.change throw at runtime.
17
+ * 3. Mutations outside Obj.update throw at runtime.
18
18
  * 4. Nested object/property mutations work correctly.
19
19
  * 5. Array mutations (push, pop, splice) require change context.
20
20
  * 6. Property delete requires change context.
21
21
  */
22
- describe('Obj.change enforcement', () => {
22
+ describe('Obj.update enforcement', () => {
23
23
  describe('compile-time and runtime safety', () => {
24
24
  test('direct property mutation outside change throws', ({ expect }) => {
25
25
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
@@ -28,7 +28,7 @@ describe('Obj.change enforcement', () => {
28
28
  expect(() => {
29
29
  // @ts-expect-error Testing runtime error for readonly property mutation.
30
30
  obj.name = 'New Name';
31
- }).toThrow(/outside of Obj.change/);
31
+ }).toThrow(/outside of Obj.update/);
32
32
  });
33
33
 
34
34
  test('Obj.setValue outside change throws', ({ expect }) => {
@@ -36,7 +36,7 @@ describe('Obj.change enforcement', () => {
36
36
 
37
37
  // No compile-time error: TypeScript's structural typing allows readonly objects
38
38
  // to be passed to Mutable<T> parameters. Enforcement is runtime-only.
39
- expect(() => Obj.setValue(obj, ['name'], 'value')).toThrow(/outside of Obj.change/);
39
+ expect(() => Obj.setValue(obj, ['name'], 'value')).toThrow(/outside of Obj.update/);
40
40
  });
41
41
 
42
42
  test('Obj.addTag outside change throws', ({ expect }) => {
@@ -44,7 +44,7 @@ describe('Obj.change enforcement', () => {
44
44
 
45
45
  // No compile-time error: TypeScript's structural typing allows readonly objects
46
46
  // to be passed to Mutable<T> parameters. Enforcement is runtime-only.
47
- expect(() => Obj.addTag(obj, 'tag')).toThrow(/outside of Obj.change/);
47
+ expect(() => Obj.addTag(obj, 'tag')).toThrow(/outside of Obj.update/);
48
48
  });
49
49
 
50
50
  test('getMeta mutation outside change throws', ({ expect }) => {
@@ -52,15 +52,15 @@ describe('Obj.change enforcement', () => {
52
52
  const meta = Obj.getMeta(obj);
53
53
 
54
54
  // Runtime errors for direct meta mutations.
55
- expect(() => ((meta as any).keys = [])).toThrow(/outside of Obj.change/);
56
- expect(() => ((meta as any).tags = ['tag'])).toThrow(/outside of Obj.change/);
55
+ expect(() => ((meta as any).keys = [])).toThrow(/outside of Obj.update/);
56
+ expect(() => ((meta as any).tags = ['tag'])).toThrow(/outside of Obj.update/);
57
57
  });
58
58
 
59
59
  test('getMeta returns mutable ObjectMeta inside change callback', ({ expect }) => {
60
60
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
61
61
 
62
- Obj.change(obj, (mutableObj) => {
63
- const meta = Obj.getMeta(mutableObj);
62
+ Obj.update(obj, (obj) => {
63
+ const meta = Obj.getMeta(obj);
64
64
 
65
65
  // These should compile without errors because meta is ObjectMeta (mutable).
66
66
  meta.keys = [];
@@ -76,9 +76,9 @@ describe('Obj.change enforcement', () => {
76
76
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
77
77
 
78
78
  // These should compile without errors inside change callback.
79
- Obj.change(obj, (mutableObj) => {
80
- Obj.addTag(mutableObj, 'my-tag');
81
- Obj.setValue(mutableObj, ['name'], 'Updated');
79
+ Obj.update(obj, (obj) => {
80
+ Obj.addTag(obj, 'my-tag');
81
+ Obj.setValue(obj, ['name'], 'Updated');
82
82
  });
83
83
 
84
84
  expect(obj.name).toBe('Updated');
@@ -97,7 +97,7 @@ describe('Obj.change enforcement', () => {
97
97
  expect(() => {
98
98
  // @ts-expect-error Testing runtime error for readonly property mutation.
99
99
  rel.title = 'Manager';
100
- }).toThrow(/outside of Obj.change/);
100
+ }).toThrow(/outside of Obj.update/);
101
101
  });
102
102
 
103
103
  test('Relation.addTag outside change throws', ({ expect }) => {
@@ -110,7 +110,7 @@ describe('Obj.change enforcement', () => {
110
110
 
111
111
  // No compile-time error: TypeScript's structural typing allows readonly objects
112
112
  // to be passed to Mutable<T> parameters. Enforcement is runtime-only.
113
- expect(() => Relation.addTag(rel, 'tag')).toThrow(/outside of Obj.change/);
113
+ expect(() => Relation.addTag(rel, 'tag')).toThrow(/outside of Obj.update/);
114
114
  });
115
115
  });
116
116
 
@@ -122,8 +122,8 @@ describe('Obj.change enforcement', () => {
122
122
  // Person schema uses 'name' as label field.
123
123
  expect(Obj.getLabel(obj)).toBe('John');
124
124
 
125
- Obj.change(obj, (o) => {
126
- Obj.setLabel(o, 'Jane');
125
+ Obj.update(obj, (obj) => {
126
+ Obj.setLabel(obj, 'Jane');
127
127
  });
128
128
 
129
129
  // setLabel updates the name field.
@@ -140,8 +140,8 @@ describe('Obj.change enforcement', () => {
140
140
 
141
141
  // setDescription only works if schema has description annotation.
142
142
  // For schemas without it, this is a no-op.
143
- Obj.change(obj, (o) => {
144
- Obj.setDescription(o, 'My Description');
143
+ Obj.update(obj, (obj) => {
144
+ Obj.setDescription(obj, 'My Description');
145
145
  });
146
146
 
147
147
  // Verify setDescription doesn't throw.
@@ -153,15 +153,15 @@ describe('Obj.change enforcement', () => {
153
153
 
154
154
  expect(Obj.getMeta(obj).tags).toBeUndefined();
155
155
 
156
- Obj.change(obj, (o) => {
157
- Obj.addTag(o, 'tag-1');
158
- Obj.addTag(o, 'tag-2');
156
+ Obj.update(obj, (obj) => {
157
+ Obj.addTag(obj, 'tag-1');
158
+ Obj.addTag(obj, 'tag-2');
159
159
  });
160
160
 
161
161
  expect(Obj.getMeta(obj).tags).toEqual(['tag-1', 'tag-2']);
162
162
 
163
- Obj.change(obj, (o) => {
164
- Obj.removeTag(o, 'tag-1');
163
+ Obj.update(obj, (obj) => {
164
+ Obj.removeTag(obj, 'tag-1');
165
165
  });
166
166
 
167
167
  expect(Obj.getMeta(obj).tags).toEqual(['tag-2']);
@@ -170,8 +170,8 @@ describe('Obj.change enforcement', () => {
170
170
  test('deleteKeys removes foreign keys by source', ({ expect }) => {
171
171
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
172
172
 
173
- Obj.change(obj, (o) => {
174
- const meta = Obj.getMeta(o);
173
+ Obj.update(obj, (obj) => {
174
+ const meta = Obj.getMeta(obj);
175
175
  meta.keys.push({ source: 'source-a', id: '1' });
176
176
  meta.keys.push({ source: 'source-a', id: '2' });
177
177
  meta.keys.push({ source: 'source-b', id: '3' });
@@ -179,8 +179,8 @@ describe('Obj.change enforcement', () => {
179
179
 
180
180
  expect(Obj.getMeta(obj).keys).toHaveLength(3);
181
181
 
182
- Obj.change(obj, (o) => {
183
- Obj.deleteKeys(o, 'source-a');
182
+ Obj.update(obj, (obj) => {
183
+ Obj.deleteKeys(obj, 'source-a');
184
184
  });
185
185
 
186
186
  expect(Obj.getMeta(obj).keys).toHaveLength(1);
@@ -190,8 +190,8 @@ describe('Obj.change enforcement', () => {
190
190
  test('setValue sets nested properties', ({ expect }) => {
191
191
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
192
192
 
193
- Obj.change(obj, (o) => {
194
- Obj.setValue(o, ['name'], 'Updated Name');
193
+ Obj.update(obj, (obj) => {
194
+ Obj.setValue(obj, ['name'], 'Updated Name');
195
195
  });
196
196
 
197
197
  expect(obj.name).toBe('Updated Name');
@@ -200,8 +200,8 @@ describe('Obj.change enforcement', () => {
200
200
  test('getMeta is mutable inside change and changes persist', ({ expect }) => {
201
201
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
202
202
 
203
- Obj.change(obj, (o) => {
204
- const meta = Obj.getMeta(o);
203
+ Obj.update(obj, (obj) => {
204
+ const meta = Obj.getMeta(obj);
205
205
  meta.tags = ['tag-1', 'tag-2'];
206
206
  meta.keys.push({ source: 'external', id: '123' });
207
207
  });
@@ -214,12 +214,12 @@ describe('Obj.change enforcement', () => {
214
214
  test('multiple mutations in single change all persist', ({ expect }) => {
215
215
  const obj = Obj.make(TestSchema.Person, { name: 'Test' });
216
216
 
217
- Obj.change(obj, (o) => {
218
- o.name = 'Name 1';
219
- o.name = 'Name 2';
220
- o.name = 'Name 3';
221
- Obj.addTag(o, 'tag-1');
222
- Obj.addTag(o, 'tag-2');
217
+ Obj.update(obj, (obj) => {
218
+ obj.name = 'Name 1';
219
+ obj.name = 'Name 2';
220
+ obj.name = 'Name 3';
221
+ Obj.addTag(obj, 'tag-1');
222
+ Obj.addTag(obj, 'tag-2');
223
223
  });
224
224
 
225
225
  // All mutations should persist.
@@ -229,7 +229,7 @@ describe('Obj.change enforcement', () => {
229
229
  });
230
230
 
231
231
  describe('notifications', () => {
232
- test('batched notifications - only one per Obj.change', ({ expect }) => {
232
+ test('batched notifications - only one per Obj.update', ({ expect }) => {
233
233
  const obj = Obj.make(TestSchema.Person, { name: 'John' });
234
234
 
235
235
  let notificationCount = 0;
@@ -237,9 +237,9 @@ describe('Obj.change enforcement', () => {
237
237
  notificationCount++;
238
238
  });
239
239
 
240
- Obj.change(obj, (p) => {
241
- p.name = 'Jane';
242
- p.age = 30;
240
+ Obj.update(obj, (obj) => {
241
+ obj.name = 'Jane';
242
+ obj.age = 30;
243
243
  });
244
244
 
245
245
  // Should only fire one notification for all changes.
@@ -250,36 +250,36 @@ describe('Obj.change enforcement', () => {
250
250
  });
251
251
 
252
252
  describe('nested mutations', () => {
253
- test('nested object property mutation within Obj.change', ({ expect }) => {
253
+ test('nested object property mutation within Obj.update', ({ expect }) => {
254
254
  const obj = Obj.make(TestSchema.Person, {
255
255
  name: 'John',
256
256
  address: { city: 'NYC', coordinates: {} },
257
257
  });
258
258
 
259
- Obj.change(obj, (p) => {
260
- p.address!.state = 'NY';
259
+ Obj.update(obj, (obj) => {
260
+ obj.address!.state = 'NY';
261
261
  });
262
262
 
263
263
  expect(obj.address?.state).toBe('NY');
264
264
  expect(obj.address?.city).toBe('NYC');
265
265
  });
266
266
 
267
- test('deeply nested property mutation within Obj.change (2 levels)', ({ expect }) => {
267
+ test('deeply nested property mutation within Obj.update (2 levels)', ({ expect }) => {
268
268
  const obj = Obj.make(TestSchema.Person, {
269
269
  name: 'John',
270
270
  address: { city: 'NYC', coordinates: { lat: 40.7128, lng: -74.006 } },
271
271
  });
272
272
 
273
- Obj.change(obj, (p) => {
274
- p.address!.coordinates!.lat = 51.5074;
275
- p.address!.coordinates!.lng = -0.1278;
273
+ Obj.update(obj, (obj) => {
274
+ obj.address!.coordinates!.lat = 51.5074;
275
+ obj.address!.coordinates!.lng = -0.1278;
276
276
  });
277
277
 
278
278
  expect(obj.address?.coordinates?.lat).toBe(51.5074);
279
279
  expect(obj.address?.coordinates?.lng).toBe(-0.1278);
280
280
  });
281
281
 
282
- test('nested object mutation outside Obj.change throws (1 level deep)', ({ expect }) => {
282
+ test('nested object mutation outside Obj.update throws (1 level deep)', ({ expect }) => {
283
283
  const obj = Obj.make(TestSchema.Person, {
284
284
  name: 'John',
285
285
  address: { city: 'NYC', coordinates: {} },
@@ -288,10 +288,10 @@ describe('Obj.change enforcement', () => {
288
288
  expect(() => {
289
289
  // @ts-expect-error - nested property assignment is readonly.
290
290
  obj.address!.city = 'LA';
291
- }).toThrow(/outside of Obj.change/);
291
+ }).toThrow(/outside of Obj.update/);
292
292
  });
293
293
 
294
- test('deeply nested mutation outside Obj.change throws (2 levels deep)', ({ expect }) => {
294
+ test('deeply nested mutation outside Obj.update throws (2 levels deep)', ({ expect }) => {
295
295
  const obj = Obj.make(TestSchema.Person, {
296
296
  name: 'John',
297
297
  address: { city: 'NYC', coordinates: { lat: 40.7128, lng: -74.006 } },
@@ -300,18 +300,18 @@ describe('Obj.change enforcement', () => {
300
300
  expect(() => {
301
301
  // @ts-expect-error - deeply nested property assignment should be caught.
302
302
  obj.address!.coordinates!.lat = 0;
303
- }).toThrow(/outside of Obj.change/);
303
+ }).toThrow(/outside of Obj.update/);
304
304
  });
305
305
 
306
- test('nested Obj.change calls work correctly', ({ expect }) => {
306
+ test('nested Obj.update calls work correctly', ({ expect }) => {
307
307
  const obj = Obj.make(TestSchema.Person, { name: 'John' });
308
308
 
309
- Obj.change(obj, (p) => {
310
- p.name = 'Jane';
309
+ Obj.update(obj, (obj) => {
310
+ obj.name = 'Jane';
311
311
 
312
312
  // Nested change should work (already in change context).
313
- Obj.change(obj, (p2) => {
314
- p2.age = 30;
313
+ Obj.update(obj, (obj) => {
314
+ obj.age = 30;
315
315
  });
316
316
  });
317
317
 
@@ -323,8 +323,8 @@ describe('Obj.change enforcement', () => {
323
323
  const obj = Obj.make(TestSchema.Person, { name: 'John' });
324
324
 
325
325
  expect(() => {
326
- Obj.change(obj, (p) => {
327
- p.name = 'Jane';
326
+ Obj.update(obj, (obj) => {
327
+ obj.name = 'Jane';
328
328
  throw new Error('Test error');
329
329
  });
330
330
  }).toThrow('Test error');
@@ -333,26 +333,26 @@ describe('Obj.change enforcement', () => {
333
333
  expect(() => {
334
334
  // @ts-expect-error Testing runtime error for readonly property mutation.
335
335
  obj.name = 'Bob';
336
- }).toThrow(/outside of Obj.change/);
336
+ }).toThrow(/outside of Obj.update/);
337
337
  });
338
338
  });
339
339
 
340
340
  describe('array mutations', () => {
341
- test('array push within Obj.change', ({ expect }) => {
341
+ test('array push within Obj.update', ({ expect }) => {
342
342
  const obj = Obj.make(TestSchema.Person, {
343
343
  name: 'John',
344
344
  fields: [{ label: 'tag1', value: 'val1' }],
345
345
  });
346
346
 
347
- Obj.change(obj, (p) => {
348
- p.fields!.push({ label: 'tag2', value: 'val2' });
347
+ Obj.update(obj, (obj) => {
348
+ obj.fields!.push({ label: 'tag2', value: 'val2' });
349
349
  });
350
350
 
351
351
  expect(obj.fields).toHaveLength(2);
352
352
  expect(obj.fields![1].label).toBe('tag2');
353
353
  });
354
354
 
355
- test('array pop within Obj.change', ({ expect }) => {
355
+ test('array pop within Obj.update', ({ expect }) => {
356
356
  const obj = Obj.make(TestSchema.Person, {
357
357
  name: 'John',
358
358
  fields: [
@@ -362,15 +362,15 @@ describe('Obj.change enforcement', () => {
362
362
  });
363
363
 
364
364
  let popped: any;
365
- Obj.change(obj, (p) => {
366
- popped = p.fields!.pop();
365
+ Obj.update(obj, (obj) => {
366
+ popped = obj.fields!.pop();
367
367
  });
368
368
 
369
369
  expect(popped.label).toBe('b');
370
370
  expect(obj.fields).toHaveLength(1);
371
371
  });
372
372
 
373
- test('array splice within Obj.change', ({ expect }) => {
373
+ test('array splice within Obj.update', ({ expect }) => {
374
374
  const obj = Obj.make(TestSchema.Person, {
375
375
  name: 'John',
376
376
  fields: [
@@ -380,15 +380,15 @@ describe('Obj.change enforcement', () => {
380
380
  ],
381
381
  });
382
382
 
383
- Obj.change(obj, (p) => {
384
- p.fields!.splice(1, 1, { label: 'x', value: 'x' });
383
+ Obj.update(obj, (obj) => {
384
+ obj.fields!.splice(1, 1, { label: 'x', value: 'x' });
385
385
  });
386
386
 
387
387
  expect(obj.fields).toHaveLength(3);
388
388
  expect(obj.fields![1].label).toBe('x');
389
389
  });
390
390
 
391
- test('array push outside Obj.change throws', ({ expect }) => {
391
+ test('array push outside Obj.update throws', ({ expect }) => {
392
392
  const obj = Obj.make(TestSchema.Person, {
393
393
  name: 'John',
394
394
  fields: [{ label: 'tag1', value: 'val1' }],
@@ -397,10 +397,10 @@ describe('Obj.change enforcement', () => {
397
397
  expect(() => {
398
398
  // @ts-expect-error Testing runtime error for readonly array mutation.
399
399
  obj.fields!.push({ label: 'tag2', value: 'val2' });
400
- }).toThrow(/array\.push\(\).*outside of Obj\.change/);
400
+ }).toThrow(/array\.push\(\).*outside of Obj\.update/);
401
401
  });
402
402
 
403
- test('array pop outside Obj.change throws', ({ expect }) => {
403
+ test('array pop outside Obj.update throws', ({ expect }) => {
404
404
  const obj = Obj.make(TestSchema.Person, {
405
405
  name: 'John',
406
406
  fields: [{ label: 'tag1', value: 'val1' }],
@@ -409,10 +409,10 @@ describe('Obj.change enforcement', () => {
409
409
  expect(() => {
410
410
  // @ts-expect-error Testing runtime error for readonly array mutation.
411
411
  obj.fields!.pop();
412
- }).toThrow(/array\.pop\(\).*outside of Obj\.change/);
412
+ }).toThrow(/array\.pop\(\).*outside of Obj\.update/);
413
413
  });
414
414
 
415
- test('array splice outside Obj.change throws', ({ expect }) => {
415
+ test('array splice outside Obj.update throws', ({ expect }) => {
416
416
  const obj = Obj.make(TestSchema.Person, {
417
417
  name: 'John',
418
418
  fields: [{ label: 'tag1', value: 'val1' }],
@@ -421,33 +421,33 @@ describe('Obj.change enforcement', () => {
421
421
  expect(() => {
422
422
  // @ts-expect-error Testing runtime error for readonly array mutation.
423
423
  obj.fields!.splice(0, 1);
424
- }).toThrow(/array\.splice\(\).*outside of Obj\.change/);
424
+ }).toThrow(/array\.splice\(\).*outside of Obj\.update/);
425
425
  });
426
426
  });
427
427
 
428
428
  describe('property delete', () => {
429
- test('delete property within Obj.change', ({ expect }) => {
429
+ test('delete property within Obj.update', ({ expect }) => {
430
430
  const obj = Obj.make(TestSchema.Person, { name: 'John', age: 25 });
431
431
 
432
- Obj.change(obj, (p) => {
433
- delete p.age;
432
+ Obj.update(obj, (obj) => {
433
+ delete obj.age;
434
434
  });
435
435
 
436
436
  expect(obj.age).toBeUndefined();
437
437
  });
438
438
 
439
- test('delete property outside Obj.change throws', ({ expect }) => {
439
+ test('delete property outside Obj.update throws', ({ expect }) => {
440
440
  const obj = Obj.make(TestSchema.Person, { name: 'John', age: 25 });
441
441
 
442
442
  expect(() => {
443
443
  // @ts-expect-error Testing runtime error for readonly property delete.
444
444
  delete obj.age;
445
- }).toThrow(/delete object property.*outside of Obj\.change/);
445
+ }).toThrow(/delete object property.*outside of Obj\.update/);
446
446
  });
447
447
  });
448
448
 
449
449
  describe('Relation mutators', () => {
450
- test('Relation.getMeta is mutable inside Relation.change', ({ expect }) => {
450
+ test('Relation.getMeta is mutable inside Relation.update', ({ expect }) => {
451
451
  const source = Obj.make(TestSchema.Person, { name: 'Alice' });
452
452
  const target = Obj.make(TestSchema.Person, { name: 'Bob' });
453
453
  const rel = Relation.make(TestSchema.HasManager, {
@@ -455,8 +455,8 @@ describe('Obj.change enforcement', () => {
455
455
  [Relation.Target]: target,
456
456
  });
457
457
 
458
- Relation.change(rel, (r) => {
459
- const meta = Relation.getMeta(r);
458
+ Relation.update(rel, (rel) => {
459
+ const meta = Relation.getMeta(rel);
460
460
  meta.tags = ['rel-tag'];
461
461
  meta.keys.push({ source: 'rel-source', id: 'rel-key' });
462
462
  });
@@ -473,14 +473,14 @@ describe('Obj.change enforcement', () => {
473
473
  [Relation.Target]: target,
474
474
  });
475
475
 
476
- Relation.change(rel, (r) => {
477
- Relation.addTag(r, 'important');
476
+ Relation.update(rel, (rel) => {
477
+ Relation.addTag(rel, 'important');
478
478
  });
479
479
 
480
480
  expect(Relation.getMeta(rel).tags).toContain('important');
481
481
 
482
- Relation.change(rel, (r) => {
483
- Relation.removeTag(r, 'important');
482
+ Relation.update(rel, (rel) => {
483
+ Relation.removeTag(rel, 'important');
484
484
  });
485
485
 
486
486
  expect(Relation.getMeta(rel).tags).not.toContain('important');
@@ -494,8 +494,8 @@ describe('Obj.change enforcement', () => {
494
494
 
495
495
  // Direct assignment of root ECHO objects (created with Obj.make) is not allowed.
496
496
  expect(() => {
497
- Obj.change(obj, (o) => {
498
- o.other = other;
497
+ Obj.update(obj, (obj) => {
498
+ obj.other = other;
499
499
  });
500
500
  }).toThrow(/Object references must be wrapped with `Ref\.make`/);
501
501
  });
@@ -504,14 +504,14 @@ describe('Obj.change enforcement', () => {
504
504
  const obj = Obj.make(TestSchema.Expando, {});
505
505
 
506
506
  // Assign a plain object (not created with Obj.make).
507
- Obj.change(obj, (o) => {
508
- o.nested = { value: 'initial' };
507
+ Obj.update(obj, (obj) => {
508
+ obj.nested = { value: 'initial' };
509
509
  });
510
510
  expect(obj.nested.value).toBe('initial');
511
511
 
512
512
  // Modify plain nested object through parent's change context.
513
- Obj.change(obj, (o) => {
514
- o.nested.value = 'modified';
513
+ Obj.update(obj, (obj) => {
514
+ obj.nested.value = 'modified';
515
515
  });
516
516
  expect(obj.nested.value).toBe('modified');
517
517
  });
@@ -3,12 +3,12 @@
3
3
  //
4
4
 
5
5
  /**
6
- * Error thrown when attempting to mutate an object outside of an Obj.change() context.
6
+ * Error thrown when attempting to mutate an object outside of an Obj.update() context.
7
7
  */
8
8
  export class MutationOutsideChangeContextError extends Error {
9
9
  constructor(operation: string, suggestion: string) {
10
10
  super(
11
- `Cannot ${operation} outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { ${suggestion} }) instead.`,
11
+ `Cannot ${operation} outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { ${suggestion} }) instead.`,
12
12
  );
13
13
  this.name = 'MutationOutsideChangeContextError';
14
14
  }
@@ -3,15 +3,13 @@
3
3
  //
4
4
 
5
5
  import { inspect } from 'node:util';
6
-
7
6
  import { describe, expect, test } from 'vitest';
8
7
 
9
8
  import { isNode } from '@dxos/util';
10
9
 
11
- import { TestSchema, updateCounter } from '../../testing';
12
- import { createObject } from '../object';
10
+ import { TestSchema, updateCounter } from '../../../testing';
11
+ import { createObject } from '../../Obj';
13
12
  import { ATTR_META } from '../types';
14
-
15
13
  import { makeObject } from './make-object';
16
14
  import { objectData } from './proxy-types';
17
15
  import { change } from './reactive';
@@ -7,16 +7,19 @@ import { invariant } from '@dxos/invariant';
7
7
  import { DXN } from '@dxos/keys';
8
8
  import { deepMapValues } from '@dxos/util';
9
9
 
10
+ import { Ref } from '../../Ref';
10
11
  import {
12
+ ATTR_META,
11
13
  ATTR_RELATION_SOURCE,
12
14
  ATTR_RELATION_TARGET,
13
15
  ATTR_SELF_DXN,
16
+ ATTR_TYPE,
17
+ MetaId,
14
18
  RelationSourceDXNId,
15
19
  RelationTargetDXNId,
16
20
  SelfDXNId,
17
- } from '../entities';
18
- import { Ref } from '../ref';
19
- import { ATTR_META, ATTR_TYPE, MetaId, TypeId } from '../types';
21
+ TypeId,
22
+ } from '../types';
20
23
 
21
24
  /**
22
25
  * Attaches a toJSON method to the object for typed serialization.
@@ -6,9 +6,8 @@ import type * as Schema from 'effect/Schema';
6
6
 
7
7
  import { ObjectId } from '@dxos/keys';
8
8
 
9
- import { getTypeAnnotation } from '../annotations';
9
+ import { getTypeAnnotation } from '../../Annotation';
10
10
  import { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema, ParentId } from '../types';
11
-
12
11
  import { defineHiddenProperty } from './define-hidden-property';
13
12
  import { attachTypedJsonSerializer } from './json-serializer';
14
13
  import { createProxy, getProxyTarget, isValidProxyTarget } from './proxy-utils';
@@ -5,7 +5,6 @@
5
5
  import { invariant } from '@dxos/invariant';
6
6
 
7
7
  import { KindId } from '../types';
8
-
9
8
  import { queueOwnerNotification } from './change-context';
10
9
  import { defineHiddenProperty } from './define-hidden-property';
11
10
  import { getProxyTarget, isProxy, isValidProxyTarget } from './proxy-utils';
@@ -34,7 +34,7 @@ const checkArrayMutationAllowed = (arr: any, method: string): void => {
34
34
 
35
35
  /**
36
36
  * Extends the native array to make sure that arrays methods are correctly reactive.
37
- * Enforces that mutations only happen within Obj.change() context.
37
+ * Enforces that mutations only happen within Obj.update() context.
38
38
  */
39
39
  export class ReactiveArray<T> extends Array<T> {
40
40
  static override get [Symbol.species]() {
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import * as Obj from '../../../Obj';
8
+ import { TestSchema } from '../../../testing';
9
+
10
+ describe('Obj.subscribe', () => {
11
+ test('subscribes and fires for reactive proxies', () => {
12
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
13
+ let calls = 0;
14
+ const unsubscribe = Obj.subscribe(obj, () => {
15
+ calls++;
16
+ });
17
+
18
+ Obj.update(obj, (obj) => {
19
+ obj.name = 'Updated';
20
+ });
21
+ expect(calls).toBeGreaterThan(0);
22
+
23
+ unsubscribe();
24
+ const seen = calls;
25
+ Obj.update(obj, (obj) => {
26
+ obj.name = 'After unsubscribe';
27
+ });
28
+ expect(calls).toBe(seen);
29
+ });
30
+
31
+ // Regression: queue-stored typed objects (e.g. ContextBinding) and other Obj-shaped values
32
+ // satisfy `Obj.isObject` (KindId is set) but are not wrapped in a reactive Proxy. Earlier
33
+ // versions invariant'd inside `getProxyTarget` when an atom body did `Obj.subscribe(obj)` on
34
+ // such an input. The contract is "no-op for non-reactive inputs"; verify the function
35
+ // returns gracefully instead of throwing.
36
+ test('returns a no-op unsubscribe for non-proxy inputs', () => {
37
+ const queueShaped: any = {
38
+ id: '01KQ5NKXJWSKMRPVTVG2GHV8V3',
39
+ blueprints: { added: [], removed: [] },
40
+ objects: { added: [], removed: [] },
41
+ };
42
+ const unsubscribe = Obj.subscribe(queueShaped, () => {});
43
+ expect(typeof unsubscribe).toBe('function');
44
+ expect(() => unsubscribe()).not.toThrow();
45
+ });
46
+
47
+ test('returns a no-op unsubscribe for primitives, null, and undefined', () => {
48
+ for (const value of [null, undefined, 42, 'string', true]) {
49
+ const unsubscribe = Obj.subscribe(value as any, () => {});
50
+ expect(typeof unsubscribe).toBe('function');
51
+ expect(() => unsubscribe()).not.toThrow();
52
+ }
53
+ });
54
+ });