@dxos/echo 0.8.4-main.dedc0f3 → 0.8.4-main.e00bdcdb52

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 (536) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +49 -0
  4. package/dist/lib/neutral/Entity.mjs +61 -0
  5. package/dist/lib/neutral/Entity.mjs.map +7 -0
  6. package/dist/lib/neutral/Err.mjs +12 -0
  7. package/dist/lib/neutral/Err.mjs.map +7 -0
  8. package/dist/lib/neutral/Extension.mjs +18 -0
  9. package/dist/lib/neutral/Extension.mjs.map +7 -0
  10. package/dist/lib/neutral/Feed.mjs +50 -0
  11. package/dist/lib/neutral/Feed.mjs.map +7 -0
  12. package/dist/lib/neutral/Filter.mjs +72 -0
  13. package/dist/lib/neutral/Filter.mjs.map +7 -0
  14. package/dist/lib/neutral/Format.mjs +66 -0
  15. package/dist/lib/neutral/Format.mjs.map +7 -0
  16. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  17. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  18. package/dist/lib/neutral/Key.mjs +12 -0
  19. package/dist/lib/neutral/Key.mjs.map +7 -0
  20. package/dist/lib/neutral/Migration.mjs +17 -0
  21. package/dist/lib/neutral/Migration.mjs.map +7 -0
  22. package/dist/lib/neutral/Obj.mjs +113 -0
  23. package/dist/lib/neutral/Obj.mjs.map +7 -0
  24. package/dist/lib/neutral/Order.mjs +12 -0
  25. package/dist/lib/neutral/Order.mjs.map +7 -0
  26. package/dist/lib/neutral/Query.mjs +38 -0
  27. package/dist/lib/neutral/Query.mjs.map +7 -0
  28. package/dist/lib/neutral/QueryResult.mjs +2 -0
  29. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  30. package/dist/lib/neutral/Ref.mjs +24 -0
  31. package/dist/lib/neutral/Ref.mjs.map +7 -0
  32. package/dist/lib/neutral/Relation.mjs +94 -0
  33. package/dist/lib/neutral/Relation.mjs.map +7 -0
  34. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  35. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  36. package/dist/lib/neutral/Tag.mjs +29 -0
  37. package/dist/lib/neutral/Tag.mjs.map +7 -0
  38. package/dist/lib/neutral/Type.mjs +37 -0
  39. package/dist/lib/neutral/Type.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-2T22UGGN.mjs +206 -0
  41. package/dist/lib/neutral/chunk-2T22UGGN.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-44HT3MEC.mjs +73 -0
  43. package/dist/lib/neutral/chunk-44HT3MEC.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-6VC3FI5E.mjs +125 -0
  45. package/dist/lib/neutral/chunk-6VC3FI5E.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-7JFW72MX.mjs +132 -0
  47. package/dist/lib/neutral/chunk-7JFW72MX.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-7RVZT53K.mjs +21 -0
  49. package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-BICZKPQG.mjs +7 -0
  51. package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs +36 -0
  53. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-DUNXPKAC.mjs +56 -0
  55. package/dist/lib/neutral/chunk-DUNXPKAC.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-FAW7PJRO.mjs +34 -0
  57. package/dist/lib/neutral/chunk-FAW7PJRO.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-FAYW32CW.mjs +27 -0
  59. package/dist/lib/neutral/chunk-FAYW32CW.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  61. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-I2MFJ76N.mjs +354 -0
  63. package/dist/lib/neutral/chunk-I2MFJ76N.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  65. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-JALF2CVV.mjs +345 -0
  67. package/dist/lib/neutral/chunk-JALF2CVV.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs +128 -0
  69. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-LOTZLYHB.mjs +420 -0
  71. package/dist/lib/neutral/chunk-LOTZLYHB.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-N4B7FHQT.mjs +67 -0
  73. package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-NKXEKBP5.mjs +81 -0
  75. package/dist/lib/neutral/chunk-NKXEKBP5.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-NSMLBSFS.mjs +270 -0
  77. package/dist/lib/neutral/chunk-NSMLBSFS.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-QBIGOSRF.mjs +45 -0
  79. package/dist/lib/neutral/chunk-QBIGOSRF.mjs.map +7 -0
  80. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs +734 -0
  81. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs.map +7 -0
  82. package/dist/lib/neutral/chunk-QEVM3JUP.mjs +318 -0
  83. package/dist/lib/neutral/chunk-QEVM3JUP.mjs.map +7 -0
  84. package/dist/lib/neutral/chunk-REP7WWAQ.mjs +346 -0
  85. package/dist/lib/neutral/chunk-REP7WWAQ.mjs.map +7 -0
  86. package/dist/lib/neutral/chunk-TRPZU2HV.mjs +402 -0
  87. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
  88. package/dist/lib/neutral/chunk-TTCSATUD.mjs +42 -0
  89. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  90. package/dist/lib/neutral/chunk-TW76K7H5.mjs +45 -0
  91. package/dist/lib/neutral/chunk-TW76K7H5.mjs.map +7 -0
  92. package/dist/lib/neutral/chunk-UYJYDSD7.mjs +2436 -0
  93. package/dist/lib/neutral/chunk-UYJYDSD7.mjs.map +7 -0
  94. package/dist/lib/neutral/chunk-V72DY6LU.mjs +7 -0
  95. package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +7 -0
  96. package/dist/lib/neutral/chunk-ZISMEVKD.mjs +51 -0
  97. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
  98. package/dist/lib/neutral/index.mjs +107 -0
  99. package/dist/lib/neutral/index.mjs.map +7 -0
  100. package/dist/lib/neutral/internal/index.mjs +474 -0
  101. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  102. package/dist/lib/neutral/meta.json +1 -0
  103. package/dist/lib/neutral/testing/index.mjs +375 -0
  104. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  105. package/dist/types/src/Annotation.d.ts +24 -0
  106. package/dist/types/src/Annotation.d.ts.map +1 -0
  107. package/dist/types/src/Collection.d.ts +16 -0
  108. package/dist/types/src/Collection.d.ts.map +1 -0
  109. package/dist/types/src/Database.d.ts +201 -0
  110. package/dist/types/src/Database.d.ts.map +1 -0
  111. package/dist/types/src/Dataset.d.ts +19 -0
  112. package/dist/types/src/Dataset.d.ts.map +1 -0
  113. package/dist/types/src/Entity.d.ts +174 -0
  114. package/dist/types/src/Entity.d.ts.map +1 -0
  115. package/dist/types/src/Entity.test.d.ts +2 -0
  116. package/dist/types/src/Entity.test.d.ts.map +1 -0
  117. package/dist/types/src/Err.d.ts +107 -0
  118. package/dist/types/src/Err.d.ts.map +1 -0
  119. package/dist/types/src/Extension.d.ts +80 -0
  120. package/dist/types/src/Extension.d.ts.map +1 -0
  121. package/dist/types/src/Extension.test.d.ts +2 -0
  122. package/dist/types/src/Extension.test.d.ts.map +1 -0
  123. package/dist/types/src/Feed.d.ts +182 -0
  124. package/dist/types/src/Feed.d.ts.map +1 -0
  125. package/dist/types/src/Filter.d.ts +149 -0
  126. package/dist/types/src/Filter.d.ts.map +1 -0
  127. package/dist/types/src/Filter.test.d.ts +2 -0
  128. package/dist/types/src/Filter.test.d.ts.map +1 -0
  129. package/dist/types/src/Format.d.ts +4 -0
  130. package/dist/types/src/Format.d.ts.map +1 -0
  131. package/dist/types/src/Hypergraph.d.ts +65 -0
  132. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  133. package/dist/types/src/Json.d.ts +33 -0
  134. package/dist/types/src/Json.d.ts.map +1 -0
  135. package/dist/types/src/Json.test.d.ts +2 -0
  136. package/dist/types/src/Json.test.d.ts.map +1 -0
  137. package/dist/types/src/JsonSchema.d.ts +16 -0
  138. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  139. package/dist/types/src/Key.d.ts +1 -0
  140. package/dist/types/src/Key.d.ts.map +1 -1
  141. package/dist/types/src/Migration.d.ts +57 -0
  142. package/dist/types/src/Migration.d.ts.map +1 -0
  143. package/dist/types/src/Obj.d.ts +440 -91
  144. package/dist/types/src/Obj.d.ts.map +1 -1
  145. package/dist/types/src/Obj.test.d.ts +2 -0
  146. package/dist/types/src/Obj.test.d.ts.map +1 -0
  147. package/dist/types/src/Order.d.ts +16 -0
  148. package/dist/types/src/Order.d.ts.map +1 -0
  149. package/dist/types/src/Query.d.ts +213 -0
  150. package/dist/types/src/Query.d.ts.map +1 -0
  151. package/dist/types/src/Query.test.d.ts +2 -0
  152. package/dist/types/src/Query.test.d.ts.map +1 -0
  153. package/dist/types/src/QueryResult.d.ts +80 -0
  154. package/dist/types/src/QueryResult.d.ts.map +1 -0
  155. package/dist/types/src/Ref.d.ts +61 -11
  156. package/dist/types/src/Ref.d.ts.map +1 -1
  157. package/dist/types/src/Relation.d.ts +288 -21
  158. package/dist/types/src/Relation.d.ts.map +1 -1
  159. package/dist/types/src/Relation.test.d.ts +2 -0
  160. package/dist/types/src/Relation.test.d.ts.map +1 -0
  161. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  162. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  163. package/dist/types/src/Tag.d.ts +18 -0
  164. package/dist/types/src/Tag.d.ts.map +1 -0
  165. package/dist/types/src/Type.d.ts +123 -100
  166. package/dist/types/src/Type.d.ts.map +1 -1
  167. package/dist/types/src/Type.test.d.ts +2 -0
  168. package/dist/types/src/Type.test.d.ts.map +1 -0
  169. package/dist/types/src/View.d.ts +68 -0
  170. package/dist/types/src/View.d.ts.map +1 -0
  171. package/dist/types/src/hierarchy.test.d.ts +2 -0
  172. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  173. package/dist/types/src/index.d.ts +22 -4
  174. package/dist/types/src/index.d.ts.map +1 -1
  175. package/dist/types/src/internal/Annotation/annotations.d.ts +231 -0
  176. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  177. package/dist/types/src/internal/Annotation/annotations.test.d.ts +2 -0
  178. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  179. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  180. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  181. package/dist/types/src/internal/Annotation/sorting.d.ts +24 -0
  182. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  183. package/dist/types/src/internal/Annotation/util.d.ts +39 -0
  184. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  185. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  186. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  187. package/dist/types/src/internal/Entity/entity.d.ts +20 -0
  188. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  189. package/dist/types/src/internal/Entity/index.d.ts +8 -0
  190. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  191. package/dist/types/src/internal/Entity/model.d.ts +55 -0
  192. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  193. package/dist/types/src/internal/Entity/object.d.ts +18 -0
  194. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  195. package/dist/types/src/internal/Entity/relation.d.ts +35 -0
  196. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  197. package/dist/types/src/internal/Entity/util.d.ts +2 -0
  198. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  199. package/dist/types/src/internal/Entity/version.d.ts +42 -0
  200. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  201. package/dist/types/src/internal/Format/date.d.ts +63 -0
  202. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  203. package/dist/types/src/internal/Format/date.test.d.ts +2 -0
  204. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  205. package/dist/types/src/internal/Format/format.d.ts +32 -0
  206. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  207. package/dist/types/src/internal/Format/format.test.d.ts +2 -0
  208. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  209. package/dist/types/src/internal/Format/index.d.ts +8 -0
  210. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  211. package/dist/types/src/internal/Format/number.d.ts +31 -0
  212. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  213. package/dist/types/src/internal/Format/object.d.ts +35 -0
  214. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  215. package/dist/types/src/internal/Format/select.d.ts +13 -0
  216. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  217. package/dist/types/src/internal/Format/string.d.ts +42 -0
  218. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  219. package/dist/types/src/internal/Format/types.d.ts +72 -0
  220. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  221. package/dist/types/src/internal/JsonSchema/annotations.d.ts +19 -0
  222. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  223. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts +2 -0
  224. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/JsonSchema/index.d.ts +5 -0
  226. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  227. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts +7 -0
  228. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  229. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +351 -0
  230. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  231. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +30 -0
  232. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  233. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts +2 -0
  234. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  235. package/dist/types/src/internal/Obj/clone.d.ts +8 -0
  236. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  237. package/dist/types/src/internal/Obj/common.d.ts +18 -0
  238. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  239. package/dist/types/src/internal/Obj/create-object.d.ts +39 -0
  240. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  241. package/dist/types/src/internal/Obj/create-object.test.d.ts +2 -0
  242. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  243. package/dist/types/src/internal/Obj/deleted.d.ts +6 -0
  244. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  245. package/dist/types/src/internal/Obj/ids.d.ts +6 -0
  246. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  247. package/dist/types/src/internal/Obj/index.d.ts +11 -0
  248. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  249. package/dist/types/src/internal/Obj/inspect.d.ts +2 -0
  250. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  251. package/dist/types/src/internal/Obj/json-serializer.d.ts +45 -0
  252. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  253. package/dist/types/src/internal/Obj/json-serializer.test.d.ts +2 -0
  254. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  255. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  256. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  257. package/dist/types/src/internal/Obj/schema-validator.test.d.ts +2 -0
  258. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
  260. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  261. package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
  262. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
  264. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  265. package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
  266. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  267. package/dist/types/src/internal/Obj/typed-object.test.d.ts +2 -0
  268. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  269. package/dist/types/src/internal/Query.d.ts +10 -0
  270. package/dist/types/src/internal/Query.d.ts.map +1 -0
  271. package/dist/types/src/internal/Ref/index.d.ts +3 -0
  272. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  273. package/dist/types/src/internal/Ref/ref-array.d.ts +21 -0
  274. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  275. package/dist/types/src/internal/Ref/ref.d.ts +244 -0
  276. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  277. package/dist/types/src/internal/Ref/ref.test.d.ts +2 -0
  278. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  279. package/dist/types/src/internal/Type/compose.d.ts +7 -0
  280. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  281. package/dist/types/src/internal/Type/compose.test.d.ts +2 -0
  282. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  283. package/dist/types/src/internal/Type/echo-schema.d.ts +181 -0
  284. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  285. package/dist/types/src/internal/Type/index.d.ts +4 -0
  286. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  287. package/dist/types/src/internal/Type/manipulation.d.ts +10 -0
  288. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  289. package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
  290. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  291. package/dist/types/src/internal/common/api/index.d.ts +11 -0
  292. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  293. package/dist/types/src/internal/common/api/meta.d.ts +42 -0
  294. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  295. package/dist/types/src/internal/common/index.d.ts +4 -0
  296. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  297. package/dist/types/src/internal/common/proxy/change-context.d.ts +55 -0
  298. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  299. package/dist/types/src/internal/common/proxy/change.test.d.ts +2 -0
  300. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  301. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts +5 -0
  302. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  303. package/dist/types/src/internal/common/proxy/errors.d.ts +19 -0
  304. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  305. package/dist/types/src/internal/common/proxy/event-batch.d.ts +10 -0
  306. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  307. package/dist/types/src/internal/common/proxy/handler.test.d.ts +2 -0
  308. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  309. package/dist/types/src/internal/common/proxy/index.d.ts +14 -0
  310. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  311. package/dist/types/src/internal/common/proxy/json-serializer.d.ts +6 -0
  312. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  313. package/dist/types/src/internal/common/proxy/make-object.d.ts +14 -0
  314. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  315. package/dist/types/src/internal/common/proxy/ownership.d.ts +57 -0
  316. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  317. package/dist/types/src/internal/common/proxy/proxy-types.d.ts +18 -0
  318. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  319. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +47 -0
  320. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  321. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +8 -0
  322. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  323. package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
  324. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
  325. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  326. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  327. package/dist/types/src/internal/common/proxy/schema-validator.d.ts +15 -0
  328. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  329. package/dist/types/src/internal/common/proxy/schema.test.d.ts +2 -0
  330. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  331. package/dist/types/src/internal/common/proxy/symbols.d.ts +3 -0
  332. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  333. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +48 -0
  334. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  335. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts +2 -0
  336. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  337. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts +2 -0
  338. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  339. package/dist/types/src/internal/common/types/base.d.ts +27 -0
  340. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  341. package/dist/types/src/internal/common/types/entity.d.ts +37 -0
  342. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  343. package/dist/types/src/internal/common/types/index.d.ts +7 -0
  344. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  345. package/dist/types/src/internal/common/types/meta.d.ts +33 -0
  346. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  347. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  348. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  349. package/dist/types/src/internal/common/types/typename.d.ts +21 -0
  350. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  351. package/dist/types/src/internal/common/types/version.d.ts +15 -0
  352. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  353. package/dist/types/src/internal/index.d.ts +11 -0
  354. package/dist/types/src/internal/index.d.ts.map +1 -0
  355. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  356. package/dist/types/src/testing/index.d.ts +3 -1
  357. package/dist/types/src/testing/index.d.ts.map +1 -1
  358. package/dist/types/src/testing/test-data.d.ts +18 -0
  359. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  360. package/dist/types/src/testing/test-schema.d.ts +304 -0
  361. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  362. package/dist/types/src/testing/util.d.ts +21 -0
  363. package/dist/types/src/testing/util.d.ts.map +1 -0
  364. package/dist/types/tsconfig.tsbuildinfo +1 -1
  365. package/package.json +119 -56
  366. package/src/Annotation.ts +48 -0
  367. package/src/Collection.ts +37 -0
  368. package/src/Database.ts +352 -0
  369. package/src/Dataset.ts +26 -0
  370. package/src/Entity.test.ts +22 -0
  371. package/src/Entity.ts +243 -0
  372. package/src/Err.ts +40 -0
  373. package/src/Extension.test.ts +235 -0
  374. package/src/Extension.ts +122 -0
  375. package/src/Feed.ts +304 -0
  376. package/src/Filter.test.ts +90 -0
  377. package/src/Filter.ts +454 -0
  378. package/src/Format.ts +9 -0
  379. package/src/Hypergraph.ts +79 -0
  380. package/src/Json.test.ts +175 -0
  381. package/src/Json.ts +102 -0
  382. package/src/JsonSchema.ts +26 -0
  383. package/src/Key.ts +3 -0
  384. package/src/Migration.ts +94 -0
  385. package/src/Obj.test.ts +539 -0
  386. package/src/Obj.ts +716 -212
  387. package/src/Order.ts +46 -0
  388. package/src/Query.test.ts +822 -0
  389. package/src/Query.ts +567 -0
  390. package/src/QueryResult.ts +106 -0
  391. package/src/Ref.ts +78 -9
  392. package/src/Relation.test.ts +88 -0
  393. package/src/Relation.ts +452 -53
  394. package/src/SchemaRegistry.ts +106 -0
  395. package/src/Tag.ts +41 -0
  396. package/src/Type.test.ts +52 -0
  397. package/src/Type.ts +168 -155
  398. package/src/View.ts +107 -0
  399. package/src/hierarchy.test.ts +33 -0
  400. package/src/index.ts +25 -5
  401. package/src/internal/Annotation/annotations.test.ts +145 -0
  402. package/src/internal/Annotation/annotations.ts +577 -0
  403. package/src/internal/Annotation/index.ts +7 -0
  404. package/src/internal/Annotation/sorting.ts +51 -0
  405. package/src/internal/Annotation/util.ts +85 -0
  406. package/src/internal/Entity/api.ts +30 -0
  407. package/src/internal/Entity/entity.ts +128 -0
  408. package/src/internal/Entity/index.ts +11 -0
  409. package/src/internal/Entity/model.ts +109 -0
  410. package/src/internal/Entity/object.ts +57 -0
  411. package/src/internal/Entity/relation.ts +154 -0
  412. package/src/internal/Entity/util.ts +33 -0
  413. package/src/internal/Entity/version.ts +96 -0
  414. package/src/internal/Format/date.test.ts +55 -0
  415. package/src/internal/Format/date.ts +217 -0
  416. package/src/internal/Format/format.test.ts +76 -0
  417. package/src/internal/Format/format.ts +54 -0
  418. package/src/internal/Format/index.ts +12 -0
  419. package/src/internal/Format/number.ts +89 -0
  420. package/src/internal/Format/object.ts +80 -0
  421. package/src/internal/Format/select.ts +18 -0
  422. package/src/internal/Format/string.ts +81 -0
  423. package/src/internal/Format/types.ts +186 -0
  424. package/src/internal/JsonSchema/annotations.ts +50 -0
  425. package/src/internal/JsonSchema/effect-schema.test.ts +143 -0
  426. package/src/internal/JsonSchema/index.ts +8 -0
  427. package/src/internal/JsonSchema/json-schema-normalize.ts +111 -0
  428. package/src/internal/JsonSchema/json-schema-type.ts +403 -0
  429. package/src/internal/JsonSchema/json-schema.test.ts +860 -0
  430. package/src/internal/JsonSchema/json-schema.ts +533 -0
  431. package/src/internal/Obj/clone.ts +48 -0
  432. package/src/internal/Obj/common.ts +75 -0
  433. package/src/internal/Obj/create-object.test.ts +114 -0
  434. package/src/internal/Obj/create-object.ts +94 -0
  435. package/src/internal/Obj/deleted.ts +19 -0
  436. package/src/internal/Obj/ids.ts +12 -0
  437. package/src/internal/Obj/index.ts +14 -0
  438. package/src/internal/Obj/inspect.ts +46 -0
  439. package/src/internal/Obj/json-serializer.test.ts +120 -0
  440. package/src/internal/Obj/json-serializer.ts +222 -0
  441. package/src/internal/Obj/schema-validator.test.ts +182 -0
  442. package/src/internal/Obj/schema-validator.ts +6 -0
  443. package/src/internal/Obj/set-value.test.ts +281 -0
  444. package/src/internal/Obj/set-value.ts +165 -0
  445. package/src/internal/Obj/snapshot.ts +105 -0
  446. package/src/internal/Obj/typed-object.test.ts +34 -0
  447. package/src/internal/Obj/typed-object.ts +30 -0
  448. package/src/internal/Query.ts +137 -0
  449. package/src/internal/Ref/index.ts +6 -0
  450. package/src/internal/Ref/ref-array.ts +38 -0
  451. package/src/internal/Ref/ref.test.ts +100 -0
  452. package/src/internal/Ref/ref.ts +589 -0
  453. package/src/internal/Type/compose.test.ts +41 -0
  454. package/src/internal/Type/compose.ts +41 -0
  455. package/src/internal/Type/echo-schema.ts +423 -0
  456. package/src/internal/Type/index.ts +7 -0
  457. package/src/internal/Type/manipulation.ts +92 -0
  458. package/src/internal/Type/persistent-schema.ts +33 -0
  459. package/src/internal/common/README.md +102 -0
  460. package/src/internal/common/api/index.ts +15 -0
  461. package/src/internal/common/api/meta.ts +88 -0
  462. package/src/internal/common/index.ts +7 -0
  463. package/src/internal/common/proxy/change-context.ts +138 -0
  464. package/src/internal/common/proxy/change.test.ts +519 -0
  465. package/src/internal/common/proxy/define-hidden-property.ts +14 -0
  466. package/src/internal/common/proxy/errors.ts +42 -0
  467. package/src/internal/common/proxy/event-batch.ts +44 -0
  468. package/src/internal/common/proxy/handler.test.ts +121 -0
  469. package/src/internal/common/proxy/index.ts +17 -0
  470. package/src/internal/common/proxy/json-serializer.ts +90 -0
  471. package/src/internal/common/proxy/make-object.ts +105 -0
  472. package/src/internal/common/proxy/ownership.ts +252 -0
  473. package/src/internal/common/proxy/proxy-types.ts +23 -0
  474. package/src/internal/common/proxy/proxy-utils.ts +150 -0
  475. package/src/internal/common/proxy/reactive-array.ts +71 -0
  476. package/src/internal/common/proxy/reactive.test.ts +54 -0
  477. package/src/internal/common/proxy/reactive.ts +77 -0
  478. package/src/internal/common/proxy/schema-validator.ts +244 -0
  479. package/src/internal/common/proxy/schema.test.ts +145 -0
  480. package/src/internal/common/proxy/symbols.ts +7 -0
  481. package/src/internal/common/proxy/typed-handler.test.ts +313 -0
  482. package/src/internal/common/proxy/typed-handler.ts +447 -0
  483. package/src/internal/common/proxy/typed-object.test.ts +115 -0
  484. package/src/internal/common/types/base.ts +43 -0
  485. package/src/internal/common/types/entity.ts +54 -0
  486. package/src/internal/common/types/index.ts +10 -0
  487. package/src/internal/common/types/meta.ts +67 -0
  488. package/src/internal/common/types/model-symbols.ts +69 -0
  489. package/src/internal/common/types/typename.ts +55 -0
  490. package/src/internal/common/types/version.ts +19 -0
  491. package/src/internal/index.ts +17 -0
  492. package/src/testing/api.test.ts +125 -0
  493. package/src/testing/index.ts +3 -1
  494. package/src/testing/test-data.ts +129 -0
  495. package/src/testing/test-schema.ts +240 -0
  496. package/src/testing/util.ts +85 -0
  497. package/dist/lib/browser/chunk-MTR3E5S2.mjs +0 -786
  498. package/dist/lib/browser/chunk-MTR3E5S2.mjs.map +0 -7
  499. package/dist/lib/browser/index.mjs +0 -26
  500. package/dist/lib/browser/meta.json +0 -1
  501. package/dist/lib/browser/testing/index.mjs +0 -70
  502. package/dist/lib/browser/testing/index.mjs.map +0 -7
  503. package/dist/lib/node-esm/chunk-MYZLAJSR.mjs +0 -786
  504. package/dist/lib/node-esm/chunk-MYZLAJSR.mjs.map +0 -7
  505. package/dist/lib/node-esm/index.mjs +0 -26
  506. package/dist/lib/node-esm/meta.json +0 -1
  507. package/dist/lib/node-esm/testing/index.mjs +0 -70
  508. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  509. package/dist/types/src/experimental/database.d.ts +0 -8
  510. package/dist/types/src/experimental/database.d.ts.map +0 -1
  511. package/dist/types/src/experimental/index.d.ts +0 -1
  512. package/dist/types/src/experimental/index.d.ts.map +0 -1
  513. package/dist/types/src/experimental/queue.d.ts +0 -8
  514. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  515. package/dist/types/src/experimental/space.d.ts +0 -8
  516. package/dist/types/src/experimental/space.d.ts.map +0 -1
  517. package/dist/types/src/query/dsl.d.ts +0 -238
  518. package/dist/types/src/query/dsl.d.ts.map +0 -1
  519. package/dist/types/src/query/dsl.test.d.ts +0 -2
  520. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  521. package/dist/types/src/query/index.d.ts +0 -2
  522. package/dist/types/src/query/index.d.ts.map +0 -1
  523. package/dist/types/src/testing/types.d.ts +0 -113
  524. package/dist/types/src/testing/types.d.ts.map +0 -1
  525. package/src/experimental/database.ts +0 -11
  526. package/src/experimental/index.ts +0 -7
  527. package/src/experimental/queue.ts +0 -11
  528. package/src/experimental/space.ts +0 -11
  529. package/src/query/dsl.test.ts +0 -332
  530. package/src/query/dsl.ts +0 -704
  531. package/src/query/index.ts +0 -5
  532. package/src/test/api.test.ts +0 -180
  533. package/src/testing/types.ts +0 -91
  534. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  535. /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
  536. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/internal/index.ts", "../../../src/internal/common/types/base.ts", "../../../src/internal/common/types/meta.ts", "../../../src/internal/common/types/model-symbols.ts", "../../../src/internal/common/types/version.ts", "../../../src/internal/Annotation/sorting.ts", "../../../src/internal/common/api/meta.ts", "../../../src/internal/common/proxy/symbols.ts", "../../../src/internal/common/proxy/event-batch.ts", "../../../src/internal/common/proxy/change-context.ts", "../../../src/internal/common/proxy/define-hidden-property.ts", "../../../src/internal/common/proxy/errors.ts", "../../../src/internal/common/proxy/json-serializer.ts", "../../../src/internal/common/proxy/make-object.ts", "../../../src/internal/common/proxy/proxy-utils.ts", "../../../src/internal/common/proxy/typed-handler.ts", "../../../src/internal/common/proxy/ownership.ts", "../../../src/internal/common/proxy/proxy-types.ts", "../../../src/internal/common/proxy/reactive-array.ts", "../../../src/internal/common/proxy/schema-validator.ts", "../../../src/internal/common/proxy/reactive.ts", "../../../src/internal/Entity/api.ts", "../../../src/internal/Entity/model.ts", "../../../src/internal/Entity/util.ts", "../../../src/internal/Entity/entity.ts", "../../../src/internal/Entity/object.ts", "../../../src/internal/Entity/relation.ts", "../../../src/internal/Entity/version.ts", "../../../src/internal/JsonSchema/json-schema-normalize.ts", "../../../src/internal/Obj/common.ts", "../../../src/internal/Obj/create-object.ts", "../../../src/internal/Obj/inspect.ts", "../../../src/internal/Obj/json-serializer.ts", "../../../src/internal/Obj/deleted.ts", "../../../src/internal/Obj/ids.ts", "../../../src/internal/Obj/set-value.ts", "../../../src/internal/Obj/snapshot.ts", "../../../src/internal/Obj/clone.ts", "../../../src/internal/Query.ts", "../../../src/internal/Type/echo-schema.ts", "../../../src/internal/Type/manipulation.ts", "../../../src/internal/Type/persistent-schema.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\n// TODO(burdon): Import directly (not part of ECHO API).\nexport { JsonPath, JsonProp, getValue, splitJsonPath } from '@dxos/effect';\n\nexport * from './Annotation';\nexport * from './common';\nexport * from './Entity';\nexport * from './Format';\nexport * from './JsonSchema';\n// TODO(wittjosiah): Required to ensure types are portable (need to export all types required for downstream inference).\nexport * from './Obj';\nexport * from './Query';\nexport * from './Ref';\nexport * from './Type';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { type ObjectId } from '@dxos/keys';\n\nimport { type ATTR_META, type ObjectMeta } from './meta';\n\n/**\n * Base type for all data objects (reactive, ECHO, and other raw objects).\n * NOTE: This describes the base type for all database objects.\n * It is stricter than `T extends {}` or `T extends object`.\n */\n// TODO(burdon): Prefer Record<string, unknown>.\nexport type AnyProperties = Record<string, any>;\n\n/**\n * Canonical type for all ECHO entities (objects and relations).\n * @depreacted Remove, use Entity.Unknown instead.\n */\n// TODO(wittjosiah): Remove. Prefer higher level types (e.g. Entity.Unknown).\nexport interface AnyEntity {\n readonly id: ObjectId;\n}\n\nexport type ExcludeId<T extends AnyProperties> = Omit<T, 'id'>;\n\nexport type PropertyKey<T extends AnyProperties> = Extract<keyof ExcludeId<T>, string>;\n\n// TODO(dmaretskyi): Remove. This should be using the symbol type.\ntype WithMeta = { [ATTR_META]?: ObjectMeta };\n\n/**\n * The raw object should not include the ECHO id, but may include metadata.\n */\nexport const RawObject = <S extends Schema.Schema.AnyNoContext>(\n schema: S,\n): Schema.Schema<ExcludeId<Schema.Schema.Type<S>> & WithMeta, Schema.Schema.Encoded<S>> => {\n return Schema.make(SchemaAST.omit(schema.ast, ['id']));\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { ForeignKey } from '@dxos/echo-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { type Comparator, intersection } from '@dxos/util';\n\nimport type * as Entity from '../../../Entity';\nimport { type AnyProperties } from './base';\n\n/**\n * Property name for meta when object is serialized to JSON.\n */\nexport const ATTR_META = '@meta';\n\n/**\n * Metadata section.\n */\nexport const MetaId: Entity.Meta = Symbol.for('@dxos/echo/Meta') as any;\n\n//\n// ObjectMeta\n//\n\n// TODO(dmaretskyi): Rename to ObjectMeta\nexport const ObjectMetaSchema = Schema.Struct({\n keys: Schema.Array(ForeignKey),\n\n /**\n * A set of tags.\n * Tags are arbitrary application-defined strings.\n * ECHO makes no assumptions about the tag structure.\n */\n // TODO(dmaretskyi): Has to be optional for compatibility with old data.\n // Defaulting to an empty array is possible but requires a bit more work.\n // TODO(dmaretskyi): In automerge this should be a map of { [tag]: boolean } for uniqueness and conflict resolution.\n tags: Schema.optional(Schema.Array(Schema.String)),\n});\n\nexport type ObjectMeta = Schema.Schema.Type<typeof ObjectMetaSchema>;\n\n/*\n * Get metadata from object.\n * Only callable on the object root.\n *\n * @internal (use Obj.getMeta or Relation.getMeta)\n */\n// TODO(burdon): Refine type to BaseObj.\nexport const getMeta = (obj: AnyProperties): ObjectMeta => {\n const metadata = (obj as any)[MetaId];\n invariant(metadata, 'ObjectMeta not found.');\n return metadata;\n};\n\n//\n// Foreign keys\n//\n\nexport const foreignKey = (source: string, id: string): ForeignKey => ({ source, id });\nexport const foreignKeyEquals = (a: ForeignKey, b: ForeignKey) => a.source === b.source && a.id === b.id;\n\n// TODO(dmaretskyi): Move to echo-schema.\nexport const compareForeignKeys: Comparator<AnyProperties> = (a: AnyProperties, b: AnyProperties) =>\n intersection(getMeta(a).keys, getMeta(b).keys, foreignKeyEquals).length > 0;\n", "//\n// Copyright 2025 DXOS.org\n//\n\n/**\n * Internal symbol/string constants for the echo object model.\n * Defined in common/ so proxy/ can use them without importing from Entity/.\n * Entity/ re-exports these for external consumers.\n */\n\n/**\n * Property name for self DXN when object is serialized to JSON.\n */\nexport const ATTR_SELF_DXN = '@dxn';\n\n/**\n * DXN to the object itself.\n */\nexport const SelfDXNId = Symbol.for('@dxos/echo/DXN');\n\n/**\n * Property name for deleted when object is serialized to JSON.\n */\nexport const ATTR_DELETED = '@deleted';\n\n/**\n * Deletion marker.\n */\nexport const ObjectDeletedId = Symbol.for('@dxos/echo/Deleted');\n\n/**\n * Object version accessor symbol.\n */\nexport const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/Version');\n\n/**\n * Object database accessor symbol.\n */\nexport const ObjectDatabaseId = Symbol.for('@dxos/echo/Database');\n\n/**\n * Property name for relation source when object is serialized to JSON.\n */\nexport const ATTR_RELATION_SOURCE = '@relationSource';\n\n/**\n * Used to access relation source ref on live ECHO objects.\n */\nexport const RelationSourceId: unique symbol = Symbol.for('@dxos/echo/RelationSource');\n\n/**\n * Used to access relation source DXN on live ECHO objects.\n */\nexport const RelationSourceDXNId: unique symbol = Symbol.for('@dxos/echo/RelationSourceDXN');\n\n/**\n * Property name for relation target when object is serialized to JSON.\n */\nexport const ATTR_RELATION_TARGET = '@relationTarget';\n\n/**\n * Used to access relation target ref on live ECHO objects.\n */\nexport const RelationTargetId: unique symbol = Symbol.for('@dxos/echo/RelationTarget');\n\n/**\n * Used to access relation target DXN on live ECHO objects.\n */\nexport const RelationTargetDXNId: unique symbol = Symbol.for('@dxos/echo/RelationTargetDXN');\n", "//\n// Copyright 2025 DXOS.org\n//\n\n/**\n * Version type identifier.\n */\nexport const VersionTypeId = '~@dxos/echo/VersionTypeId' as const;\nexport type VersionTypeId = typeof VersionTypeId;\n\n/**\n * Represents the object version.\n * May be backed by Automerge.\n * Objects with no history are not versioned.\n */\nexport interface Version {\n [VersionTypeId]: {};\n automergeHeads?: string[];\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type { AnyEntity } from '../common/types';\nimport { getLabel, getTypename } from './annotations';\n\n/**\n * String comparison helper for sorting.\n */\nexport const compare = (a?: string, b?: string): number => {\n if (a == null) {\n return b == null ? 0 : 1;\n }\n if (b == null) {\n return -1;\n }\n return a.localeCompare(b);\n};\n\n/**\n * Comparator function type for sorting entities.\n * Accepts both reactive entities and snapshots.\n */\nexport type Comparator<T extends AnyEntity = AnyEntity> = (a: T, b: T) => number;\n\n/**\n * Sort entities by label.\n */\nexport const sortByLabel: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getLabel(a), getLabel(b));\n\n/**\n * Sort entities by typename.\n */\nexport const sortByTypename: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getTypename(a), getTypename(b));\n\n/**\n * Compose multiple comparators into one.\n * Applies comparators in order until one returns non-zero.\n */\nexport const sort = <T extends AnyEntity>(...comparators: Comparator<T>[]): Comparator<T> => {\n return (a: T, b: T) => {\n for (const comparator of comparators) {\n const result = comparator(a, b);\n if (result !== 0) {\n return result;\n }\n }\n return 0;\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type { ForeignKey } from '@dxos/echo-protocol';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport type { DeepReadonly } from '@dxos/util';\n\nimport { type Mutable } from '../proxy';\nimport { type AnyProperties, type ObjectMeta, getMeta as getMeta$ } from '../types';\n\n/**\n * Deeply read-only version of ObjectMeta.\n */\nexport type ReadonlyMeta = DeepReadonly<ObjectMeta>;\n\n/**\n * Mutable meta type received in meta mutation callbacks.\n */\nexport type Meta = Mutable<ObjectMeta>;\n\n/**\n * Get the metadata for an entity with validation.\n * Returns mutable meta when passed a mutable entity (inside change callback).\n * Returns read-only meta when passed a regular entity or snapshot.\n *\n * TODO(burdon): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.\n */\nexport function getMetaChecked(entity: Mutable<AnyProperties>): Meta;\nexport function getMetaChecked(entity: AnyProperties): ReadonlyMeta;\nexport function getMetaChecked(entity: AnyProperties): Meta | ReadonlyMeta {\n assertArgument(entity, 'entity', 'Should be an entity.');\n const meta = getMeta$(entity);\n invariant(meta != null, 'Invalid entity.');\n return meta;\n}\n\n/**\n * @returns Foreign keys for the entity from the specified source.\n * Accepts both reactive entities and snapshots.\n */\nexport const getKeys = (entity: AnyProperties, source: string): ForeignKey[] => {\n assertArgument(entity, 'entity', 'Should be an entity.');\n const meta = getMetaChecked(entity);\n invariant(meta != null, 'Invalid entity.');\n return meta.keys.filter((key) => key.source === source);\n};\n\n/**\n * Delete all keys from the entity for the specified source.\n * Must be called within an Obj.update or Relation.update callback.\n */\nexport const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {\n const meta = getMetaChecked(entity);\n for (let i = 0; i < meta.keys.length; i++) {\n if (meta.keys[i].source === source) {\n meta.keys.splice(i, 1);\n i--;\n }\n }\n};\n\n/**\n * Add a tag to the entity.\n * Must be called within an Obj.update or Relation.update callback.\n */\nexport const addTag = (entity: Mutable<AnyProperties>, tag: string) => {\n const meta = getMetaChecked(entity);\n meta.tags ??= [];\n meta.tags.push(tag);\n};\n\n/**\n * Remove a tag from the entity.\n * Must be called within an Obj.update or Relation.update callback.\n */\nexport const removeTag = (entity: Mutable<AnyProperties>, tag: string) => {\n const meta = getMetaChecked(entity);\n if (!meta.tags) {\n return;\n }\n for (let i = 0; i < meta.tags.length; i++) {\n if (meta.tags[i] === tag) {\n meta.tags.splice(i, 1);\n i--;\n }\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// TODO(dmaretskyi): Rename all symbols that are props to end with *Key.\nexport const EventId = Symbol.for('@dxos/live-object/EventId');\nexport const ChangeId = Symbol.for('@dxos/live-object/ChangeId');\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EventId } from './symbols';\n\n/**\n * Simple batching mechanism for EventId emissions.\n * When batch depth > 0, events are collected instead of emitted immediately.\n * When batch depth returns to 0, pending events are emitted.\n */\nlet eventBatchDepth = 0;\nconst pendingEventTargets = new Set<object>();\n\n/**\n * Run a callback in a batched context for EventId emissions.\n * Multiple mutations within the batch will only emit one event per target.\n */\nexport const batchEvents = (callback: () => void): void => {\n eventBatchDepth++;\n try {\n callback();\n } finally {\n eventBatchDepth--;\n if (eventBatchDepth === 0) {\n // Emit pending events.\n for (const target of pendingEventTargets) {\n (target as any)[EventId]?.emit();\n }\n pendingEventTargets.clear();\n }\n }\n};\n\n/**\n * Emit an event on a target, respecting batching.\n */\nexport const emitEvent = (target: object): void => {\n if (eventBatchDepth > 0) {\n pendingEventTargets.add(target);\n } else {\n (target as any)[EventId]?.emit();\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { batchEvents } from './event-batch';\nimport { EventId } from './symbols';\n\n/**\n * Generic change context tracking.\n * Only one object can be in a change context at a time (synchronous changes).\n *\n * This module provides a unified change context mechanism used by both:\n * - TypedReactiveHandler (for non-database objects, using target as key)\n * - EchoReactiveHandler (for database objects, using ObjectCore as key)\n */\n\n/**\n * The object currently in a change context.\n * Can be a target object (for typed reactive) or ObjectCore (for database objects).\n */\nlet currentChangeContext: object | null = null;\n\n/**\n * The primary object that has pending notifications, if any.\n * This uses the contextKey (target or ObjectCore).\n */\nlet pendingNotificationKey: object | null = null;\n\n/**\n * Additional objects (owner chain) that need notifications.\n * These are separate from the primary notification because they use EventId directly.\n */\nconst pendingOwnerNotifications = new Set<object>();\n\n/**\n * Enter a change context for the given key.\n * While in a change context, mutations are allowed on the associated object.\n * Nested Obj.update calls are not supported.\n *\n * @param key - The key to enter the change context for (target object or ObjectCore).\n * @returns A cleanup function that exits the change context.\n */\nexport const enterChangeContext = (key: object): (() => void) => {\n currentChangeContext = key;\n return () => {\n currentChangeContext = null;\n };\n};\n\n/**\n * Check if the given key is currently in a change context.\n *\n * @param key - The key to check (target object or ObjectCore).\n * @returns True if the key is in a change context, false otherwise.\n */\nexport const isInChangeContext = (key: object): boolean => {\n return currentChangeContext === key;\n};\n\n/**\n * Queue a notification for the given key to be fired when the change context exits.\n *\n * @param key - The key to queue a notification for.\n */\nexport const queueNotification = (key: object): void => {\n if (currentChangeContext === key) {\n pendingNotificationKey = key;\n }\n};\n\n/**\n * Queue an owner notification. Owner notifications are for objects in the ownership\n * chain that should be notified when a nested object changes.\n * These objects have EventId and emit directly.\n * Skip if the target is already the current change context (to avoid duplicate notifications).\n *\n * @param target - The owner target that has EventId.\n */\nexport const queueOwnerNotification = (target: object): void => {\n // Skip if this is the object already being changed (primary notification handles it).\n if (currentChangeContext !== null && target !== currentChangeContext) {\n pendingOwnerNotifications.add(target);\n }\n};\n\n/**\n * Check if there are any pending notifications for the given key.\n *\n * @param key - The key to check.\n * @returns True if there are pending notifications, false otherwise.\n */\nexport const hasPendingNotifications = (key: object): boolean => {\n return pendingNotificationKey === key;\n};\n\n/**\n * Clear any pending notifications for the given key.\n *\n * @param key - The key to clear notifications for.\n */\nexport const clearPendingNotifications = (key: object): void => {\n if (pendingNotificationKey === key) {\n pendingNotificationKey = null;\n }\n};\n\n/**\n * Execute a callback within a change context.\n * This is the shared implementation used by both TypedReactiveHandler and EchoReactiveHandler.\n *\n * @param contextKey - The key for the change context (target for typed, ObjectCore for db).\n * @param eventTarget - The object that has the EventId for notifications.\n * @param proxy - The proxy object to pass to the callback.\n * @param callback - The callback to execute with mutations allowed.\n */\nexport const executeChange = (\n contextKey: object,\n eventTarget: object,\n proxy: any,\n callback: (proxy: any) => void,\n): void => {\n const exitContext = enterChangeContext(contextKey);\n try {\n batchEvents(() => callback(proxy));\n } finally {\n exitContext();\n // Fire primary notification.\n if (hasPendingNotifications(contextKey)) {\n clearPendingNotifications(contextKey);\n (eventTarget as any)[EventId]?.emit();\n }\n // Fire owner chain notifications.\n for (const ownerTarget of pendingOwnerNotifications) {\n (ownerTarget as any)[EventId]?.emit();\n }\n pendingOwnerNotifications.clear();\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Define a non-enumerable property on an object.\n */\nexport const defineHiddenProperty = (object: any, key: string | symbol, value: any) => {\n Object.defineProperty(object, key, {\n enumerable: false,\n configurable: true,\n value,\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\n/**\n * Error thrown when attempting to mutate an object outside of an Obj.update() context.\n */\nexport class MutationOutsideChangeContextError extends Error {\n constructor(operation: string, suggestion: string) {\n super(\n `Cannot ${operation} outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { ${suggestion} }) instead.`,\n );\n this.name = 'MutationOutsideChangeContextError';\n }\n}\n\n/**\n * Create an error for attempting to set a property outside of a change context.\n */\nexport const createPropertySetError = (prop: string | symbol): MutationOutsideChangeContextError => {\n return new MutationOutsideChangeContextError(\n `modify object property \"${String(prop)}\"`,\n `mutableObj.${String(prop)} = value;`,\n );\n};\n\n/**\n * Create an error for attempting to delete a property outside of a change context.\n */\nexport const createPropertyDeleteError = (prop: string | symbol): MutationOutsideChangeContextError => {\n return new MutationOutsideChangeContextError(\n `delete object property \"${String(prop)}\"`,\n `delete mutableObj.${String(prop)};`,\n );\n};\n\n/**\n * Create an error for attempting to call an array method outside of a change context.\n */\nexport const createArrayMethodError = (method: string): MutationOutsideChangeContextError => {\n return new MutationOutsideChangeContextError(`call array.${method}()`, `mutableObj.array.${method}(...);`);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ObjectMeta } from '@dxos/echo-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { deepMapValues } from '@dxos/util';\n\nimport { Ref } from '../../Ref';\nimport {\n ATTR_META,\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n ATTR_SELF_DXN,\n ATTR_TYPE,\n MetaId,\n RelationSourceDXNId,\n RelationTargetDXNId,\n SelfDXNId,\n TypeId,\n} from '../types';\n\n/**\n * Attaches a toJSON method to the object for typed serialization.\n */\nexport const attachTypedJsonSerializer = (obj: any) => {\n const descriptor = Object.getOwnPropertyDescriptor(obj, 'toJSON');\n if (descriptor) {\n return;\n }\n\n Object.defineProperty(obj, 'toJSON', {\n value: typedJsonSerializer,\n writable: false,\n enumerable: false,\n // Setting `configurable` to false breaks proxy invariants, should be fixable.\n configurable: true,\n });\n};\n\n// NOTE: KEEP as function.\n// Exported for use in objectToJSON.\nexport const typedJsonSerializer = function (this: any) {\n const { id, ...rest } = this;\n const result: any = {\n id,\n };\n\n if (this[TypeId]) {\n result[ATTR_TYPE] = this[TypeId].toString();\n }\n\n if (this[MetaId]) {\n result[ATTR_META] = serializeMeta(this[MetaId]);\n }\n\n if (this[SelfDXNId]) {\n result[ATTR_SELF_DXN] = this[SelfDXNId].toString();\n }\n\n if (this[RelationSourceDXNId]) {\n const sourceDXN = this[RelationSourceDXNId];\n invariant(sourceDXN instanceof DXN);\n result[ATTR_RELATION_SOURCE] = sourceDXN.toString();\n }\n if (this[RelationTargetDXNId]) {\n const targetDXN = this[RelationTargetDXNId];\n invariant(targetDXN instanceof DXN);\n result[ATTR_RELATION_TARGET] = targetDXN.toString();\n }\n\n Object.assign(result, serializeData(rest));\n return result;\n};\n\nconst serializeData = (data: unknown) => {\n return deepMapValues(data, (value, recurse) => {\n if (Ref.isRef(value)) {\n // TODO(dmaretskyi): Should this be configurable?\n return value.noInline().encode();\n }\n\n return recurse(value);\n });\n};\n\nconst serializeMeta = (meta: ObjectMeta) => {\n return deepMapValues(meta, (value, recurse) => recurse(value));\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\n\nimport { ObjectId } from '@dxos/keys';\n\nimport { getTypeAnnotation } from '../../Annotation';\nimport { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema, ParentId } from '../types';\nimport { defineHiddenProperty } from './define-hidden-property';\nimport { attachTypedJsonSerializer } from './json-serializer';\nimport { createProxy, getProxyTarget, isValidProxyTarget } from './proxy-utils';\nimport { TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';\n\n/**\n *\n */\n// TODO(burdon): Make internal\nexport type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId>;\n\n/**\n * Creates a reactive object from a plain Javascript object.\n * Requires a TS-effect schema.\n */\n// TODO(burdon): Make internal\n// TODO(dmaretskyi): Deep mutability.\n// TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.\n// TODO(dmaretskyi): Could mutate original object making it unusable.\nexport const makeObject: {\n <T extends AnyProperties>(\n schema: Schema.Schema<T, any, never>,\n obj: NoInfer<MakeObjectProps<T>>,\n meta?: ObjectMeta,\n ): T;\n} = <T extends AnyProperties>(schema: Schema.Schema<T, any>, obj: MakeObjectProps<T>, meta?: ObjectMeta): T => {\n // Use Object.assign to copy symbol properties (like ParentId) that spread operator doesn't copy.\n return createReactiveObject<T>(Object.assign({}, obj) as T, meta, schema);\n};\n\nconst createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta, schema?: Schema.Schema<T>): T => {\n if (!isValidProxyTarget(obj)) {\n throw new Error('Value cannot be made into a reactive object.');\n }\n\n if (!schema) {\n throw new Error('Schema is required for reactive objects. Use Atom for untyped reactive state.');\n }\n\n // Extract parent from props (can be set via [Obj.Parent]).\n const parent = (obj as any)[ParentId];\n if (parent !== undefined) {\n delete (obj as any)[ParentId];\n }\n\n const annotation = getTypeAnnotation(schema);\n if (annotation) {\n setIdOnTarget(obj);\n defineHiddenProperty(obj, KindId, annotation.kind);\n }\n initMeta(obj, meta);\n if (parent !== undefined) {\n defineHiddenProperty(obj, ParentId, parent);\n }\n prepareTypedTarget(obj, schema);\n attachTypedJsonSerializer(obj);\n const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);\n\n // Set meta's owner to the main object so meta mutations respect the parent's change context.\n // For non-database objects using TypedReactiveHandler, this links the meta to the main object's\n // change context. For database objects, meta is handled by EchoReactiveHandler.getMeta().\n const metaProxy = (obj as any)[MetaId];\n if (metaProxy) {\n const metaTarget = getProxyTarget(metaProxy);\n if (metaTarget) {\n setMetaOwner(metaTarget, obj);\n }\n }\n\n return proxy;\n};\n\n/**\n * Set ID on ECHO object targets during creation.\n * Used for objects with schema and the ones explicitly marked as Expando.\n */\nconst setIdOnTarget = (target: any) => {\n // invariant(!('id' in target), 'Object already has an `id` field, which is reserved.');\n if ('id' in target && target.id !== undefined && target.id !== null) {\n if (!ObjectId.isValid(target.id)) {\n throw new Error('Invalid object id format.');\n }\n } else {\n target.id = ObjectId.random();\n }\n};\n\n/**\n * Set metadata on object.\n */\n// TODO(dmaretskyi): Move to echo-schema.\nconst initMeta = <T>(obj: T, meta: ObjectMeta = { keys: [] }) => {\n prepareTypedTarget(meta, ObjectMetaSchema);\n defineHiddenProperty(obj, MetaId, createProxy(meta, TypedReactiveHandler.instance as any));\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\n\nimport { type ReactiveHandler } from './proxy-types';\n\nexport const symbolIsProxy = Symbol.for('@dxos/schema/Proxy');\n\n/**\n * Internal api.\n */\nexport const isProxy = (value: unknown) => !!(value as any)?.[symbolIsProxy];\n\nexport const isValidProxyTarget = (value: any): value is object => {\n if (value == null || value[symbolIsProxy]) {\n return false;\n }\n if (Array.isArray(value)) {\n return true;\n }\n\n return typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype;\n};\n\n/**\n * @deprecated\n */\nexport const getProxySlot = <T extends object>(proxy: any): ProxyHandlerSlot<T> => {\n const value = (proxy as any)[symbolIsProxy];\n invariant(value instanceof ProxyHandlerSlot);\n return value;\n};\n\nexport const getProxyTarget = <T extends object>(proxy: any): T => {\n return getProxySlot<T>(proxy).target;\n};\n\nexport const getProxyHandler = <T extends object>(proxy: any): ReactiveHandler<T> => {\n return getProxySlot<T>(proxy).handler;\n};\n\n/**\n * Unsafe method to override id for debugging/testing and migration purposes.\n * @deprecated\n */\nexport const dangerouslySetProxyId = <T>(obj: T, id: string) => {\n (getProxySlot(obj).target as any).id = id;\n};\n\n/**\n * Create a reactive proxy object.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n *\n * @param target Object or array. Passing in array will enable array methods.\n * @param handler ReactiveHandler instance.\n */\n// TODO(burdon): Document.\n// TODO(burdon): Tests for low-level functions.\nexport const createProxy = <T extends object>(target: T, handler: ReactiveHandler<T>): T => {\n const existingProxy = handler._proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n\n // TODO(dmaretskyi): In the future this should be mutable to allow replacing the handler on-the-fly while maintaining the proxy identity.\n const proxy = new Proxy(target, new ProxyHandlerSlot<T>(target, handler));\n handler.init(target);\n\n // TODO(dmaretskyi): Check if this will actually work; maybe a global WeakMap is better?\n handler._proxyMap.set(target, proxy);\n return proxy;\n};\n\n/**\n * Passed as the handler to the Proxy constructor.\n * Maintains a mutable slot for the actual handler.\n */\nclass ProxyHandlerSlot<T extends object> implements ProxyHandler<T> {\n /**\n * @param target Original object.\n * @param _handler Handles intercepted operations.\n */\n constructor(\n readonly target: T,\n private _handler: ReactiveHandler<T>,\n ) {}\n\n get handler() {\n invariant(this._handler);\n return this._handler;\n }\n\n // TODO(burdon): Requires comment.\n setHandler(handler: ReactiveHandler<T>): void {\n this._handler = handler;\n }\n\n /**\n * Get value.\n */\n get(target: T, prop: string | symbol, receiver: any): any {\n if (prop === symbolIsProxy) {\n return this;\n }\n\n if (!this._handler || !this._handler.get) {\n return Reflect.get(target, prop, receiver);\n }\n\n return this._handler.get(target, prop, receiver);\n }\n\n static {\n const TRAPS: (keyof ProxyHandler<any>)[] = [\n 'apply',\n 'construct',\n 'defineProperty',\n 'deleteProperty',\n 'get',\n 'getOwnPropertyDescriptor',\n 'getPrototypeOf',\n 'has',\n 'isExtensible',\n 'ownKeys',\n 'preventExtensions',\n 'set',\n 'setPrototypeOf',\n ];\n\n for (const trap of TRAPS) {\n if (trap === 'get') {\n continue;\n }\n\n Object.defineProperty(this.prototype, trap, {\n enumerable: false,\n value: function (this: ProxyHandlerSlot<any>, ...args: any[]) {\n // log.info('trap', { trap, args });\n if (!this._handler || !this._handler[trap]) {\n return (Reflect[trap] as Function)(...args);\n }\n\n return (this._handler[trap] as Function).apply(this._handler, args);\n },\n });\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\nimport { type InspectOptionsStylized } from 'node:util';\n\nimport { Event } from '@dxos/async';\nimport { inspectCustom } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\n\nimport { getSchemaDXN } from '../../Annotation';\nimport { ObjectDeletedId, ParentId, SchemaId, TypeId } from '../types';\nimport { executeChange, isInChangeContext, queueNotification } from './change-context';\nimport { defineHiddenProperty } from './define-hidden-property';\nimport { createPropertyDeleteError } from './errors';\nimport { batchEvents } from './event-batch';\nimport {\n getEchoRoot,\n getOwner,\n getRawTarget,\n hasForeignOwner,\n notifyOwnerChain,\n setOwnerRecursive,\n wouldCreateCycle,\n} from './ownership';\nimport { type ReactiveHandler, objectData } from './proxy-types';\nimport { createProxy, isProxy, isValidProxyTarget, symbolIsProxy } from './proxy-utils';\nimport { ReactiveArray } from './reactive-array';\nimport { SchemaValidator } from './schema-validator';\nimport { ChangeId, EventId } from './symbols';\n\n// Re-export for external consumers.\nexport { getEchoRoot, setMetaOwner } from './ownership';\n\ntype ProxyTarget = {\n /**\n * Typename or type DXN.\n */\n [TypeId]: string;\n\n /**\n * Schema for the root.\n */\n [SchemaId]: Schema.Schema.AnyNoContext;\n [ParentId]?: any;\n\n /**\n * For modifications.\n */\n [EventId]: Event<void>;\n} & ({ [key: keyof any]: any } | any[]);\n\n/**\n * Deep copy a value, handling arrays and nested objects.\n * Preserves ReactiveArray type and hidden properties (SchemaId, TypeId).\n * Does not copy class instances or functions (except ReactiveArray).\n *\n * Note: Cannot use structuredClone because we need to:\n * - Unwrap proxies\n * - Preserve ReactiveArray instances\n * - Copy Symbol-keyed hidden properties (SchemaId, TypeId)\n * - Convert plain arrays to ReactiveArray\n *\n * Performance: O(n) where n is the total number of nested objects/arrays.\n * For large structures, consider using Refs for frequently reassigned subtrees.\n */\nconst deepCopy = <T>(value: T, visited = new Map<object, object>()): T => {\n if (value == null || typeof value !== 'object') {\n return value;\n }\n\n // Handle proxies - get the underlying target.\n const actualValue = getRawTarget(value);\n\n // Check for circular references in the copy.\n if (visited.has(actualValue)) {\n return visited.get(actualValue) as T;\n }\n\n // Handle ReactiveArray specially to preserve reactivity.\n if (actualValue instanceof ReactiveArray) {\n const copy = new ReactiveArray<any>();\n visited.set(actualValue, copy);\n for (const item of actualValue) {\n copy.push(deepCopy(item, visited));\n }\n // Copy hidden properties.\n copyHiddenProperties(actualValue, copy);\n return copy as T;\n }\n\n // Don't copy other class instances (objects with non-Object prototype).\n const proto = Object.getPrototypeOf(actualValue);\n if (proto !== Object.prototype && proto !== Array.prototype && proto !== null) {\n return value; // Return as-is, don't copy class instances.\n }\n\n if (Array.isArray(actualValue)) {\n // Plain arrays become ReactiveArrays.\n const copy = new ReactiveArray<any>();\n visited.set(actualValue, copy);\n for (const item of actualValue) {\n copy.push(deepCopy(item, visited));\n }\n return copy as T;\n }\n\n const copy: Record<string, any> = {};\n visited.set(actualValue, copy);\n for (const key of Object.keys(actualValue)) {\n copy[key] = deepCopy((actualValue as any)[key], visited);\n }\n // Copy hidden properties (SchemaId, TypeId).\n copyHiddenProperties(actualValue, copy);\n return copy as T;\n};\n\n/**\n * Copy hidden properties (SchemaId, TypeId) from source to target.\n */\nconst copyHiddenProperties = (source: any, target: any): void => {\n if (SchemaId in source) {\n defineHiddenProperty(target, SchemaId, source[SchemaId]);\n }\n if (TypeId in source) {\n defineHiddenProperty(target, TypeId, source[TypeId]);\n }\n};\n\n/**\n * Typed in-memory reactive store (with Schema).\n * Reactivity is based on Event subscriptions, not signals.\n */\nexport class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {\n public static readonly instance: ReactiveHandler<any> = new TypedReactiveHandler();\n\n readonly _proxyMap = new WeakMap<object, any>();\n private _inSet = false;\n\n private constructor() {}\n\n init(target: ProxyTarget): void {\n invariant(typeof target === 'object' && target !== null);\n invariant(SchemaId in target, 'Schema is not defined for the target');\n\n // Only set EventId on root objects (those without an owner).\n // Nested objects share their root's EventId for centralized reactivity.\n const hasOwner = !!getOwner(target);\n if (!(EventId in target) && !hasOwner) {\n defineHiddenProperty(target, EventId, new Event());\n }\n\n defineHiddenProperty(target, ObjectDeletedId, false);\n\n // Mark root objects as having a change handler.\n // The actual handler is returned dynamically in get() to have access to the proxy.\n if (!hasOwner && !(ChangeId in target)) {\n defineHiddenProperty(target, ChangeId, true);\n }\n\n // Only set owners if this is a root object (no existing owner).\n // Nested objects already have owners set by their root's initialization.\n // If we re-set owners here for nested objects, we'd incorrectly point\n // array elements to the array instead of the true root ECHO object.\n if (!hasOwner) {\n // Set owner on all nested objects to this root ECHO object.\n // All nested records point directly to this root for centralized reactivity.\n for (const key in target) {\n if ((target as any)[symbolIsProxy]) {\n continue;\n }\n let value = (target as any)[key];\n if (isValidProxyTarget(value) || isProxy(value)) {\n // Deep copy values that have foreign owners (owned by a different object,\n // or are root ECHO objects whose nested structures would be owned by them).\n // This recursively checks all nested objects.\n if (hasForeignOwner(value, target)) {\n value = deepCopy(value);\n (target as any)[key] = value;\n }\n setOwnerRecursive(value, target);\n }\n }\n }\n\n // Maybe have been set by `create`.\n Object.defineProperty(target, inspectCustom, {\n enumerable: false,\n configurable: true,\n value: this._inspect.bind(target),\n });\n }\n\n get(target: ProxyTarget, prop: string | symbol, receiver: any): any {\n switch (prop) {\n // TODO(burdon): Remove?\n case objectData: {\n return toJSON(target);\n }\n case ChangeId: {\n // Return change handler only for root objects that have been marked with ChangeId.\n if ((target as any)[ChangeId] !== true) {\n return undefined;\n }\n // Return a function that allows mutations within a controlled context.\n // Uses target as both the context key and event target for non-database objects.\n return (callback: (obj: any) => void) => executeChange(target, target, receiver, callback);\n }\n }\n\n // Handle getter properties.\n if (Object.getOwnPropertyDescriptor(target, prop)?.get) {\n return Reflect.get(target, prop, receiver);\n }\n\n const value = Reflect.get(target, prop, receiver);\n if (isValidProxyTarget(value)) {\n return createProxy(value, this);\n }\n\n return value;\n }\n\n set(target: ProxyTarget, prop: string | symbol, value: any, receiver: any): boolean {\n const echoRoot = getEchoRoot(target);\n\n // Check readonly enforcement - mutations only allowed within Obj.update().\n // Skip check if the object is still being initialized (no ChangeId handler yet).\n // Also skip for non-initialized root objects (those without EventId).\n // Skip for symbol properties (internal infrastructure, not user data).\n const isInitialized = ChangeId in echoRoot || EventId in echoRoot;\n const isSymbolProp = typeof prop === 'symbol';\n if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {\n throw new Error(\n `Cannot modify object property \"${String(prop)}\" outside of Obj.update(). ` +\n 'Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.',\n );\n }\n\n let result: boolean = false;\n this._inSet = true;\n try {\n batchEvents(() => {\n const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value);\n result = Reflect.set(target, prop, preparedValue, receiver);\n // Queue notification instead of emitting immediately (batched).\n if (isInitialized) {\n queueNotification(echoRoot);\n // Also notify the owner chain so parent objects are updated when nested objects change.\n notifyOwnerChain(target);\n }\n });\n } finally {\n this._inSet = false;\n }\n return result;\n }\n\n ownKeys(target: ProxyTarget): ArrayLike<string | symbol> {\n return Reflect.ownKeys(target);\n }\n\n deleteProperty(target: ProxyTarget, property: string | symbol): boolean {\n const echoRoot = getEchoRoot(target);\n\n // Check readonly enforcement - mutations only allowed within Obj.update().\n // Skip for symbol properties (internal infrastructure, not user data).\n const isInitialized = (echoRoot as any)[ChangeId] === true || EventId in echoRoot;\n const isSymbolProp = typeof property === 'symbol';\n if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {\n throw createPropertyDeleteError(property);\n }\n\n const result = Reflect.deleteProperty(target, property);\n if (isInitialized) {\n queueNotification(echoRoot);\n }\n return result;\n }\n\n defineProperty(target: ProxyTarget, property: string | symbol, attributes: PropertyDescriptor): boolean {\n const echoRoot = getEchoRoot(target);\n\n // Check readonly enforcement - mutations only allowed within Obj.update().\n // Skip check if the object is still being initialized (no ChangeId handler yet).\n // Skip for symbol properties (internal infrastructure, not user data).\n const isInitialized = ChangeId in echoRoot || EventId in echoRoot;\n const isSymbolProp = typeof property === 'symbol';\n if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {\n throw new Error(\n `Cannot modify object property \"${String(property)}\" outside of Obj.update(). ` +\n 'Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.',\n );\n }\n\n const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, property, attributes.value);\n const result = Reflect.defineProperty(target, property, {\n ...attributes,\n value: preparedValue,\n });\n if (!this._inSet && isInitialized) {\n // Queue notification instead of emitting immediately (batched).\n queueNotification(echoRoot);\n }\n return result;\n }\n\n /**\n * Prepare a value for assignment to a typed object property.\n * Handles cycle detection, copy-on-assign, array conversion, validation, and ownership.\n */\n private _prepareValueForAssignment(\n target: ProxyTarget,\n prop: string | symbol,\n value: any,\n ): { echoRoot: object; preparedValue: any } {\n const echoRoot = getEchoRoot(target);\n\n if (prop === ParentId) {\n return { echoRoot, preparedValue: value }; // Short-circuit for parent assignment.\n }\n\n // Check for cycles before assignment.\n if (isValidProxyTarget(value) || isProxy(value)) {\n if (wouldCreateCycle(echoRoot, value)) {\n throw new Error('Cannot create cycles in typed object graph. Consider using Ref for circular references.');\n }\n }\n\n // Prevent direct assignment of root ECHO objects (those created with Obj.make/Relation.make).\n // These must be wrapped with Ref.make for proper reference handling.\n // This matches database object behavior for consistency.\n if (isValidProxyTarget(value) || isProxy(value)) {\n const actualValue = getRawTarget(value);\n const isRootEchoObject = EventId in actualValue;\n if (isRootEchoObject) {\n throw new Error('Object references must be wrapped with `Ref.make`');\n }\n }\n\n // Copy-on-assign: If the value is a nested record owned by a different ECHO object, deep copy it.\n if (isValidProxyTarget(value) || isProxy(value)) {\n const actualValue = getRawTarget(value);\n const existingOwner = getOwner(actualValue);\n if (existingOwner != null && existingOwner !== echoRoot) {\n value = deepCopy(value);\n }\n }\n\n // Convert arrays to reactive arrays.\n if (Array.isArray(value) && !(value instanceof ReactiveArray)) {\n value = ReactiveArray.from(value);\n }\n\n const validatedValue = this._validateValue(target, prop, value);\n\n // Set owner on new value to the root ECHO object.\n if (isValidProxyTarget(validatedValue) || isProxy(validatedValue)) {\n setOwnerRecursive(validatedValue, echoRoot);\n }\n\n return { echoRoot, preparedValue: validatedValue };\n }\n\n private _validateValue(target: any, prop: string | symbol, value: any) {\n if (prop === ParentId) {\n return value;\n }\n const schema = SchemaValidator.getTargetPropertySchema(target, prop);\n const _ = Schema.asserts(schema)(value);\n if (isValidProxyTarget(value)) {\n setSchemaProperties(value, schema);\n }\n\n return value;\n }\n\n private _inspect(\n _: number,\n options: InspectOptionsStylized,\n inspectFn: (value: any, options?: InspectOptionsStylized) => string,\n ): string {\n const inspected = inspectFn(this, {\n ...options,\n showHidden: false,\n customInspect: false,\n });\n\n return `Typed ${inspected}`;\n }\n}\n\n/**\n * @deprecated Use `Obj.toJSON` instead.\n */\n// TODO(burdon): Remove?\nconst toJSON = (target: ProxyTarget): any => {\n return { '@type': 'TypedReactiveObject', ...target };\n};\n\n/**\n * Recursively set AST on all potential proxy targets.\n */\nconst setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext) => {\n const schemaType = getSchemaDXN(schema);\n if (schemaType != null) {\n defineHiddenProperty(obj, TypeId, schemaType);\n }\n\n defineHiddenProperty(obj, SchemaId, schema);\n for (const key in obj) {\n if (isValidProxyTarget(obj[key])) {\n const elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);\n if (elementSchema != null) {\n setSchemaProperties(obj[key], elementSchema);\n }\n }\n }\n};\n\nexport const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T>) => {\n // log.info('prepareTypedTarget', { target, schema });\n if (!SchemaAST.isTypeLiteral(schema.ast)) {\n throw new Error('schema has to describe an object type');\n }\n\n SchemaValidator.validateSchema(schema);\n const _ = Schema.asserts(schema)(target);\n makeArraysReactive(target);\n setSchemaProperties(target, schema);\n};\n\nconst makeArraysReactive = (target: any) => {\n for (const key in target) {\n if (target[symbolIsProxy]) {\n continue;\n }\n if (Array.isArray(target[key])) {\n target[key] = ReactiveArray.from(target[key]);\n }\n if (typeof target[key] === 'object') {\n makeArraysReactive(target[key]);\n }\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\n\nimport { KindId } from '../types';\nimport { queueOwnerNotification } from './change-context';\nimport { defineHiddenProperty } from './define-hidden-property';\nimport { getProxyTarget, isProxy, isValidProxyTarget } from './proxy-utils';\nimport { EventId } from './symbols';\n\n/**\n * Symbol to store the owning ECHO object reference on nested JS objects (records).\n * Every nested record is attributed to exactly one ECHO object.\n * This achieves:\n * - No cycles in the object graph (cyclical Refs are still allowed).\n * - No multiple inbound pointers to one record.\n * - Centralized reactivity for entire ECHO object.\n */\nconst EchoOwner = Symbol.for('@dxos/echo/Owner');\n\n/**\n * Get the raw target from a value, unwrapping proxy if needed.\n */\nexport const getRawTarget = (value: any): any => {\n return isProxy(value) ? getProxyTarget(value) : value;\n};\n\n/**\n * Get the ECHO object that owns this nested record.\n *\n * The owner is always the raw target object (not a proxy) of the root ECHO object.\n * For example, if you have `echoObject.nested.deep`, both `nested` and `deep`\n * will have their owner set to the raw target of `echoObject`.\n *\n * @param value - The nested record to check (can be a proxy or raw target).\n * @returns The raw target of the owning root ECHO object, or undefined if not owned.\n */\nexport const getOwner = (value: object | null | undefined): object | undefined => {\n return (value as any)?.[EchoOwner];\n};\n\n/**\n * Set the owner of a meta object to its parent.\n * This allows meta mutations to respect the parent's change context.\n * @internal\n */\nexport const setMetaOwner = (metaTarget: object, parent: object): void => {\n defineHiddenProperty(metaTarget, EchoOwner, parent);\n};\n\n/**\n * Set the ECHO object owner on a value and all its nested records.\n * All nested JS objects point directly to the root ECHO object.\n *\n * @param value - The value to set ownership on (can be a proxy or raw target).\n * @param owner - The raw target of the root ECHO object that will own this value.\n * @param options.visited - Set of already-visited objects to avoid infinite loops.\n * @param options.depth - Current recursion depth (unused, kept for debugging).\n * @param options.allowedPreviousOwner - When reassigning a root ECHO object, its nested structures\n * are allowed to have this as their previous owner without triggering the invariant.\n */\nexport const setOwnerRecursive = (\n value: any,\n owner: object,\n options: {\n visited?: Set<object>;\n depth?: number;\n allowedPreviousOwner?: object;\n } = {},\n): void => {\n const { visited = new Set<object>(), depth = 0, allowedPreviousOwner } = options;\n if (value == null || typeof value !== 'object') {\n return;\n }\n\n const actualValue = getRawTarget(value);\n if (visited.has(actualValue)) {\n return;\n }\n visited.add(actualValue);\n\n // Check that we're not stealing a nested record owned by a different ECHO object.\n // Root ECHO objects (those with EventId) can be reassigned - they maintain their own\n // identity and choosing to embed them in another object is a valid operation.\n // When reassigning a root, its nested records (owned by that root) are also allowed.\n const existingOwner = getOwner(actualValue);\n const isRootEchoObject = EventId in actualValue;\n\n // Track if this is a root being assigned - its nested structures are allowed to transfer.\n let newAllowedPreviousOwner = allowedPreviousOwner;\n if (isRootEchoObject && depth === 0) {\n // This is the top-level root being assigned; allow its nested structures to transfer.\n newAllowedPreviousOwner = actualValue;\n }\n\n if (!isRootEchoObject) {\n const ownershipAllowed =\n existingOwner == null || existingOwner === owner || existingOwner === newAllowedPreviousOwner;\n invariant(\n ownershipAllowed,\n 'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.',\n );\n }\n\n // Set owner directly to the root ECHO object.\n defineHiddenProperty(actualValue, EchoOwner, owner);\n\n // Recursively set owner on nested objects and array elements.\n const recursiveOptions = {\n visited,\n depth: depth + 1,\n allowedPreviousOwner: newAllowedPreviousOwner,\n };\n if (Array.isArray(actualValue)) {\n for (const item of actualValue) {\n if (isValidProxyTarget(item) || isProxy(item)) {\n setOwnerRecursive(item, owner, recursiveOptions);\n }\n }\n } else {\n for (const key in actualValue) {\n if (Object.prototype.hasOwnProperty.call(actualValue, key)) {\n const nested = actualValue[key];\n if (isValidProxyTarget(nested) || isProxy(nested)) {\n setOwnerRecursive(nested, owner, recursiveOptions);\n }\n }\n }\n }\n};\n\n/**\n * Traverse an object graph, calling the visitor on each object.\n * Handles proxy unwrapping and cycle detection.\n *\n * @param value - The value to traverse (can be a proxy or raw target).\n * @param visitor - Called for each object. Return true to stop traversal (early exit).\n * @returns true if the visitor returns true for any object.\n */\nexport const traverseObjectGraph = (\n value: any,\n visitor: (actualValue: any) => boolean,\n visited = new Set<object>(),\n): boolean => {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n\n const actualValue = getRawTarget(value);\n\n if (visited.has(actualValue)) {\n return false;\n }\n visited.add(actualValue);\n\n if (visitor(actualValue)) {\n return true;\n }\n\n if (Array.isArray(actualValue)) {\n for (const item of actualValue) {\n if (traverseObjectGraph(item, visitor, visited)) {\n return true;\n }\n }\n } else {\n for (const key in actualValue) {\n if (Object.prototype.hasOwnProperty.call(actualValue, key)) {\n if (traverseObjectGraph(actualValue[key], visitor, visited)) {\n return true;\n }\n }\n }\n }\n\n return false;\n};\n\n/**\n * Check if a value would create a cycle when assigned to a target ECHO object.\n * Returns true if the value (or any nested object) IS the target root.\n */\nexport const wouldCreateCycle = (targetRoot: object, value: any): boolean =>\n traverseObjectGraph(value, (v) => v === targetRoot);\n\n/**\n * Check if a value or any of its nested objects has an owner different from the target.\n * Used to determine if deep copy is needed during init.\n */\nexport const hasForeignOwner = (value: any, target: object): boolean =>\n traverseObjectGraph(value, (v) => {\n const owner = getOwner(v);\n if (owner != null && owner !== target) {\n return true;\n }\n // Root ECHO objects (with EventId) have their nested structures owned by them.\n if (EventId in v && v !== target) {\n return true;\n }\n return false;\n });\n\n/**\n * Maximum depth for owner chain traversal.\n * This is a defensive measure against malformed circular ownership.\n * Primary cycle detection is handled by wouldCreateCycle() before assignment.\n */\nconst MAX_OWNER_DEPTH = 100;\n\n/**\n * Get the root ECHO object for a target.\n * Follows the owner chain to find the ultimate root.\n * An object may have EventId (from being created standalone) but if it now\n * has an owner, it's nested and we should use its owner's root instead.\n * @internal\n */\nexport const getEchoRoot = (target: object, depth = 0): object => {\n invariant(depth < MAX_OWNER_DEPTH, 'Owner chain too deep - possible circular ownership');\n\n // Root ECHO objects (those created with Obj.make or Relation.make) have KindId set.\n // They maintain their own change context identity even when nested inside another object.\n // Nested helper objects like ObjectMeta don't have KindId and should follow their owner.\n if (KindId in target) {\n return target;\n }\n\n // For non-root objects (nested records, ObjectMeta, etc.), follow the owner chain.\n const owner = getOwner(target);\n if (owner) {\n return getEchoRoot(owner, depth + 1);\n }\n\n // No owner means this is an unowned object (e.g., during initialization).\n return target;\n};\n\n/**\n * Notify all owners in the ownership chain.\n * When a nested object changes, its parent should also be notified.\n * This handles the case where a root ECHO object is nested inside another object.\n */\nexport const notifyOwnerChain = (target: object): void => {\n const owner = getOwner(target);\n if (owner) {\n // Queue notification for the owner's root (which has EventId).\n queueOwnerNotification(getEchoRoot(owner));\n // Continue up the chain (owner might also be nested).\n notifyOwnerChain(owner);\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Reactive object proxy.\n */\nexport interface ReactiveHandler<T extends object> extends ProxyHandler<T> {\n /**\n * Target to Proxy mapping.\n */\n readonly _proxyMap: WeakMap<object, any>;\n\n /**\n * Called when a proxy is created for this target.\n */\n init(target: T): void;\n}\n\n/**\n * For debug-dumping the data of the object.\n */\nexport const objectData = Symbol.for('@dxos/live-object/objectData');\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { isInChangeContext } from './change-context';\nimport { createArrayMethodError } from './errors';\nimport { batchEvents } from './event-batch';\nimport { getEchoRoot } from './ownership';\nimport { getProxyTarget, isProxy } from './proxy-utils';\nimport { ChangeId, EventId } from './symbols';\n\n/**\n * Check if array mutation is allowed (inside a change context).\n * Throws a descriptive error if not.\n */\nconst checkArrayMutationAllowed = (arr: any, method: string): void => {\n // Get the raw target - if arr is a proxy, get its underlying target.\n const target = isProxy(arr) ? getProxyTarget(arr) : arr;\n\n // Find the root ECHO object.\n const echoRoot = getEchoRoot(target);\n\n // Check if initialized (has ChangeId marker or EventId).\n const isInitialized = (echoRoot as any)[ChangeId] === true || EventId in echoRoot;\n if (!isInitialized) {\n // Array is still being initialized, allow mutations.\n return;\n }\n\n if (!isInChangeContext(echoRoot)) {\n throw createArrayMethodError(method);\n }\n};\n\n/**\n * Extends the native array to make sure that arrays methods are correctly reactive.\n * Enforces that mutations only happen within Obj.update() context.\n */\nexport class ReactiveArray<T> extends Array<T> {\n static override get [Symbol.species]() {\n return Array;\n }\n\n static {\n /**\n * These methods will trigger proxy traps like `set` and `defineProperty` and emit event notifications.\n * We wrap them in a batch to avoid unnecessary event notifications.\n * Change context is checked before allowing mutations.\n *\n * Note: When called on a proxy, `this` will be the proxy, so array mutations\n * go through the proxy's set trap which handles event emission.\n */\n const BATCHED_METHODS = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'] as const;\n\n for (const method of BATCHED_METHODS) {\n Object.defineProperty(this.prototype, method, {\n enumerable: false,\n value: function (this: ReactiveArray<any>, ...args: any[]) {\n // Check change context before allowing mutation.\n checkArrayMutationAllowed(this, method);\n\n let result!: any;\n batchEvents(() => {\n result = Array.prototype[method].apply(this, args);\n });\n return result;\n },\n });\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { SchemaId } from '../types';\n\n// TODO(burdon): Reconcile with @dxos/effect visit().\n\nexport class SchemaValidator {\n /**\n * Recursively check that schema specifies constructions we can handle.\n * Validates there are no ambiguous discriminated union types.\n */\n public static validateSchema(schema: Schema.Schema.AnyNoContext): void {\n const visitAll = (nodes: SchemaAST.AST[]) => nodes.forEach((node) => this.validateSchema(Schema.make(node)));\n if (SchemaAST.isUnion(schema.ast)) {\n const typeAstList = schema.ast.types.filter((type) => SchemaAST.isTypeLiteral(type)) as SchemaAST.TypeLiteral[];\n // Check we can handle a discriminated union.\n if (typeAstList.length > 1) {\n getTypeDiscriminators(typeAstList);\n }\n visitAll(typeAstList);\n } else if (SchemaAST.isTupleType(schema.ast)) {\n const positionalTypes = schema.ast.elements.map((t) => t.type);\n const allTypes = positionalTypes.concat(schema.ast.rest.map((t) => t.type));\n visitAll(allTypes);\n } else if (SchemaAST.isTypeLiteral(schema.ast)) {\n visitAll(SchemaAST.getPropertySignatures(schema.ast).map((p) => p.type));\n }\n }\n\n public static hasTypeAnnotation(\n rootObjectSchema: Schema.Schema.AnyNoContext,\n property: string,\n annotation: symbol,\n ): boolean {\n try {\n let type = this.getPropertySchema(rootObjectSchema, [property]);\n if (SchemaAST.isTupleType(type.ast)) {\n type = this.getPropertySchema(rootObjectSchema, [property, '0']);\n }\n\n return type.ast.annotations[annotation] != null;\n } catch {\n return false;\n }\n }\n\n public static getPropertySchema(\n rootObjectSchema: Schema.Schema.AnyNoContext,\n propertyPath: KeyPath,\n getProperty: (path: KeyPath) => any = () => null,\n ): Schema.Schema.AnyNoContext {\n let schema: Schema.Schema.AnyNoContext = rootObjectSchema;\n for (let i = 0; i < propertyPath.length; i++) {\n const propertyName = propertyPath[i];\n const tupleAst = unwrapArray(schema.ast);\n if (tupleAst != null) {\n schema = getArrayElementSchema(tupleAst, propertyName);\n } else {\n const propertyType = getPropertyType(schema.ast, propertyName.toString(), (propertyName) =>\n getProperty([...propertyPath.slice(0, i), propertyName]),\n );\n if (propertyType == null) {\n log.warn('unknown property', { path: propertyPath, property: propertyName });\n continue;\n }\n\n schema = Schema.make(propertyType).annotations(propertyType.annotations);\n }\n }\n\n return schema;\n }\n\n public static getTargetPropertySchema(target: any, prop: string | symbol): Schema.Schema.AnyNoContext {\n const schema: Schema.Schema.AnyNoContext | undefined = (target as any)[SchemaId];\n invariant(schema, 'target has no schema');\n const arrayAst = unwrapArray(schema.ast);\n if (arrayAst != null) {\n return getArrayElementSchema(arrayAst, prop);\n }\n\n const propertyType = getPropertyType(schema.ast, prop.toString(), (prop) => target[prop]);\n if (propertyType == null) {\n return Schema.Any; // TODO(burdon): HACK.\n }\n\n invariant(propertyType, `invalid property: ${prop.toString()}`);\n return Schema.make(propertyType);\n }\n}\n\n/**\n * Tuple AST is used both for:\n * fixed-length tuples ([string, number]) in which case AST will be { elements: [Schema.String, Schema.Number] }\n * variable-length arrays (Array<string | number>) in which case AST will be { rest: [Schema.Union(Schema.String, Schema.Number)] }\n */\nconst getArrayElementSchema = (\n tupleAst: SchemaAST.TupleType,\n property: string | symbol | number,\n): Schema.Schema.AnyNoContext => {\n const elementIndex = typeof property === 'string' ? parseInt(property, 10) : Number.NaN;\n if (Number.isNaN(elementIndex)) {\n invariant(property === 'length', `invalid array property: ${String(property)}`);\n return Schema.Number;\n }\n if (elementIndex < tupleAst.elements.length) {\n const elementType = tupleAst.elements[elementIndex].type;\n return Schema.make(elementType).annotations(elementType.annotations);\n }\n\n const restType = tupleAst.rest;\n return Schema.make(restType[0].type).annotations(restType[0].annotations);\n};\n\nconst flattenUnion = (typeAst: SchemaAST.AST): SchemaAST.AST[] =>\n SchemaAST.isUnion(typeAst) ? typeAst.types.flatMap(flattenUnion) : [typeAst];\n\nconst getProperties = (\n typeAst: SchemaAST.AST,\n getTargetPropertyFn: (propertyName: string) => any,\n): SchemaAST.PropertySignature[] => {\n const astCandidates = flattenUnion(typeAst);\n const typeAstList = astCandidates.filter((type) => SchemaAST.isTypeLiteral(type)) as SchemaAST.TypeLiteral[];\n if (typeAstList.length === 0) {\n return [];\n }\n if (typeAstList.length === 1) {\n return SchemaAST.getPropertySignatures(typeAstList[0]);\n }\n\n const typeDiscriminators = getTypeDiscriminators(typeAstList);\n const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));\n const typeIndex = typeDiscriminators.findIndex((p) => targetPropertyValue === (p.type as SchemaAST.Literal).literal);\n invariant(typeIndex !== -1, 'discriminator field not set on target');\n return SchemaAST.getPropertySignatures(typeAstList[typeIndex]);\n};\n\nconst getPropertyType = (\n ast: SchemaAST.AST,\n propertyName: string,\n getTargetPropertyFn: (propertyName: string) => any,\n): SchemaAST.AST | null => {\n const anyOrObject = unwrapAst(\n ast,\n (candidate) => SchemaAST.isAnyKeyword(candidate) || SchemaAST.isObjectKeyword(candidate),\n );\n if (anyOrObject != null) {\n return ast;\n }\n\n const typeOrDiscriminatedUnion = unwrapAst(ast, (t) => {\n return SchemaAST.isTypeLiteral(t) || (SchemaAST.isUnion(t) && t.types.some((t) => SchemaAST.isTypeLiteral(t)));\n });\n if (typeOrDiscriminatedUnion == null) {\n return null;\n }\n\n const targetProperty = getProperties(typeOrDiscriminatedUnion, getTargetPropertyFn).find(\n (p) => p.name === propertyName,\n );\n if (targetProperty != null) {\n return unwrapAst(targetProperty.type);\n }\n\n const indexSignatureType = unwrapAst(ast, SchemaAST.isTypeLiteral);\n if (\n indexSignatureType &&\n SchemaAST.isTypeLiteral(indexSignatureType) &&\n indexSignatureType.indexSignatures.length > 0\n ) {\n return unwrapAst(indexSignatureType.indexSignatures[0].type);\n }\n\n return null;\n};\n\nconst getTypeDiscriminators = (typeAstList: SchemaAST.TypeLiteral[]): SchemaAST.PropertySignature[] => {\n const discriminatorPropCandidates = typeAstList\n .flatMap(SchemaAST.getPropertySignatures)\n .filter((p) => SchemaAST.isLiteral(p.type));\n const propertyName = discriminatorPropCandidates[0].name;\n const isValidDiscriminator = discriminatorPropCandidates.every((p) => p.name === propertyName && !p.isOptional);\n const everyTypeHasDiscriminator = discriminatorPropCandidates.length === typeAstList.length;\n const isDiscriminatedUnion = isValidDiscriminator && everyTypeHasDiscriminator;\n invariant(isDiscriminatedUnion, 'type ambiguity: every type in a union must have a single unique-literal field');\n return discriminatorPropCandidates;\n};\n\n/**\n * Used to check that rootAst is for a type matching the provided predicate.\n * That's not always straightforward because types of optionality and recursive types.\n * const Task = Schema.Struct({\n * ...,\n * previous?: Schema.optional(Schema.suspend(() => Task)),\n * });\n * Here the AST for `previous` field is going to be Union(Suspend(Type), Undefined).\n * SchemaAST.isTypeLiteral(field) will return false, but unwrapAst(field, (ast) => SchemaAST.isTypeLiteral(ast))\n * will return true.\n */\nconst unwrapAst = (rootAst: SchemaAST.AST, predicate?: (ast: SchemaAST.AST) => boolean): SchemaAST.AST | null => {\n let ast: SchemaAST.AST | undefined = rootAst;\n while (ast != null) {\n if (predicate?.(ast)) {\n return ast;\n }\n\n if (SchemaAST.isUnion(ast)) {\n const next: any = ast.types.find((t) => (predicate != null && predicate(t)) || SchemaAST.isSuspend(t));\n if (next != null) {\n ast = next;\n continue;\n }\n }\n\n if (SchemaAST.isSuspend(ast)) {\n ast = ast.f();\n } else {\n return predicate == null ? ast : null;\n }\n }\n\n return null;\n};\n\nconst unwrapArray = (ast: SchemaAST.AST) => unwrapAst(ast, SchemaAST.isTupleType) as SchemaAST.TupleType | null;\n\nexport const checkIdNotPresentOnSchema = (schema: Schema.Schema<any, any, any>) => {\n invariant(SchemaAST.isTypeLiteral(schema.ast));\n const idProperty = SchemaAST.getPropertySignatures(schema.ast).find((prop) => prop.name === 'id');\n if (idProperty != null) {\n throw new Error('\"id\" property name is reserved');\n }\n};\n\n// TODO(burdon): Reconcile with JsonPath.\ntype KeyPath = readonly (string | number)[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type RefTypeId } from '../../Ref/ref';\nimport { getProxyTarget, isProxy } from './proxy-utils';\nimport { ChangeId, EventId } from './symbols';\n\n/**\n * Subscribe to changes on a reactive object.\n * @param obj - The reactive object to subscribe to.\n * @param callback - Called when the object changes.\n * @returns Unsubscribe function.\n */\n// TODO(wittjosiah): Consider throwing if obj doesn't have EventId instead of returning no-op.\nexport const subscribe = (obj: unknown, callback: () => void): (() => void) => {\n // Guard against non-reactive inputs (queue-stored typed objects, snapshots, plain shapes\n // with branded symbols) before `getProxyTarget`'s `ProxyHandlerSlot` invariant kicks in.\n // `Obj.isObject` (KindId-based) is satisfied by these inputs, so callers like\n // `Atom.family((obj) => Atom.make((get) => Obj.subscribe(obj, ...)))` legitimately reach\n // here with a non-proxy. Falling back to a no-op preserves the documented contract that\n // values without subscription support get a no-op unsubscribe.\n if (!isProxy(obj)) {\n return () => {};\n }\n const target = getProxyTarget(obj as any);\n if (target && EventId in target) {\n return (target as any)[EventId].on(callback);\n }\n return () => {};\n};\n\n/**\n * Deeply removes readonly modifiers from all properties of T.\n * Inside Obj.update, all properties are fully mutable regardless of schema definition.\n * Ref types are preserved as-is since they are value-like objects that are replaced, not mutated.\n * Primitive types (including branded primitives) are preserved as-is.\n */\nexport type Mutable<T> = T extends string | number | boolean | bigint | symbol | null | undefined\n ? T // Primitives (including branded primitives like JsonPath) stay as-is.\n : T extends { [RefTypeId]: any }\n ? T // Keep Ref types as-is (they're value-like, not mutated in place).\n : T extends object\n ? T extends readonly (infer U)[]\n ? Mutable<U>[]\n : { -readonly [K in keyof T]: Mutable<T[K]> }\n : T;\n\n/**\n * Callback type for the change function.\n */\nexport type ChangeCallback<T> = (mutableObj: Mutable<T>) => void;\n\n/**\n * Perform mutations on a reactive object within a change context.\n *\n * If the object has a change handler (via ChangeId), it will be called with the callback.\n * This allows handlers to implement features like:\n * - Readonly enforcement (mutations only allowed within change context)\n * - Batched notifications (single notification for all mutations in the callback)\n * - Transaction semantics\n *\n * If the object doesn't have a change handler, the callback is called directly.\n *\n * @param obj - The reactive object to mutate.\n * @param callback - Callback that receives a mutable view of the object.\n */\nexport const change = <T>(obj: T, callback: ChangeCallback<T>): void => {\n // Check proxy first (allows handler to intercept), then fall back to target.\n // This order is important for EchoReactiveHandler which handles ChangeId in the proxy trap.\n const changeFn = (obj as any)[ChangeId];\n if (changeFn) {\n changeFn(callback);\n } else {\n callback(obj as Mutable<T>);\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { type DXN } from '@dxos/keys';\nimport { assumeType } from '@dxos/util';\n\nimport type { AnyEntity } from '../common/types';\nimport { type InternalObjectProps, ObjectDatabaseId } from './model';\nimport { getObjectDXN } from './util';\n\n/**\n * Get the DXN of an entity.\n * Accepts both reactive entities and snapshots.\n */\nexport const getDXN = (entity: AnyEntity): DXN => {\n const dxn = getObjectDXN(entity);\n invariant(dxn != null, 'Invalid entity.');\n return dxn;\n};\n\n/**\n * Get the database the entity belongs to.\n * Accepts both reactive entities and snapshots.\n */\nexport const getDatabase = (entity: AnyEntity): any | undefined => {\n assumeType<InternalObjectProps>(entity);\n return entity[ObjectDatabaseId];\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\n\nimport { type ForeignKey } from '@dxos/echo-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { DXN, ObjectId } from '@dxos/keys';\nimport { assumeType } from '@dxos/util';\n\nimport type * as Database from '../../Database';\nimport {\n type ATTR_META,\n type ATTR_PARENT,\n type ATTR_TYPE,\n ATTR_DELETED,\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n ATTR_SELF_DXN,\n EntityKind,\n KindId,\n type MetaId,\n ObjectDatabaseId,\n ObjectDeletedId,\n type ObjectMeta,\n ObjectVersionId,\n type ParentId,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n type SchemaId,\n SelfDXNId,\n TypeId,\n type Version,\n} from '../common/types';\n\nexport { ATTR_DELETED, ATTR_SELF_DXN, ObjectDatabaseId, ObjectDeletedId, ObjectVersionId, SelfDXNId };\n\n/**\n * Internal runtime representation of an object.\n * The fields are accessed through getter functions.\n */\n// NOTE: Each symbol has a jsdoc describing its purpose.\nexport interface InternalObjectProps {\n readonly id: ObjectId;\n readonly [SelfDXNId]: DXN;\n readonly [KindId]: EntityKind;\n readonly [SchemaId]: Schema.Schema.AnyNoContext;\n readonly [TypeId]: DXN;\n readonly [MetaId]?: ObjectMeta;\n [ParentId]?: InternalObjectProps;\n readonly [ObjectDatabaseId]?: Database.Database;\n readonly [ObjectDeletedId]?: boolean;\n readonly [ObjectVersionId]?: Version;\n readonly [RelationSourceDXNId]?: DXN;\n readonly [RelationTargetDXNId]?: DXN;\n readonly [RelationSourceId]?: InternalObjectProps;\n readonly [RelationTargetId]?: InternalObjectProps;\n}\n\n/**\n * Entity metadata.\n */\nexport interface ObjectMetaJSON {\n keys: ForeignKey[];\n tags?: string[];\n}\n\n/**\n * JSON representation of an object or relation metadata.\n */\nexport interface ObjectJSON {\n id: string;\n [ATTR_TYPE]: DXN.String;\n [ATTR_SELF_DXN]?: DXN.String;\n [ATTR_PARENT]?: string; // Encoded reference\n [ATTR_DELETED]?: boolean;\n [ATTR_META]?: ObjectMetaJSON;\n [ATTR_RELATION_SOURCE]?: DXN.String;\n [ATTR_RELATION_TARGET]?: DXN.String;\n\n /**\n * Application-specific properties.\n */\n [key: string]: unknown;\n}\n\n/**\n * NOTE: Keep as `function` to avoid type inference issues.\n */\nexport function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {\n invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');\n assumeType<InternalObjectProps>(obj);\n invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');\n invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');\n invariant(\n obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,\n 'Invalid object model: invalid entity kind',\n );\n\n if (obj[KindId] === EntityKind.Relation) {\n invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');\n invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');\n invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');\n invariant(!(obj[RelationTargetId] instanceof DXN), 'Invalid object model: target pointer is a DXN');\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { DXN, ObjectId } from '@dxos/keys';\nimport { assumeType } from '@dxos/util';\n\nimport { type InternalObjectProps, SelfDXNId } from './model';\n\n/**\n * Returns a DXN for an object or schema.\n *\n * @internal\n */\nexport const getObjectDXN = (object: any): DXN | undefined => {\n invariant(!Schema.isSchema(object), 'schema not allowed in this function');\n assertArgument(typeof object === 'object' && object != null, 'object', 'expected object');\n assumeType<InternalObjectProps>(object);\n\n if (object[SelfDXNId]) {\n invariant(object[SelfDXNId] instanceof DXN, 'Invalid object model: invalid self dxn');\n return object[SelfDXNId];\n }\n\n if (!ObjectId.isValid(object.id)) {\n throw new TypeError('Object id is not valid.');\n }\n\n return DXN.fromLocalObjectId(object.id);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport type * as SchemaAST from 'effect/SchemaAST';\nimport type * as Types from 'effect/Types';\n\nimport { type ToMutable } from '@dxos/util';\n\nimport { type TypeMeta } from '../Annotation';\nimport { type AnyEntity, type EntityKind, SchemaKindId } from '../common/types';\n\n// TODO(burdon): Define Schema type for `typename` and use consistently for all DXN-like properties.\n\n// type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];\nexport type EchoTypeSchemaProps<T, ExtraFields = {}> = Types.Simplify<AnyEntity & ToMutable<T> & ExtraFields>;\n\n// TODO(burdon): Rename EchoEntitySchema.\nexport interface EchoTypeSchema<\n Self extends Schema.Schema.Any,\n ExtraFields = {},\n K extends EntityKind = EntityKind,\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n>\n extends\n TypeMeta,\n Schema.AnnotableClass<\n EchoTypeSchema<Self, ExtraFields, K, Fields>,\n EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields>,\n EchoTypeSchemaProps<Schema.Schema.Encoded<Self>, ExtraFields>,\n Schema.Schema.Context<Self>\n > {\n /**\n * Schema kind key that marks this as an ECHO schema and indicates its kind.\n * Makes EchoTypeSchema satisfy the Type.AnyObj or Type.Relation.Any type.\n */\n readonly [SchemaKindId]: K;\n\n /**\n * The fields defined in the original struct schema.\n * Allows accessing field definitions for introspection.\n */\n readonly fields: Fields;\n\n instanceOf(value: unknown): boolean;\n}\n\n// type MakeProps =\n// | boolean\n// | {\n// readonly disableValidation?: boolean;\n// };\n\n// NOTE: Utils copied from Effect `Schema.ts`.\n// const _ownKeys = (o: object): Array<PropertyKey> =>\n// (Object.keys(o) as Array<PropertyKey>).concat(Object.getOwnPropertySymbols(o));\n\n// const _lazilyMergeDefaults = (\n// fields: Schema.Struct.Fields,\n// out: Record<PropertyKey, unknown>,\n// ): { [x: string | symbol]: unknown } => {\n// const ownKeys = _ownKeys(fields);\n// for (const key of ownKeys) {\n// const field = fields[key];\n// if (out[key] === undefined && Schema.isPropertySignature(field)) {\n// const ast = field.ast;\n// const defaultValue = ast._tag === 'PropertySignatureDeclaration' ? ast.defaultValue : ast.to.defaultValue;\n// if (defaultValue !== undefined) {\n// out[key] = defaultValue();\n// }\n// }\n// }\n// return out;\n// };\n\n// const _getDisableValidationMakeOption = (options: MakeProps | undefined): boolean =>\n// Predicate.isBoolean(options) ? options : options?.disableValidation ?? false;\n\n/**\n * @internal\n */\nexport const makeEchoTypeSchema = <\n Self extends Schema.Schema.Any,\n K extends EntityKind = EntityKind,\n // TODO(wittjosiah): Can this be inferred from the schema?\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n>(\n fields: Fields,\n ast: SchemaAST.AST,\n typename: string,\n version: string,\n kind: K,\n): EchoTypeSchema<Self, {}, K, Fields> => {\n return class EchoObjectSchemaClass extends Schema.make<\n EchoTypeSchemaProps<Schema.Schema.Type<Self>>,\n EchoTypeSchemaProps<Schema.Schema.Encoded<Self>>,\n Schema.Schema.Context<Self>\n >(ast) {\n static readonly typename = typename;\n static readonly version = version;\n static readonly [SchemaKindId] = kind;\n static readonly fields = fields;\n\n static override annotations(\n annotations: Schema.Annotations.GenericSchema<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>,\n ): EchoTypeSchema<Self, {}, K, Fields> {\n const schema = Schema.make<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>(ast).annotations(annotations);\n return makeEchoTypeSchema<Self, K, Fields>(fields, schema.ast, typename, version, kind);\n }\n\n // static make(\n // props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never\n // ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>\n // : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,\n // options?: MakeProps,\n // ): Simplify<Schema.TypeLiteral.Type<Fields, []>> {\n // const propsWithDefaults: any = _lazilyMergeDefaults(fields, { ...(props as any) });\n // return _getDisableValidationMakeOption(options)\n // ? propsWithDefaults\n // : ParseResult.validateSync(this)(propsWithDefaults);\n // }\n\n static instanceOf(value: unknown): boolean {\n return Schema.is(this)(value);\n }\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { type TypeAnnotation, TypeAnnotationId, type TypeMeta, makeTypeJsonSchemaAnnotation } from '../Annotation';\nimport { EntityKind } from '../common/types';\nimport { type EchoTypeSchema, makeEchoTypeSchema } from './entity';\n\n/**\n * Object schema type with kind marker.\n */\nexport type EchoObjectSchema<\n Self extends Schema.Schema.Any,\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n> = EchoTypeSchema<Self, {}, EntityKind.Object, Fields>;\n\n/**\n * Schema for Obj entity types.\n * Pipeable function to add ECHO object annotations to a schema.\n */\nexport const EchoObjectSchema: {\n (\n meta: TypeMeta,\n ): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ) => EchoObjectSchema<Self, Fields>;\n} = ({ typename, version }) => {\n return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ): EchoObjectSchema<Self, Fields> => {\n invariant(typeof TypeAnnotationId === 'symbol', 'Sanity.');\n invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');\n\n // Extract fields from the schema if available (Struct schemas have .fields).\n const fields = ((self as any).fields ?? {}) as Fields;\n\n const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));\n const ast = SchemaAST.annotations(schemaWithId.ast, {\n // TODO(dmaretskyi): `extend` kills the annotations.\n ...self.ast.annotations,\n [TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,\n // TODO(dmaretskyi): TypeIdentifierAnnotationId?\n [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({\n kind: EntityKind.Object,\n typename,\n version,\n }),\n });\n\n return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(fields, ast, typename, version, EntityKind.Object);\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { raise } from '@dxos/debug';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\n\nimport {\n type TypeAnnotation,\n TypeAnnotationId,\n type TypeMeta,\n getEntityKind,\n getSchemaTypename,\n getTypeIdentifierAnnotation,\n makeTypeJsonSchemaAnnotation,\n} from '../Annotation';\nimport {\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n EntityKind,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n} from '../common/types';\n\nexport {\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n};\n\nimport { type EchoTypeSchema, makeEchoTypeSchema } from './entity';\n\n/**\n * Source and target props on relations.\n */\n// TODO(burdon): any?\nexport type RelationSourceTargetRefs<Source = any, Target = any> = {\n /**\n * Source ECHO live object.\n */\n [RelationSourceId]: Source;\n\n /**\n * Target ECHO live object.\n */\n [RelationTargetId]: Target;\n};\n\nexport type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;\nexport type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;\n\nexport type EchoRelationSchemaOptions<\n TSource extends Schema.Schema.AnyNoContext,\n TTarget extends Schema.Schema.AnyNoContext,\n> = TypeMeta & {\n source: TSource;\n target: TTarget;\n};\n\n/**\n * Relation schema type with kind marker.\n */\nexport type EchoRelationSchema<\n Self extends Schema.Schema.Any,\n Source extends Schema.Schema.AnyNoContext,\n Target extends Schema.Schema.AnyNoContext,\n Fields extends Schema.Struct.Fields = Schema.Struct.Fields,\n> = EchoTypeSchema<\n Self,\n RelationSourceTargetRefs<Schema.Schema.Type<Source>, Schema.Schema.Type<Target>>,\n EntityKind.Relation,\n Fields\n>;\n\n/**\n * Schema for Relation entity types.\n */\nexport const EchoRelationSchema = <\n Source extends Schema.Schema.AnyNoContext,\n Target extends Schema.Schema.AnyNoContext,\n>({\n source,\n target,\n typename,\n version,\n}: EchoRelationSchemaOptions<Source, Target>) => {\n assertArgument(Schema.isSchema(source), 'source');\n assertArgument(Schema.isSchema(target), 'target');\n const sourceDXN = getDXNForRelationSchemaRef(source);\n const targetDXN = getDXNForRelationSchemaRef(target);\n if (getEntityKind(source) !== EntityKind.Object) {\n raise(new Error('Source schema must be an echo object schema.'));\n }\n if (getEntityKind(target) !== EntityKind.Object) {\n raise(new Error('Target schema must be an echo object schema.'));\n }\n\n return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(\n self: Self & { fields?: Fields },\n ): EchoRelationSchema<Self, Source, Target, Fields> => {\n invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');\n\n // Extract fields from the schema if available (Struct schemas have .fields).\n const fields = ((self as any).fields ?? {}) as Fields;\n\n const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));\n const ast = SchemaAST.annotations(schemaWithId.ast, {\n // TODO(dmaretskyi): `extend` kills the annotations.\n ...self.ast.annotations,\n [TypeAnnotationId]: {\n kind: EntityKind.Relation,\n typename,\n version,\n sourceSchema: sourceDXN,\n targetSchema: targetDXN,\n } satisfies TypeAnnotation,\n // TODO(dmaretskyi): TypeIdentifierAnnotationId?\n\n [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({\n kind: EntityKind.Relation,\n typename,\n version,\n relationSource: sourceDXN,\n relationTarget: targetDXN,\n }),\n });\n\n return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(fields, ast, typename, version, EntityKind.Relation);\n };\n};\n\nconst getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): string => {\n assertArgument(Schema.isSchema(schema), 'schema');\n const identifier = getTypeIdentifierAnnotation(schema);\n if (identifier) {\n return identifier;\n }\n\n const typename = getSchemaTypename(schema);\n if (!typename) {\n throw new Error('Schema must have a typename');\n }\n\n return DXN.fromTypename(typename).toString();\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { assertArgument } from '@dxos/invariant';\n\nimport { type AnyEntity, VersionTypeId } from '../common/types';\nimport { ObjectVersionId } from './model';\n\n/**\n * Represent entity version.\n * May be backed by Automerge.\n * Entities with no history are not versioned.\n * Named EntityVersion to avoid conflict with types/version.ts.\n */\nexport interface EntityVersion {\n [VersionTypeId]: {};\n\n /**\n * Whether the entity is versioned.\n */\n versioned: boolean;\n\n /**\n * Automerge heads.\n */\n automergeHeads?: string[];\n}\n\nconst unversioned: EntityVersion = {\n [VersionTypeId]: {},\n versioned: false,\n};\n\n/**\n * Checks that `obj` is a version object.\n */\nexport const isVersion = (entity: unknown): entity is EntityVersion => {\n return entity != null && typeof entity === 'object' && VersionTypeId in entity;\n};\n\n/**\n * Returns the version of an entity.\n * Accepts both reactive entities and snapshots.\n */\nexport const version = (entity: AnyEntity): EntityVersion => {\n const ver = (entity as any)[ObjectVersionId];\n if (ver === undefined) {\n return unversioned;\n }\n return ver;\n};\n\n/**\n * Checks that `version` is a valid version object.\n */\nexport const versionValid = (ver: EntityVersion): boolean => {\n assertArgument(isVersion(ver), 'version', 'Invalid version object');\n return !!ver.versioned;\n};\n\nexport type VersionCompareResult = 'unversioned' | 'equal' | 'different';\n\n/**\n * Compares two versions.\n * @param version1\n * @param version2\n * @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.\n */\nexport const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {\n assertArgument(isVersion(version1), 'version1', 'Invalid version object');\n assertArgument(isVersion(version2), 'version2', 'Invalid version object');\n\n if (!versionValid(version1) || !versionValid(version2)) {\n return 'unversioned';\n }\n\n if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {\n return 'different';\n }\n if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {\n return 'different';\n }\n\n return 'equal';\n};\n\nexport const encodeVersion = (ver: EntityVersion): string => {\n return JSON.stringify(ver);\n};\n\nexport const decodeVersion = (ver: string): EntityVersion => {\n const parsed = JSON.parse(ver);\n parsed[VersionTypeId] = {};\n return parsed;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Types from 'effect/Types';\n\nimport { JsonSchemaFields, type JsonSchemaType } from './json-schema-type';\n\n/**\n * Normalize schema to to draft-07 format.\n * Note: the input type does not necessarily match the {@link JsonSchemaType} type.\n */\nexport const normalizeSchema = (schema: JsonSchemaType): JsonSchemaType => {\n const copy = structuredClone(schema) as Types.DeepMutable<JsonSchemaType>;\n go(copy);\n return copy;\n};\n\nconst go = (schema: Types.DeepMutable<JsonSchemaType>) => {\n if (typeof schema !== 'object' || schema === null) {\n return;\n }\n\n if ((schema as any).exclusiveMaximum === true) {\n schema.exclusiveMaximum = schema.maximum;\n delete (schema as any).exclusiveMaximum;\n } else if ((schema as any).exclusiveMaximum === false) {\n delete (schema as any).exclusiveMaximum;\n }\n\n if ((schema as any).exclusiveMinimum === true) {\n schema.exclusiveMinimum = schema.minimum;\n delete (schema as any).exclusiveMinimum;\n } else if ((schema as any).exclusiveMinimum === false) {\n delete (schema as any).exclusiveMinimum;\n }\n\n // Delete all properties that are not in the JsonSchemaFields.\n for (const key of Object.keys(schema)) {\n if (!JsonSchemaFields.includes(key)) {\n delete (schema as any)[key];\n }\n }\n\n // Recursively normalize the schema.\n // Recursively normalize the schema.\n if (schema.properties) {\n goOnRecord(schema.properties);\n }\n if (schema.patternProperties) {\n goOnRecord(schema.patternProperties);\n }\n if (schema.propertyNames) {\n go(schema.propertyNames);\n }\n if (schema.definitions) {\n goOnRecord(schema.definitions);\n }\n if (schema.items) {\n maybeGoOnArray(schema.items);\n }\n if (schema.additionalItems) {\n maybeGoOnArray(schema.additionalItems);\n }\n if (schema.contains) {\n go(schema.contains);\n }\n if (schema.if) {\n go(schema.if);\n }\n if (schema.then) {\n go(schema.then);\n }\n if (schema.else) {\n go(schema.else);\n }\n if (schema.allOf) {\n maybeGoOnArray(schema.allOf);\n }\n if (schema.anyOf) {\n maybeGoOnArray(schema.anyOf);\n }\n if (schema.oneOf) {\n maybeGoOnArray(schema.oneOf);\n }\n if (schema.not) {\n go(schema.not);\n }\n if (schema.$defs) {\n goOnRecord(schema.$defs);\n }\n if (schema.reference) {\n go(schema.reference.schema);\n }\n};\n\nconst maybeGoOnArray = (value: any) => {\n if (Array.isArray(value)) {\n for (const item of value) {\n go(item);\n }\n } else if (typeof value === 'object' && value !== null) {\n go(value);\n }\n};\n\nconst goOnRecord = (record: Record<string, any>) => {\n for (const key of Object.keys(record)) {\n go(record[key]);\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { getTypename } from '../Annotation';\nimport { type AnyProperties } from '../common/types';\n\n// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).\nexport type TypedObjectOptions = {\n // TODO(burdon): Document.\n partial?: true;\n // TODO(burdon): Document.\n record?: true;\n};\n\n/**\n *\n */\n// TODO(burdon): Comment required.\n// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).\ntype SimplifiedSchemaFields<\n SchemaFields extends Schema.Struct.Fields,\n Options extends TypedObjectOptions,\n> = Options['partial'] extends boolean\n ? Schema.SimplifyMutable<Partial<Schema.Struct.Type<SchemaFields>>>\n : Schema.SimplifyMutable<Schema.Struct.Type<SchemaFields>>;\n\n/**\n *\n */\n// TODO(burdon): Comment required.\n// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).\nexport type TypedObjectFields<\n SchemaFields extends Schema.Struct.Fields,\n Options extends TypedObjectOptions,\n> = SimplifiedSchemaFields<SchemaFields, Options> & { id: string } & (Options['record'] extends boolean\n ? Schema.SimplifyMutable<Schema.IndexSignature.Type<Schema.IndexSignature.Records>>\n : {});\n\nexport const makeTypedEntityClass = (\n typename: string,\n version: string,\n baseSchema: Schema.Schema.AnyNoContext,\n): Schema.SchemaClass<any> => {\n return class {\n // Implement TypedObject properties.\n static readonly typename = typename;\n static readonly version = version;\n\n // Implement Schema.Schema properties.\n // TODO(burdon): Comment required.\n static readonly [Schema.TypeId] = schemaVariance;\n static readonly ast = baseSchema.ast;\n static readonly annotations = baseSchema.annotations.bind(baseSchema);\n static readonly pipe = baseSchema.pipe.bind(baseSchema);\n\n // TODO(burdon): Comment required.\n static [Symbol.hasInstance](obj: AnyProperties) {\n return obj != null && getTypename(obj) === typename;\n }\n\n // TODO(burdon): Throw APIError.\n private constructor() {\n throw new Error('Use live(Typename, { ...fields }) to instantiate an object.');\n }\n } as any;\n};\n\nconst schemaVariance = {\n _A: (_: any) => _,\n _I: (_: any) => _,\n _R: (_: never) => _,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\n\nimport { raise } from '@dxos/debug';\nimport { assertArgument, failedInvariant } from '@dxos/invariant';\nimport { ObjectId } from '@dxos/keys';\n\nimport { getSchemaDXN, getTypeAnnotation, setTypename } from '../Annotation';\nimport { defineHiddenProperty } from '../common/proxy';\nimport { EntityKind, KindId, MetaId, setSchema } from '../common/types';\nimport {\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n assertObjectModel,\n getObjectDXN,\n} from '../Entity';\nimport { attachedTypedObjectInspector } from './inspect';\nimport { attachTypedJsonSerializer } from './json-serializer';\n\nexport type CreateObjectProps<T> = T extends { id: string } ? Omit<T, 'id' | KindId> & { id?: string } : T;\n\n/**\n * Creates a new object instance from a schema and data, without signal reactivity.\n * This static version creates plain JavaScript objects that are not reactive/observable.\n * For reactive objects that automatically update UI when changed, use the regular live() function.\n *\n * @param schema - The Effect schema that defines the object's structure and type, piped into EchoObjectSchema\n * @param data - The data to initialize the object with. The id and @type fields are handled automatically.\n * @returns A new non-reactive object instance conforming to the schema\n * @throws {Error} If the schema is not an object schema\n * @throws {TypeError} If data contains an @type field\n *\n * @example\n * ```ts\n * const Contact = Schema.Struct({\n * name: Schema.String,\n * email: Schema.String,\n * }).pipe(Type.object({\n * typename: 'com.example.type.person',\n * version: '0.1.0',\n * }))\n *\n * const contact = createObject(Contact, {\n * name: \"John\",\n * email: \"john@example.com\",\n * })\n * ```\n */\n// TODO(burdon): Make internal.\nexport const createObject = <S extends Schema.Schema.AnyNoContext>(\n schema: S,\n props: CreateObjectProps<Schema.Schema.Type<S>>,\n): CreateObjectProps<Schema.Schema.Type<S>> & { id: string; [KindId]: EntityKind } => {\n const annotation = getTypeAnnotation(schema);\n if (!annotation) {\n throw new Error('Schema is not an ECHO schema');\n }\n assertArgument(!('@type' in props), 'data', '@type is not allowed');\n assertArgument(!(RelationSourceDXNId in props), 'data', 'Relation source DXN is not allowed in the constructor');\n assertArgument(!(RelationTargetDXNId in props), 'data', 'Relation target DXN is not allowed in the constructor');\n assertArgument(\n RelationSourceId in props === RelationTargetId in props,\n 'data',\n 'Relation source and target must be provided together',\n );\n\n // Raw object.\n const obj = { ...props, id: props.id ?? ObjectId.random() };\n\n // Metadata.\n const kind = RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;\n defineHiddenProperty(obj, KindId, kind);\n defineHiddenProperty(obj, MetaId, { keys: [] });\n setSchema(obj, schema);\n setTypename(obj, getSchemaDXN(schema) ?? failedInvariant('Missing schema DXN'));\n attachTypedJsonSerializer(obj);\n attachedTypedObjectInspector(obj);\n\n // Relation.\n if (kind === EntityKind.Relation) {\n const sourceDXN = getObjectDXN(props[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));\n const targetDXN = getObjectDXN(props[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));\n defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);\n defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);\n }\n\n assertObjectModel(obj);\n return obj;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type { InspectOptionsStylized, inspect as inspectFn } from 'node:util';\n\nimport { type CustomInspectFunction, inspectCustom } from '@dxos/debug';\n\nimport { getTypeDXN } from '../Annotation';\nimport { ATTR_META, ATTR_TYPE, type AnyEntity, MetaId } from '../common/types';\n\n/*\n * @internal\n */\nexport const attachedTypedObjectInspector = (obj: any) => {\n const descriptor = Object.getOwnPropertyDescriptor(obj, inspectCustom);\n if (descriptor) {\n return;\n }\n\n Object.defineProperty(obj, inspectCustom, {\n value: typedObjectInspectFunction,\n writable: false,\n enumerable: false,\n configurable: true,\n });\n};\n\n// NOTE: KEEP as function.\nconst typedObjectInspectFunction: CustomInspectFunction<AnyEntity> = function (\n this: AnyEntity,\n depth: number,\n options: InspectOptionsStylized,\n inspect: typeof inspectFn,\n) {\n const { id, ...props } = this;\n return inspect(\n {\n id,\n [ATTR_TYPE]: getTypeDXN(this),\n ...props,\n [ATTR_META]: (this as any)[MetaId], // TODO(dmaretskyi): Couldn't use getMeta since that throw's if the object has no meta.\n },\n options,\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { raise } from '@dxos/debug';\nimport { type EncodedReference, ObjectStructure, isEncodedReference } from '@dxos/echo-protocol';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { DXN, ObjectId } from '@dxos/keys';\nimport { assumeType, deepMapValues, visitValues } from '@dxos/util';\n\nimport type * as Database from '../../Database';\nimport type * as Obj from '../../Obj';\nimport { getTypeDXN, setTypename } from '../Annotation';\nimport { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';\nimport {\n ATTR_META,\n ATTR_PARENT,\n ATTR_TYPE,\n type AnyEntity,\n EntityKind,\n KindId,\n MetaId,\n ObjectMetaSchema,\n ParentId,\n setSchema,\n} from '../common/types';\nimport {\n ATTR_DELETED,\n ATTR_RELATION_SOURCE,\n ATTR_RELATION_TARGET,\n ATTR_SELF_DXN,\n ObjectDatabaseId,\n type ObjectJSON,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n SelfDXNId,\n assertObjectModel,\n} from '../Entity';\nimport { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../Ref';\n\n// Re-export for backward compatibility.\nexport { attachTypedJsonSerializer };\n\ntype DeepReplaceRef<T> =\n T extends Ref<any>\n ? EncodedReference\n : T extends object\n ? {\n [K in keyof T]: DeepReplaceRef<T[K]>;\n }\n : T;\n\ntype SerializedObject<T extends { id: string }> = {\n [K in keyof T]: DeepReplaceRef<T[K]>;\n} & ObjectJSON;\n\n/**\n * Converts object to it's JSON representation.\n */\nexport const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {\n const typename = getTypeDXN(obj)?.toString();\n invariant(typename && typeof typename === 'string');\n return typedJsonSerializer.call(obj);\n};\n\n/**\n * Creates an object from it's json representation.\n * Performs schema validation.\n * References and schema will be resolvable if the `refResolver` is provided.\n * The function need to be async to support resolving the schema as well as the relation endpoints.\n *\n * @param jsonData - JSON representation of the object.\n * @param options.refResolver - Resolver for references.\n * @param options.dxn - Override object DXN.\n * @param options.database - Database to associate with the object.\n */\nexport const objectFromJSON = async (\n jsonData: unknown,\n {\n refResolver,\n dxn,\n database,\n parent,\n }: { refResolver?: RefResolver; dxn?: DXN; database?: Database.Database; parent?: Obj.Unknown } = {},\n): Promise<AnyEntity> => {\n assumeType<ObjectJSON>(jsonData);\n assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');\n assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');\n assertArgument(typeof jsonData.id === 'string', 'jsonData.id', 'expected object to have an id');\n\n const type = DXN.parse(jsonData[ATTR_TYPE]);\n const schema = await refResolver?.resolveSchema(type);\n invariant(schema === undefined || Schema.isSchema(schema));\n const decodedInput = stripInternalJsonKeys(jsonData);\n\n let obj: any;\n if (schema != null) {\n obj = await schema.pipe(Schema.decodeUnknownPromise)(decodedInput);\n if (refResolver) {\n setRefResolverOnData(obj, refResolver);\n }\n } else {\n obj = decodeGeneric(decodedInput, { refResolver });\n }\n\n invariant(ObjectId.isValid(obj.id), 'Invalid object id');\n setTypename(obj, type);\n if (schema) {\n setSchema(obj, schema);\n }\n\n const isRelation =\n typeof jsonData[ATTR_RELATION_SOURCE] === 'string' || typeof jsonData[ATTR_RELATION_TARGET] === 'string';\n if (isRelation) {\n const sourceDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source')));\n const targetDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target')));\n\n const source = (await refResolver?.resolve(sourceDxn)) as AnyEntity | undefined;\n const target = (await refResolver?.resolve(targetDxn)) as AnyEntity | undefined;\n\n defineHiddenProperty(obj, KindId, EntityKind.Relation);\n defineHiddenProperty(obj, RelationSourceDXNId, sourceDxn);\n defineHiddenProperty(obj, RelationTargetDXNId, targetDxn);\n defineHiddenProperty(obj, RelationSourceId, source);\n defineHiddenProperty(obj, RelationTargetId, target);\n } else {\n defineHiddenProperty(obj, KindId, EntityKind.Object);\n }\n\n if (typeof jsonData[ATTR_META] === 'object') {\n const meta = await ObjectMetaSchema.pipe(Schema.decodeUnknownPromise)(jsonData[ATTR_META]);\n invariant(Array.isArray(meta.keys));\n defineHiddenProperty(obj, MetaId, meta);\n } else {\n defineHiddenProperty(obj, MetaId, {\n keys: [],\n });\n }\n\n if (jsonData[ATTR_PARENT]) {\n const parentDxn = DXN.parse(jsonData[ATTR_PARENT]);\n const resolvedParent = (await refResolver?.resolve(parentDxn)) as Obj.Unknown | undefined;\n defineHiddenProperty(obj, ParentId, resolvedParent);\n } else if (parent) {\n defineHiddenProperty(obj, ParentId, parent);\n }\n\n if (dxn) {\n defineHiddenProperty(obj, SelfDXNId, dxn);\n }\n\n if (database) {\n defineHiddenProperty(obj, ObjectDatabaseId, database);\n }\n\n assertObjectModel(obj);\n invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_SELF_DXN] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');\n invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');\n return obj;\n};\n\nconst decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {\n const props = stripInternalJsonKeys(jsonData);\n\n return deepMapValues(props, (value, visitor) => {\n if (isEncodedReference(value)) {\n return refFromEncodedReference(value, options.refResolver);\n }\n\n return visitor(value);\n });\n};\n\nconst stripInternalJsonKeys = (jsonData: unknown) => {\n const {\n [ATTR_TYPE]: _type,\n [ATTR_META]: _meta,\n [ATTR_DELETED]: _deleted,\n [ATTR_SELF_DXN]: _selfDxn,\n [ATTR_RELATION_SOURCE]: _relationSource,\n [ATTR_RELATION_TARGET]: _relationTarget,\n ...props\n } = jsonData as any;\n\n return props;\n};\n\nexport const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) => {\n const visitor = (value: unknown) => {\n if (Ref.isRef(value)) {\n setRefResolver(value, refResolver);\n } else {\n visitValues(value, visitor);\n }\n };\n\n visitor(obj);\n};\n\n/**\n * Convert ObjectStructure to JSON data for indexing.\n * Different from {@link objectToJSON} as it takes the internal {@link ObjectStructure} representation directly\n */\nexport const objectStructureToJson = (objectId: string, structure: ObjectStructure): Obj.JSON => {\n return {\n ...structure.data,\n id: objectId,\n [ATTR_TYPE]: (ObjectStructure.getTypeReference(structure)?.['/'] ?? '') as DXN.String,\n [ATTR_DELETED]: ObjectStructure.isDeleted(structure),\n [ATTR_PARENT]: ObjectStructure.getParent(structure)?.['/'] as DXN.String | undefined,\n [ATTR_RELATION_SOURCE]: ObjectStructure.getRelationSource(structure)?.['/'] as DXN.String | undefined,\n [ATTR_RELATION_TARGET]: ObjectStructure.getRelationTarget(structure)?.['/'] as DXN.String | undefined,\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type AnyProperties } from '../common/types';\nimport { ObjectDeletedId } from '../Entity';\n\n/**\n * @returns `true` if the object has been marked as deleted.\n */\nexport const isDeleted = (obj: AnyProperties): boolean => {\n if ((obj as any)[ObjectDeletedId] === undefined) {\n // TODO(dmaretskyi): Return to prior behavior of throwing.\n // throw new Error('Object does not support deletion marker');\n return false;\n }\n\n return (obj as any)[ObjectDeletedId] ?? false;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { DXN, ObjectId, QueueSubspaceTags, SpaceId } from '@dxos/keys';\n\n/**\n * @deprecated Use `db.queues.create()`\n */\n// TODO(burdon): Move to @dxos/keys.\nexport const createQueueDXN = (spaceId = SpaceId.random(), queueId = ObjectId.random()) =>\n new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId, queueId]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Match from 'effect/Match';\nimport * as Option from 'effect/Option';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport {\n type SchemaProperty,\n getArrayElementType,\n getBaseType,\n getProperties,\n isArrayType,\n isNestedType,\n} from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\n\nimport { type Mutable } from '../common/proxy';\nimport { getSchema } from '../common/types';\n\n/**\n * Set a deeply nested property on an object.\n * Must be called within an Obj.update or Relation.update callback.\n */\nexport const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {\n invariant(path.length > 0, 'Path must not be empty');\n\n const schema = getSchema(obj);\n invariant(schema != null, 'Object must have a schema');\n\n let parent = obj;\n let currentAST: SchemaAST.AST | undefined = schema.ast;\n\n // Navigate to the parent of the target property.\n for (let i = 0; i < path.length - 1; i++) {\n const part = path[i];\n const key = typeof part === 'number' ? part : String(part);\n if (parent[key] === undefined) {\n const propertyAST = getPropertyAST(currentAST, String(part));\n const shouldBeArray = propertyAST ? isArrayType(propertyAST) : false;\n\n if (shouldBeArray) {\n // Create array.\n parent[key] = [];\n } else {\n // TODO(wittjosiah): Is there a better way to handle this than creating an object with defaults?\n // Perhaps properties on objects should be optional by default?\n // Create object with defaults for required fields.\n const objWithDefaults = createObjectWithDefaults(propertyAST);\n parent[key] = objWithDefaults;\n }\n }\n\n parent = parent[key];\n currentAST = getPropertyAST(currentAST, String(part));\n }\n\n const finalKey = path[path.length - 1];\n parent[finalKey] = value;\n\n return value;\n};\n\n/**\n * Helper to get the AST of a nested property.\n * @param ast - Current schema AST.\n * @param propertyName - Name of the property to get.\n * @returns The AST of the nested property, or undefined if not found.\n */\nconst getPropertyAST = (ast: SchemaAST.AST | undefined, propertyName: string): SchemaAST.AST | undefined => {\n if (!ast) {\n return undefined;\n }\n\n if (isNestedType(ast)) {\n const properties = getProperties(ast);\n const property = properties.find((p) => p.name.toString() === propertyName);\n if (property) {\n return getBaseType(property).type;\n }\n }\n\n if (isArrayType(ast)) {\n const elementType = getArrayElementType(ast);\n return elementType;\n }\n\n return undefined;\n};\n\n/**\n * Get all required properties from a schema AST.\n * A property is required if it's not optional.\n *\n * @param ast - Schema AST to inspect.\n * @returns Array of required properties with their types.\n */\nconst getRequiredProperties = (ast: SchemaAST.AST | undefined): SchemaProperty[] => {\n if (!ast) {\n return [];\n }\n\n // Only objects/structs have properties with optional/required distinction.\n if (!isNestedType(ast)) {\n return [];\n }\n\n const properties = getProperties(ast);\n\n // Filter to only required properties (where isOptional === false).\n return properties.filter((p) => !p.isOptional);\n};\n\n/**\n * Get the default value for a primitive type.\n * Returns undefined for non-primitive or unsupported types.\n *\n * @param ast - Type AST.\n * @returns Default value for the type, or undefined.\n */\nconst getDefaultValueForType = (ast: SchemaAST.AST | undefined): any => {\n if (!ast) {\n return undefined;\n }\n\n const defaultValue = SchemaAST.getDefaultAnnotation(ast);\n if (Option.isSome(defaultValue)) {\n return defaultValue.value;\n }\n\n return Match.value(ast).pipe(\n Match.when({ _tag: 'StringKeyword' }, () => ''),\n Match.when({ _tag: 'NumberKeyword' }, () => 0),\n Match.when({ _tag: 'BooleanKeyword' }, () => false),\n Match.orElse(() => undefined),\n );\n};\n\n/**\n * Create an object with default values for all required properties.\n * Handles primitive types (String, Number, Boolean) and recursively initializes required nested objects.\n *\n * @param ast - Schema AST describing the object structure.\n * @returns Object with required fields populated with defaults.\n */\nconst createObjectWithDefaults = (ast: SchemaAST.AST | undefined): any => {\n if (!ast) {\n return {};\n }\n\n const requiredProps = getRequiredProperties(ast);\n const obj: any = {};\n\n for (const prop of requiredProps) {\n const defaultValue = getDefaultValueForType(prop.type);\n if (defaultValue !== undefined) {\n obj[prop.name] = defaultValue;\n } else if (isNestedType(prop.type)) {\n obj[prop.name] = createObjectWithDefaults(prop.type);\n }\n }\n\n return obj;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { assertArgument } from '@dxos/invariant';\nimport { deepMapValues } from '@dxos/util';\n\nimport {\n KindId,\n MetaId,\n ObjectDatabaseId,\n ObjectDeletedId,\n RelationSourceDXNId,\n RelationSourceId,\n RelationTargetDXNId,\n RelationTargetId,\n SchemaId,\n SelfDXNId,\n SnapshotKindId,\n TypeId,\n} from '../common/types';\n\n/**\n * Copy a Symbol-keyed property from source to target if it has a defined value.\n * Handles both plain objects (symbol in source) and proxies where get returns a value\n * but has/in returns false (e.g. ObjectDatabaseId on echo-db proxies).\n * Optional transform clones or mutates the value before assignment (e.g. for MetaId).\n */\nconst copySymbolProperty = (\n source: any,\n target: any,\n symbol: symbol,\n transform?: (value: unknown) => unknown,\n): void => {\n let value: unknown;\n // Echo-db proxy getters (e.g. RelationSourceId, RelationTargetId) can throw in certain states.\n try {\n value = source[symbol];\n } catch {\n return;\n }\n if (value !== undefined) {\n const finalValue = transform ? transform(value) : value;\n Object.defineProperty(target, symbol, {\n value: finalValue,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n }\n};\n\n/**\n * Returns an immutable snapshot of the reactive object.\n * The snapshot is branded with SnapshotKindId (not KindId).\n */\nexport const getSnapshot = <T extends object>(obj: T): T => {\n assertArgument(typeof obj === 'object' && obj !== null && KindId in obj, 'obj', 'must be an entity');\n\n const snapshot = deepMapValues(obj, (value, recurse) => {\n // Do not recurse on references (but do recurse on arrays).\n if (\n typeof value === 'object' &&\n value !== null &&\n Object.getPrototypeOf(value) !== Object.prototype &&\n !Array.isArray(value)\n ) {\n return value;\n }\n\n return recurse(value);\n }) as any;\n\n // Add SnapshotKindId brand based on original KindId.\n if (obj != null && typeof obj === 'object' && KindId in obj) {\n snapshot[SnapshotKindId] = (obj as any)[KindId];\n }\n\n // Preserve Symbol-keyed properties that are important for type introspection.\n // These are not copied by deepMapValues since Object.keys() doesn't include symbols.\n const source = obj as any;\n\n // Type introspection symbols.\n copySymbolProperty(source, snapshot, TypeId);\n copySymbolProperty(source, snapshot, SchemaId);\n copySymbolProperty(source, snapshot, SelfDXNId);\n\n // Database reference (required for Obj.getDatabase to work on snapshots).\n copySymbolProperty(source, snapshot, ObjectDatabaseId);\n copySymbolProperty(source, snapshot, ObjectDeletedId);\n\n // Metadata symbol. Copy arrays so the snapshot is not affected by mutations to the live meta's keys/tags.\n copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({\n keys: [...(meta?.keys ?? [])],\n tags: [...(meta?.tags ?? [])],\n }));\n\n // Relation endpoint symbols.\n copySymbolProperty(source, snapshot, RelationSourceDXNId);\n copySymbolProperty(source, snapshot, RelationTargetDXNId);\n copySymbolProperty(source, snapshot, RelationSourceId);\n copySymbolProperty(source, snapshot, RelationTargetId);\n\n return Object.freeze(snapshot) as T;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { deepMapValues } from '@dxos/util';\n\nimport type * as Obj from '../../Obj';\nimport { makeObject } from '../common/proxy';\nimport { getMeta, getSchema } from '../common/types';\nimport { Ref } from '../Ref';\n\n/**\n * Clones an object or relation.\n * This does not clone referenced objects, only the properties in the object.\n * @returns A new object with the same schema and properties.\n */\nexport const clone = <T extends Obj.Any>(obj: T, opts?: Obj.CloneOptions): T => {\n const { id, ...data } = obj;\n const schema = getSchema(obj);\n invariant(schema != null, 'Object should have a schema');\n const props: any = deepMapValues(data, (value, recurse) => {\n if (Ref.isRef(value)) {\n if (opts?.deep) {\n // TODO(dmaretskyi): Will break on circular references.\n return Ref.make(clone(value.target!, opts));\n }\n return value;\n }\n return recurse(value);\n });\n\n if (opts?.retainId) {\n props.id = id;\n }\n const meta = deepMapValues(getMeta(obj), (value, recurse) => {\n if (Ref.isRef(value)) {\n if (opts?.deep) {\n // TODO(dmaretskyi): Will break on circular references.\n return Ref.make(clone(value.target!, opts));\n }\n return value;\n }\n return recurse(value);\n });\n\n return makeObject(schema, props, meta);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type QueryAST } from '@dxos/echo-protocol';\n\n/**\n * Returns a human-readable string representation of a Filter AST.\n */\nexport const prettyFilter = (filter: QueryAST.Filter): string => {\n switch (filter.type) {\n case 'object': {\n const parts: string[] = [];\n if (filter.typename !== null) {\n parts.push(String(filter.typename));\n }\n if (filter.id !== undefined && filter.id.length > 0) {\n parts.push(`id: [${filter.id.join(', ')}]`);\n }\n const propEntries = Object.entries(filter.props);\n if (propEntries.length > 0) {\n const propsStr = propEntries.map(([k, v]) => `${k}: ${prettyFilter(v)}`).join(', ');\n parts.push(`{ ${propsStr} }`);\n }\n if (filter.foreignKeys !== undefined && filter.foreignKeys.length > 0) {\n parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(', ')}]`);\n }\n return parts.length > 0 ? `Filter.type(${parts.join(', ')})` : 'Filter.everything()';\n }\n case 'compare':\n return `Filter.${filter.operator}(${JSON.stringify(filter.value)})`;\n case 'in':\n return `Filter.in([${filter.values.map((v) => JSON.stringify(v)).join(', ')}])`;\n case 'contains':\n return `Filter.contains(${JSON.stringify(filter.value)})`;\n case 'tag':\n return `Filter.tag(${JSON.stringify(filter.tag)})`;\n case 'range':\n return `Filter.range(${JSON.stringify(filter.from)}, ${JSON.stringify(filter.to)})`;\n case 'text-search':\n return filter.searchKind\n ? `Filter.textSearch(${JSON.stringify(filter.text)}, ${JSON.stringify(filter.searchKind)})`\n : `Filter.textSearch(${JSON.stringify(filter.text)})`;\n case 'timestamp':\n return `Filter.${filter.field}.${filter.operator}(${filter.value})`;\n case 'child-of':\n return `Filter.childOf([${filter.parents.map((p) => JSON.stringify(p)).join(', ')}], { transitive: ${filter.transitive} })`;\n case 'not':\n return `Filter.not(${prettyFilter(filter.filter)})`;\n case 'and':\n return `Filter.and(${filter.filters.map(prettyFilter).join(', ')})`;\n case 'or':\n return `Filter.or(${filter.filters.map(prettyFilter).join(', ')})`;\n }\n};\n\n/**\n * Returns a human-readable string representation of a Query AST.\n */\nexport const prettyQuery = (query: QueryAST.Query): string => {\n switch (query.type) {\n case 'select':\n return `Query.select(${prettyFilter(query.filter)})`;\n case 'filter':\n return `${prettyQuery(query.selection)}.select(${prettyFilter(query.filter)})`;\n case 'reference-traversal':\n return `${prettyQuery(query.anchor)}.reference(${JSON.stringify(query.property)})`;\n case 'incoming-references': {\n const args: string[] = [];\n if (query.typename !== null) {\n args.push(String(query.typename));\n }\n if (query.property !== null) {\n args.push(JSON.stringify(query.property));\n }\n return `${prettyQuery(query.anchor)}.referencedBy(${args.join(', ')})`;\n }\n case 'relation': {\n const method =\n query.direction === 'outgoing' ? 'sourceOf' : query.direction === 'incoming' ? 'targetOf' : 'relationOf';\n const filterStr = query.filter !== undefined ? prettyFilter(query.filter) : '';\n return `${prettyQuery(query.anchor)}.${method}(${filterStr})`;\n }\n case 'relation-traversal':\n return `${prettyQuery(query.anchor)}.${query.direction}()`;\n case 'hierarchy-traversal':\n return query.direction === 'to-parent'\n ? `${prettyQuery(query.anchor)}.parent()`\n : `${prettyQuery(query.anchor)}.children()`;\n case 'union':\n return `Query.all(${query.queries.map(prettyQuery).join(', ')})`;\n case 'set-difference':\n return `Query.without(${prettyQuery(query.source)}, ${prettyQuery(query.exclude)})`;\n case 'order': {\n const orders = query.order.map((o) => {\n if (o.kind === 'natural') {\n return 'Order.natural()';\n } else if (o.kind === 'rank') {\n return `Order.rank(${JSON.stringify(o.direction)})`;\n } else {\n return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;\n }\n });\n return `${prettyQuery(query.query)}.orderBy(${orders.join(', ')})`;\n }\n case 'options': {\n const opts = query.options;\n const parts: string[] = [];\n if (opts.deleted !== undefined) {\n parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);\n }\n if (opts.debugLabel !== undefined) {\n parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);\n }\n return `${prettyQuery(query.query)}.options({ ${parts.join(', ')} })`;\n }\n case 'from': {\n if (query.from._tag === 'scope') {\n const scope = query.from.scope;\n const parts: string[] = [];\n if (scope.spaceIds !== undefined) {\n parts.push(`spaceIds: [${scope.spaceIds.map((s) => JSON.stringify(s)).join(', ')}]`);\n }\n if (scope.queues !== undefined) {\n parts.push(`queues: [${scope.queues.map(String).join(', ')}]`);\n }\n if (scope.allQueuesFromSpaces !== undefined) {\n parts.push(`allQueuesFromSpaces: ${scope.allQueuesFromSpaces}`);\n }\n return `${prettyQuery(query.query)}.from({ ${parts.join(', ')} })`;\n }\n return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;\n }\n case 'limit':\n return `${prettyQuery(query.query)}.limit(${query.limit})`;\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\nimport { type ObjectId } from '@dxos/keys';\n\nimport type * as Type from '../../Type';\nimport { type SchemaMeta, SchemaMetaSymbol, type TypeAnnotation, getTypeAnnotation } from '../Annotation';\nimport { ChangeId } from '../common/proxy';\nimport { EntityKind, SchemaKindId } from '../common/types';\nimport { type JsonSchemaType, toEffectSchema, toJsonSchema } from '../JsonSchema';\nimport { type TypedObject, type TypedObjectPrototype, getSnapshot } from '../Obj';\nimport {\n addFieldsToSchema,\n removeFieldsFromSchema,\n setTypenameInSchema,\n updateFieldNameInSchema,\n updateFieldsInSchema,\n} from './manipulation';\nimport { PersistentSchema } from './persistent-schema';\n\n/**\n * Base schema type.\n */\n// TODO(burdon): Merge with ImmutableSchema.\nexport interface BaseSchema<A = any, I = any> extends TypedObject<A, I> {\n // TODO(burdon): Different from mutable?\n get readonly(): boolean;\n // TODO(burdon): Change to external function.\n get mutable(): EchoSchema<A, I>;\n get snapshot(): Schema.Schema<A, I>;\n get jsonSchema(): JsonSchemaType;\n}\n\n/**\n * Immutable schema type.\n * @deprecated Use `Schema.Schema.AnyNoContext` instead.\n */\n// TODO(burdon): Common abstract base class?\nexport class ImmutableSchema<A = any, I = any> implements BaseSchema<A, I> {\n private readonly _objectAnnotation: TypeAnnotation;\n constructor(private readonly _schema: Schema.Schema<A, I>) {\n this._objectAnnotation = getTypeAnnotation(this._schema)!;\n invariant(this._objectAnnotation);\n }\n\n //\n // Effect Schema (push to abstract base class).\n //\n\n public get [Schema.TypeId]() {\n return schemaVariance;\n }\n\n public get Type() {\n return this._schema.Type;\n }\n\n public get Encoded() {\n return this._schema.Encoded;\n }\n\n public get Context() {\n return this._schema.Context;\n }\n\n public get ast(): SchemaAST.AST {\n return this._schema.ast;\n }\n\n public get annotations() {\n return this._schema.annotations;\n }\n\n public get pipe() {\n return this._schema.pipe;\n }\n\n //\n // TypedObject\n //\n\n get kind(): EntityKind {\n return this._objectAnnotation.kind;\n }\n\n get typename(): string {\n return this._objectAnnotation.typename;\n }\n\n get version(): string {\n return this._objectAnnotation.version;\n }\n\n //\n // BaseSchema\n //\n\n get readonly(): boolean {\n return true;\n }\n\n get snapshot(): Schema.Schema.AnyNoContext {\n return this._schema;\n }\n\n // TODO(burdon): Change from getter since this is expensive.\n get jsonSchema(): JsonSchemaType {\n return toJsonSchema(this._schema);\n }\n\n get mutable(): EchoSchema {\n throw new Error('Schema is readonly.');\n }\n}\n\n/**\n * Defines an effect-schema for the `EchoSchema` type.\n *\n * This is here so that `EchoSchema` class can be used as a part of another schema definition (e.g., `ref(EchoSchema)`).\n */\nconst EchoSchemaConstructor = (): TypedObjectPrototype => {\n /**\n * Return class definition satisfying Schema.Schema.\n */\n return class {\n private static get _schema() {\n // The field is DynamicEchoSchema in runtime, but is serialized as PersisentSchema in automerge.\n return Schema.Union(PersistentSchema, Schema.instanceOf(EchoSchema)).annotations(\n PersistentSchema.ast.annotations,\n );\n }\n\n static readonly [Schema.TypeId] = schemaVariance;\n\n static get ast() {\n const schema = this._schema;\n return schema.ast;\n }\n\n static get annotations() {\n const schema = this._schema;\n return schema.annotations.bind(schema);\n }\n\n static get pipe() {\n const schema = this._schema;\n return schema.pipe.bind(schema);\n }\n } as any;\n};\n\nexport const isMutable = (schema: Schema.Schema.AnyNoContext): schema is EchoSchema => {\n return schema instanceof EchoSchema;\n};\n\n// NOTE: Keep in this file.\nconst schemaVariance = {\n _A: (_: any) => _,\n _I: (_: any) => _,\n _R: (_: never) => _,\n};\n\n/**\n * Represents a schema that is persisted in the ECHO database.\n * Schema can me mutable or readonly (specified by the {@link EchoSchema.readonly} field).\n *\n * Schema that can be modified at runtime via the API.\n * Is an instance of effect-schema (`Schema.Schema.AnyNoContext`) so it can be used in the same way as a regular schema.\n * IMPORTANT: The schema AST will change reactively when the schema is updated, including synced updates from remote peers.\n *\n * The class constructor is a schema instance itself, and can be used in the echo object definitions:\n *\n * @example\n * ```ts\n * export class TableType extends Schema.Struct({...}).pipe(Type.object({ typename: 'com.example.type.table', version: '0.1.0' })){\n * title: Schema.String,\n * schema: Schema.optional(ref(EchoSchema)),\n * props: Schema.mutable(S.Array(TablePropSchema)),\n * }) {}\n * ```\n *\n * The ECHO API will translate any references to PersistentSchema objects to be resolved as EchoSchema objects.\n */\nexport class EchoSchema<A = any, I = any> extends EchoSchemaConstructor() implements BaseSchema<A, I> {\n private _schema: Schema.Schema.AnyNoContext | undefined;\n private _isDirty = true;\n\n /**\n * Schema kind key that marks this as an ECHO schema.\n * Makes EchoSchema satisfy the Type.AnyObj type.\n */\n readonly [SchemaKindId]: EntityKind.Object = EntityKind.Object;\n\n constructor(private readonly _persistentSchema: PersistentSchema) {\n super();\n }\n\n //\n // Effect Schema (push to abstract base class).\n //\n\n public get [Schema.TypeId]() {\n return schemaVariance;\n }\n\n public get Type() {\n return this._persistentSchema as A;\n }\n\n public get Encoded() {\n return this._persistentSchema as I;\n }\n\n public get Context() {\n const schema = this._getSchema();\n return schema.Context;\n }\n\n public get ast() {\n const schema = this._getSchema();\n return schema.ast;\n }\n\n public get annotations() {\n const schema = this._getSchema();\n return schema.annotations.bind(schema);\n }\n\n public get pipe(): Schema.Schema.AnyNoContext['pipe'] {\n const schema = this._getSchema();\n return schema.pipe.bind(schema);\n }\n\n //\n // BaseSchema\n //\n\n public get kind(): EntityKind.Object {\n // Dynamic schemas are always object schemas.\n return EntityKind.Object;\n }\n\n public get typename(): string {\n return this._persistentSchema.typename;\n }\n\n public get version(): string {\n return this._persistentSchema.version;\n }\n\n public get readonly(): boolean {\n return false;\n }\n\n /**\n * Returns an immutable schema snapshot of the current state of the schema.\n */\n public get snapshot(): Schema.Schema.AnyNoContext {\n return this._getSchema();\n }\n\n /**\n * Returns the JSON schema for the schema.\n */\n public get jsonSchema(): JsonSchemaType {\n return this._persistentSchema.jsonSchema;\n }\n\n /**\n * Returns a mutable schema.\n */\n public get mutable(): EchoSchema {\n invariant(!this.readonly, 'Schema is not mutable');\n return this;\n }\n\n //\n // Mutable Schema\n //\n\n /**\n * Id of the ECHO object containing the schema.\n */\n public get id(): ObjectId {\n return this._persistentSchema.id;\n }\n\n /**\n * Short name of the schema.\n */\n public get name(): string | undefined {\n return this._persistentSchema.name;\n }\n\n public get [SchemaMetaSymbol](): SchemaMeta {\n return { id: this.id, typename: this.typename, version: this._persistentSchema.version };\n }\n\n /**\n * Reference to the underlying persistent schema object.\n */\n public get persistentSchema(): Type.PersistentType {\n return this._persistentSchema as Type.PersistentType;\n }\n\n public getProperties(): SchemaAST.PropertySignature[] {\n const ast = this._getSchema().ast;\n invariant(SchemaAST.isTypeLiteral(ast));\n return [...ast.propertySignatures].filter((p) => p.name !== 'id').map(unwrapOptionality);\n }\n\n //\n // Mutation methods.\n // TODO(burdon): Create separate interface for dynamic schema.\n // TODO(burdon): Deprecate direct manipulation? Use JSONSchema directly.\n //\n\n /**\n * @throws Error if the schema is readonly.\n */\n public updateTypename(typename: string): void {\n const updated = setTypenameInSchema(this._getSchema(), typename);\n this._change((schema) => {\n schema.typename = typename;\n schema.jsonSchema = toJsonSchema(updated);\n });\n }\n\n /**\n * @throws Error if the schema is readonly.\n */\n public addFields(fields: Schema.Struct.Fields): void {\n const extended = addFieldsToSchema(this._getSchema(), fields);\n this._change((schema) => {\n schema.jsonSchema = toJsonSchema(extended);\n });\n }\n\n /**\n * @throws Error if the schema is readonly.\n */\n public updateFields(fields: Schema.Struct.Fields): void {\n const updated = updateFieldsInSchema(this._getSchema(), fields);\n this._change((schema) => {\n schema.jsonSchema = toJsonSchema(updated);\n });\n }\n\n /**\n * @throws Error if the schema is readonly.\n */\n public updateFieldPropertyName({ before, after }: { before: PropertyKey; after: PropertyKey }): void {\n const renamed = updateFieldNameInSchema(this._getSchema(), { before, after });\n this._change((schema) => {\n schema.jsonSchema = toJsonSchema(renamed);\n });\n }\n\n /**\n * @throws Error if the schema is readonly.\n */\n public removeFields(fieldNames: string[]): void {\n const removed = removeFieldsFromSchema(this._getSchema(), fieldNames);\n this._change((schema) => {\n schema.jsonSchema = toJsonSchema(removed);\n });\n }\n\n /**\n * Wrapper for Obj.update that handles the change context for the persistent schema.\n */\n private _change(callback: (schema: PersistentSchema) => void): void {\n const changeFn = (this._persistentSchema as any)[ChangeId];\n if (changeFn) {\n changeFn(callback);\n } else {\n callback(this._persistentSchema);\n }\n }\n\n //\n // Internals\n //\n\n /**\n * Called by DatabaseSchemaRegistry on update.\n */\n _invalidate(): void {\n this._isDirty = true;\n }\n\n /**\n * Rebuilds this schema if it is dirty.\n */\n _rebuild(): void {\n if (this._isDirty || this._schema == null) {\n this._schema = toEffectSchema(getSnapshot(this._persistentSchema).jsonSchema);\n this._isDirty = false;\n }\n }\n\n _getSchema(): Schema.Schema.AnyNoContext {\n this._rebuild();\n return this._schema!;\n }\n}\n\n// TODO(burdon): Move to effect.\nconst unwrapOptionality = (property: SchemaAST.PropertySignature): SchemaAST.PropertySignature => {\n if (!SchemaAST.isUnion(property.type)) {\n return property;\n }\n\n return {\n ...property,\n type: property.type.types.find((type) => !SchemaAST.isUndefinedKeyword(type))!,\n } as any;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\n\nimport { type TypeAnnotation, TypeAnnotationId, TypeIdentifierAnnotationId } from '../Annotation';\n\n// TODO(ZaymonFC): Do this one at a time. This might be dangerous.\nexport const addFieldsToSchema = (\n schema: Schema.Schema.AnyNoContext,\n fields: Schema.Struct.Fields,\n): Schema.Schema.AnyNoContext => {\n const schemaExtension = Schema.partial(Schema.Struct(fields));\n return Schema.extend(schema, schemaExtension).annotations(\n schema.ast.annotations,\n ) as any as Schema.Schema.AnyNoContext;\n};\n\nexport const updateFieldsInSchema = (\n schema: Schema.Schema.AnyNoContext,\n fields: Schema.Struct.Fields,\n): Schema.Schema.AnyNoContext => {\n const ast = schema.ast as SchemaAST.TypeLiteral;\n invariant(SchemaAST.isTypeLiteral(ast));\n\n const updatedProperties = [...ast.propertySignatures];\n const propertiesToUpdate = (Schema.partial(Schema.Struct(fields)).ast as SchemaAST.TypeLiteral).propertySignatures;\n for (const property of propertiesToUpdate) {\n const index = updatedProperties.findIndex((p) => p.name === property.name);\n if (index !== -1) {\n updatedProperties[index] = property;\n } else {\n updatedProperties.push(property);\n }\n }\n\n return Schema.make(new SchemaAST.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));\n};\n\nexport const removeFieldsFromSchema = (\n schema: Schema.Schema.AnyNoContext,\n fieldNames: string[],\n): Schema.Schema.AnyNoContext => {\n return Schema.make(SchemaAST.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);\n};\n\nexport const updateFieldNameInSchema = (\n schema: Schema.Schema.AnyNoContext,\n { before, after }: { before: PropertyKey; after: PropertyKey },\n): Schema.Schema.AnyNoContext => {\n const ast = schema.ast as SchemaAST.TypeLiteral;\n invariant(SchemaAST.isTypeLiteral(ast));\n\n return Schema.make(\n new SchemaAST.TypeLiteral(\n ast.propertySignatures.map((p) =>\n p.name === before\n ? new SchemaAST.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations)\n : p,\n ),\n ast.indexSignatures,\n ast.annotations,\n ),\n );\n};\n\nexport const setTypenameInSchema = (\n schema: Schema.Schema.AnyNoContext,\n typename: string,\n): Schema.Schema.AnyNoContext => {\n const existingAnnotation = schema.ast.annotations[TypeAnnotationId] as TypeAnnotation;\n invariant(existingAnnotation, `Missing ${String(TypeAnnotationId)}`);\n\n return schema.annotations({\n ...schema.ast.annotations,\n [TypeAnnotationId]: {\n kind: existingAnnotation.kind,\n typename,\n version: existingAnnotation.version,\n } satisfies TypeAnnotation,\n [SchemaAST.JSONSchemaAnnotationId]: {\n ...(schema.ast.annotations[SchemaAST.JSONSchemaAnnotationId] ?? {}),\n $id: schema.ast.annotations[TypeIdentifierAnnotationId] ?? DXN.fromTypename(typename).toString(),\n typename,\n },\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { IconAnnotation } from '../Annotation';\nimport { LabelAnnotation, TypenameSchema, VersionSchema } from '../Annotation';\nimport { EchoObjectSchema } from '../Entity';\nimport { JsonSchemaType } from '../JsonSchema';\n\n/**\n * Persistent representation of a schema.\n */\n// TODO(burdon): Move.\nexport const PersistentSchema = Schema.Struct({\n name: Schema.optional(Schema.String),\n typename: TypenameSchema,\n version: VersionSchema,\n jsonSchema: JsonSchemaType,\n}).pipe(\n EchoObjectSchema({\n typename: 'org.dxos.type.schema',\n version: '0.1.0',\n }),\n LabelAnnotation.set(['name']),\n IconAnnotation.set({\n icon: 'ph--database--regular',\n hue: 'green',\n }),\n);\n\nexport interface PersistentSchema extends Schema.Schema.Type<typeof PersistentSchema> {}\n"],
