@dxos/echo 0.8.4-main.ef1bc66f44 → 0.8.4-main.effb148878

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 (602) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +9 -9
  3. package/dist/lib/neutral/Annotation.mjs +7 -3
  4. package/dist/lib/neutral/Database.mjs +8 -4
  5. package/dist/lib/neutral/Entity.mjs +35 -18
  6. package/dist/lib/neutral/Err.mjs +3 -1
  7. package/dist/lib/neutral/Extension.mjs +18 -0
  8. package/dist/lib/neutral/Extension.mjs.map +7 -0
  9. package/dist/lib/neutral/Feed.mjs +54 -0
  10. package/dist/lib/neutral/Feed.mjs.map +7 -0
  11. package/dist/lib/neutral/Filter.mjs +25 -12
  12. package/dist/lib/neutral/Format.mjs +23 -3
  13. package/dist/lib/neutral/JsonSchema.mjs +9 -9
  14. package/dist/lib/neutral/Key.mjs +7 -3
  15. package/dist/lib/neutral/Migration.mjs +18 -0
  16. package/dist/lib/neutral/Migration.mjs.map +7 -0
  17. package/dist/lib/neutral/Obj.mjs +41 -23
  18. package/dist/lib/neutral/Order.mjs +1 -1
  19. package/dist/lib/neutral/Query.mjs +21 -9
  20. package/dist/lib/neutral/QueryResult.mjs +1 -1
  21. package/dist/lib/neutral/Ref.mjs +13 -9
  22. package/dist/lib/neutral/Relation.mjs +34 -23
  23. package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
  24. package/dist/lib/neutral/Tag.mjs +14 -10
  25. package/dist/lib/neutral/Type.mjs +52 -36
  26. package/dist/lib/neutral/{chunk-K5K3Z62A.mjs → chunk-4SYHDOQA.mjs} +14 -6
  27. package/dist/lib/neutral/chunk-4SYHDOQA.mjs.map +7 -0
  28. package/dist/lib/neutral/{chunk-XAJMXQ4H.mjs → chunk-4U7OD55H.mjs} +6 -2
  29. package/dist/lib/neutral/chunk-4U7OD55H.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-52NG2XEE.mjs +34 -0
  31. package/dist/lib/neutral/chunk-52NG2XEE.mjs.map +7 -0
  32. package/dist/lib/neutral/{chunk-KB7RIVLK.mjs → chunk-A5HDDVKS.mjs} +33 -6
  33. package/dist/lib/neutral/chunk-A5HDDVKS.mjs.map +7 -0
  34. package/dist/lib/neutral/{chunk-DLPC7DHQ.mjs → chunk-EZ4XJFHJ.mjs} +9 -11
  35. package/dist/lib/neutral/chunk-EZ4XJFHJ.mjs.map +7 -0
  36. package/dist/lib/neutral/{chunk-ZAHWXGK4.mjs → chunk-F625JEZB.mjs} +97 -19
  37. package/dist/lib/neutral/chunk-F625JEZB.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-FFCN66OF.mjs +420 -0
  39. package/dist/lib/neutral/chunk-FFCN66OF.mjs.map +7 -0
  40. package/dist/lib/neutral/{chunk-RPB6V4BE.mjs → chunk-GOHDOJE3.mjs} +16 -3
  41. package/dist/lib/neutral/chunk-GOHDOJE3.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  43. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-J7QWJQQV.mjs +318 -0
  45. package/dist/lib/neutral/chunk-J7QWJQQV.mjs.map +7 -0
  46. package/dist/lib/neutral/{chunk-QARLJVDB.mjs → chunk-JTHNDGAR.mjs} +8 -4
  47. package/dist/lib/neutral/chunk-JTHNDGAR.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-K5RH2PBH.mjs +361 -0
  49. package/dist/lib/neutral/chunk-K5RH2PBH.mjs.map +7 -0
  50. package/dist/lib/neutral/{chunk-RIMHNJ3E.mjs → chunk-KHRAQDYX.mjs} +138 -91
  51. package/dist/lib/neutral/chunk-KHRAQDYX.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-L65CW5EI.mjs +156 -0
  53. package/dist/lib/neutral/chunk-L65CW5EI.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-LNZIPZX6.mjs +2186 -0
  55. package/dist/lib/neutral/chunk-LNZIPZX6.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-MPXUNTME.mjs +41 -0
  57. package/dist/lib/neutral/chunk-MPXUNTME.mjs.map +7 -0
  58. package/dist/lib/neutral/{chunk-7WE7SBA2.mjs → chunk-O2EOH7XQ.mjs} +152 -134
  59. package/dist/lib/neutral/chunk-O2EOH7XQ.mjs.map +7 -0
  60. package/dist/lib/neutral/{chunk-MTEHHY62.mjs → chunk-Q7ID37KF.mjs} +121 -94
  61. package/dist/lib/neutral/chunk-Q7ID37KF.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-QLYEQ5VA.mjs +205 -0
  63. package/dist/lib/neutral/chunk-QLYEQ5VA.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-SSDGRJ3A.mjs +747 -0
  65. package/dist/lib/neutral/chunk-SSDGRJ3A.mjs.map +7 -0
  66. package/dist/lib/neutral/{chunk-ROKO4RKJ.mjs → chunk-TTCSATUD.mjs} +2 -2
  67. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-UEFRFUYC.mjs} +8 -4
  69. package/dist/lib/neutral/chunk-UEFRFUYC.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-UN7K472Q.mjs +132 -0
  71. package/dist/lib/neutral/chunk-UN7K472Q.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-UQAMAXDU.mjs +243 -0
  73. package/dist/lib/neutral/chunk-UQAMAXDU.mjs.map +7 -0
  74. package/dist/lib/neutral/{chunk-4L6DOFXP.mjs → chunk-V5NE2X7Y.mjs} +1 -1
  75. package/dist/lib/neutral/chunk-V5NE2X7Y.mjs.map +7 -0
  76. package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
  77. package/dist/lib/neutral/chunk-ZII2BGPM.mjs +269 -0
  78. package/dist/lib/neutral/chunk-ZII2BGPM.mjs.map +7 -0
  79. package/dist/lib/neutral/{chunk-N2QNHMT5.mjs → chunk-ZM7VFIS2.mjs} +22 -2
  80. package/dist/lib/neutral/chunk-ZM7VFIS2.mjs.map +7 -0
  81. package/dist/lib/neutral/index.mjs +56 -29
  82. package/dist/lib/neutral/internal/index.mjs +128 -77
  83. package/dist/lib/neutral/meta.json +1 -1
  84. package/dist/lib/neutral/testing/index.mjs +226 -174
  85. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  86. package/dist/types/src/Annotation.d.ts +3 -3
  87. package/dist/types/src/Annotation.d.ts.map +1 -1
  88. package/dist/types/src/Collection.d.ts +15 -0
  89. package/dist/types/src/Collection.d.ts.map +1 -0
  90. package/dist/types/src/Database.d.ts +27 -42
  91. package/dist/types/src/Database.d.ts.map +1 -1
  92. package/dist/types/src/Dataset.d.ts +29 -0
  93. package/dist/types/src/Dataset.d.ts.map +1 -0
  94. package/dist/types/src/Entity.d.ts +123 -29
  95. package/dist/types/src/Entity.d.ts.map +1 -1
  96. package/dist/types/src/Err.d.ts +56 -13
  97. package/dist/types/src/Err.d.ts.map +1 -1
  98. package/dist/types/src/Extension.d.ts +80 -0
  99. package/dist/types/src/Extension.d.ts.map +1 -0
  100. package/dist/types/src/Extension.test.d.ts +2 -0
  101. package/dist/types/src/Extension.test.d.ts.map +1 -0
  102. package/dist/types/src/Feed.d.ts +229 -0
  103. package/dist/types/src/Feed.d.ts.map +1 -0
  104. package/dist/types/src/Filter.d.ts +74 -11
  105. package/dist/types/src/Filter.d.ts.map +1 -1
  106. package/dist/types/src/Filter.test.d.ts +2 -0
  107. package/dist/types/src/Filter.test.d.ts.map +1 -0
  108. package/dist/types/src/Format.d.ts +3 -3
  109. package/dist/types/src/Format.d.ts.map +1 -1
  110. package/dist/types/src/Hypergraph.d.ts +15 -10
  111. package/dist/types/src/Hypergraph.d.ts.map +1 -1
  112. package/dist/types/src/Json.d.ts +33 -0
  113. package/dist/types/src/Json.d.ts.map +1 -0
  114. package/dist/types/src/Json.test.d.ts +2 -0
  115. package/dist/types/src/Json.test.d.ts.map +1 -0
  116. package/dist/types/src/JsonSchema.d.ts +11 -4
  117. package/dist/types/src/JsonSchema.d.ts.map +1 -1
  118. package/dist/types/src/Key.d.ts +1 -1
  119. package/dist/types/src/Key.d.ts.map +1 -1
  120. package/dist/types/src/Migration.d.ts +72 -0
  121. package/dist/types/src/Migration.d.ts.map +1 -0
  122. package/dist/types/src/Obj.d.ts +201 -77
  123. package/dist/types/src/Obj.d.ts.map +1 -1
  124. package/dist/types/src/Order.d.ts.map +1 -1
  125. package/dist/types/src/Query.d.ts +117 -17
  126. package/dist/types/src/Query.d.ts.map +1 -1
  127. package/dist/types/src/Ref.d.ts +66 -10
  128. package/dist/types/src/Ref.d.ts.map +1 -1
  129. package/dist/types/src/Relation.d.ts +127 -54
  130. package/dist/types/src/Relation.d.ts.map +1 -1
  131. package/dist/types/src/SchemaRegistry.d.ts +12 -13
  132. package/dist/types/src/SchemaRegistry.d.ts.map +1 -1
  133. package/dist/types/src/Tag.d.ts +4 -3
  134. package/dist/types/src/Tag.d.ts.map +1 -1
  135. package/dist/types/src/Type.d.ts +337 -218
  136. package/dist/types/src/Type.d.ts.map +1 -1
  137. package/dist/types/src/View.d.ts +65 -0
  138. package/dist/types/src/View.d.ts.map +1 -0
  139. package/dist/types/src/exemplars.test.d.ts +2 -0
  140. package/dist/types/src/exemplars.test.d.ts.map +1 -0
  141. package/dist/types/src/index.d.ts +8 -1
  142. package/dist/types/src/index.d.ts.map +1 -1
  143. package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +98 -24
  144. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  145. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  146. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  147. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  148. package/dist/types/src/internal/{api → Annotation}/sorting.d.ts +1 -1
  149. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  150. package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +15 -6
  151. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  152. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  153. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  154. package/dist/types/src/internal/Entity/entity.d.ts +67 -0
  155. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  156. package/dist/types/src/internal/Entity/index.d.ts +10 -0
  157. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  158. package/dist/types/src/internal/Entity/model.d.ts +57 -0
  159. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  160. package/dist/types/src/internal/{entities → Entity}/object.d.ts +3 -3
  161. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  162. package/dist/types/src/internal/Entity/relation.d.ts +51 -0
  163. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  164. package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
  165. package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
  166. package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
  167. package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
  168. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  169. package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
  170. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  171. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  172. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  173. package/dist/types/src/internal/{formats → Format}/format.d.ts +2 -1
  174. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  175. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  176. package/dist/types/src/internal/{formats → Format}/index.d.ts +2 -2
  177. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  178. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  179. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  180. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  181. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  182. package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
  183. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  184. package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
  185. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  186. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  187. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  188. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  189. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +37 -37
  190. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  191. package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +3 -2
  192. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  193. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  194. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  195. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  196. package/dist/types/src/internal/{object → Obj}/create-object.d.ts +10 -12
  197. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  198. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  199. package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
  200. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  201. package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -1
  202. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  203. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  204. package/dist/types/src/internal/{object → Obj}/json-serializer.d.ts +16 -8
  205. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  206. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  207. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  208. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  209. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  210. package/dist/types/src/internal/{object → Obj}/set-value.d.ts +2 -2
  211. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  212. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  213. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  214. package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +5 -5
  215. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  216. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  217. package/dist/types/src/internal/Query.d.ts +10 -0
  218. package/dist/types/src/internal/Query.d.ts.map +1 -0
  219. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  220. package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +1 -1
  221. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  222. package/dist/types/src/internal/{ref → Ref}/ref.d.ts +42 -19
  223. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  224. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/{schema → Type}/compose.d.ts +1 -1
  226. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  227. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  228. package/dist/types/src/internal/Type/index.d.ts +3 -0
  229. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  230. package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -1
  231. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  232. package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
  233. package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
  234. package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
  235. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  236. package/dist/types/src/internal/{api → common/api}/meta.d.ts +3 -3
  237. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  238. package/dist/types/src/internal/common/index.d.ts +4 -0
  239. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  240. package/dist/types/src/internal/{proxy → common/proxy}/change-context.d.ts +1 -1
  241. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  242. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  243. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  244. package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +1 -1
  245. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  246. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  247. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  248. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  249. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  250. package/dist/types/src/internal/common/proxy/make-object.d.ts +19 -0
  251. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  252. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  253. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  254. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  255. package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +1 -1
  256. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  257. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +2 -2
  258. package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts.map +1 -1
  259. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  260. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  261. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  262. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  264. package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +18 -2
  265. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  266. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  267. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  268. package/dist/types/src/internal/{types → common/types}/base.d.ts +1 -0
  269. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  270. package/dist/types/src/internal/common/types/entity.d.ts +94 -0
  271. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  272. package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
  273. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  274. package/dist/types/src/internal/{types → common/types}/meta.d.ts +12 -1
  275. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  276. package/dist/types/src/internal/common/types/model-symbols.d.ts +58 -0
  277. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  278. package/dist/types/src/internal/{types → common/types}/typename.d.ts +7 -0
  279. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  280. package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
  281. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  282. package/dist/types/src/internal/index.d.ts +9 -10
  283. package/dist/types/src/internal/index.d.ts.map +1 -1
  284. package/dist/types/src/testing/test-data.d.ts +8 -8
  285. package/dist/types/src/testing/test-data.d.ts.map +1 -1
  286. package/dist/types/src/testing/test-schema.d.ts +77 -82
  287. package/dist/types/src/testing/test-schema.d.ts.map +1 -1
  288. package/dist/types/src/testing/util.d.ts +5 -3
  289. package/dist/types/src/testing/util.d.ts.map +1 -1
  290. package/dist/types/tsconfig.tsbuildinfo +1 -1
  291. package/package.json +30 -15
  292. package/src/Annotation.ts +7 -3
  293. package/src/Collection.ts +36 -0
  294. package/src/Database.ts +80 -77
  295. package/src/Dataset.ts +34 -0
  296. package/src/Entity.test.ts +116 -6
  297. package/src/Entity.ts +181 -66
  298. package/src/Err.ts +25 -3
  299. package/src/Extension.test.ts +235 -0
  300. package/src/Extension.ts +122 -0
  301. package/src/Feed.ts +356 -0
  302. package/src/Filter.test.ts +90 -0
  303. package/src/Filter.ts +152 -21
  304. package/src/Format.ts +3 -3
  305. package/src/Hypergraph.ts +16 -11
  306. package/src/Json.test.ts +175 -0
  307. package/src/Json.ts +103 -0
  308. package/src/JsonSchema.ts +14 -4
  309. package/src/Key.ts +1 -1
  310. package/src/Migration.ts +114 -0
  311. package/src/Obj.test.ts +158 -20
  312. package/src/Obj.ts +451 -183
  313. package/src/Order.ts +3 -1
  314. package/src/Query.test.ts +446 -89
  315. package/src/Query.ts +300 -35
  316. package/src/Ref.ts +83 -12
  317. package/src/Relation.test.ts +16 -10
  318. package/src/Relation.ts +236 -165
  319. package/src/SchemaRegistry.ts +13 -17
  320. package/src/Tag.ts +9 -9
  321. package/src/Type.test.ts +169 -24
  322. package/src/Type.ts +561 -354
  323. package/src/View.ts +101 -0
  324. package/src/exemplars.test.ts +21 -0
  325. package/src/index.ts +9 -2
  326. package/src/internal/Annotation/annotations.test.ts +165 -0
  327. package/src/internal/{annotations → Annotation}/annotations.ts +181 -101
  328. package/src/internal/{annotations → Annotation}/index.ts +1 -0
  329. package/src/internal/{api → Annotation}/sorting.ts +2 -4
  330. package/src/internal/{annotations → Annotation}/util.ts +17 -9
  331. package/src/internal/{api/entity.ts → Entity/api.ts} +9 -8
  332. package/src/internal/Entity/entity.ts +246 -0
  333. package/src/internal/{entities → Entity}/index.ts +4 -0
  334. package/src/internal/{entities → Entity}/model.ts +42 -60
  335. package/src/internal/{entities → Entity}/object.ts +13 -6
  336. package/src/internal/Entity/relation.ts +179 -0
  337. package/src/internal/Entity/type-kind.ts +67 -0
  338. package/src/internal/Entity/type-uri.ts +87 -0
  339. package/src/internal/Entity/util.ts +34 -0
  340. package/src/internal/{api → Entity}/version.ts +2 -2
  341. package/src/internal/{formats → Format}/date.test.ts +1 -2
  342. package/src/internal/{formats → Format}/date.ts +0 -4
  343. package/src/internal/{formats → Format}/format.test.ts +1 -2
  344. package/src/internal/{formats → Format}/index.ts +2 -3
  345. package/src/internal/{formats → Format}/types.ts +2 -2
  346. package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
  347. package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
  348. package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +64 -151
  349. package/src/internal/{json-schema → JsonSchema}/json-schema.ts +47 -28
  350. package/src/internal/{object → Obj}/clone.ts +10 -6
  351. package/src/internal/{object → Obj}/common.ts +2 -2
  352. package/src/internal/{object → Obj}/create-object.test.ts +13 -14
  353. package/src/internal/Obj/create-object.ts +135 -0
  354. package/src/internal/{object → Obj}/deleted.ts +2 -2
  355. package/src/internal/{object → Obj}/index.ts +0 -1
  356. package/src/internal/{object → Obj}/inspect.ts +3 -3
  357. package/src/internal/Obj/json-serializer.test.ts +185 -0
  358. package/src/internal/{object → Obj}/json-serializer.ts +108 -45
  359. package/src/internal/{object → Obj}/schema-validator.ts +1 -1
  360. package/src/internal/{object → Obj}/set-value.test.ts +31 -54
  361. package/src/internal/{object → Obj}/set-value.ts +3 -3
  362. package/src/internal/{object → Obj}/snapshot.ts +41 -23
  363. package/src/internal/Obj/typed-object.test.ts +32 -0
  364. package/src/internal/{object → Obj}/typed-object.ts +5 -5
  365. package/src/internal/Query.ts +156 -0
  366. package/src/internal/{ref → Ref}/ref-array.ts +1 -2
  367. package/src/internal/{ref → Ref}/ref.test.ts +16 -26
  368. package/src/internal/{ref → Ref}/ref.ts +117 -57
  369. package/src/internal/{schema → Type}/compose.test.ts +6 -5
  370. package/src/internal/{schema → Type}/compose.ts +1 -1
  371. package/src/internal/Type/index.ts +6 -0
  372. package/src/internal/{schema → Type}/manipulation.ts +0 -25
  373. package/src/internal/Type/type-schema.ts +60 -0
  374. package/src/internal/{README.md → common/README.md} +2 -2
  375. package/src/internal/{api → common/api}/index.ts +0 -4
  376. package/src/internal/{api → common/api}/meta.ts +3 -3
  377. package/src/internal/common/index.ts +7 -0
  378. package/src/internal/{proxy → common/proxy}/change-context.ts +1 -1
  379. package/src/internal/{proxy → common/proxy}/change.test.ts +97 -97
  380. package/src/internal/{proxy → common/proxy}/errors.ts +2 -2
  381. package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -4
  382. package/src/internal/{proxy → common/proxy}/json-serializer.ts +20 -14
  383. package/src/internal/{proxy → common/proxy}/make-object.ts +37 -15
  384. package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
  385. package/src/internal/{proxy → common/proxy}/reactive-array.ts +1 -1
  386. package/src/internal/common/proxy/reactive.test.ts +54 -0
  387. package/src/internal/{proxy → common/proxy}/reactive.ts +12 -4
  388. package/src/internal/common/proxy/schema.test.ts +107 -0
  389. package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +15 -15
  390. package/src/internal/{proxy → common/proxy}/typed-handler.ts +75 -18
  391. package/src/internal/{proxy → common/proxy}/typed-object.test.ts +17 -30
  392. package/src/internal/{types → common/types}/base.ts +1 -1
  393. package/src/internal/common/types/entity.ts +133 -0
  394. package/src/internal/{types → common/types}/index.ts +1 -0
  395. package/src/internal/{types → common/types}/meta.ts +15 -1
  396. package/src/internal/common/types/model-symbols.ts +74 -0
  397. package/src/internal/common/types/typename.ts +91 -0
  398. package/src/internal/{types → common/types}/version.ts +2 -3
  399. package/src/internal/index.ts +9 -31
  400. package/src/testing/api.test.ts +15 -12
  401. package/src/testing/test-data.ts +158 -99
  402. package/src/testing/test-schema.ts +33 -67
  403. package/src/testing/util.ts +14 -11
  404. package/dist/lib/neutral/chunk-2AF5GMG6.mjs +0 -171
  405. package/dist/lib/neutral/chunk-2AF5GMG6.mjs.map +0 -7
  406. package/dist/lib/neutral/chunk-4L6DOFXP.mjs.map +0 -7
  407. package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +0 -7
  408. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
  409. package/dist/lib/neutral/chunk-DLPC7DHQ.mjs.map +0 -7
  410. package/dist/lib/neutral/chunk-EBUAT5ID.mjs +0 -229
  411. package/dist/lib/neutral/chunk-EBUAT5ID.mjs.map +0 -7
  412. package/dist/lib/neutral/chunk-K5K3Z62A.mjs.map +0 -7
  413. package/dist/lib/neutral/chunk-KB7RIVLK.mjs.map +0 -7
  414. package/dist/lib/neutral/chunk-LKFNEFHF.mjs +0 -130
  415. package/dist/lib/neutral/chunk-LKFNEFHF.mjs.map +0 -7
  416. package/dist/lib/neutral/chunk-MTEHHY62.mjs.map +0 -7
  417. package/dist/lib/neutral/chunk-N2QNHMT5.mjs.map +0 -7
  418. package/dist/lib/neutral/chunk-QARLJVDB.mjs.map +0 -7
  419. package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +0 -7
  420. package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +0 -7
  421. package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +0 -7
  422. package/dist/lib/neutral/chunk-TLGNKUUG.mjs +0 -3905
  423. package/dist/lib/neutral/chunk-TLGNKUUG.mjs.map +0 -7
  424. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs +0 -142
  425. package/dist/lib/neutral/chunk-TQT6WTIJ.mjs.map +0 -7
  426. package/dist/lib/neutral/chunk-VUQGRDRI.mjs +0 -97
  427. package/dist/lib/neutral/chunk-VUQGRDRI.mjs.map +0 -7
  428. package/dist/lib/neutral/chunk-X2MPMYYN.mjs +0 -13
  429. package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +0 -7
  430. package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +0 -7
  431. package/dist/lib/neutral/chunk-ZAHWXGK4.mjs.map +0 -7
  432. package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
  433. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
  434. package/dist/types/src/internal/annotations/index.d.ts +0 -3
  435. package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
  436. package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
  437. package/dist/types/src/internal/api/annotations.d.ts +0 -23
  438. package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
  439. package/dist/types/src/internal/api/entity.d.ts +0 -13
  440. package/dist/types/src/internal/api/entity.d.ts.map +0 -1
  441. package/dist/types/src/internal/api/index.d.ts.map +0 -1
  442. package/dist/types/src/internal/api/meta.d.ts.map +0 -1
  443. package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
  444. package/dist/types/src/internal/api/version.d.ts.map +0 -1
  445. package/dist/types/src/internal/entities/entity.d.ts +0 -20
  446. package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
  447. package/dist/types/src/internal/entities/index.d.ts +0 -6
  448. package/dist/types/src/internal/entities/index.d.ts.map +0 -1
  449. package/dist/types/src/internal/entities/model.d.ts +0 -79
  450. package/dist/types/src/internal/entities/model.d.ts.map +0 -1
  451. package/dist/types/src/internal/entities/object.d.ts.map +0 -1
  452. package/dist/types/src/internal/entities/relation.d.ts +0 -62
  453. package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
  454. package/dist/types/src/internal/entities/util.d.ts.map +0 -1
  455. package/dist/types/src/internal/formats/date.d.ts.map +0 -1
  456. package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
  457. package/dist/types/src/internal/formats/format.d.ts.map +0 -1
  458. package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
  459. package/dist/types/src/internal/formats/index.d.ts.map +0 -1
  460. package/dist/types/src/internal/formats/number.d.ts.map +0 -1
  461. package/dist/types/src/internal/formats/object.d.ts.map +0 -1
  462. package/dist/types/src/internal/formats/select.d.ts.map +0 -1
  463. package/dist/types/src/internal/formats/string.d.ts.map +0 -1
  464. package/dist/types/src/internal/formats/types.d.ts.map +0 -1
  465. package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
  466. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
  467. package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
  468. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
  469. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
  470. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
  471. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
  472. package/dist/types/src/internal/object/clone.d.ts.map +0 -1
  473. package/dist/types/src/internal/object/common.d.ts.map +0 -1
  474. package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
  475. package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
  476. package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
  477. package/dist/types/src/internal/object/ids.d.ts +0 -6
  478. package/dist/types/src/internal/object/ids.d.ts.map +0 -1
  479. package/dist/types/src/internal/object/index.d.ts.map +0 -1
  480. package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
  481. package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
  482. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
  483. package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
  484. package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
  485. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
  486. package/dist/types/src/internal/object/set-value.d.ts.map +0 -1
  487. package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
  488. package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
  489. package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
  490. package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
  491. package/dist/types/src/internal/proxy/change-context.d.ts.map +0 -1
  492. package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
  493. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
  494. package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
  495. package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
  496. package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
  497. package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
  498. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
  499. package/dist/types/src/internal/proxy/make-object.d.ts +0 -14
  500. package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
  501. package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
  502. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
  503. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
  504. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
  505. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
  506. package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
  507. package/dist/types/src/internal/proxy/symbols.d.ts.map +0 -1
  508. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
  509. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
  510. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
  511. package/dist/types/src/internal/ref/index.d.ts.map +0 -1
  512. package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
  513. package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
  514. package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
  515. package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
  516. package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
  517. package/dist/types/src/internal/schema/echo-schema.d.ts +0 -181
  518. package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
  519. package/dist/types/src/internal/schema/index.d.ts +0 -4
  520. package/dist/types/src/internal/schema/index.d.ts.map +0 -1
  521. package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
  522. package/dist/types/src/internal/schema/persistent-schema.d.ts +0 -20
  523. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
  524. package/dist/types/src/internal/types/base.d.ts.map +0 -1
  525. package/dist/types/src/internal/types/entity.d.ts +0 -37
  526. package/dist/types/src/internal/types/entity.d.ts.map +0 -1
  527. package/dist/types/src/internal/types/index.d.ts.map +0 -1
  528. package/dist/types/src/internal/types/meta.d.ts.map +0 -1
  529. package/dist/types/src/internal/types/typename.d.ts.map +0 -1
  530. package/dist/types/src/internal/types/version.d.ts.map +0 -1
  531. package/src/internal/annotations/annotations.test.ts +0 -96
  532. package/src/internal/api/annotations.ts +0 -60
  533. package/src/internal/entities/entity.ts +0 -126
  534. package/src/internal/entities/relation.ts +0 -171
  535. package/src/internal/entities/util.ts +0 -33
  536. package/src/internal/object/create-object.ts +0 -95
  537. package/src/internal/object/ids.ts +0 -12
  538. package/src/internal/object/json-serializer.test.ts +0 -98
  539. package/src/internal/object/typed-object.test.ts +0 -34
  540. package/src/internal/proxy/schema.test.ts +0 -145
  541. package/src/internal/schema/echo-schema.ts +0 -424
  542. package/src/internal/schema/index.ts +0 -7
  543. package/src/internal/schema/persistent-schema.ts +0 -28
  544. package/src/internal/types/entity.ts +0 -54
  545. package/src/internal/types/typename.ts +0 -55
  546. /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
  547. /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
  548. /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
  549. /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
  550. /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
  551. /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
  552. /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
  553. /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
  554. /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
  555. /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
  556. /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
  557. /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
  558. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
  559. /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
  560. /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
  561. /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
  562. /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
  563. /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
  564. /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
  565. /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
  566. /package/dist/types/src/internal/{object → Obj}/set-value.test.d.ts +0 -0
  567. /package/dist/types/src/internal/{object → Obj}/snapshot.d.ts +0 -0
  568. /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
  569. /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
  570. /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
  571. /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
  572. /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
  573. /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
  574. /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
  575. /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
  576. /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
  577. /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
  578. /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
  579. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
  580. /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
  581. /package/dist/types/src/internal/{proxy → common/proxy}/schema-validator.d.ts +0 -0
  582. /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
  583. /package/dist/types/src/internal/{proxy → common/proxy}/symbols.d.ts +0 -0
  584. /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
  585. /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
  586. /package/src/internal/{formats → Format}/format.ts +0 -0
  587. /package/src/internal/{formats → Format}/number.ts +0 -0
  588. /package/src/internal/{formats → Format}/object.ts +0 -0
  589. /package/src/internal/{formats → Format}/select.ts +0 -0
  590. /package/src/internal/{formats → Format}/string.ts +0 -0
  591. /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
  592. /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
  593. /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
  594. /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
  595. /package/src/internal/{ref → Ref}/index.ts +0 -0
  596. /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
  597. /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
  598. /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
  599. /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
  600. /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
  601. /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
  602. /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
