@dxos/echo 0.8.4-main.548089c → 0.8.4-main.59c2e9b

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 (598) hide show
  1. package/README.md +1 -2
  2. package/dist/lib/browser/Annotation.mjs +33 -0
  3. package/dist/lib/browser/Database.mjs +18 -0
  4. package/dist/lib/browser/Entity.mjs +52 -0
  5. package/dist/lib/browser/Entity.mjs.map +7 -0
  6. package/dist/lib/browser/Err.mjs +11 -0
  7. package/dist/lib/browser/Err.mjs.map +7 -0
  8. package/dist/lib/browser/Filter.mjs +62 -0
  9. package/dist/lib/browser/Filter.mjs.map +7 -0
  10. package/dist/lib/browser/Format.mjs +67 -0
  11. package/dist/lib/browser/Format.mjs.map +7 -0
  12. package/dist/lib/browser/JsonSchema.mjs +20 -0
  13. package/dist/lib/browser/JsonSchema.mjs.map +7 -0
  14. package/dist/lib/browser/Key.mjs +13 -0
  15. package/dist/lib/browser/Key.mjs.map +7 -0
  16. package/dist/lib/browser/Obj.mjs +91 -0
  17. package/dist/lib/browser/Obj.mjs.map +7 -0
  18. package/dist/lib/browser/Order.mjs +13 -0
  19. package/dist/lib/browser/Order.mjs.map +7 -0
  20. package/dist/lib/browser/Query.mjs +27 -0
  21. package/dist/lib/browser/Query.mjs.map +7 -0
  22. package/dist/lib/browser/QueryResult.mjs +3 -0
  23. package/dist/lib/browser/QueryResult.mjs.map +7 -0
  24. package/dist/lib/browser/Ref.mjs +23 -0
  25. package/dist/lib/browser/Ref.mjs.map +7 -0
  26. package/dist/lib/browser/Relation.mjs +85 -0
  27. package/dist/lib/browser/Relation.mjs.map +7 -0
  28. package/dist/lib/browser/SchemaRegistry.mjs +3 -0
  29. package/dist/lib/browser/SchemaRegistry.mjs.map +7 -0
  30. package/dist/lib/browser/Tag.mjs +26 -0
  31. package/dist/lib/browser/Tag.mjs.map +7 -0
  32. package/dist/lib/browser/Type.mjs +48 -0
  33. package/dist/lib/browser/Type.mjs.map +7 -0
  34. package/dist/lib/browser/chunk-22JMFST2.mjs +24 -0
  35. package/dist/lib/browser/chunk-22JMFST2.mjs.map +7 -0
  36. package/dist/lib/browser/chunk-2SBB7OWV.mjs +250 -0
  37. package/dist/lib/browser/chunk-2SBB7OWV.mjs.map +7 -0
  38. package/dist/lib/browser/chunk-6L5HHUVU.mjs +158 -0
  39. package/dist/lib/browser/chunk-6L5HHUVU.mjs.map +7 -0
  40. package/dist/lib/browser/chunk-7STIBCP7.mjs +133 -0
  41. package/dist/lib/browser/chunk-7STIBCP7.mjs.map +7 -0
  42. package/dist/lib/browser/chunk-BJPE6CIC.mjs +3847 -0
  43. package/dist/lib/browser/chunk-BJPE6CIC.mjs.map +7 -0
  44. package/dist/lib/browser/chunk-CGS2ULMK.mjs +11 -0
  45. package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +7 -0
  46. package/dist/lib/browser/chunk-CJ5YELTO.mjs +39 -0
  47. package/dist/lib/browser/chunk-CJ5YELTO.mjs.map +7 -0
  48. package/dist/lib/browser/chunk-FPOISFQK.mjs +40 -0
  49. package/dist/lib/browser/chunk-FPOISFQK.mjs.map +7 -0
  50. package/dist/lib/browser/chunk-FRDT7RA4.mjs +403 -0
  51. package/dist/lib/browser/chunk-FRDT7RA4.mjs.map +7 -0
  52. package/dist/lib/browser/chunk-INHXFXY5.mjs +22 -0
  53. package/dist/lib/browser/chunk-INHXFXY5.mjs.map +7 -0
  54. package/dist/lib/browser/chunk-IXVWLTG7.mjs +9 -0
  55. package/dist/lib/browser/chunk-IXVWLTG7.mjs.map +7 -0
  56. package/dist/lib/browser/chunk-JMKVF2YQ.mjs +43 -0
  57. package/dist/lib/browser/chunk-JMKVF2YQ.mjs.map +7 -0
  58. package/dist/lib/browser/chunk-KQQGVHFN.mjs +143 -0
  59. package/dist/lib/browser/chunk-KQQGVHFN.mjs.map +7 -0
  60. package/dist/lib/browser/chunk-MYCCGG2T.mjs +15 -0
  61. package/dist/lib/browser/chunk-MYCCGG2T.mjs.map +7 -0
  62. package/dist/lib/browser/chunk-NOPVNWPT.mjs +204 -0
  63. package/dist/lib/browser/chunk-NOPVNWPT.mjs.map +7 -0
  64. package/dist/lib/browser/chunk-PQZW3S6L.mjs +74 -0
  65. package/dist/lib/browser/chunk-PQZW3S6L.mjs.map +7 -0
  66. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs +283 -0
  67. package/dist/lib/browser/chunk-RK4Z4JUZ.mjs.map +7 -0
  68. package/dist/lib/browser/chunk-U2J7TA7K.mjs +57 -0
  69. package/dist/lib/browser/chunk-U2J7TA7K.mjs.map +7 -0
  70. package/dist/lib/browser/chunk-W5D2GWAW.mjs +98 -0
  71. package/dist/lib/browser/chunk-W5D2GWAW.mjs.map +7 -0
  72. package/dist/lib/browser/chunk-XDIUHAAX.mjs +41 -0
  73. package/dist/lib/browser/chunk-XDIUHAAX.mjs.map +7 -0
  74. package/dist/lib/browser/chunk-YKTSSMDS.mjs +69 -0
  75. package/dist/lib/browser/chunk-YKTSSMDS.mjs.map +7 -0
  76. package/dist/lib/browser/chunk-ZAGAOZVY.mjs +288 -0
  77. package/dist/lib/browser/chunk-ZAGAOZVY.mjs.map +7 -0
  78. package/dist/lib/browser/chunk-ZHXZGIXD.mjs +9 -0
  79. package/dist/lib/browser/chunk-ZHXZGIXD.mjs.map +7 -0
  80. package/dist/lib/browser/index.mjs +68 -18
  81. package/dist/lib/browser/internal/index.mjs +245 -124
  82. package/dist/lib/browser/meta.json +1 -1
  83. package/dist/lib/browser/testing/index.mjs +298 -198
  84. package/dist/lib/browser/testing/index.mjs.map +4 -4
  85. package/dist/lib/node-esm/Annotation.mjs +33 -0
  86. package/dist/lib/node-esm/Annotation.mjs.map +7 -0
  87. package/dist/lib/node-esm/Database.mjs +18 -0
  88. package/dist/lib/node-esm/Database.mjs.map +7 -0
  89. package/dist/lib/node-esm/Entity.mjs +52 -0
  90. package/dist/lib/node-esm/Entity.mjs.map +7 -0
  91. package/dist/lib/node-esm/Err.mjs +11 -0
  92. package/dist/lib/node-esm/Err.mjs.map +7 -0
  93. package/dist/lib/node-esm/Filter.mjs +62 -0
  94. package/dist/lib/node-esm/Filter.mjs.map +7 -0
  95. package/dist/lib/node-esm/Format.mjs +67 -0
  96. package/dist/lib/node-esm/Format.mjs.map +7 -0
  97. package/dist/lib/node-esm/JsonSchema.mjs +20 -0
  98. package/dist/lib/node-esm/JsonSchema.mjs.map +7 -0
  99. package/dist/lib/node-esm/Key.mjs +13 -0
  100. package/dist/lib/node-esm/Key.mjs.map +7 -0
  101. package/dist/lib/node-esm/Obj.mjs +91 -0
  102. package/dist/lib/node-esm/Obj.mjs.map +7 -0
  103. package/dist/lib/node-esm/Order.mjs +13 -0
  104. package/dist/lib/node-esm/Order.mjs.map +7 -0
  105. package/dist/lib/node-esm/Query.mjs +27 -0
  106. package/dist/lib/node-esm/Query.mjs.map +7 -0
  107. package/dist/lib/node-esm/QueryResult.mjs +3 -0
  108. package/dist/lib/node-esm/QueryResult.mjs.map +7 -0
  109. package/dist/lib/node-esm/Ref.mjs +23 -0
  110. package/dist/lib/node-esm/Ref.mjs.map +7 -0
  111. package/dist/lib/node-esm/Relation.mjs +85 -0
  112. package/dist/lib/node-esm/Relation.mjs.map +7 -0
  113. package/dist/lib/node-esm/SchemaRegistry.mjs +3 -0
  114. package/dist/lib/node-esm/SchemaRegistry.mjs.map +7 -0
  115. package/dist/lib/node-esm/Tag.mjs +26 -0
  116. package/dist/lib/node-esm/Tag.mjs.map +7 -0
  117. package/dist/lib/node-esm/Type.mjs +48 -0
  118. package/dist/lib/node-esm/Type.mjs.map +7 -0
  119. package/dist/lib/node-esm/chunk-4PNXQA64.mjs +250 -0
  120. package/dist/lib/node-esm/chunk-4PNXQA64.mjs.map +7 -0
  121. package/dist/lib/node-esm/chunk-5OBN7GZW.mjs +158 -0
  122. package/dist/lib/node-esm/chunk-5OBN7GZW.mjs.map +7 -0
  123. package/dist/lib/node-esm/chunk-AJEMYSIR.mjs +22 -0
  124. package/dist/lib/node-esm/chunk-AJEMYSIR.mjs.map +7 -0
  125. package/dist/lib/node-esm/chunk-ANLVLWME.mjs +98 -0
  126. package/dist/lib/node-esm/chunk-ANLVLWME.mjs.map +7 -0
  127. package/dist/lib/node-esm/chunk-DMR7OAFK.mjs +57 -0
  128. package/dist/lib/node-esm/chunk-DMR7OAFK.mjs.map +7 -0
  129. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs +133 -0
  130. package/dist/lib/node-esm/chunk-FWTSPIFF.mjs.map +7 -0
  131. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  132. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  133. package/dist/lib/node-esm/chunk-ILMLLM4R.mjs +204 -0
  134. package/dist/lib/node-esm/chunk-ILMLLM4R.mjs.map +7 -0
  135. package/dist/lib/node-esm/chunk-K37NA7PO.mjs +43 -0
  136. package/dist/lib/node-esm/chunk-K37NA7PO.mjs.map +7 -0
  137. package/dist/lib/node-esm/chunk-LT3H4JOX.mjs +3847 -0
  138. package/dist/lib/node-esm/chunk-LT3H4JOX.mjs.map +7 -0
  139. package/dist/lib/node-esm/chunk-MOLNWFNL.mjs +9 -0
  140. package/dist/lib/node-esm/chunk-MOLNWFNL.mjs.map +7 -0
  141. package/dist/lib/node-esm/chunk-MOWUEW5P.mjs +15 -0
  142. package/dist/lib/node-esm/chunk-MOWUEW5P.mjs.map +7 -0
  143. package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs +40 -0
  144. package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs.map +7 -0
  145. package/dist/lib/node-esm/chunk-NRN3ZW2T.mjs +143 -0
  146. package/dist/lib/node-esm/chunk-NRN3ZW2T.mjs.map +7 -0
  147. package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs +41 -0
  148. package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs.map +7 -0
  149. package/dist/lib/node-esm/chunk-QYR67VBV.mjs +288 -0
  150. package/dist/lib/node-esm/chunk-QYR67VBV.mjs.map +7 -0
  151. package/dist/lib/node-esm/chunk-UKGVOINP.mjs +9 -0
  152. package/dist/lib/node-esm/chunk-UKGVOINP.mjs.map +7 -0
  153. package/dist/lib/node-esm/chunk-W6QIEBTQ.mjs +403 -0
  154. package/dist/lib/node-esm/chunk-W6QIEBTQ.mjs.map +7 -0
  155. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs +69 -0
  156. package/dist/lib/node-esm/chunk-XHJRMQZD.mjs.map +7 -0
  157. package/dist/lib/node-esm/chunk-Y75VU7LB.mjs +74 -0
  158. package/dist/lib/node-esm/chunk-Y75VU7LB.mjs.map +7 -0
  159. package/dist/lib/node-esm/chunk-YOLH5KS4.mjs +283 -0
  160. package/dist/lib/node-esm/chunk-YOLH5KS4.mjs.map +7 -0
  161. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs +39 -0
  162. package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs.map +7 -0
  163. package/dist/lib/node-esm/chunk-ZBB67AKD.mjs +24 -0
  164. package/dist/lib/node-esm/chunk-ZBB67AKD.mjs.map +7 -0
  165. package/dist/lib/node-esm/index.mjs +68 -18
  166. package/dist/lib/node-esm/internal/index.mjs +245 -124
  167. package/dist/lib/node-esm/meta.json +1 -1
  168. package/dist/lib/node-esm/testing/index.mjs +298 -198
  169. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  170. package/dist/types/src/Annotation.d.ts +2 -0
  171. package/dist/types/src/Annotation.d.ts.map +1 -0
  172. package/dist/types/src/Database.d.ts +194 -0
  173. package/dist/types/src/Database.d.ts.map +1 -0
  174. package/dist/types/src/Entity.d.ts +142 -0
  175. package/dist/types/src/Entity.d.ts.map +1 -0
  176. package/dist/types/src/Entity.test.d.ts +2 -0
  177. package/dist/types/src/Entity.test.d.ts.map +1 -0
  178. package/dist/types/src/{errors.d.ts → Err.d.ts} +19 -19
  179. package/dist/types/src/Err.d.ts.map +1 -0
  180. package/dist/types/src/Filter.d.ts +120 -0
  181. package/dist/types/src/Filter.d.ts.map +1 -0
  182. package/dist/types/src/Format.d.ts +4 -0
  183. package/dist/types/src/Format.d.ts.map +1 -0
  184. package/dist/types/src/Hypergraph.d.ts +60 -0
  185. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  186. package/dist/types/src/JsonSchema.d.ts +9 -0
  187. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  188. package/dist/types/src/Key.d.ts +1 -0
  189. package/dist/types/src/Key.d.ts.map +1 -1
  190. package/dist/types/src/Obj.d.ts +300 -99
  191. package/dist/types/src/Obj.d.ts.map +1 -1
  192. package/dist/types/src/Obj.test.d.ts +2 -0
  193. package/dist/types/src/Obj.test.d.ts.map +1 -0
  194. package/dist/types/src/Order.d.ts +16 -0
  195. package/dist/types/src/Order.d.ts.map +1 -0
  196. package/dist/types/src/Query.d.ts +115 -0
  197. package/dist/types/src/Query.d.ts.map +1 -0
  198. package/dist/types/src/Query.test.d.ts +2 -0
  199. package/dist/types/src/Query.test.d.ts.map +1 -0
  200. package/dist/types/src/QueryResult.d.ts +80 -0
  201. package/dist/types/src/QueryResult.d.ts.map +1 -0
  202. package/dist/types/src/Ref.d.ts +13 -11
  203. package/dist/types/src/Ref.d.ts.map +1 -1
  204. package/dist/types/src/Relation.d.ts +242 -22
  205. package/dist/types/src/Relation.d.ts.map +1 -1
  206. package/dist/types/src/Relation.test.d.ts +2 -0
  207. package/dist/types/src/Relation.test.d.ts.map +1 -0
  208. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  209. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  210. package/dist/types/src/Tag.d.ts +7 -7
  211. package/dist/types/src/Tag.d.ts.map +1 -1
  212. package/dist/types/src/Type.d.ts +225 -72
  213. package/dist/types/src/Type.d.ts.map +1 -1
  214. package/dist/types/src/Type.test.d.ts +2 -0
  215. package/dist/types/src/Type.test.d.ts.map +1 -0
  216. package/dist/types/src/index.d.ts +14 -5
  217. package/dist/types/src/index.d.ts.map +1 -1
  218. package/dist/types/src/internal/annotations/annotations.d.ts +170 -0
  219. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  220. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  221. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  222. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  223. package/dist/types/src/internal/annotations/util.d.ts +27 -0
  224. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  225. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  226. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  227. package/dist/types/src/internal/api/entity.d.ts +13 -0
  228. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  229. package/dist/types/src/internal/api/index.d.ts +15 -0
  230. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  231. package/dist/types/src/internal/api/meta.d.ts +42 -0
  232. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  233. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  234. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  235. package/dist/types/src/internal/api/version.d.ts +42 -0
  236. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  237. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  238. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  239. package/dist/types/src/internal/entities/index.d.ts +6 -0
  240. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  241. package/dist/types/src/internal/entities/model.d.ts +77 -0
  242. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  243. package/dist/types/src/internal/entities/object.d.ts +18 -0
  244. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  245. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  246. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  247. package/dist/types/src/internal/entities/util.d.ts +2 -0
  248. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  249. package/dist/types/src/internal/formats/format.d.ts +4 -2
  250. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  251. package/dist/types/src/internal/formats/select.d.ts +5 -3
  252. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  253. package/dist/types/src/internal/formats/string.d.ts +4 -0
  254. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  255. package/dist/types/src/internal/formats/types.d.ts +13 -9
  256. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  257. package/dist/types/src/internal/index.d.ts +7 -10
  258. package/dist/types/src/internal/index.d.ts.map +1 -1
  259. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  260. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  261. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  262. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  263. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  264. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +2 -1
  265. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  266. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  267. package/dist/types/src/internal/object/clone.d.ts +8 -0
  268. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  269. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  270. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +9 -10
  271. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  272. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  273. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  274. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  275. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  276. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  277. package/dist/types/src/internal/object/index.d.ts +6 -11
  278. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  279. package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
  280. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  281. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  282. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  283. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  284. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  285. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  286. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  287. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  288. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  289. package/dist/types/src/internal/object/typed-object.d.ts +8 -14
  290. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  291. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  292. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  293. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  294. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  295. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  296. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  297. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  298. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  299. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  300. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  301. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  302. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  303. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  304. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  305. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  306. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  307. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  308. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  309. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  310. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  311. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  312. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  313. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  314. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  315. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  316. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  317. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  318. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  319. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  320. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  321. package/dist/types/src/internal/proxy/typed-handler.d.ts +15 -12
  322. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  323. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  324. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  325. package/dist/types/src/internal/ref/ref.d.ts +27 -16
  326. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  327. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  328. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  329. package/dist/types/src/internal/schema/echo-schema.d.ts +24 -12
  330. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  331. package/dist/types/src/internal/schema/index.d.ts +1 -4
  332. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  333. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  334. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  335. package/dist/types/src/internal/types/base.d.ts +26 -0
  336. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  337. package/dist/types/src/internal/types/entity.d.ts +37 -0
  338. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  339. package/dist/types/src/internal/types/index.d.ts +5 -2
  340. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  341. package/dist/types/src/internal/{object → types}/meta.d.ts +12 -11
  342. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  343. package/dist/types/src/internal/types/typename.d.ts +13 -0
  344. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  345. package/dist/types/src/internal/{object → types}/version.d.ts +3 -2
  346. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  347. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  348. package/dist/types/src/testing/index.d.ts +3 -3
  349. package/dist/types/src/testing/index.d.ts.map +1 -1
  350. package/dist/types/src/testing/test-data.d.ts +18 -0
  351. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  352. package/dist/types/src/testing/test-schema.d.ts +303 -0
  353. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  354. package/dist/types/src/testing/util.d.ts +21 -0
  355. package/dist/types/src/testing/util.d.ts.map +1 -0
  356. package/dist/types/tsconfig.tsbuildinfo +1 -1
  357. package/package.json +160 -45
  358. package/src/Annotation.ts +18 -0
  359. package/src/Database.ts +336 -0
  360. package/src/Entity.test.ts +22 -0
  361. package/src/Entity.ts +217 -0
  362. package/src/{errors.ts → Err.ts} +2 -2
  363. package/src/Filter.ts +376 -0
  364. package/src/Format.ts +9 -0
  365. package/src/Hypergraph.ts +74 -0
  366. package/src/JsonSchema.ts +16 -0
  367. package/src/Key.ts +3 -0
  368. package/src/Obj.test.ts +386 -0
  369. package/src/Obj.ts +447 -292
  370. package/src/Order.ts +44 -0
  371. package/src/Query.test.ts +465 -0
  372. package/src/Query.ts +296 -0
  373. package/src/QueryResult.ts +106 -0
  374. package/src/Ref.ts +26 -9
  375. package/src/Relation.test.ts +82 -0
  376. package/src/Relation.ts +411 -60
  377. package/src/SchemaRegistry.ts +105 -0
  378. package/src/Tag.ts +3 -2
  379. package/src/Type.test.ts +52 -0
  380. package/src/Type.ts +361 -114
  381. package/src/index.ts +15 -6
  382. package/src/internal/README.md +100 -0
  383. package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
  384. package/src/internal/annotations/annotations.ts +460 -0
  385. package/src/internal/annotations/index.ts +6 -0
  386. package/src/internal/annotations/util.ts +72 -0
  387. package/src/internal/api/annotations.ts +60 -0
  388. package/src/internal/api/entity.ts +29 -0
  389. package/src/internal/api/index.ts +19 -0
  390. package/src/internal/api/meta.ts +88 -0
  391. package/src/internal/api/sorting.ts +53 -0
  392. package/src/internal/api/version.ts +96 -0
  393. package/src/internal/entities/entity.ts +126 -0
  394. package/src/internal/entities/index.ts +9 -0
  395. package/src/internal/entities/model.ts +134 -0
  396. package/src/internal/entities/object.ts +60 -0
  397. package/src/internal/entities/relation.ts +173 -0
  398. package/src/internal/entities/util.ts +33 -0
  399. package/src/internal/formats/date.test.ts +1 -1
  400. package/src/internal/formats/date.ts +5 -5
  401. package/src/internal/formats/format.test.ts +5 -5
  402. package/src/internal/formats/format.ts +8 -6
  403. package/src/internal/formats/number.ts +5 -5
  404. package/src/internal/formats/object.ts +4 -4
  405. package/src/internal/formats/select.ts +5 -3
  406. package/src/internal/formats/string.ts +14 -9
  407. package/src/internal/formats/types.ts +53 -42
  408. package/src/internal/index.ts +30 -13
  409. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  410. package/src/internal/json-schema/index.ts +2 -0
  411. package/src/internal/json-schema/json-schema-type.ts +5 -4
  412. package/src/internal/{json → json-schema}/json-schema.test.ts +67 -55
  413. package/src/internal/{json → json-schema}/json-schema.ts +17 -8
  414. package/src/internal/object/clone.ts +48 -0
  415. package/src/internal/object/common.ts +3 -4
  416. package/src/internal/object/{create.test.ts → create-object.test.ts} +30 -32
  417. package/src/internal/object/{create.ts → create-object.ts} +35 -36
  418. package/src/internal/object/deleted.ts +6 -6
  419. package/src/internal/object/ids.ts +1 -1
  420. package/src/internal/object/index.ts +6 -11
  421. package/src/internal/object/inspect.ts +5 -7
  422. package/src/internal/object/json-serializer.test.ts +35 -37
  423. package/src/internal/object/json-serializer.ts +65 -102
  424. package/src/internal/object/schema-validator.ts +2 -237
  425. package/src/internal/object/set-value.test.ts +281 -0
  426. package/src/internal/object/set-value.ts +165 -0
  427. package/src/internal/object/snapshot.ts +70 -0
  428. package/src/internal/object/typed-object.test.ts +11 -11
  429. package/src/internal/object/typed-object.ts +8 -66
  430. package/src/internal/proxy/change-context.ts +138 -0
  431. package/src/internal/proxy/change.test.ts +519 -0
  432. package/src/internal/proxy/define-hidden-property.ts +14 -0
  433. package/src/internal/proxy/errors.ts +42 -0
  434. package/src/internal/proxy/event-batch.ts +44 -0
  435. package/src/internal/proxy/handler.test.ts +51 -91
  436. package/src/internal/proxy/index.ts +17 -0
  437. package/src/internal/proxy/json-serializer.ts +87 -0
  438. package/src/internal/proxy/make-object.ts +96 -0
  439. package/src/internal/proxy/ownership.ts +253 -0
  440. package/src/internal/proxy/proxy-types.ts +23 -0
  441. package/src/internal/proxy/proxy-utils.ts +150 -0
  442. package/src/internal/proxy/reactive-array.ts +71 -0
  443. package/src/internal/proxy/reactive.ts +69 -0
  444. package/src/internal/proxy/schema-validator.ts +244 -0
  445. package/src/internal/proxy/schema.test.ts +27 -18
  446. package/src/internal/proxy/symbols.ts +7 -0
  447. package/src/internal/proxy/typed-handler.test.ts +264 -48
  448. package/src/internal/proxy/typed-handler.ts +275 -61
  449. package/src/internal/proxy/typed-object.test.ts +42 -26
  450. package/src/internal/ref/ref-array.ts +4 -4
  451. package/src/internal/ref/ref.test.ts +8 -7
  452. package/src/internal/ref/ref.ts +81 -54
  453. package/src/internal/{projection → schema}/compose.test.ts +8 -9
  454. package/src/internal/{projection → schema}/compose.ts +1 -1
  455. package/src/internal/schema/echo-schema.ts +73 -33
  456. package/src/internal/schema/index.ts +1 -4
  457. package/src/internal/schema/manipulation.ts +1 -1
  458. package/src/internal/schema/persistent-schema.ts +27 -0
  459. package/src/internal/types/base.ts +43 -0
  460. package/src/internal/types/entity.ts +54 -0
  461. package/src/internal/types/index.ts +5 -2
  462. package/src/internal/{object → types}/meta.ts +22 -17
  463. package/src/internal/types/typename.ts +45 -0
  464. package/src/internal/types/version.ts +20 -0
  465. package/src/testing/api.test.ts +126 -0
  466. package/src/testing/index.ts +3 -3
  467. package/src/testing/test-data.ts +130 -0
  468. package/src/testing/test-schema.ts +238 -0
  469. package/src/testing/util.ts +85 -0
  470. package/dist/lib/browser/chunk-3FCPYTWA.mjs +0 -585
  471. package/dist/lib/browser/chunk-3FCPYTWA.mjs.map +0 -7
  472. package/dist/lib/browser/chunk-5BNXQE6S.mjs +0 -3727
  473. package/dist/lib/browser/chunk-5BNXQE6S.mjs.map +0 -7
  474. package/dist/lib/browser/chunk-U43CXUCL.mjs +0 -410
  475. package/dist/lib/browser/chunk-U43CXUCL.mjs.map +0 -7
  476. package/dist/lib/browser/query/index.mjs +0 -13
  477. package/dist/lib/node-esm/chunk-3FGSPSYN.mjs +0 -3727
  478. package/dist/lib/node-esm/chunk-3FGSPSYN.mjs.map +0 -7
  479. package/dist/lib/node-esm/chunk-C7LTTWRL.mjs +0 -585
  480. package/dist/lib/node-esm/chunk-C7LTTWRL.mjs.map +0 -7
  481. package/dist/lib/node-esm/chunk-OHJ5WBB6.mjs +0 -410
  482. package/dist/lib/node-esm/chunk-OHJ5WBB6.mjs.map +0 -7
  483. package/dist/lib/node-esm/query/index.mjs +0 -13
  484. package/dist/types/src/errors.d.ts.map +0 -1
  485. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  486. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  487. package/dist/types/src/internal/ast/annotations.d.ts +0 -131
  488. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  489. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  490. package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
  491. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  492. package/dist/types/src/internal/ast/index.d.ts +0 -5
  493. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  494. package/dist/types/src/internal/ast/types.d.ts +0 -6
  495. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  496. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  497. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  498. package/dist/types/src/internal/json/index.d.ts +0 -2
  499. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  500. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  501. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  502. package/dist/types/src/internal/object/accessors.d.ts +0 -37
  503. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  504. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  505. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  506. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  507. package/dist/types/src/internal/object/entity.d.ts +0 -33
  508. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  509. package/dist/types/src/internal/object/expando.d.ts +0 -14
  510. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  511. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  512. package/dist/types/src/internal/object/model.d.ts +0 -117
  513. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  514. package/dist/types/src/internal/object/relation.d.ts +0 -17
  515. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  516. package/dist/types/src/internal/object/typename.d.ts +0 -15
  517. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  518. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  519. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  520. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  521. package/dist/types/src/internal/projection/index.d.ts +0 -2
  522. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  523. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  524. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  525. package/dist/types/src/internal/query/index.d.ts +0 -2
  526. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  527. package/dist/types/src/internal/query/query.d.ts +0 -17
  528. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  529. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  530. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  531. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  532. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  533. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  534. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  535. package/dist/types/src/internal/testing/index.d.ts +0 -3
  536. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  537. package/dist/types/src/internal/testing/types.d.ts +0 -381
  538. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  539. package/dist/types/src/internal/testing/utils.d.ts +0 -10
  540. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  541. package/dist/types/src/internal/types/types.d.ts +0 -79
  542. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  543. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  544. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  545. package/dist/types/src/internal/types/util.d.ts +0 -5
  546. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  547. package/dist/types/src/query/index.d.ts +0 -2
  548. package/dist/types/src/query/index.d.ts.map +0 -1
  549. package/dist/types/src/query/query.d.ts +0 -248
  550. package/dist/types/src/query/query.d.ts.map +0 -1
  551. package/dist/types/src/query/query.test.d.ts +0 -2
  552. package/dist/types/src/query/query.test.d.ts.map +0 -1
  553. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  554. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  555. package/dist/types/src/testing/types.d.ts +0 -228
  556. package/dist/types/src/testing/types.d.ts.map +0 -1
  557. package/src/internal/ast/annotation-helper.ts +0 -22
  558. package/src/internal/ast/annotations.ts +0 -226
  559. package/src/internal/ast/entity-kind.ts +0 -15
  560. package/src/internal/ast/index.ts +0 -8
  561. package/src/internal/ast/types.ts +0 -17
  562. package/src/internal/json/index.ts +0 -5
  563. package/src/internal/object/accessors.ts +0 -153
  564. package/src/internal/object/entity.ts +0 -248
  565. package/src/internal/object/expando.ts +0 -21
  566. package/src/internal/object/model.ts +0 -170
  567. package/src/internal/object/relation.ts +0 -24
  568. package/src/internal/object/typename.ts +0 -61
  569. package/src/internal/object/version.ts +0 -22
  570. package/src/internal/projection/index.ts +0 -5
  571. package/src/internal/proxy/reactive-object.ts +0 -108
  572. package/src/internal/query/index.ts +0 -5
  573. package/src/internal/query/query.ts +0 -23
  574. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  575. package/src/internal/schema/snapshot.ts +0 -25
  576. package/src/internal/schema/stored-schema.ts +0 -26
  577. package/src/internal/testing/index.ts +0 -6
  578. package/src/internal/testing/types.ts +0 -144
  579. package/src/internal/testing/utils.ts +0 -54
  580. package/src/internal/types/types.test.ts +0 -48
  581. package/src/internal/types/types.ts +0 -176
  582. package/src/internal/types/util.ts +0 -9
  583. package/src/query/index.ts +0 -6
  584. package/src/query/query.test.ts +0 -401
  585. package/src/query/query.ts +0 -789
  586. package/src/test/api.test.ts +0 -180
  587. package/src/testing/echo-schema.ts +0 -39
  588. package/src/testing/types.ts +0 -108
  589. /package/dist/lib/browser/{query/index.mjs.map → Annotation.mjs.map} +0 -0
  590. /package/dist/lib/{node-esm/query/index.mjs.map → browser/Database.mjs.map} +0 -0
  591. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  592. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  593. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  594. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  595. /package/dist/types/src/internal/{projection → schema}/compose.d.ts +0 -0
  596. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  597. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  598. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