5
+ "mappings": "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",
6
+ "names": ["JsonPath", "JsonProp", "getValue", "splitJsonPath", "Schema", "SchemaAST", "RawObject", "schema", "make", "omit", "ast", "Schema", "ForeignKey", "invariant", "intersection", "metadata", "id", "compareForeignKeys", "a", "b", "getMeta", "keys", "ATTR_SELF_DXN", "SelfDXNId", "Symbol", "for", "ATTR_DELETED", "ObjectDeletedId", "ObjectVersionId", "ObjectDatabaseId", "ATTR_RELATION_SOURCE", "RelationSourceId", "RelationSourceDXNId", "ATTR_RELATION_TARGET", "RelationTargetId", "RelationTargetDXNId", "VersionTypeId", "compare", "a", "b", "localeCompare", "sortByLabel", "getLabel", "sortByTypename", "getTypename", "sort", "comparators", "comparator", "result", "assertArgument", "invariant", "__dxlog_file", "getMetaChecked", "meta", "entity", "invariant", "keys", "key", "source", "splice", "i", "tags", "push", "tag", "EventId", "Symbol", "for", "ChangeId", "eventBatchDepth", "pendingEventTargets", "Set", "batchEvents", "callback", "target", "EventId", "emit", "clear", "emitEvent", "add", "currentChangeContext", "pendingNotificationKey", "pendingOwnerNotifications", "Set", "enterChangeContext", "key", "isInChangeContext", "queueNotification", "queueOwnerNotification", "target", "add", "hasPendingNotifications", "clearPendingNotifications", "executeChange", "contextKey", "eventTarget", "proxy", "callback", "exitContext", "batchEvents", "EventId", "emit", "ownerTarget", "clear", "defineHiddenProperty", "object", "key", "value", "Object", "defineProperty", "enumerable", "configurable", "MutationOutsideChangeContextError", "Error", "operation", "suggestion", "name", "createPropertySetError", "prop", "String", "createPropertyDeleteError", "createArrayMethodError", "method", "invariant", "DXN", "deepMapValues", "__dxlog_file", "descriptor", "Object", "writable", "enumerable", "configurable", "result", "id", "MetaId", "SelfDXNId", "RelationSourceDXNId", "invariant", "sourceDXN", "ATTR_RELATION_SOURCE", "toString", "RelationTargetDXNId", "targetDXN", "ATTR_RELATION_TARGET", "assign", "serializeData", "rest", "value", "noInline", "recurse", "ObjectId", "invariant", "__dxlog_file", "symbolIsProxy", "value", "Array", "isArray", "ProxyHandlerSlot", "getProxyHandler", "existingProxy", "handler", "_proxyMap", "set", "_handler", "setHandler", "get", "target", "prop", "receiver", "Object", "trap", "apply", "Schema", "SchemaAST", "Event", "inspectCustom", "invariant", "invariant", "__dxlog_file", "value", "visited", "newAllowedPreviousOwner", "allowedPreviousOwner", "actualValue", "invariant", "ownershipAllowed", "defineHiddenProperty", "recursiveOptions", "depth", "Array", "isValidProxyTarget", "item", "setOwnerRecursive", "nested", "isProxy", "owner", "isArray", "traverseObjectGraph", "target", "getEchoRoot", "queueOwnerNotification", "notifyOwnerChain", "objectData", "Symbol", "for", "checkArrayMutationAllowed", "arr", "method", "target", "isProxy", "getProxyTarget", "echoRoot", "getEchoRoot", "isInitialized", "ChangeId", "EventId", "isInChangeContext", "createArrayMethodError", "ReactiveArray", "Array", "Symbol", "species", "BATCHED_METHODS", "Object", "defineProperty", "prototype", "enumerable", "value", "args", "result", "batchEvents", "apply", "Schema", "SchemaAST", "invariant", "log", "__dxlog_file", "SchemaAST", "isUnion", "schema", "typeAstList", "ast", "filter", "type", "isTypeLiteral", "length", "visitAll", "positionalTypes", "concat", "allTypes", "getPropertySchema", "rootObjectSchema", "property", "propertyPath", "propertyName", "tupleAst", "unwrapArray", "getArrayElementSchema", "propertyType", "getPropertyType", "log", "getTargetPropertySchema", "invariant", "arrayAst", "prop", "Number", "elementIndex", "Schema", "make", "elementType", "annotations", "flattenUnion", "typeAst", "flatMap", "getProperties", "astCandidates", "typeDiscriminators", "getTypeDiscriminators", "typeIndex", "p", "targetPropertyValue", "getPropertySignatures", "getTargetPropertyFn", "typeOrDiscriminatedUnion", "t", "targetProperty", "indexSignatureType", "unwrapAst", "indexSignatures", "discriminatorPropCandidates", "isValidDiscriminator", "everyTypeHasDiscriminator", "isDiscriminatedUnion", "predicate", "next", "idProperty", "__dxlog_file", "value", "visited", "actualValue", "copy", "item", "push", "copyHiddenProperties", "Array", "isArray", "ReactiveArray", "key", "defineHiddenProperty", "target", "SchemaId", "source", "TypeId", "_proxyMap", "_inSet", "init", "invariant", "EventId", "ObjectDeletedId", "setOwnerRecursive", "Object", "configurable", "_inspect", "objectData", "ChangeId", "Reflect", "get", "prop", "receiver", "createProxy", "isInitialized", "isSymbolProp", "isInChangeContext", "echoRoot", "result", "batchEvents", "notifyOwnerChain", "ownKeys", "deleteProperty", "property", "createPropertyDeleteError", "queueNotification", "defineProperty", "_prepareValueForAssignment", "attributes", "preparedValue", "Error", "isRootEchoObject", "existingOwner", "getOwner", "validatedValue", "_validateValue", "isValidProxyTarget", "isProxy", "schema", "setSchemaProperties", "options", "showHidden", "customInspect", "inspected", "schemaType", "obj", "elementSchema", "SchemaAST", "SchemaValidator", "validateSchema", "makeArraysReactive", "symbolIsProxy", "makeObject", "schema", "obj", "meta", "createReactiveObject", "Object", "assign", "isValidProxyTarget", "Error", "parent", "ParentId", "undefined", "annotation", "getTypeAnnotation", "setIdOnTarget", "defineHiddenProperty", "KindId", "kind", "initMeta", "prepareTypedTarget", "attachTypedJsonSerializer", "proxy", "createProxy", "TypedReactiveHandler", "instance", "metaProxy", "MetaId", "metaTarget", "getProxyTarget", "setMetaOwner", "target", "id", "ObjectId", "isValid", "random", "keys", "ObjectMetaSchema", "subscribe", "obj", "callback", "isProxy", "target", "getProxyTarget", "EventId", "on", "change", "changeFn", "ChangeId", "invariant", "assumeType", "invariant", "DXN", "ObjectId", "assumeType", "__dxlog_file", "ATTR_DELETED", "assumeType", "obj", "invariant", "ObjectId", "isValid", "__dxlog_file", "TypeId", "KindId", "EntityKind", "DXN", "RelationSourceDXNId", "RelationTargetDXNId", "Schema", "assertArgument", "invariant", "DXN", "ObjectId", "assumeType", "__dxlog_file", "assertArgument", "object", "assumeType", "SelfDXNId", "invariant", "DXN", "ObjectId", "isValid", "fromLocalObjectId", "__dxlog_file", "invariant", "dxn", "entity", "ObjectDatabaseId", "assumeType", "Schema", "makeEchoTypeSchema", "fields", "ast", "typename", "version", "kind", "EchoObjectSchemaClass", "make", "SchemaKindId", "annotations", "schema", "instanceOf", "value", "is", "Schema", "SchemaAST", "invariant", "__dxlog_file", "invariant", "TypeAnnotationId", "version", "SchemaAST", "fields", "id", "String", "annotations", "kind", "EntityKind", "typename", "Schema", "SchemaAST", "raise", "assertArgument", "invariant", "DXN", "__dxlog_file", "ATTR_RELATION_SOURCE", "assertArgument", "target", "version", "getDXNForRelationSchemaRef", "source", "getEntityKind", "Object", "raise", "Error", "self", "invariant", "fields", "__dxlog_file", "id", "String", "SchemaAST", "annotations", "kind", "EntityKind", "typename", "sourceSchema", "targetSchema", "relationSource", "relationTarget", "getTypeIdentifierAnnotation", "identifier", "DXN", "fromTypename", "assertArgument", "unversioned", "VersionTypeId", "versioned", "isVersion", "entity", "version", "ver", "ObjectVersionId", "undefined", "versionValid", "assertArgument", "compareVersions", "version1", "version2", "automergeHeads", "length", "some", "head", "includes", "encodeVersion", "JSON", "stringify", "decodeVersion", "parsed", "parse", "normalizeSchema", "schema", "copy", "structuredClone", "go", "exclusiveMaximum", "maximum", "exclusiveMinimum", "minimum", "key", "Object", "keys", "JsonSchemaFields", "includes", "properties", "goOnRecord", "patternProperties", "propertyNames", "definitions", "items", "maybeGoOnArray", "additionalItems", "contains", "if", "then", "else", "allOf", "anyOf", "oneOf", "not", "$defs", "reference", "value", "Array", "isArray", "item", "record", "Schema", "makeTypedEntityClass", "typename", "version", "baseSchema", "TypeId", "schemaVariance", "ast", "annotations", "bind", "pipe", "Symbol", "hasInstance", "obj", "getTypename", "Error", "_A", "_", "_I", "_R", "raise", "assertArgument", "failedInvariant", "ObjectId", "inspectCustom", "attachedTypedObjectInspector", "obj", "descriptor", "Object", "getOwnPropertyDescriptor", "inspectCustom", "defineProperty", "value", "typedObjectInspectFunction", "writable", "enumerable", "configurable", "depth", "options", "inspect", "id", "props", "ATTR_TYPE", "getTypeDXN", "ATTR_META", "MetaId", "Schema", "raise", "ObjectStructure", "isEncodedReference", "assertArgument", "invariant", "DXN", "ObjectId", "assumeType", "deepMapValues", "visitValues", "__dxlog_file", "invariant", "typename", "typedJsonSerializer", "call", "obj", "__dxlog_file", "assertArgument", "jsonData", "DXN", "ATTR_TYPE", "refResolver", "resolveSchema", "type", "schema", "undefined", "isSchema", "decodedInput", "stripInternalJsonKeys", "setRefResolverOnData", "setTypename", "setSchema", "isRelation", "sourceDxn", "parse", "ATTR_RELATION_SOURCE", "TypeError", "targetDxn", "source", "resolve", "target", "defineHiddenProperty", "EntityKind", "Relation", "RelationSourceDXNId", "RelationTargetDXNId", "RelationSourceId", "RelationTargetId", "KindId", "Object", "ATTR_META", "isArray", "meta", "keys", "MetaId", "resolvedParent", "ParentId", "parent", "dxn", "database", "assertObjectModel", "ATTR_DELETED", "ATTR_SELF_DXN", "ATTR_RELATION_TARGET", "decodeGeneric", "deepMapValues", "value", "visitor", "isEncodedReference", "refFromEncodedReference", "options", "props", "Ref", "setRefResolver", "visitValues", "structure", "id", "ObjectStructure", "ATTR_PARENT", "getRelationSource", "getRelationTarget", "createObject", "schema", "props", "annotation", "getTypeAnnotation", "Error", "assertArgument", "RelationSourceDXNId", "RelationTargetDXNId", "RelationSourceId", "RelationTargetId", "obj", "id", "ObjectId", "random", "kind", "EntityKind", "Relation", "Object", "defineHiddenProperty", "KindId", "MetaId", "keys", "setSchema", "setTypename", "getSchemaDXN", "failedInvariant", "attachTypedJsonSerializer", "attachedTypedObjectInspector", "sourceDXN", "getObjectDXN", "raise", "targetDXN", "assertObjectModel", "isDeleted", "obj", "ObjectDeletedId", "undefined", "DXN", "ObjectId", "QueueSubspaceTags", "SpaceId", "createQueueDXN", "spaceId", "random", "queueId", "kind", "QUEUE", "DATA", "Match", "Option", "SchemaAST", "getArrayElementType", "getBaseType", "getProperties", "isArrayType", "isNestedType", "invariant", "__dxlog_file", "schema", "getSchema", "obj", "invariant", "parent", "currentAST", "ast", "i", "length", "key", "part", "propertyAST", "getPropertyAST", "String", "shouldBeArray", "path", "value", "undefined", "isNestedType", "property", "properties", "getProperties", "getBaseType", "type", "isArrayType", "elementType", "filter", "isOptional", "defaultValue", "Match", "pipe", "when", "_tag", "orElse", "requiredProps", "prop", "name", "createObjectWithDefaults", "assertArgument", "deepMapValues", "copySymbolProperty", "source", "target", "symbol", "transform", "value", "undefined", "finalValue", "Object", "defineProperty", "writable", "enumerable", "configurable", "getSnapshot", "obj", "assertArgument", "KindId", "snapshot", "deepMapValues", "recurse", "getPrototypeOf", "prototype", "Array", "isArray", "SnapshotKindId", "TypeId", "SchemaId", "SelfDXNId", "ObjectDatabaseId", "ObjectDeletedId", "MetaId", "meta", "keys", "tags", "RelationSourceDXNId", "RelationTargetDXNId", "RelationSourceId", "RelationTargetId", "freeze", "invariant", "deepMapValues", "__dxlog_file", "schema", "getSchema", "obj", "invariant", "props", "deepMapValues", "data", "Ref", "value", "opts", "make", "recurse", "retainId", "meta", "makeObject", "prettyFilter", "filter", "type", "parts", "typename", "push", "String", "id", "undefined", "length", "join", "propEntries", "Object", "entries", "props", "propsStr", "map", "k", "v", "foreignKeys", "fk", "JSON", "stringify", "operator", "value", "values", "tag", "from", "to", "searchKind", "text", "field", "parents", "p", "transitive", "filters", "prettyQuery", "query", "selection", "anchor", "property", "args", "method", "direction", "filterStr", "queries", "source", "exclude", "orders", "order", "o", "kind", "opts", "options", "deleted", "debugLabel", "_tag", "scope", "spaceIds", "s", "queues", "allQueuesFromSpaces", "limit", "Schema", "SchemaAST", "invariant", "Schema", "SchemaAST", "invariant", "DXN", "__dxlog_file", "Schema", "schemaExtension", "annotations", "updateFieldsInSchema", "fields", "invariant", "isTypeLiteral", "ast", "updatedProperties", "propertySignatures", "propertiesToUpdate", "p", "name", "property", "index", "push", "removeFieldsFromSchema", "fieldNames", "updateFieldNameInSchema", "schema", "before", "after", "setTypenameInSchema", "typename", "TypeAnnotationId", "existingAnnotation", "version", "SchemaAST", "JSONSchemaAnnotationId", "TypeIdentifierAnnotationId", "DXN", "Schema", "PersistentSchema", "Struct", "name", "optional", "String", "typename", "TypenameSchema", "version", "VersionSchema", "jsonSchema", "JsonSchemaType", "pipe", "EchoObjectSchema", "LabelAnnotation", "set", "IconAnnotation", "icon", "hue", "__dxlog_file", "_objectAnnotation", "invariant", "Type", "schemaVariance", "Encoded", "Context", "ast", "annotations", "pipe", "typename", "version", "snapshot", "mutable", "Schema", "Union", "TypeId", "schema", "_schema", "_I", "_", "_R", "_isDirty", "_persistentSchema", "EntityKind", "readonly", "SchemaMetaSymbol", "getProperties", "SchemaAST", "propertySignatures", "filter", "jsonSchema", "_change", "toJsonSchema", "extended", "updated", "before", "after", "removed", "changeFn", "callback", "_getSchema", "property", "type"]
7
+ }
@@ -0,0 +1,7 @@
1
+ // src/QueryResult.ts
2
+ var QueryResult_exports = {};
3
+
4
+ export {
5
+ QueryResult_exports
6
+ };
7
+ //# sourceMappingURL=chunk-V72DY6LU.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/QueryResult.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type CleanupFn } from '@dxos/async';\n\nimport type * as Entity from './Entity';\n\n/**\n * Individual query result entry.\n */\nexport type Entry<T> = {\n id: string;\n\n /**\n * May not be present for remote results.\n */\n result?: T;\n\n match?: {\n // TODO(dmaretskyi): text positional info.\n\n /**\n * Higher means better match.\n */\n rank: number;\n };\n\n /**\n * Query resolution metadata.\n */\n // TODO(dmaretskyi): Rename to meta?\n resolution?: {\n // TODO(dmaretskyi): Make this more generic.\n source: 'remote' | 'local' | 'index';\n\n /**\n * Query resolution time in milliseconds.\n */\n time: number;\n };\n};\n\n/**\n * Invidual query result entry for a database Entity.\n */\nexport type EntityEntry<T extends Entity.Unknown = Entity.Unknown> = Entry<T>;\n\nexport type RunOptions = {\n timeout?: number;\n};\n\nexport type SubscriptionOptions = {\n /**\n * Fire the callback immediately.\n */\n fire?: boolean;\n};\n\n// TODO(burdon): Should T be constrained to Entity.Any?\nexport interface QueryResult<T> {\n /**\n * Currently available results along with their match metadata.\n */\n readonly entries: Entry<T>[];\n\n /**\n * Currently available results.\n */\n readonly results: T[];\n\n /**\n * Returns all known results.\n */\n run(opts?: RunOptions): Promise<T[]>;\n\n /**\n * Returns all known results along with their match metadata.\n */\n runEntries(opts?: RunOptions): Promise<Entry<T>[]>;\n\n /**\n * Returns currently available results synchronously.\n */\n runSync(): T[];\n\n /**\n * Returns currently available results synchronously along with their match metadata.\n */\n runSyncEntries(): Entry<T>[];\n\n /**\n * Returns first result.\n */\n first(opts?: RunOptions): Promise<T>;\n\n /**\n * Returns first result if there is one.\n */\n firstOrUndefined(opts?: RunOptions): Promise<T | undefined>;\n\n /**\n * Subscribes to changes in query results.\n */\n subscribe(callback?: (query: QueryResult<T>) => void, opts?: SubscriptionOptions): CleanupFn;\n}\n"],
5
+ "mappings": ";AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,51 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-J5LGTIGS.mjs";
4
+
5
+ // src/Err.ts
6
+ var Err_exports = {};
7
+ __export(Err_exports, {
8
+ GetReactiveError: () => GetReactiveError,
9
+ ObjectNotFoundError: () => ObjectNotFoundError,
10
+ SchemaNotFoundError: () => SchemaNotFoundError
11
+ });
12
+ import { BaseError } from "@dxos/errors";
13
+ var SchemaNotFoundError = class extends BaseError.extend("SchemaNotFoundError", "Schema not found") {
14
+ constructor(schema, options) {
15
+ super({
16
+ context: {
17
+ schema
18
+ },
19
+ ...options
20
+ });
21
+ }
22
+ };
23
+ var ObjectNotFoundError = class extends BaseError.extend("ObjectNotFoundError", "Object not found") {
24
+ constructor(dxn, options) {
25
+ super({
26
+ context: {
27
+ dxn
28
+ },
29
+ ...options
30
+ });
31
+ }
32
+ };
33
+ var GetReactiveError = class extends BaseError.extend("GetReactiveError", "Failed to get reactive object from snapshot") {
34
+ constructor(options) {
35
+ super({
36
+ context: {
37
+ reason: options.reason,
38
+ snapshotId: options.snapshotId
39
+ },
40
+ ...options
41
+ });
42
+ }
43
+ };
44
+
45
+ export {
46
+ SchemaNotFoundError,
47
+ ObjectNotFoundError,
48
+ GetReactiveError,
49
+ Err_exports
50
+ };
51
+ //# sourceMappingURL=chunk-ZISMEVKD.mjs.map