@@ -6,40 +6,62 @@ import type * as Schema from 'effect/Schema';
6
6
 
7
7
  import { ObjectId } from '@dxos/keys';
8
8
 
9
- import { getTypeAnnotation } from '../annotations';
10
- import { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema, ParentId } from '../types';
11
-
9
+ import { getTypeAnnotation } from '../../Annotation';
10
+ import {
11
+ type AnyProperties,
12
+ KindId,
13
+ MetaId,
14
+ type ObjectMeta,
15
+ ObjectMetaSchema,
16
+ ParentId,
17
+ SchemaKindId,
18
+ StaticTypeSchemaSlot,
19
+ } from '../types';
12
20
  import { defineHiddenProperty } from './define-hidden-property';
13
21
  import { attachTypedJsonSerializer } from './json-serializer';
14
22
  import { createProxy, getProxyTarget, isValidProxyTarget } from './proxy-utils';
15
- import { TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
23
+ import { TypeSource, TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
16
24
 
17
25
  /**
18
26
  *
19
27
  */
20
28
  // TODO(burdon): Make internal
21
- export type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId>;
29
+ // Omits the brand slots — those get stamped on the instance by the entity
30
+ // handler (KindId via setKind, SchemaKindId derived in the proxy `get` trap
31
+ // from kind + jsonSchema.entityKind, StaticTypeSchemaSlot lazily via the
32
+ // proxy), not supplied by the caller.
33
+ export type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId | SchemaKindId | StaticTypeSchemaSlot>;
22
34
 
23
35
  /**
24
36
  * Creates a reactive object from a plain Javascript object.
25
37
  * Requires a TS-effect schema.
38
+ *
39
+ * Callers that have a `Type.Type` entity (not a raw schema) must unwrap it
40
+ * themselves — `Obj.make` / `Relation.make` do this via `Type.getSchema(...)`
41
+ * and pass the entity through as `typeSource` so the instance carries a
42
+ * back-reference for `Obj.getType` and resolves the live source schema
43
+ * uniformly via the entity's `[StaticTypeSchemaSlot]`.
26
44
  */
27
45
  // TODO(burdon): Make internal
28
46
  // TODO(dmaretskyi): Deep mutability.
29
47
  // TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.
30
48
  // TODO(dmaretskyi): Could mutate original object making it unusable.
31
- export const makeObject: {
32
- <T extends AnyProperties>(
33
- schema: Schema.Schema<T, any, never>,
34
- obj: NoInfer<MakeObjectProps<T>>,
35
- meta?: ObjectMeta,
36
- ): T;
37
- } = <T extends AnyProperties>(schema: Schema.Schema<T, any>, obj: MakeObjectProps<T>, meta?: ObjectMeta): T => {
49
+ export const makeObject = <T extends AnyProperties>(
50
+ schema: Schema.Schema<T, any, never>,
51
+ obj: NoInfer<MakeObjectProps<T>>,
52
+ meta?: ObjectMeta,
53
+ typeSource?: TypeSource,
54
+ ): T => {
38
55
  // Use Object.assign to copy symbol properties (like ParentId) that spread operator doesn't copy.
39
- return createReactiveObject<T>(Object.assign({}, obj) as T, meta, schema);
56
+ return createReactiveObject<T>(Object.assign({}, obj) as T, meta, schema as Schema.Schema<T, any>, typeSource);
40
57
  };
41
58
 
42
- const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta, schema?: Schema.Schema<T>): T => {
59
+ const createReactiveObject = <T extends AnyProperties>(
60
+ obj: T,
61
+ meta?: ObjectMeta,
62
+ schema?: Schema.Schema<T>,
63
+ typeSource?: TypeSource,
64
+ ): T => {
43
65
  if (!isValidProxyTarget(obj)) {
44
66
  throw new Error('Value cannot be made into a reactive object.');
45
67
  }
@@ -63,7 +85,7 @@ const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta
63
85
  if (parent !== undefined) {
64
86
  defineHiddenProperty(obj, ParentId, parent);
65
87
  }
66
- prepareTypedTarget(obj, schema);
88
+ prepareTypedTarget(obj, schema, typeSource);
67
89
  attachTypedJsonSerializer(obj);
68
90
  const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);
69
91
 
@@ -5,7 +5,6 @@
5
5
  import { invariant } from '@dxos/invariant';
6
6
 
7
7
  import { KindId } from '../types';
8
-
9
8
  import { queueOwnerNotification } from './change-context';
10
9
  import { defineHiddenProperty } from './define-hidden-property';
11
10
  import { getProxyTarget, isProxy, isValidProxyTarget } from './proxy-utils';
@@ -34,7 +34,7 @@ const checkArrayMutationAllowed = (arr: any, method: string): void => {
34
34
 
35
35
  /**
36
36
  * Extends the native array to make sure that arrays methods are correctly reactive.
37
- * Enforces that mutations only happen within Obj.change() context.
37
+ * Enforces that mutations only happen within Obj.update() context.
38
38
  */
39
39
  export class ReactiveArray<T> extends Array<T> {
40
40
  static override get [Symbol.species]() {
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import * as Obj from '../../../Obj';
8
+ import { TestSchema } from '../../../testing';
9
+
10
+ describe('Obj.subscribe', () => {
11
+ test('subscribes and fires for reactive proxies', () => {
12
+ const obj = Obj.make(TestSchema.Person, { name: 'Test' });
13
+ let calls = 0;
14
+ const unsubscribe = Obj.subscribe(obj, () => {
15
+ calls++;
16
+ });
17
+
18
+ Obj.update(obj, (obj) => {
19
+ obj.name = 'Updated';
20
+ });
21
+ expect(calls).toBeGreaterThan(0);
22
+
23
+ unsubscribe();
24
+ const seen = calls;
25
+ Obj.update(obj, (obj) => {
26
+ obj.name = 'After unsubscribe';
27
+ });
28
+ expect(calls).toBe(seen);
29
+ });
30
+
31
+ // Regression: queue-stored typed objects (e.g. AiContext.Binding) and other Obj-shaped values
32
+ // satisfy `Obj.isObject` (KindId is set) but are not wrapped in a reactive Proxy. Earlier
33
+ // versions invariant'd inside `getProxyTarget` when an atom body did `Obj.subscribe(obj)` on
34
+ // such an input. The contract is "no-op for non-reactive inputs"; verify the function
35
+ // returns gracefully instead of throwing.
36
+ test('returns a no-op unsubscribe for non-proxy inputs', () => {
37
+ const queueShaped: any = {
38
+ id: '01KQ5NKXJWSKMRPVTVG2GHV8V3',
39
+ blueprints: { added: [], removed: [] },
40
+ objects: { added: [], removed: [] },
41
+ };
42
+ const unsubscribe = Obj.subscribe(queueShaped, () => {});
43
+ expect(typeof unsubscribe).toBe('function');
44
+ expect(() => unsubscribe()).not.toThrow();
45
+ });
46
+
47
+ test('returns a no-op unsubscribe for primitives, null, and undefined', () => {
48
+ for (const value of [null, undefined, 42, 'string', true]) {
49
+ const unsubscribe = Obj.subscribe(value as any, () => {});
50
+ expect(typeof unsubscribe).toBe('function');
51
+ expect(() => unsubscribe()).not.toThrow();
52
+ }
53
+ });
54
+ });
@@ -2,9 +2,8 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type RefTypeId } from '../ref/ref';
6
-
7
- import { getProxyTarget } from './proxy-utils';
5
+ import { type RefTypeId } from '../../Ref/ref';
6
+ import { getProxyTarget, isProxy } from './proxy-utils';
8
7
  import { ChangeId, EventId } from './symbols';
9
8
 
10
9
  /**
@@ -15,6 +14,15 @@ import { ChangeId, EventId } from './symbols';
15
14
  */
16
15
  // TODO(wittjosiah): Consider throwing if obj doesn't have EventId instead of returning no-op.
17
16
  export const subscribe = (obj: unknown, callback: () => void): (() => void) => {
17
+ // Guard against non-reactive inputs (queue-stored typed objects, snapshots, plain shapes
18
+ // with branded symbols) before `getProxyTarget`'s `ProxyHandlerSlot` invariant kicks in.
19
+ // `Obj.isObject` (KindId-based) is satisfied by these inputs, so callers like
20
+ // `Atom.family((obj) => Atom.make((get) => Obj.subscribe(obj, ...)))` legitimately reach
21
+ // here with a non-proxy. Falling back to a no-op preserves the documented contract that
22
+ // values without subscription support get a no-op unsubscribe.
23
+ if (!isProxy(obj)) {
24
+ return () => {};
25
+ }
18
26
  const target = getProxyTarget(obj as any);
19
27
  if (target && EventId in target) {
20
28
  return (target as any)[EventId].on(callback);
@@ -24,7 +32,7 @@ export const subscribe = (obj: unknown, callback: () => void): (() => void) => {
24
32
 
25
33
  /**
26
34
  * Deeply removes readonly modifiers from all properties of T.
27
- * Inside Obj.change, all properties are fully mutable regardless of schema definition.
35
+ * Inside Obj.update, all properties are fully mutable regardless of schema definition.
28
36
  * Ref types are preserved as-is since they are value-like objects that are replaced, not mutated.
29
37
  * Primitive types (including branded primitives) are preserved as-is.
30
38
  */
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+ import { describe, expect, test } from 'vitest';
8
+
9
+ import { invariant } from '@dxos/invariant';
10
+ import { DXN } from '@dxos/keys';
11
+
12
+ import { createEchoSchema } from '../../../testing';
13
+ import * as Type from '../../../Type';
14
+ import { PropertyMeta, getPropertyMetaAnnotation, getTypeAnnotation } from '../../Annotation';
15
+ import { EchoObjectSchema } from '../../Entity';
16
+
17
+ // Test-local: introspect a Type.Type entity's properties via its rebuilt Effect
18
+ // Schema, filter the implicit `id` field, and unwrap `T | undefined` optionality.
19
+ const getProperties = (type: Type.Type): SchemaAST.PropertySignature[] => {
20
+ const ast = Type.getSchema(type).ast;
21
+ invariant(SchemaAST.isTypeLiteral(ast));
22
+ return [...ast.propertySignatures]
23
+ .filter((p) => p.name !== 'id')
24
+ .map((p) => {
25
+ if (!SchemaAST.isUnion(p.type)) {
26
+ return p;
27
+ }
28
+ const nonUndefined = p.type.types.find((t) => !SchemaAST.isUndefinedKeyword(t))!;
29
+ return { ...p, type: nonUndefined } as SchemaAST.PropertySignature;
30
+ });
31
+ };
32
+
33
+ const EmptySchemaType = Schema.Struct({}).pipe(EchoObjectSchema(DXN.make('com.example.type.empty', '0.1.0')));
34
+
35
+ type EmptySchemaType = Type.InstanceType<typeof EmptySchemaType>;
36
+
37
+ describe('dynamic schema', () => {
38
+ test('getProperties filters out id and unwraps optionality', async () => {
39
+ const TestSchema = Schema.Struct({
40
+ field1: Schema.String,
41
+ field2: Schema.Boolean,
42
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.test', '0.1.0')));
43
+
44
+ const registered = createEchoSchema(Type.getSchema(TestSchema));
45
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
46
+ ['field1', SchemaAST.stringKeyword],
47
+ ['field2', SchemaAST.booleanKeyword],
48
+ ]);
49
+ });
50
+
51
+ test('addColumns', async () => {
52
+ const TestSchema = Schema.Struct({
53
+ field1: Schema.String,
54
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.test', '0.1.0')));
55
+
56
+ const registered = createEchoSchema(Type.getSchema(TestSchema));
57
+ Type.addFields(registered, { field2: Schema.Boolean });
58
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
59
+ ['field1', SchemaAST.stringKeyword],
60
+ ['field2', SchemaAST.booleanKeyword],
61
+ ]);
62
+ });
63
+
64
+ test('updateColumns preserves order of existing and appends new fields', async () => {
65
+ const registered = createEchoSchema(Type.getSchema(EmptySchemaType));
66
+ Type.addFields(registered, { field1: Schema.String });
67
+ Type.addFields(registered, { field2: Schema.Boolean });
68
+ Type.addFields(registered, { field3: Schema.Number });
69
+ Type.updateFields(registered, { field4: Schema.Boolean, field2: Schema.String });
70
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
71
+ ['field1', SchemaAST.stringKeyword],
72
+ ['field2', SchemaAST.stringKeyword],
73
+ ['field3', SchemaAST.numberKeyword],
74
+ ['field4', SchemaAST.booleanKeyword],
75
+ ]);
76
+ });
77
+
78
+ test('removeColumns', async () => {
79
+ const registered = createEchoSchema(Type.getSchema(EmptySchemaType));
80
+ Type.addFields(registered, { field1: Schema.String });
81
+ Type.addFields(registered, { field2: Schema.Boolean });
82
+ Type.addFields(registered, { field3: Schema.Number });
83
+ Type.removeFields(registered, ['field2']);
84
+ expect(getProperties(registered).map((p) => [p.name, p.type])).to.deep.eq([
85
+ ['field1', SchemaAST.stringKeyword],
86
+ ['field3', SchemaAST.numberKeyword],
87
+ ]);
88
+ });
89
+
90
+ test('schema manipulations preserve annotations', async () => {
91
+ const metaNamespace = 'dxos.test';
92
+ const metaInfo = { maxLength: 10 };
93
+ const registered = createEchoSchema(Type.getSchema(EmptySchemaType));
94
+ Type.addFields(registered, {
95
+ field1: Schema.String.pipe(PropertyMeta(metaNamespace, metaInfo)),
96
+ field2: Schema.String,
97
+ });
98
+ Type.addFields(registered, { field3: Schema.String });
99
+ Type.updateFields(registered, { field3: Schema.Boolean });
100
+ Type.removeFields(registered, ['field2']);
101
+ expect(getTypeAnnotation(Type.getSchema(registered))).to.deep.contain({
102
+ typename: 'com.example.type.empty',
103
+ version: '0.1.0',
104
+ });
105
+ expect(getPropertyMetaAnnotation(getProperties(registered)[0], metaNamespace)).to.deep.eq(metaInfo);
106
+ });
107
+ });
@@ -5,12 +5,14 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
- import { TestSchema } from '../../testing';
9
- import { EchoObjectSchema } from '../entities';
10
- import { setValue } from '../object';
11
- import { Ref } from '../ref';
12
- import { foreignKey, getMeta } from '../types';
8
+ import { DXN } from '@dxos/keys';
13
9
 
10
+ import * as Obj from '../../../Obj';
11
+ import { TestSchema } from '../../../testing';
12
+ import { EchoObjectSchema } from '../../Entity';
13
+ import { setValue } from '../../Obj';
14
+ import { Ref } from '../../Ref';
15
+ import { foreignKey, getMeta } from '../types';
14
16
  import { makeObject } from './make-object';
15
17
  import { change, subscribe } from './reactive';
16
18
 
@@ -40,15 +42,13 @@ describe('complex schema validations', () => {
40
42
 
41
43
  test('references', () => {
42
44
  const Foo = Schema.Struct({ field: Schema.String }).pipe(
43
- EchoObjectSchema({ typename: 'example.com/type/Foo', version: '0.1.0' }),
44
- );
45
- const Bar = Schema.Struct({ fooRef: Ref(Foo) }).pipe(
46
- EchoObjectSchema({ typename: 'example.com/type/Bar', version: '0.1.0' }),
45
+ EchoObjectSchema(DXN.make('com.example.type.foo', '0.1.0')),
47
46
  );
47
+ const Bar = Schema.Struct({ fooRef: Ref(Foo) }).pipe(EchoObjectSchema(DXN.make('com.example.type.bar', '0.1.0')));
48
48
  const field = 'hello';
49
- expect(() => makeObject(Bar, { fooRef: { id: '1', field } as any })).to.throw();
50
- expect(() => makeObject(Bar, { fooRef: undefined as any })).to.throw(); // Unresolved reference.
51
- const bar = makeObject(Bar, { fooRef: Ref.make(makeObject(Foo, { field })) });
49
+ expect(() => Obj.make(Bar, { fooRef: { id: '1', field } as any })).to.throw();
50
+ expect(() => Obj.make(Bar, { fooRef: undefined as any })).to.throw(); // Unresolved reference.
51
+ const bar = Obj.make(Bar, { fooRef: Ref.make(Obj.make(Foo, { field })) });
52
52
  expect(bar.fooRef.target?.field).to.eq(field);
53
53
  });
54
54
 
@@ -80,7 +80,7 @@ describe('complex schema validations', () => {
80
80
  // Untyped reactive objects are no longer supported - use Atoms for untyped reactive state.
81
81
 
82
82
  test('creating an object with data from another object', () => {
83
- const contact = makeObject(TestSchema.Person, {
83
+ const contact = Obj.make(TestSchema.Person, {
84
84
  name: 'Robert Smith',
85
85
  email: 'robert@example.com',
86
86
  });
@@ -95,9 +95,9 @@ describe('complex schema validations', () => {
95
95
 
96
96
  test('subscribe', () => {
97
97
  const TestSchema = Schema.Struct({ field: Schema.String }).pipe(
98
- EchoObjectSchema({ typename: 'Test', version: '0.1.0' }),
98
+ EchoObjectSchema(DXN.make('com.test.type.test', '0.1.0')),
99
99
  );
100
- const object = makeObject(TestSchema, { field: 'value' });
100
+ const object = Obj.make(TestSchema, { field: 'value' });
101
101
  let called = 0;
102
102
  const unsubscribe = subscribe(object as any, () => {
103
103
  called++;
@@ -2,19 +2,17 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type InspectOptionsStylized } from 'node:util';
6
-
7
5
  import * as Schema from 'effect/Schema';
8
6
  import * as SchemaAST from 'effect/SchemaAST';
7
+ import { type InspectOptionsStylized } from 'node:util';
9
8
 
10
9
  import { Event } from '@dxos/async';
11
10
  import { inspectCustom } from '@dxos/debug';
12
11
  import { invariant } from '@dxos/invariant';
13
12
 
14
- import { getSchemaDXN } from '../annotations';
15
- import { ObjectDeletedId } from '../entities';
16
- import { ParentId, SchemaId, TypeId } from '../types';
17
-
13
+ import { getSchemaURI } from '../../Annotation';
14
+ import { toEffectSchema } from '../../JsonSchema/json-schema';
15
+ import { ObjectDeletedId, ParentId, SchemaId, StaticTypeSchemaSlot, TypeEntityId, TypeId } from '../types';
18
16
  import { executeChange, isInChangeContext, queueNotification } from './change-context';
19
17
  import { defineHiddenProperty } from './define-hidden-property';
20
18
  import { createPropertyDeleteError } from './errors';
@@ -211,6 +209,27 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
211
209
  // Uses target as both the context key and event target for non-database objects.
212
210
  return (callback: (obj: any) => void) => executeChange(target, target, receiver, callback);
213
211
  }
212
+ case TypeEntityId: {
213
+ // The back-reference to the type entity is metadata — return the raw
214
+ // value so we don't re-wrap an already-reactive `Type.Type` entity in
215
+ // another proxy (which would fail the SchemaId-in-target invariant).
216
+ return Reflect.get(target, prop, receiver);
217
+ }
218
+ case StaticTypeSchemaSlot: {
219
+ // Lazily rebuild the source Effect Schema from `jsonSchema` and cache it on
220
+ // the slot; the set-trap invalidates the cache when `jsonSchema` is mutated.
221
+ const existing = Reflect.get(target, prop, receiver);
222
+ if (existing !== undefined) {
223
+ return existing;
224
+ }
225
+ const jsonSchema = (target as any).jsonSchema;
226
+ if (jsonSchema == null) {
227
+ return undefined;
228
+ }
229
+ const rebuilt = toEffectSchema(jsonSchema);
230
+ defineHiddenProperty(target, StaticTypeSchemaSlot, rebuilt);
231
+ return rebuilt;
232
+ }
214
233
  }
215
234
 
216
235
  // Handle getter properties.
@@ -229,7 +248,7 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
229
248
  set(target: ProxyTarget, prop: string | symbol, value: any, receiver: any): boolean {
230
249
  const echoRoot = getEchoRoot(target);
231
250
 
232
- // Check readonly enforcement - mutations only allowed within Obj.change().
251
+ // Check readonly enforcement - mutations only allowed within Obj.update().
233
252
  // Skip check if the object is still being initialized (no ChangeId handler yet).
234
253
  // Also skip for non-initialized root objects (those without EventId).
235
254
  // Skip for symbol properties (internal infrastructure, not user data).
@@ -237,8 +256,8 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
237
256
  const isSymbolProp = typeof prop === 'symbol';
238
257
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
239
258
  throw new Error(
240
- `Cannot modify object property "${String(prop)}" outside of Obj.change(). ` +
241
- 'Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
259
+ `Cannot modify object property "${String(prop)}" outside of Obj.update(). ` +
260
+ 'Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
242
261
  );
243
262
  }
244
263
 
@@ -248,6 +267,11 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
248
267
  batchEvents(() => {
249
268
  const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value);
250
269
  result = Reflect.set(target, prop, preparedValue, receiver);
270
+ // Invalidate the cached source Effect Schema when `jsonSchema` changes
271
+ // (e.g. `Type.addFields`) so `Type.getSchema` rebuilds from the new shape.
272
+ if (prop === 'jsonSchema') {
273
+ Reflect.deleteProperty(target, StaticTypeSchemaSlot);
274
+ }
251
275
  // Queue notification instead of emitting immediately (batched).
252
276
  if (isInitialized) {
253
277
  queueNotification(echoRoot);
@@ -268,7 +292,7 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
268
292
  deleteProperty(target: ProxyTarget, property: string | symbol): boolean {
269
293
  const echoRoot = getEchoRoot(target);
270
294
 
271
- // Check readonly enforcement - mutations only allowed within Obj.change().
295
+ // Check readonly enforcement - mutations only allowed within Obj.update().
272
296
  // Skip for symbol properties (internal infrastructure, not user data).
273
297
  const isInitialized = (echoRoot as any)[ChangeId] === true || EventId in echoRoot;
274
298
  const isSymbolProp = typeof property === 'symbol';
@@ -286,15 +310,15 @@ export class TypedReactiveHandler implements ReactiveHandler<ProxyTarget> {
286
310
  defineProperty(target: ProxyTarget, property: string | symbol, attributes: PropertyDescriptor): boolean {
287
311
  const echoRoot = getEchoRoot(target);
288
312
 
289
- // Check readonly enforcement - mutations only allowed within Obj.change().
313
+ // Check readonly enforcement - mutations only allowed within Obj.update().
290
314
  // Skip check if the object is still being initialized (no ChangeId handler yet).
291
315
  // Skip for symbol properties (internal infrastructure, not user data).
292
316
  const isInitialized = ChangeId in echoRoot || EventId in echoRoot;
293
317
  const isSymbolProp = typeof property === 'symbol';
294
318
  if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
295
319
  throw new Error(
296
- `Cannot modify object property "${String(property)}" outside of Obj.change(). ` +
297
- 'Use Obj.change(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
320
+ `Cannot modify object property "${String(property)}" outside of Obj.update(). ` +
321
+ 'Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.',
298
322
  );
299
323
  }
300
324
 
@@ -403,16 +427,49 @@ const toJSON = (target: ProxyTarget): any => {
403
427
  return { '@type': 'TypedReactiveObject', ...target };
404
428
  };
405
429
 
430
+ /**
431
+ * Pointer to a `Type.Type` entity, stamped as the back-reference (`TypeEntityId`)
432
+ * on instances and read by the `SchemaId` getter installed below.
433
+ *
434
+ * Structural shape (not `Type.AnyEntity`) because `internal/common/proxy/`
435
+ * can't import the top-level `Type` module without a cycle. Every kind of
436
+ * `Type.Type` entity satisfies this shape:
437
+ * - Static (`Type.makeObject(dxn)` pipe) — slot set directly on the object.
438
+ * - Persisted (echo-handler-wrapped) — slot exposed via that handler's
439
+ * `get` trap (rebuilds from `data.jsonSchema`).
440
+ * - In-memory pre-persist (`Type.makeObjectFromJsonSchema`) — slot exposed
441
+ * via the `case StaticTypeSchemaSlot:` arm in this file's `get` trap.
442
+ */
443
+ export type TypeSource = { readonly [StaticTypeSchemaSlot]?: Schema.Schema.AnyNoContext };
444
+
406
445
  /**
407
446
  * Recursively set AST on all potential proxy targets.
408
447
  */
409
- const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext) => {
410
- const schemaType = getSchemaDXN(schema);
448
+ const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext, typeSource?: TypeSource) => {
449
+ const schemaType = getSchemaURI(schema);
411
450
  if (schemaType != null) {
412
451
  defineHiddenProperty(obj, TypeId, schemaType);
413
452
  }
414
453
 
415
- defineHiddenProperty(obj, SchemaId, schema);
454
+ if (typeSource != null) {
455
+ // Keep a back-reference to the type entity so `Obj.getType` /
456
+ // `Relation.getType` / `Entity.getType` can return it.
457
+ defineHiddenProperty(obj, TypeEntityId, typeSource);
458
+
459
+ // Install `SchemaId` as a getter that reads through the entity's static
460
+ // schema slot. The three entity shapes (static / persisted / in-memory
461
+ // pre-persist) each populate the slot via their own get-trap path, so
462
+ // `Type.update` / `Type.addFields` mutations propagate into validation
463
+ // for objects created via `Obj.make(typeEntity, ...)` without this file
464
+ // having to rebuild from `jsonSchema` itself.
465
+ Object.defineProperty(obj, SchemaId, {
466
+ get: () => typeSource[StaticTypeSchemaSlot] ?? schema,
467
+ enumerable: false,
468
+ configurable: true,
469
+ });
470
+ } else {
471
+ defineHiddenProperty(obj, SchemaId, schema);
472
+ }
416
473
  for (const key in obj) {
417
474
  if (isValidProxyTarget(obj[key])) {
418
475
  const elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);
@@ -423,7 +480,7 @@ const setSchemaProperties = (obj: any, schema: Schema.Schema.AnyNoContext) => {
423
480
  }
424
481
  };
425
482
 
426
- export const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T>) => {
483
+ export const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T>, typeSource?: TypeSource) => {
427
484
  // log.info('prepareTypedTarget', { target, schema });
428
485
  if (!SchemaAST.isTypeLiteral(schema.ast)) {
429
486
  throw new Error('schema has to describe an object type');
@@ -432,7 +489,7 @@ export const prepareTypedTarget = <T>(target: T, schema: Schema.Schema<T>) => {
432
489
  SchemaValidator.validateSchema(schema);
433
490
  const _ = Schema.asserts(schema)(target);
434
491
  makeArraysReactive(target);
435
- setSchemaProperties(target, schema);
492
+ setSchemaProperties(target, schema, typeSource);
436
493
  };
437
494
 
438
495
  const makeArraysReactive = (target: any) => {
@@ -6,22 +6,20 @@ import * as Schema from 'effect/Schema';
6
6
  import type * as Types from 'effect/Types';
7
7
  import { describe, expect, test } from 'vitest';
8
8
 
9
- import { EchoObjectSchema } from '../entities';
10
- import { getSchema } from '../types';
9
+ import { DXN } from '@dxos/keys';
11
10
 
11
+ import * as Obj from '../../../Obj';
12
+ import * as Type from '../../../Type';
13
+ import { EchoObjectSchema } from '../../Entity';
14
+ import { getSchema } from '../types';
12
15
  import { makeObject } from './make-object';
13
16
  import { change } from './reactive';
14
17
 
15
18
  const Organization = Schema.Struct({
16
19
  name: Schema.String,
17
- }).pipe(
18
- EchoObjectSchema({
19
- typename: 'example.com/type/Organization',
20
- version: '0.1.0',
21
- }),
22
- );
20
+ }).pipe(EchoObjectSchema(DXN.make('com.example.type.organization', '0.1.0')));
23
21
 
24
- interface Organization extends Schema.Schema.Type<typeof Organization> {}
22
+ type Organization = Type.InstanceType<typeof Organization>;
25
23
 
26
24
  const Contact = Schema.Struct(
27
25
  {
@@ -31,27 +29,21 @@ const Contact = Schema.Struct(
31
29
  key: Schema.String,
32
30
  value: Schema.Any,
33
31
  },
34
- ).pipe(
35
- Schema.partial,
36
- EchoObjectSchema({
37
- typename: 'example.com/type/Person',
38
- version: '0.1.0',
39
- }),
40
- );
32
+ ).pipe(Schema.partial, EchoObjectSchema(DXN.make('com.example.type.person', '0.1.0')));
41
33
 
42
- interface Contact extends Schema.Schema.Type<typeof Contact> {}
34
+ type Contact = Type.InstanceType<typeof Contact>;
43
35
 
44
- const TEST_ORG: Omit<Organization, 'id'> = { name: 'Test' };
36
+ const TEST_ORG = { name: 'Test' } satisfies Pick<Organization, 'name'>;
45
37
 
46
38
  describe('EchoObjectSchema class DSL', () => {
47
39
  test('can get object schema', async () => {
48
- const obj = makeObject(Organization, TEST_ORG);
49
- expect(getSchema(obj)).to.deep.eq(Organization);
40
+ const obj = Obj.make(Organization, TEST_ORG);
41
+ expect(getSchema(obj)).to.deep.eq(Type.getSchema(Organization));
50
42
  });
51
43
 
52
44
  describe('class options', () => {
53
45
  test('can assign undefined to partial fields', async () => {
54
- const person = makeObject(Contact, { name: 'John' });
46
+ const person = Obj.make(Contact, { name: 'John' });
55
47
  change(person, (p) => {
56
48
  p.name = undefined;
57
49
  p.recordField = 'hello';
@@ -87,7 +79,7 @@ describe('EchoObjectSchema class DSL', () => {
87
79
  }
88
80
 
89
81
  {
90
- // Plain object (not a reactive proxy) - doesn't need Obj.change.
82
+ // Plain object (not a reactive proxy) - doesn't need Obj.update.
91
83
  // Note: Schema.Schema.Type generates readonly types, so we cast to mutable for plain objects.
92
84
  type Test1 = Types.Mutable<Schema.Schema.Type<typeof schema>>;
93
85
 
@@ -99,14 +91,9 @@ describe('EchoObjectSchema class DSL', () => {
99
91
  {
100
92
  const Test2 = Schema.Struct({
101
93
  meta: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),
102
- }).pipe(
103
- EchoObjectSchema({
104
- typename: 'dxos.org/type/FunctionTrigger',
105
- version: '0.1.0',
106
- }),
107
- );
108
-
109
- const object = makeObject(Test2, {});
94
+ }).pipe(EchoObjectSchema(DXN.make('org.dxos.type.functionTrigger', '0.1.0')));
95
+
96
+ const object = Obj.make(Test2, {});
110
97
  change(object, (o) => {
111
98
  (o.meta ??= {}).test = 100;
112
99
  });
@@ -14,12 +14,12 @@ import { type ATTR_META, type ObjectMeta } from './meta';
14
14
  * NOTE: This describes the base type for all database objects.
15
15
  * It is stricter than `T extends {}` or `T extends object`.
16
16
  */
17
- // TODO(burdon): Make internal.
18
17
  // TODO(burdon): Prefer Record<string, unknown>.
19
18
  export type AnyProperties = Record<string, any>;
20
19
 
21
20
  /**
22
21
  * Canonical type for all ECHO entities (objects and relations).
22
+ * @depreacted Remove, use Entity.Unknown instead.
23
23
  */
24
24
  // TODO(wittjosiah): Remove. Prefer higher level types (e.g. Entity.Unknown).
25
25
  export interface AnyEntity {