@@ -0,0 +1,42 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ /**
6
+ * Error thrown when attempting to mutate an object outside of an Obj.change() context.
7
+ */
8
+ export class MutationOutsideChangeContextError extends Error {
9
+ constructor(operation: string, suggestion: string) {
10
+ super(
11
+ `Cannot ${operation} outside of Obj.change(). Use Obj.change(obj, (mutableObj) => { ${suggestion} }) instead.`,
12
+ );
13
+ this.name = 'MutationOutsideChangeContextError';
14
+ }
15
+ }
16
+
17
+ /**
18
+ * Create an error for attempting to set a property outside of a change context.
19
+ */
20
+ export const createPropertySetError = (prop: string | symbol): MutationOutsideChangeContextError => {
21
+ return new MutationOutsideChangeContextError(
22
+ `modify object property "${String(prop)}"`,
23
+ `mutableObj.${String(prop)} = value;`,
24
+ );
25
+ };
26
+
27
+ /**
28
+ * Create an error for attempting to delete a property outside of a change context.
29
+ */
30
+ export const createPropertyDeleteError = (prop: string | symbol): MutationOutsideChangeContextError => {
31
+ return new MutationOutsideChangeContextError(
32
+ `delete object property "${String(prop)}"`,
33
+ `delete mutableObj.${String(prop)};`,
34
+ );
35
+ };
36
+
37
+ /**
38
+ * Create an error for attempting to call an array method outside of a change context.
39
+ */
40
+ export const createArrayMethodError = (method: string): MutationOutsideChangeContextError => {
41
+ return new MutationOutsideChangeContextError(`call array.${method}()`, `mutableObj.array.${method}(...);`);
42
+ };
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { EventId } from './symbols';
6
+
7
+ /**
8
+ * Simple batching mechanism for EventId emissions.
9
+ * When batch depth > 0, events are collected instead of emitted immediately.
10
+ * When batch depth returns to 0, pending events are emitted.
11
+ */
12
+ let eventBatchDepth = 0;
13
+ const pendingEventTargets = new Set<object>();
14
+
15
+ /**
16
+ * Run a callback in a batched context for EventId emissions.
17
+ * Multiple mutations within the batch will only emit one event per target.
18
+ */
19
+ export const batchEvents = (callback: () => void): void => {
20
+ eventBatchDepth++;
21
+ try {
22
+ callback();
23
+ } finally {
24
+ eventBatchDepth--;
25
+ if (eventBatchDepth === 0) {
26
+ // Emit pending events.
27
+ for (const target of pendingEventTargets) {
28
+ (target as any)[EventId]?.emit();
29
+ }
30
+ pendingEventTargets.clear();
31
+ }
32
+ }
33
+ };
34
+
35
+ /**
36
+ * Emit an event on a target, respecting batching.
37
+ */
38
+ export const emitEvent = (target: object): void => {
39
+ if (eventBatchDepth > 0) {
40
+ pendingEventTargets.add(target);
41
+ } else {
42
+ (target as any)[EventId]?.emit();
43
+ }
44
+ };
@@ -6,102 +6,111 @@ import { inspect } from 'node:util';
6
6
 
