@dxos/echo 0.8.4-main.406dc2a → 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 (600) 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 +72 -22
  81. package/dist/lib/browser/internal/index.mjs +245 -120
  82. package/dist/lib/browser/meta.json +1 -1
  83. package/dist/lib/browser/testing/index.mjs +295 -226
  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 +72 -22
  166. package/dist/lib/node-esm/internal/index.mjs +245 -120
  167. package/dist/lib/node-esm/meta.json +1 -1
  168. package/dist/lib/node-esm/testing/index.mjs +295 -226
  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} +23 -31
  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 +302 -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 +17 -0
  211. package/dist/types/src/Tag.d.ts.map +1 -0
  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 +15 -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} +10 -11
  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 +449 -275
  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/{query/tag.ts → Tag.ts} +10 -7
  379. package/src/Type.test.ts +52 -0
  380. package/src/Type.ts +361 -114
  381. package/src/index.ts +16 -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 +73 -69
  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} +31 -33
  417. package/src/internal/object/{create.ts → create-object.ts} +36 -37
  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 +43 -27
  450. package/src/internal/ref/ref-array.ts +4 -4
  451. package/src/internal/ref/ref.test.ts +9 -8
  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-HKFCK2GL.mjs +0 -175
  471. package/dist/lib/browser/chunk-HKFCK2GL.mjs.map +0 -7
  472. package/dist/lib/browser/chunk-MAAYELT7.mjs +0 -830
  473. package/dist/lib/browser/chunk-MAAYELT7.mjs.map +0 -7
  474. package/dist/lib/browser/chunk-MB6MMNFP.mjs +0 -3857
  475. package/dist/lib/browser/chunk-MB6MMNFP.mjs.map +0 -7
  476. package/dist/lib/browser/query/index.mjs +0 -15
  477. package/dist/lib/node-esm/chunk-5NWDGIBT.mjs +0 -830
  478. package/dist/lib/node-esm/chunk-5NWDGIBT.mjs.map +0 -7
  479. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs +0 -175
  480. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs.map +0 -7
  481. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs +0 -3857
  482. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs.map +0 -7
  483. package/dist/lib/node-esm/query/index.mjs +0 -15
  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 -125
  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 -455
  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 -3
  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/query/tag.d.ts +0 -17
  554. package/dist/types/src/query/tag.d.ts.map +0 -1
  555. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  556. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  557. package/dist/types/src/testing/types.d.ts +0 -113
  558. package/dist/types/src/testing/types.d.ts.map +0 -1
  559. package/src/internal/ast/annotation-helper.ts +0 -22
  560. package/src/internal/ast/annotations.ts +0 -219
  561. package/src/internal/ast/entity-kind.ts +0 -15
  562. package/src/internal/ast/index.ts +0 -8
  563. package/src/internal/ast/types.ts +0 -17
  564. package/src/internal/json/index.ts +0 -5
  565. package/src/internal/object/accessors.ts +0 -153
  566. package/src/internal/object/entity.ts +0 -248
  567. package/src/internal/object/expando.ts +0 -21
  568. package/src/internal/object/model.ts +0 -170
  569. package/src/internal/object/relation.ts +0 -24
  570. package/src/internal/object/typename.ts +0 -61
  571. package/src/internal/object/version.ts +0 -22
  572. package/src/internal/projection/index.ts +0 -5
  573. package/src/internal/proxy/reactive-object.ts +0 -108
  574. package/src/internal/query/index.ts +0 -5
  575. package/src/internal/query/query.ts +0 -23
  576. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  577. package/src/internal/schema/snapshot.ts +0 -25
  578. package/src/internal/schema/stored-schema.ts +0 -26
  579. package/src/internal/testing/index.ts +0 -6
  580. package/src/internal/testing/types.ts +0 -211
  581. package/src/internal/testing/utils.ts +0 -54
  582. package/src/internal/types/types.test.ts +0 -48
  583. package/src/internal/types/types.ts +0 -176
  584. package/src/internal/types/util.ts +0 -9
  585. package/src/query/index.ts +0 -6
  586. package/src/query/query.test.ts +0 -401
  587. package/src/query/query.ts +0 -789
  588. package/src/test/api.test.ts +0 -180
  589. package/src/testing/echo-schema.ts +0 -39
  590. package/src/testing/types.ts +0 -91
  591. /package/dist/lib/browser/{query/index.mjs.map → Annotation.mjs.map} +0 -0
  592. /package/dist/lib/{node-esm/query/index.mjs.map → browser/Database.mjs.map} +0 -0
  593. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  594. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  595. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  596. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  597. /package/dist/types/src/internal/{projection → schema}/compose.d.ts +0 -0
  598. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  599. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  600. /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
+ };