@dxos/echo 0.8.4-main.406dc2a → 0.8.4-main.4a85c3132b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +45 -0
  4. package/dist/lib/neutral/Entity.mjs +56 -0
  5. package/dist/lib/neutral/Err.mjs +12 -0
  6. package/dist/lib/neutral/Feed.mjs +43 -0
  7. package/dist/lib/neutral/Filter.mjs +61 -0
  8. package/dist/lib/neutral/Format.mjs +66 -0
  9. package/dist/lib/neutral/Format.mjs.map +7 -0
  10. package/dist/lib/neutral/JsonSchema.mjs +18 -0
  11. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  12. package/dist/lib/neutral/Key.mjs +12 -0
  13. package/dist/lib/neutral/Key.mjs.map +7 -0
  14. package/dist/lib/neutral/Obj.mjs +107 -0
  15. package/dist/lib/neutral/Obj.mjs.map +7 -0
  16. package/dist/lib/neutral/Order.mjs +12 -0
  17. package/dist/lib/neutral/Order.mjs.map +7 -0
  18. package/dist/lib/neutral/Query.mjs +32 -0
  19. package/dist/lib/neutral/Query.mjs.map +7 -0
  20. package/dist/lib/neutral/QueryResult.mjs +2 -0
  21. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  22. package/dist/lib/neutral/Ref.mjs +24 -0
  23. package/dist/lib/neutral/Ref.mjs.map +7 -0
  24. package/dist/lib/neutral/Relation.mjs +90 -0
  25. package/dist/lib/neutral/Relation.mjs.map +7 -0
  26. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  27. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  28. package/dist/lib/neutral/Tag.mjs +25 -0
  29. package/dist/lib/neutral/Tag.mjs.map +7 -0
  30. package/dist/lib/neutral/Type.mjs +34 -0
  31. package/dist/lib/neutral/Type.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-4KG6IGL4.mjs +67 -0
  33. package/dist/lib/neutral/chunk-4KG6IGL4.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-5ELDDYWE.mjs +130 -0
  35. package/dist/lib/neutral/chunk-5ELDDYWE.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-ALOGSVBP.mjs +299 -0
  37. package/dist/lib/neutral/chunk-ALOGSVBP.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
  39. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-AQP4QKYP.mjs +283 -0
  41. package/dist/lib/neutral/chunk-AQP4QKYP.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-BRJSLACP.mjs +152 -0
  43. package/dist/lib/neutral/chunk-BRJSLACP.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-DZQSL6RW.mjs +73 -0
  45. package/dist/lib/neutral/chunk-DZQSL6RW.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs +327 -0
  47. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs +56 -0
  49. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-GFNCSK7F.mjs +101 -0
  51. package/dist/lib/neutral/chunk-GFNCSK7F.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  53. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-KGV3QIRX.mjs +313 -0
  55. package/dist/lib/neutral/chunk-KGV3QIRX.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-M2KVTHZM.mjs +402 -0
  57. package/dist/lib/neutral/chunk-M2KVTHZM.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-MXQJZCPY.mjs +51 -0
  59. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-O3TZFQCT.mjs +27 -0
  61. package/dist/lib/neutral/chunk-O3TZFQCT.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
  63. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-OVUBTQLT.mjs +45 -0
  65. package/dist/lib/neutral/chunk-OVUBTQLT.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-PP4DNUZU.mjs +3919 -0
  67. package/dist/lib/neutral/chunk-PP4DNUZU.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-QXF3LGN2.mjs +43 -0
  69. package/dist/lib/neutral/chunk-QXF3LGN2.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs +97 -0
  71. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-T6JEFNP6.mjs +7 -0
  73. package/dist/lib/neutral/chunk-T6JEFNP6.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs +121 -0
  75. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs +42 -0
  77. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs +298 -0
  79. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs.map +7 -0
  80. package/dist/lib/neutral/index.mjs +94 -0
  81. package/dist/lib/neutral/index.mjs.map +7 -0
  82. package/dist/lib/{node-esm → neutral}/internal/index.mjs +253 -121
  83. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  84. package/dist/lib/neutral/meta.json +1 -0
  85. package/dist/lib/neutral/testing/index.mjs +369 -0
  86. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  87. package/dist/types/src/Annotation.d.ts +24 -0
  88. package/dist/types/src/Annotation.d.ts.map +1 -0
  89. package/dist/types/src/Collection.d.ts +16 -0
  90. package/dist/types/src/Collection.d.ts.map +1 -0
  91. package/dist/types/src/Database.d.ts +189 -0
  92. package/dist/types/src/Database.d.ts.map +1 -0
  93. package/dist/types/src/Dataset.d.ts +18 -0
  94. package/dist/types/src/Dataset.d.ts.map +1 -0
  95. package/dist/types/src/Entity.d.ts +168 -0
  96. package/dist/types/src/Entity.d.ts.map +1 -0
  97. package/dist/types/src/Entity.test.d.ts +2 -0
  98. package/dist/types/src/Entity.test.d.ts.map +1 -0
  99. package/dist/types/src/Err.d.ts +107 -0
  100. package/dist/types/src/Err.d.ts.map +1 -0
  101. package/dist/types/src/Feed.d.ts +165 -0
  102. package/dist/types/src/Feed.d.ts.map +1 -0
  103. package/dist/types/src/Filter.d.ts +120 -0
  104. package/dist/types/src/Filter.d.ts.map +1 -0
  105. package/dist/types/src/Format.d.ts +4 -0
  106. package/dist/types/src/Format.d.ts.map +1 -0
  107. package/dist/types/src/Hypergraph.d.ts +60 -0
  108. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +16 -0
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  111. package/dist/types/src/Key.d.ts +1 -0
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Obj.d.ts +417 -101
  114. package/dist/types/src/Obj.d.ts.map +1 -1
  115. package/dist/types/src/Obj.test.d.ts +2 -0
  116. package/dist/types/src/Obj.test.d.ts.map +1 -0
  117. package/dist/types/src/Order.d.ts +16 -0
  118. package/dist/types/src/Order.d.ts.map +1 -0
  119. package/dist/types/src/Query.d.ts +202 -0
  120. package/dist/types/src/Query.d.ts.map +1 -0
  121. package/dist/types/src/Query.test.d.ts +2 -0
  122. package/dist/types/src/Query.test.d.ts.map +1 -0
  123. package/dist/types/src/QueryResult.d.ts +80 -0
  124. package/dist/types/src/QueryResult.d.ts.map +1 -0
  125. package/dist/types/src/Ref.d.ts +61 -11
  126. package/dist/types/src/Ref.d.ts.map +1 -1
  127. package/dist/types/src/Relation.d.ts +287 -21
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Relation.test.d.ts +2 -0
  130. package/dist/types/src/Relation.test.d.ts.map +1 -0
  131. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  132. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  133. package/dist/types/src/Tag.d.ts +18 -0
  134. package/dist/types/src/Tag.d.ts.map +1 -0
  135. package/dist/types/src/Type.d.ts +120 -97
  136. package/dist/types/src/Type.d.ts.map +1 -1
  137. package/dist/types/src/Type.test.d.ts +2 -0
  138. package/dist/types/src/Type.test.d.ts.map +1 -0
  139. package/dist/types/src/View.d.ts +68 -0
  140. package/dist/types/src/View.d.ts.map +1 -0
  141. package/dist/types/src/hierarchy.test.d.ts +2 -0
  142. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  143. package/dist/types/src/index.d.ts +19 -5
  144. package/dist/types/src/index.d.ts.map +1 -1
  145. package/dist/types/src/internal/annotations/annotations.d.ts +209 -0
  146. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  147. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  148. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  149. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  150. package/dist/types/src/internal/annotations/util.d.ts +39 -0
  151. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  152. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  153. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  154. package/dist/types/src/internal/api/entity.d.ts +13 -0
  155. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  156. package/dist/types/src/internal/api/index.d.ts +15 -0
  157. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  158. package/dist/types/src/internal/api/meta.d.ts +42 -0
  159. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  160. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  161. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  162. package/dist/types/src/internal/api/version.d.ts +42 -0
  163. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  164. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  165. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  166. package/dist/types/src/internal/entities/index.d.ts +6 -0
  167. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  168. package/dist/types/src/internal/entities/model.d.ts +79 -0
  169. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  170. package/dist/types/src/internal/entities/object.d.ts +18 -0
  171. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  172. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  173. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  174. package/dist/types/src/internal/entities/util.d.ts +2 -0
  175. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  176. package/dist/types/src/internal/formats/format.d.ts +4 -2
  177. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  178. package/dist/types/src/internal/formats/select.d.ts +6 -4
  179. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  180. package/dist/types/src/internal/formats/string.d.ts +4 -0
  181. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  182. package/dist/types/src/internal/formats/types.d.ts +13 -9
  183. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  184. package/dist/types/src/internal/index.d.ts +7 -10
  185. package/dist/types/src/internal/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  187. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  188. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  189. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  190. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  192. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +4 -2
  194. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  195. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  196. package/dist/types/src/internal/object/clone.d.ts +8 -0
  197. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  198. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  199. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +10 -11
  200. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  201. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  202. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  203. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  204. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  205. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  206. package/dist/types/src/internal/object/index.d.ts +6 -11
  207. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  208. package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
  209. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  210. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  211. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  212. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  213. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  214. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  215. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  216. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  217. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  218. package/dist/types/src/internal/object/typed-object.d.ts +8 -14
  219. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  220. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  221. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  222. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  223. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  224. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  225. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  226. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  227. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  228. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  229. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  230. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  231. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  232. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  233. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  234. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  235. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  236. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  237. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  238. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  239. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  240. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  241. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  242. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  243. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  244. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  245. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  246. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  247. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  248. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  249. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  250. package/dist/types/src/internal/proxy/typed-handler.d.ts +16 -12
  251. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  252. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  253. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  254. package/dist/types/src/internal/ref/ref.d.ts +43 -18
  255. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  256. package/dist/types/src/internal/schema/compose.d.ts +7 -0
  257. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  258. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/schema/echo-schema.d.ts +25 -12
  260. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  261. package/dist/types/src/internal/schema/index.d.ts +1 -4
  262. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  263. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  264. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  265. package/dist/types/src/internal/types/base.d.ts +27 -0
  266. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  267. package/dist/types/src/internal/types/entity.d.ts +37 -0
  268. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  269. package/dist/types/src/internal/types/index.d.ts +5 -2
  270. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  271. package/dist/types/src/internal/{object → types}/meta.d.ts +16 -14
  272. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  273. package/dist/types/src/internal/types/typename.d.ts +21 -0
  274. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  275. package/dist/types/src/internal/types/version.d.ts +15 -0
  276. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  277. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  278. package/dist/types/src/testing/index.d.ts +3 -3
  279. package/dist/types/src/testing/index.d.ts.map +1 -1
  280. package/dist/types/src/testing/test-data.d.ts +18 -0
  281. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  282. package/dist/types/src/testing/test-schema.d.ts +304 -0
  283. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  284. package/dist/types/src/testing/util.d.ts +21 -0
  285. package/dist/types/src/testing/util.d.ts.map +1 -0
  286. package/dist/types/tsconfig.tsbuildinfo +1 -1
  287. package/package.json +106 -65
  288. package/src/Annotation.ts +46 -0
  289. package/src/Collection.ts +30 -0
  290. package/src/Database.ts +315 -0
  291. package/src/Dataset.ts +24 -0
  292. package/src/Entity.test.ts +22 -0
  293. package/src/Entity.ts +234 -0
  294. package/src/Err.ts +38 -0
  295. package/src/Feed.ts +254 -0
  296. package/src/Filter.ts +389 -0
  297. package/src/Format.ts +9 -0
  298. package/src/Hypergraph.ts +74 -0
  299. package/src/JsonSchema.ts +24 -0
  300. package/src/Key.ts +3 -0
  301. package/src/Obj.test.ts +447 -0
  302. package/src/Obj.ts +580 -267
  303. package/src/Order.ts +44 -0
  304. package/src/Query.test.ts +632 -0
  305. package/src/Query.ts +520 -0
  306. package/src/QueryResult.ts +106 -0
  307. package/src/Ref.ts +77 -9
  308. package/src/Relation.test.ts +88 -0
  309. package/src/Relation.ts +440 -58
  310. package/src/SchemaRegistry.ts +106 -0
  311. package/src/{query/tag.ts → Tag.ts} +10 -8
  312. package/src/Type.test.ts +52 -0
  313. package/src/Type.ts +162 -151
  314. package/src/View.ts +100 -0
  315. package/src/hierarchy.test.ts +33 -0
  316. package/src/index.ts +20 -6
  317. package/src/internal/README.md +102 -0
  318. package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
  319. package/src/internal/annotations/annotations.ts +526 -0
  320. package/src/internal/annotations/index.ts +6 -0
  321. package/src/internal/annotations/util.ts +85 -0
  322. package/src/internal/api/annotations.ts +60 -0
  323. package/src/internal/api/entity.ts +29 -0
  324. package/src/internal/api/index.ts +19 -0
  325. package/src/internal/api/meta.ts +88 -0
  326. package/src/internal/api/sorting.ts +53 -0
  327. package/src/internal/api/version.ts +96 -0
  328. package/src/internal/entities/entity.ts +128 -0
  329. package/src/internal/entities/index.ts +9 -0
  330. package/src/internal/entities/model.ts +138 -0
  331. package/src/internal/entities/object.ts +58 -0
  332. package/src/internal/entities/relation.ts +171 -0
  333. package/src/internal/entities/util.ts +33 -0
  334. package/src/internal/formats/date.test.ts +1 -1
  335. package/src/internal/formats/date.ts +5 -5
  336. package/src/internal/formats/format.test.ts +6 -6
  337. package/src/internal/formats/format.ts +8 -6
  338. package/src/internal/formats/number.ts +5 -5
  339. package/src/internal/formats/object.ts +4 -4
  340. package/src/internal/formats/select.ts +6 -4
  341. package/src/internal/formats/string.ts +14 -9
  342. package/src/internal/formats/types.ts +53 -42
  343. package/src/internal/index.ts +30 -13
  344. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  345. package/src/internal/json-schema/index.ts +2 -0
  346. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  347. package/src/internal/json-schema/json-schema-type.ts +35 -35
  348. package/src/internal/{json → json-schema}/json-schema.test.ts +73 -69
  349. package/src/internal/{json → json-schema}/json-schema.ts +30 -15
  350. package/src/internal/object/clone.ts +48 -0
  351. package/src/internal/object/common.ts +3 -4
  352. package/src/internal/object/{create.test.ts → create-object.test.ts} +31 -33
  353. package/src/internal/object/{create.ts → create-object.ts} +36 -37
  354. package/src/internal/object/deleted.ts +6 -6
  355. package/src/internal/object/ids.ts +1 -1
  356. package/src/internal/object/index.ts +6 -11
  357. package/src/internal/object/inspect.ts +5 -7
  358. package/src/internal/object/json-serializer.test.ts +59 -37
  359. package/src/internal/object/json-serializer.ts +87 -108
  360. package/src/internal/object/schema-validator.test.ts +3 -7
  361. package/src/internal/object/schema-validator.ts +2 -237
  362. package/src/internal/object/set-value.test.ts +281 -0
  363. package/src/internal/object/set-value.ts +165 -0
  364. package/src/internal/object/snapshot.ts +96 -0
  365. package/src/internal/object/typed-object.test.ts +11 -11
  366. package/src/internal/object/typed-object.ts +8 -66
  367. package/src/internal/proxy/change-context.ts +138 -0
  368. package/src/internal/proxy/change.test.ts +519 -0
  369. package/src/internal/proxy/define-hidden-property.ts +14 -0
  370. package/src/internal/proxy/errors.ts +42 -0
  371. package/src/internal/proxy/event-batch.ts +44 -0
  372. package/src/internal/proxy/handler.test.ts +51 -91
  373. package/src/internal/proxy/index.ts +17 -0
  374. package/src/internal/proxy/json-serializer.ts +87 -0
  375. package/src/internal/proxy/make-object.ts +106 -0
  376. package/src/internal/proxy/ownership.ts +253 -0
  377. package/src/internal/proxy/proxy-types.ts +23 -0
  378. package/src/internal/proxy/proxy-utils.ts +150 -0
  379. package/src/internal/proxy/reactive-array.ts +71 -0
  380. package/src/internal/proxy/reactive.ts +69 -0
  381. package/src/internal/proxy/schema-validator.ts +244 -0
  382. package/src/internal/proxy/schema.test.ts +27 -18
  383. package/src/internal/proxy/symbols.ts +7 -0
  384. package/src/internal/proxy/typed-handler.test.ts +260 -48
  385. package/src/internal/proxy/typed-handler.ts +283 -61
  386. package/src/internal/proxy/typed-object.test.ts +54 -38
  387. package/src/internal/ref/ref-array.ts +4 -4
  388. package/src/internal/ref/ref.test.ts +10 -9
  389. package/src/internal/ref/ref.ts +107 -56
  390. package/src/internal/{projection → schema}/compose.test.ts +8 -9
  391. package/src/internal/{projection → schema}/compose.ts +13 -8
  392. package/src/internal/schema/echo-schema.ts +74 -33
  393. package/src/internal/schema/index.ts +1 -4
  394. package/src/internal/schema/manipulation.ts +1 -1
  395. package/src/internal/schema/persistent-schema.ts +33 -0
  396. package/src/internal/types/base.ts +43 -0
  397. package/src/internal/types/entity.ts +54 -0
  398. package/src/internal/types/index.ts +5 -2
  399. package/src/internal/types/meta.ts +68 -0
  400. package/src/internal/types/typename.ts +55 -0
  401. package/src/internal/types/version.ts +19 -0
  402. package/src/testing/api.test.ts +126 -0
  403. package/src/testing/index.ts +3 -3
  404. package/src/testing/test-data.ts +130 -0
  405. package/src/testing/test-schema.ts +240 -0
  406. package/src/testing/util.ts +85 -0
  407. package/dist/lib/browser/chunk-HKFCK2GL.mjs +0 -175
  408. package/dist/lib/browser/chunk-HKFCK2GL.mjs.map +0 -7
  409. package/dist/lib/browser/chunk-MAAYELT7.mjs +0 -830
  410. package/dist/lib/browser/chunk-MAAYELT7.mjs.map +0 -7
  411. package/dist/lib/browser/chunk-MB6MMNFP.mjs +0 -3857
  412. package/dist/lib/browser/chunk-MB6MMNFP.mjs.map +0 -7
  413. package/dist/lib/browser/index.mjs +0 -35
  414. package/dist/lib/browser/internal/index.mjs +0 -332
  415. package/dist/lib/browser/meta.json +0 -1
  416. package/dist/lib/browser/query/index.mjs +0 -15
  417. package/dist/lib/browser/testing/index.mjs +0 -298
  418. package/dist/lib/browser/testing/index.mjs.map +0 -7
  419. package/dist/lib/node-esm/chunk-5NWDGIBT.mjs +0 -830
  420. package/dist/lib/node-esm/chunk-5NWDGIBT.mjs.map +0 -7
  421. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs +0 -175
  422. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs.map +0 -7
  423. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs +0 -3857
  424. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs.map +0 -7
  425. package/dist/lib/node-esm/index.mjs +0 -35
  426. package/dist/lib/node-esm/meta.json +0 -1
  427. package/dist/lib/node-esm/query/index.mjs +0 -15
  428. package/dist/lib/node-esm/testing/index.mjs +0 -298
  429. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  430. package/dist/types/src/errors.d.ts +0 -72
  431. package/dist/types/src/errors.d.ts.map +0 -1
  432. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  433. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  434. package/dist/types/src/internal/ast/annotations.d.ts +0 -125
  435. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  436. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  437. package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
  438. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  439. package/dist/types/src/internal/ast/index.d.ts +0 -5
  440. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  441. package/dist/types/src/internal/ast/types.d.ts +0 -6
  442. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  443. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  444. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  445. package/dist/types/src/internal/json/index.d.ts +0 -2
  446. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  447. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  448. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  449. package/dist/types/src/internal/object/accessors.d.ts +0 -37
  450. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  451. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  452. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  453. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  454. package/dist/types/src/internal/object/entity.d.ts +0 -33
  455. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  456. package/dist/types/src/internal/object/expando.d.ts +0 -14
  457. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  458. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  459. package/dist/types/src/internal/object/model.d.ts +0 -117
  460. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  461. package/dist/types/src/internal/object/relation.d.ts +0 -17
  462. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  463. package/dist/types/src/internal/object/typename.d.ts +0 -15
  464. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  465. package/dist/types/src/internal/object/version.d.ts +0 -14
  466. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  467. package/dist/types/src/internal/projection/compose.d.ts +0 -6
  468. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  469. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  470. package/dist/types/src/internal/projection/index.d.ts +0 -2
  471. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  472. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  473. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  474. package/dist/types/src/internal/query/index.d.ts +0 -2
  475. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  476. package/dist/types/src/internal/query/query.d.ts +0 -17
  477. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  478. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  479. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  480. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  481. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  482. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  483. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  484. package/dist/types/src/internal/testing/index.d.ts +0 -3
  485. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  486. package/dist/types/src/internal/testing/types.d.ts +0 -455
  487. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  488. package/dist/types/src/internal/testing/utils.d.ts +0 -10
  489. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  490. package/dist/types/src/internal/types/types.d.ts +0 -79
  491. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  492. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  493. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  494. package/dist/types/src/internal/types/util.d.ts +0 -5
  495. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  496. package/dist/types/src/query/index.d.ts +0 -3
  497. package/dist/types/src/query/index.d.ts.map +0 -1
  498. package/dist/types/src/query/query.d.ts +0 -248
  499. package/dist/types/src/query/query.d.ts.map +0 -1
  500. package/dist/types/src/query/query.test.d.ts +0 -2
  501. package/dist/types/src/query/query.test.d.ts.map +0 -1
  502. package/dist/types/src/query/tag.d.ts +0 -17
  503. package/dist/types/src/query/tag.d.ts.map +0 -1
  504. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  505. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  506. package/dist/types/src/testing/types.d.ts +0 -113
  507. package/dist/types/src/testing/types.d.ts.map +0 -1
  508. package/src/errors.ts +0 -18
  509. package/src/internal/ast/annotation-helper.ts +0 -22
  510. package/src/internal/ast/annotations.ts +0 -219
  511. package/src/internal/ast/entity-kind.ts +0 -15
  512. package/src/internal/ast/index.ts +0 -8
  513. package/src/internal/ast/types.ts +0 -17
  514. package/src/internal/json/index.ts +0 -5
  515. package/src/internal/object/accessors.ts +0 -153
  516. package/src/internal/object/entity.ts +0 -248
  517. package/src/internal/object/expando.ts +0 -21
  518. package/src/internal/object/meta.ts +0 -61
  519. package/src/internal/object/model.ts +0 -170
  520. package/src/internal/object/relation.ts +0 -24
  521. package/src/internal/object/typename.ts +0 -61
  522. package/src/internal/object/version.ts +0 -22
  523. package/src/internal/projection/index.ts +0 -5
  524. package/src/internal/proxy/reactive-object.ts +0 -108
  525. package/src/internal/query/index.ts +0 -5
  526. package/src/internal/query/query.ts +0 -23
  527. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  528. package/src/internal/schema/snapshot.ts +0 -25
  529. package/src/internal/schema/stored-schema.ts +0 -26
  530. package/src/internal/testing/index.ts +0 -6
  531. package/src/internal/testing/types.ts +0 -211
  532. package/src/internal/testing/utils.ts +0 -54
  533. package/src/internal/types/types.test.ts +0 -48
  534. package/src/internal/types/types.ts +0 -176
  535. package/src/internal/types/util.ts +0 -9
  536. package/src/query/index.ts +0 -6
  537. package/src/query/query.test.ts +0 -401
  538. package/src/query/query.ts +0 -789
  539. package/src/test/api.test.ts +0 -180
  540. package/src/testing/echo-schema.ts +0 -39
  541. package/src/testing/types.ts +0 -91
  542. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  543. /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
  544. /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
  545. /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
  546. /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Feed.mjs.map} +0 -0
  547. /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Filter.mjs.map} +0 -0
  548. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  549. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  550. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  551. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  552. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  553. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  554. /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,106 @@
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, ParentId } 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
+ // Use Object.assign to copy symbol properties (like ParentId) that spread operator doesn't copy.
39
+ return createReactiveObject<T>(Object.assign({}, obj) as T, meta, schema);
40
+ };
41
+
42
+ const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta, schema?: Schema.Schema<T>): T => {
43
+ if (!isValidProxyTarget(obj)) {
44
+ throw new Error('Value cannot be made into a reactive object.');
45
+ }
46
+
47
+ if (!schema) {
48
+ throw new Error('Schema is required for reactive objects. Use Atom for untyped reactive state.');
49
+ }
50
+
51
+ // Extract parent from props (can be set via [Obj.Parent]).
52
+ const parent = (obj as any)[ParentId];
53
+ if (parent !== undefined) {
54
+ delete (obj as any)[ParentId];
55
+ }
56
+
57
+ const annotation = getTypeAnnotation(schema);
58
+ if (annotation) {
59
+ setIdOnTarget(obj);
60
+ defineHiddenProperty(obj, KindId, annotation.kind);
61
+ }
62
+ initMeta(obj, meta);
63
+ if (parent !== undefined) {
64
+ defineHiddenProperty(obj, ParentId, parent);
65
+ }
66
+ prepareTypedTarget(obj, schema);
67
+ attachTypedJsonSerializer(obj);
68
+ const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);
69
+
70
+ // Set meta's owner to the main object so meta mutations respect the parent's change context.
71
+ // For non-database objects using TypedReactiveHandler, this links the meta to the main object's
72
+ // change context. For database objects, meta is handled by EchoReactiveHandler.getMeta().
73
+ const metaProxy = (obj as any)[MetaId];
74
+ if (metaProxy) {
75
+ const metaTarget = getProxyTarget(metaProxy);
76
+ if (metaTarget) {
77
+ setMetaOwner(metaTarget, obj);
78
+ }
79
+ }
80
+
81
+ return proxy;
82
+ };
83
+
84
+ /**
85
+ * Set ID on ECHO object targets during creation.
86
+ * Used for objects with schema and the ones explicitly marked as Expando.
87
+ */
88
+ const setIdOnTarget = (target: any) => {
89
+ // invariant(!('id' in target), 'Object already has an `id` field, which is reserved.');
90
+ if ('id' in target && target.id !== undefined && target.id !== null) {
91
+ if (!ObjectId.isValid(target.id)) {
92
+ throw new Error('Invalid object id format.');
93
+ }
94
+ } else {
95
+ target.id = ObjectId.random();
96
+ }
97
+ };
98
+
99
+ /**
100
+ * Set metadata on object.
101
+ */
102
+ // TODO(dmaretskyi): Move to echo-schema.
103
+ const initMeta = <T>(obj: T, meta: ObjectMeta = { keys: [] }) => {
104
+ prepareTypedTarget(meta, ObjectMetaSchema);
105
+ defineHiddenProperty(obj, MetaId, createProxy(meta, TypedReactiveHandler.instance as any));
106
+ };