7
7
  import { describe, expect, test } from 'vitest';
8
8
 
9
- import { registerSignalsRuntime } from '@dxos/echo-signals';
10
- import type { Live } from '@dxos/live-object';
11
- import { objectData } from '@dxos/live-object';
12
9
  import { isNode } from '@dxos/util';
13
10
 
14
- import { ATTR_META } from '..';
15
- import { Testing, updateCounter } from '../testing';
11
+ import { TestSchema, updateCounter } from '../../testing';
12
+ import { createObject } from '../object';
13
+ import { ATTR_META } from '../types';
16
14
 
17
- import { live } from './reactive-object';
15
+ import { makeObject } from './make-object';
16
+ import { objectData } from './proxy-types';
17
+ import { change } from './reactive';
18
18
 
19
- registerSignalsRuntime();
19
+ describe('proxy', () => {
20
+ test.skipIf(!isNode())('inspect', ({ expect }) => {
21
+ const obj = createObject(TestSchema.Message, { timestamp: new Date().toISOString() });
22
+ const str = inspect(obj, { colors: true });
23
+ expect(str).to.exist;
24
+ });
25
+ });
20
26
 
21
- const TEST_OBJECT: Testing.TestSchema = {
27
+ const TEST_OBJECT: TestSchema.ExampleSchema = {
22
28
  string: 'foo',
23
29
  number: 42,
24
30
  boolean: true,
25
31
  null: null,
26
32
  stringArray: ['1', '2', '3'],
27
- object: { field: 'bar' },
33
+ nested: {
34
+ field: 'bar',
35
+ },
28
36
  };
29
37
 
30
- for (const schema of [undefined, Testing.TestSchemaWithClass]) {
31
- const createObject = (props: Partial<Testing.TestSchemaWithClass> = {}): Live<Testing.TestSchemaWithClass> => {
32
- return schema == null ? (live(props) as Testing.TestSchemaWithClass) : live(schema, props);
38
+ // Schema is now required for reactive objects.
39
+ {
40
+ const createObject = (props: Partial<TestSchema.ExampleSchema> = {}): TestSchema.ExampleSchema => {
41
+ return makeObject(TestSchema.ExampleSchema, props);
33
42
  };
34
43
 
35
- describe(`Non-echo specific proxy properties${schema == null ? '' : ' with schema'}`, () => {
44
+ describe('Non-echo specific proxy properties with schema', () => {
36
45
  test.skipIf(!isNode())('inspect', () => {
37
46
  const obj = createObject({ string: 'bar' });
38
47
  const str = inspect(obj, { colors: false });
39
- expect(str).to.eq(`${schema == null ? '' : 'Typed '}{ string: 'bar' }`);
48
+ expect(str).to.eq("Typed { string: 'bar' }");
40
49
  });
41
50
 
42
51
  test('data symbol', async () => {
43
52
  const obj = createObject({ ...TEST_OBJECT });
44
53
  const objData: any = (obj as any)[objectData];
45
54
  expect(objData).to.deep.contain({
46
- '@type': `${schema ? 'Typed' : ''}ReactiveObject`,
55
+ '@type': 'TypedReactiveObject',
47
56
  ...TEST_OBJECT,
48
57
  });
49
58
  });
50
59
 
60
+ // TODO(wittjosiah): Should we prevent this?
51
61
  test('can assign class instances', () => {
52
62
  const obj = createObject();
53
63
 
54
- const classInstance = new Testing.TestClass();
55
- obj.classInstance = classInstance;
64
+ const classInstance = new TestSchema.TestClass();
65
+ change(obj, (o) => {
66
+ o.classInstance = classInstance;
67
+ });
56
68
  expect(obj.classInstance!.field).to.eq('value');
57
- expect(obj.classInstance instanceof Testing.TestClass).to.eq(true);
69
+ expect(obj.classInstance instanceof TestSchema.TestClass).to.eq(true);
58
70
  expect(obj.classInstance === classInstance).to.be.true;
59
71
 
72
+ // Class instances are not wrapped in proxies, so direct mutation works.
60
73
  obj.classInstance!.field = 'baz';
61
74
  expect(obj.classInstance!.field).to.eq('baz');
62
75
  });
63
76
 
64
77
  describe('class instance equality', () => {
65
78
  test('toJSON', () => {
66
- const original = { classInstance: new Testing.TestClass() };
79
+ const original = { classInstance: new TestSchema.TestClass() };
67
80
  const reactive = createObject(original);
68
- if (!schema) {
69
- expect(JSON.stringify(reactive)).to.eq(JSON.stringify(original));
70
- } else {
71
- expect(JSON.stringify(reactive)).to.eq(
72
- JSON.stringify({
73
- [ATTR_META]: {
74
- keys: [],
75
- },
76
- ...original,
77
- }),
78
- );
79
- }
81
+ expect(JSON.stringify(reactive)).to.eq(
82
+ JSON.stringify({
83
+ [ATTR_META]: {
84
+ keys: [],
85
+ },
86
+ ...original,
87
+ }),
88
+ );
80
89
  });
81
90
 
82
91
  test('chai deep equal works', () => {
83
- const original = { classInstance: new Testing.TestClass() };
92
+ const original = { classInstance: new TestSchema.TestClass() };
84
93
  const reactive = createObject(original);
85
94
  expect(reactive).to.deep.eq(original);
86
95
  expect(reactive).to.not.deep.eq({ ...original, number: 11 });
87
96
  });
88
97
 
89
98
  test('jest deep equal works', () => {
90
- const original = { classInstance: new Testing.TestClass() };
99
+ const original = { classInstance: new TestSchema.TestClass() };
91
100
  const reactive = createObject(original);
92
101
  expect(reactive).toEqual(original);
93
102
  expect(reactive).not.toEqual({ ...original, number: 11 });
94
103
  });
95
104
  });
96
105
 
97
- describe('signal updates', () => {
98
- test('not in nested class instances', () => {
99
- const obj = createObject({ classInstance: new Testing.TestClass() });
100
- using updates = updateCounter(() => {
101
- obj.classInstance!.field;
102
- });
106
+ describe('subscription updates', () => {
107
+ test('not triggered by nested class instance changes', () => {
108
+ const obj = createObject({ classInstance: new TestSchema.TestClass() });
109
+ using updates = updateCounter(obj);
103
110
  expect(updates.count, 'update count').to.eq(0);
104
111
 
112
+ // Changes to class instance fields don't trigger subscription updates
113
+ // because class instances aren't wrapped in live proxies.
105
114
  obj.classInstance!.field = 'baz';
106
115
  expect(updates.count, 'update count').to.eq(0);
107
116
  });
@@ -109,55 +118,6 @@ for (const schema of [undefined, Testing.TestSchemaWithClass]) {
109
118
  });
110
119
  }
111
120
 
112
- describe('getters', () => {
113
- test('add getter to object', () => {
114
- let value = 'foo';
115
- const obj = live({
116
- get getter() {
117
- return value;
118
- },
119
- });
120
- expect(obj.getter).to.eq('foo');
121
-
122
- value = 'bar';
123
- expect(obj.getter).to.eq('bar');
124
- });
125
-
126
- test('signal updates', () => {
127
- const innerObj = live({
128
- string: 'bar',
129
- });
130
-
131
- const obj = live({
132
- field: 1,
133
- get getter() {
134
- return innerObj.string;
135
- },
136
- });
137
-
138
- using updates = updateCounter(() => {
139
- const value = obj.getter;
140
- expect(value).to.exist;
141
- });
142
-
143
- innerObj.string = 'baz';
144
- expect(obj.getter).to.eq('baz');
145
- expect(updates.count, 'update count').to.eq(1);
146
-
147
- obj.field = 2;
148
- expect(updates.count, 'update count').to.eq(1);
149
- });
150
-
151
- test('getter for array', () => {
152
- const value = [1];
153
- const obj = live({
154
- get getter() {
155
- return value;
156
- },
157
- });
158
- expect(obj.getter).to.have.length(1);
159
-
160
- value.push(2);
161
- expect(obj.getter).to.have.length(2);
162
- });
163
- });
121
+ // NOTE: Getter tests with external variable references were removed.
122
+ // These patterns only worked with untyped reactive objects, which are no longer supported.
123
+ // For typed schemas, getters should be defined in the schema itself.
@@ -0,0 +1,17 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './change-context';
6
+ export * from './define-hidden-property';
7
+ export * from './errors';
8
+ export * from './event-batch';
9
+ export * from './json-serializer';
10
+ export * from './make-object';
11
+ export * from './proxy-types';
12
+ export * from './proxy-utils';
13
+ export * from './reactive';
14
+ export * from './reactive-array';
15
+ export * from './schema-validator';
16
+ export * from './symbols';
17
+ export * from './typed-handler';
@@ -0,0 +1,87 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ObjectMeta } from '@dxos/echo-protocol';
6
+ import { invariant } from '@dxos/invariant';
7
+ import { DXN } from '@dxos/keys';
8
+ import { deepMapValues } from '@dxos/util';
9
+
10
+ import {
11
+ ATTR_RELATION_SOURCE,
12
+ ATTR_RELATION_TARGET,
13
+ ATTR_SELF_DXN,
14
+ RelationSourceDXNId,
15
+ RelationTargetDXNId,
16
+ SelfDXNId,
17
+ } from '../entities';
18
+ import { Ref } from '../ref';
19
+ import { ATTR_META, ATTR_TYPE, MetaId, TypeId } from '../types';
20
+
21
+ /**
22
+ * Attaches a toJSON method to the object for typed serialization.
23
+ */
24
+ export const attachTypedJsonSerializer = (obj: any) => {
25
+ const descriptor = Object.getOwnPropertyDescriptor(obj, 'toJSON');
26
+ if (descriptor) {
27
+ return;
28
+ }
29
+
30
+ Object.defineProperty(obj, 'toJSON', {
31
+ value: typedJsonSerializer,
32
+ writable: false,
33
+ enumerable: false,
34
+ // Setting `configurable` to false breaks proxy invariants, should be fixable.
35
+ configurable: true,
36
+ });
37
+ };
38
+
39
+ // NOTE: KEEP as function.
40
+ // Exported for use in objectToJSON.
41
+ export const typedJsonSerializer = function (this: any) {
42
+ const { id, ...rest } = this;
43
+ const result: any = {
44
+ id,
45
+ };
46
+
47
+ if (this[TypeId]) {
48
+ result[ATTR_TYPE] = this[TypeId].toString();
49
+ }
50
+
51
+ if (this[MetaId]) {
52
+ result[ATTR_META] = serializeMeta(this[MetaId]);
53
+ }
54
+
55
+ if (this[SelfDXNId]) {
56
+ result[ATTR_SELF_DXN] = this[SelfDXNId].toString();
57
+ }
58
+
59
+ if (this[RelationSourceDXNId]) {
60
+ const sourceDXN = this[RelationSourceDXNId];
61
+ invariant(sourceDXN instanceof DXN);
62
+ result[ATTR_RELATION_SOURCE] = sourceDXN.toString();
63
+ }
64
+ if (this[RelationTargetDXNId]) {
65
+ const targetDXN = this[RelationTargetDXNId];
66
+ invariant(targetDXN instanceof DXN);
67
+ result[ATTR_RELATION_TARGET] = targetDXN.toString();
68
+ }
69
+
70
+ Object.assign(result, serializeData(rest));
71
+ return result;
72
+ };
73
+
74
+ const serializeData = (data: unknown) => {
75
+ return deepMapValues(data, (value, recurse) => {
76
+ if (Ref.isRef(value)) {
77
+ // TODO(dmaretskyi): Should this be configurable?
78
+ return value.noInline().encode();
79
+ }
80
+
81
+ return recurse(value);
82
+ });
83
+ };
84
+
85
+ const serializeMeta = (meta: ObjectMeta) => {
86
+ return deepMapValues(meta, (value, recurse) => recurse(value));
87
+ };
@@ -0,0 +1,96 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import type * as Schema from 'effect/Schema';
6
+
7
+ import { ObjectId } from '@dxos/keys';
8
+
9
+ import { getTypeAnnotation } from '../annotations';
10
+ import { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema } from '../types';
11
+
12
+ import { defineHiddenProperty } from './define-hidden-property';
13
+ import { attachTypedJsonSerializer } from './json-serializer';
14
+ import { createProxy, getProxyTarget, isValidProxyTarget } from './proxy-utils';
15
+ import { TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
16
+
17
+ /**
18
+ *
19
+ */
20
+ // TODO(burdon): Make internal
21
+ export type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId>;
22
+
23
+ /**
24
+ * Creates a reactive object from a plain Javascript object.
25
+ * Requires a TS-effect schema.
26
+ */
27
+ // TODO(burdon): Make internal
28
+ // TODO(dmaretskyi): Deep mutability.
29
+ // TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.
30
+ // TODO(dmaretskyi): Could mutate original object making it unusable.
31
+ export const makeObject: {
32
+ <T extends AnyProperties>(
33
+ schema: Schema.Schema<T, any, never>,
34
+ obj: NoInfer<MakeObjectProps<T>>,
35
+ meta?: ObjectMeta,
36
+ ): T;
37
+ } = <T extends AnyProperties>(schema: Schema.Schema<T, any>, obj: MakeObjectProps<T>, meta?: ObjectMeta): T => {
38
+ return createReactiveObject<T>({ ...obj } as T, meta, schema);
39
+ };
40
+
41
+ const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta, schema?: Schema.Schema<T>): T => {
42
+ if (!isValidProxyTarget(obj)) {
43
+ throw new Error('Value cannot be made into a reactive object.');
44
+ }
45
+
46
+ if (!schema) {
47
+ throw new Error('Schema is required for reactive objects. Use Atom for untyped reactive state.');
48
+ }
49
+
50
+ const annotation = getTypeAnnotation(schema);
51
+ if (annotation) {
52
+ setIdOnTarget(obj);
53
+ defineHiddenProperty(obj, KindId, annotation.kind);
54
+ }
55
+ initMeta(obj, meta);
56
+ prepareTypedTarget(obj, schema);
57
+ attachTypedJsonSerializer(obj);
58
+ const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);
59
+
60
+ // Set meta's owner to the main object so meta mutations respect the parent's change context.
61
+ // For non-database objects using TypedReactiveHandler, this links the meta to the main object's
62
+ // change context. For database objects, meta is handled by EchoReactiveHandler.getMeta().
63
+ const metaProxy = (obj as any)[MetaId];
64
+ if (metaProxy) {
65
+ const metaTarget = getProxyTarget(metaProxy);
66
+ if (metaTarget) {
67
+ setMetaOwner(metaTarget, obj);
68
+ }
69
+ }
70
+
71
+ return proxy;
72
+ };
73
+
74
+ /**
75
+ * Set ID on ECHO object targets during creation.
76
+ * Used for objects with schema and the ones explicitly marked as Expando.
77
+ */
78
+ const setIdOnTarget = (target: any) => {
79
+ // invariant(!('id' in target), 'Object already has an `id` field, which is reserved.');
80
+ if ('id' in target && target.id !== undefined && target.id !== null) {
81
+ if (!ObjectId.isValid(target.id)) {
82
+ throw new Error('Invalid object id format.');
83
+ }
84
+ } else {
85
+ target.id = ObjectId.random();
86
+ }
87
+ };
88
+
89
+ /**
90
+ * Set metadata on object.
91
+ */
92
+ // TODO(dmaretskyi): Move to echo-schema.
93
+ const initMeta = <T>(obj: T, meta: ObjectMeta = { keys: [] }) => {
94
+ prepareTypedTarget(meta, ObjectMetaSchema);
95
+ defineHiddenProperty(obj, MetaId, createProxy(meta, TypedReactiveHandler.instance as any));
96
+ };