@dxos/echo 0.8.4-main.c4373fc → 0.8.4-main.c85a9c8dae

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 (559) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +45 -0
  4. package/dist/lib/neutral/Entity.mjs +56 -0
  5. package/dist/lib/neutral/Err.mjs +12 -0
  6. package/dist/lib/neutral/Feed.mjs +43 -0
  7. package/dist/lib/neutral/Filter.mjs +61 -0
  8. package/dist/lib/neutral/Format.mjs +66 -0
  9. package/dist/lib/neutral/Format.mjs.map +7 -0
  10. package/dist/lib/neutral/JsonSchema.mjs +18 -0
  11. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  12. package/dist/lib/neutral/Key.mjs +12 -0
  13. package/dist/lib/neutral/Key.mjs.map +7 -0
  14. package/dist/lib/neutral/Obj.mjs +107 -0
  15. package/dist/lib/neutral/Obj.mjs.map +7 -0
  16. package/dist/lib/neutral/Order.mjs +12 -0
  17. package/dist/lib/neutral/Order.mjs.map +7 -0
  18. package/dist/lib/neutral/Query.mjs +32 -0
  19. package/dist/lib/neutral/Query.mjs.map +7 -0
  20. package/dist/lib/neutral/QueryResult.mjs +2 -0
  21. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  22. package/dist/lib/neutral/Ref.mjs +24 -0
  23. package/dist/lib/neutral/Ref.mjs.map +7 -0
  24. package/dist/lib/neutral/Relation.mjs +90 -0
  25. package/dist/lib/neutral/Relation.mjs.map +7 -0
  26. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  27. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  28. package/dist/lib/neutral/Tag.mjs +25 -0
  29. package/dist/lib/neutral/Tag.mjs.map +7 -0
  30. package/dist/lib/neutral/Type.mjs +34 -0
  31. package/dist/lib/neutral/Type.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-4KG6IGL4.mjs +67 -0
  33. package/dist/lib/neutral/chunk-4KG6IGL4.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-5ELDDYWE.mjs +130 -0
  35. package/dist/lib/neutral/chunk-5ELDDYWE.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-ALOGSVBP.mjs +299 -0
  37. package/dist/lib/neutral/chunk-ALOGSVBP.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
  39. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-AQP4QKYP.mjs +283 -0
  41. package/dist/lib/neutral/chunk-AQP4QKYP.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-BRJSLACP.mjs +152 -0
  43. package/dist/lib/neutral/chunk-BRJSLACP.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-DZQSL6RW.mjs +73 -0
  45. package/dist/lib/neutral/chunk-DZQSL6RW.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs +327 -0
  47. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs +56 -0
  49. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-GFNCSK7F.mjs +101 -0
  51. package/dist/lib/neutral/chunk-GFNCSK7F.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  53. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-KGV3QIRX.mjs +313 -0
  55. package/dist/lib/neutral/chunk-KGV3QIRX.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-M2KVTHZM.mjs +402 -0
  57. package/dist/lib/neutral/chunk-M2KVTHZM.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-MXQJZCPY.mjs +51 -0
  59. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-O3TZFQCT.mjs +27 -0
  61. package/dist/lib/neutral/chunk-O3TZFQCT.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
  63. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-OVUBTQLT.mjs +45 -0
  65. package/dist/lib/neutral/chunk-OVUBTQLT.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-PP4DNUZU.mjs +3919 -0
  67. package/dist/lib/neutral/chunk-PP4DNUZU.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-QXF3LGN2.mjs +43 -0
  69. package/dist/lib/neutral/chunk-QXF3LGN2.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs +97 -0
  71. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-T6JEFNP6.mjs +7 -0
  73. package/dist/lib/neutral/chunk-T6JEFNP6.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs +121 -0
  75. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs +42 -0
  77. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs +298 -0
  79. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs.map +7 -0
  80. package/dist/lib/neutral/index.mjs +94 -0
  81. package/dist/lib/neutral/index.mjs.map +7 -0
  82. package/dist/lib/{node-esm → neutral}/internal/index.mjs +260 -122
  83. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  84. package/dist/lib/neutral/meta.json +1 -0
  85. package/dist/lib/neutral/testing/index.mjs +369 -0
  86. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  87. package/dist/types/src/Annotation.d.ts +24 -0
  88. package/dist/types/src/Annotation.d.ts.map +1 -0
  89. package/dist/types/src/Collection.d.ts +16 -0
  90. package/dist/types/src/Collection.d.ts.map +1 -0
  91. package/dist/types/src/Database.d.ts +189 -0
  92. package/dist/types/src/Database.d.ts.map +1 -0
  93. package/dist/types/src/Dataset.d.ts +18 -0
  94. package/dist/types/src/Dataset.d.ts.map +1 -0
  95. package/dist/types/src/Entity.d.ts +168 -0
  96. package/dist/types/src/Entity.d.ts.map +1 -0
  97. package/dist/types/src/Entity.test.d.ts +2 -0
  98. package/dist/types/src/Entity.test.d.ts.map +1 -0
  99. package/dist/types/src/Err.d.ts +107 -0
  100. package/dist/types/src/Err.d.ts.map +1 -0
  101. package/dist/types/src/Feed.d.ts +165 -0
  102. package/dist/types/src/Feed.d.ts.map +1 -0
  103. package/dist/types/src/Filter.d.ts +120 -0
  104. package/dist/types/src/Filter.d.ts.map +1 -0
  105. package/dist/types/src/Format.d.ts +4 -0
  106. package/dist/types/src/Format.d.ts.map +1 -0
  107. package/dist/types/src/Hypergraph.d.ts +60 -0
  108. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +16 -0
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  111. package/dist/types/src/Key.d.ts +1 -0
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Obj.d.ts +423 -95
  114. package/dist/types/src/Obj.d.ts.map +1 -1
  115. package/dist/types/src/Obj.test.d.ts +2 -0
  116. package/dist/types/src/Obj.test.d.ts.map +1 -0
  117. package/dist/types/src/Order.d.ts +16 -0
  118. package/dist/types/src/Order.d.ts.map +1 -0
  119. package/dist/types/src/Query.d.ts +202 -0
  120. package/dist/types/src/Query.d.ts.map +1 -0
  121. package/dist/types/src/Query.test.d.ts +2 -0
  122. package/dist/types/src/Query.test.d.ts.map +1 -0
  123. package/dist/types/src/QueryResult.d.ts +80 -0
  124. package/dist/types/src/QueryResult.d.ts.map +1 -0
  125. package/dist/types/src/Ref.d.ts +61 -11
  126. package/dist/types/src/Ref.d.ts.map +1 -1
  127. package/dist/types/src/Relation.d.ts +287 -21
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Relation.test.d.ts +2 -0
  130. package/dist/types/src/Relation.test.d.ts.map +1 -0
  131. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  132. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  133. package/dist/types/src/Tag.d.ts +18 -0
  134. package/dist/types/src/Tag.d.ts.map +1 -0
  135. package/dist/types/src/Type.d.ts +120 -97
  136. package/dist/types/src/Type.d.ts.map +1 -1
  137. package/dist/types/src/Type.test.d.ts +2 -0
  138. package/dist/types/src/Type.test.d.ts.map +1 -0
  139. package/dist/types/src/View.d.ts +68 -0
  140. package/dist/types/src/View.d.ts.map +1 -0
  141. package/dist/types/src/hierarchy.test.d.ts +2 -0
  142. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  143. package/dist/types/src/index.d.ts +19 -5
  144. package/dist/types/src/index.d.ts.map +1 -1
  145. package/dist/types/src/internal/annotations/annotations.d.ts +209 -0
  146. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  147. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  148. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  149. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  150. package/dist/types/src/internal/annotations/util.d.ts +39 -0
  151. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  152. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  153. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  154. package/dist/types/src/internal/api/entity.d.ts +13 -0
  155. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  156. package/dist/types/src/internal/api/index.d.ts +15 -0
  157. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  158. package/dist/types/src/internal/api/meta.d.ts +42 -0
  159. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  160. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  161. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  162. package/dist/types/src/internal/api/version.d.ts +42 -0
  163. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  164. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  165. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  166. package/dist/types/src/internal/entities/index.d.ts +6 -0
  167. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  168. package/dist/types/src/internal/entities/model.d.ts +79 -0
  169. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  170. package/dist/types/src/internal/entities/object.d.ts +18 -0
  171. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  172. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  173. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  174. package/dist/types/src/internal/entities/util.d.ts +2 -0
  175. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  176. package/dist/types/src/internal/formats/format.d.ts +4 -2
  177. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  178. package/dist/types/src/internal/formats/select.d.ts +6 -4
  179. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  180. package/dist/types/src/internal/formats/string.d.ts +4 -0
  181. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  182. package/dist/types/src/internal/formats/types.d.ts +13 -9
  183. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  184. package/dist/types/src/internal/index.d.ts +7 -10
  185. package/dist/types/src/internal/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  187. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  188. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  189. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  190. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  192. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +4 -6
  194. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  195. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  196. package/dist/types/src/internal/object/clone.d.ts +8 -0
  197. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  198. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  199. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +10 -11
  200. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  201. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  202. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  203. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  204. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  205. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  206. package/dist/types/src/internal/object/index.d.ts +6 -12
  207. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  208. package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
  209. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  210. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  211. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  212. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  213. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  214. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  215. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  216. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  217. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  218. package/dist/types/src/internal/object/typed-object.d.ts +8 -14
  219. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  220. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  221. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  222. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  223. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  224. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  225. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  226. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  227. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  228. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  229. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  230. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  231. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  232. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  233. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  234. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  235. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  236. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  237. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  238. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  239. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  240. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  241. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  242. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  243. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  244. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  245. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  246. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  247. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  248. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  249. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  250. package/dist/types/src/internal/proxy/typed-handler.d.ts +16 -12
  251. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  252. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  253. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  254. package/dist/types/src/internal/ref/ref.d.ts +43 -18
  255. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  256. package/dist/types/src/internal/schema/compose.d.ts +7 -0
  257. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  258. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/schema/echo-schema.d.ts +25 -12
  260. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  261. package/dist/types/src/internal/schema/index.d.ts +1 -4
  262. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  263. package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -1
  264. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  265. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  266. package/dist/types/src/internal/types/base.d.ts +27 -0
  267. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  268. package/dist/types/src/internal/types/entity.d.ts +37 -0
  269. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  270. package/dist/types/src/internal/types/index.d.ts +5 -2
  271. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  272. package/dist/types/src/internal/{object → types}/meta.d.ts +16 -14
  273. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  274. package/dist/types/src/internal/types/typename.d.ts +21 -0
  275. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  276. package/dist/types/src/internal/types/version.d.ts +15 -0
  277. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  278. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  279. package/dist/types/src/testing/index.d.ts +3 -3
  280. package/dist/types/src/testing/index.d.ts.map +1 -1
  281. package/dist/types/src/testing/test-data.d.ts +18 -0
  282. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  283. package/dist/types/src/testing/test-schema.d.ts +304 -0
  284. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  285. package/dist/types/src/testing/util.d.ts +21 -0
  286. package/dist/types/src/testing/util.d.ts.map +1 -0
  287. package/dist/types/tsconfig.tsbuildinfo +1 -1
  288. package/package.json +106 -65
  289. package/src/Annotation.ts +46 -0
  290. package/src/Collection.ts +30 -0
  291. package/src/Database.ts +315 -0
  292. package/src/Dataset.ts +24 -0
  293. package/src/Entity.test.ts +22 -0
  294. package/src/Entity.ts +234 -0
  295. package/src/Err.ts +38 -0
  296. package/src/Feed.ts +254 -0
  297. package/src/Filter.ts +389 -0
  298. package/src/Format.ts +9 -0
  299. package/src/Hypergraph.ts +74 -0
  300. package/src/JsonSchema.ts +24 -0
  301. package/src/Key.ts +3 -0
  302. package/src/Obj.test.ts +447 -0
  303. package/src/Obj.ts +588 -248
  304. package/src/Order.ts +44 -0
  305. package/src/Query.test.ts +632 -0
  306. package/src/Query.ts +520 -0
  307. package/src/QueryResult.ts +106 -0
  308. package/src/Ref.ts +77 -9
  309. package/src/Relation.test.ts +88 -0
  310. package/src/Relation.ts +440 -58
  311. package/src/SchemaRegistry.ts +106 -0
  312. package/src/Tag.ts +39 -0
  313. package/src/Type.test.ts +52 -0
  314. package/src/Type.ts +162 -151
  315. package/src/View.ts +100 -0
  316. package/src/hierarchy.test.ts +33 -0
  317. package/src/index.ts +20 -6
  318. package/src/internal/README.md +102 -0
  319. package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
  320. package/src/internal/annotations/annotations.ts +526 -0
  321. package/src/internal/annotations/index.ts +6 -0
  322. package/src/internal/annotations/util.ts +85 -0
  323. package/src/internal/api/annotations.ts +60 -0
  324. package/src/internal/api/entity.ts +29 -0
  325. package/src/internal/api/index.ts +19 -0
  326. package/src/internal/api/meta.ts +88 -0
  327. package/src/internal/api/sorting.ts +53 -0
  328. package/src/internal/api/version.ts +96 -0
  329. package/src/internal/entities/entity.ts +128 -0
  330. package/src/internal/entities/index.ts +9 -0
  331. package/src/internal/entities/model.ts +138 -0
  332. package/src/internal/entities/object.ts +58 -0
  333. package/src/internal/entities/relation.ts +171 -0
  334. package/src/internal/entities/util.ts +33 -0
  335. package/src/internal/formats/date.test.ts +1 -1
  336. package/src/internal/formats/date.ts +5 -5
  337. package/src/internal/formats/format.test.ts +6 -6
  338. package/src/internal/formats/format.ts +8 -6
  339. package/src/internal/formats/number.ts +5 -5
  340. package/src/internal/formats/object.ts +4 -4
  341. package/src/internal/formats/select.ts +6 -4
  342. package/src/internal/formats/string.ts +14 -9
  343. package/src/internal/formats/types.ts +53 -42
  344. package/src/internal/index.ts +30 -13
  345. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  346. package/src/internal/json-schema/index.ts +2 -0
  347. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  348. package/src/internal/json-schema/json-schema-type.ts +35 -35
  349. package/src/internal/{json → json-schema}/json-schema.test.ts +232 -97
  350. package/src/internal/{json → json-schema}/json-schema.ts +79 -93
  351. package/src/internal/object/clone.ts +48 -0
  352. package/src/internal/object/common.ts +3 -4
  353. package/src/internal/object/{create.test.ts → create-object.test.ts} +31 -33
  354. package/src/internal/object/{create.ts → create-object.ts} +36 -37
  355. package/src/internal/object/deleted.ts +6 -6
  356. package/src/internal/object/ids.ts +1 -1
  357. package/src/internal/object/index.ts +6 -12
  358. package/src/internal/object/inspect.ts +5 -7
  359. package/src/internal/object/json-serializer.test.ts +59 -37
  360. package/src/internal/object/json-serializer.ts +87 -108
  361. package/src/internal/object/schema-validator.test.ts +3 -7
  362. package/src/internal/object/schema-validator.ts +2 -237
  363. package/src/internal/object/set-value.test.ts +281 -0
  364. package/src/internal/object/set-value.ts +165 -0
  365. package/src/internal/object/snapshot.ts +96 -0
  366. package/src/internal/object/typed-object.test.ts +11 -11
  367. package/src/internal/object/typed-object.ts +8 -59
  368. package/src/internal/proxy/change-context.ts +138 -0
  369. package/src/internal/proxy/change.test.ts +519 -0
  370. package/src/internal/proxy/define-hidden-property.ts +14 -0
  371. package/src/internal/proxy/errors.ts +42 -0
  372. package/src/internal/proxy/event-batch.ts +44 -0
  373. package/src/internal/proxy/handler.test.ts +51 -91
  374. package/src/internal/proxy/index.ts +17 -0
  375. package/src/internal/proxy/json-serializer.ts +87 -0
  376. package/src/internal/proxy/make-object.ts +106 -0
  377. package/src/internal/proxy/ownership.ts +253 -0
  378. package/src/internal/proxy/proxy-types.ts +23 -0
  379. package/src/internal/proxy/proxy-utils.ts +150 -0
  380. package/src/internal/proxy/reactive-array.ts +71 -0
  381. package/src/internal/proxy/reactive.ts +69 -0
  382. package/src/internal/proxy/schema-validator.ts +244 -0
  383. package/src/internal/proxy/schema.test.ts +27 -18
  384. package/src/internal/proxy/symbols.ts +7 -0
  385. package/src/internal/proxy/typed-handler.test.ts +260 -48
  386. package/src/internal/proxy/typed-handler.ts +283 -61
  387. package/src/internal/proxy/typed-object.test.ts +54 -38
  388. package/src/internal/ref/ref-array.ts +4 -4
  389. package/src/internal/ref/ref.test.ts +10 -9
  390. package/src/internal/ref/ref.ts +107 -56
  391. package/src/internal/{projection → schema}/compose.test.ts +8 -9
  392. package/src/internal/{projection → schema}/compose.ts +13 -8
  393. package/src/internal/schema/echo-schema.ts +74 -33
  394. package/src/internal/schema/index.ts +1 -4
  395. package/src/internal/schema/manipulation.ts +7 -1
  396. package/src/internal/schema/persistent-schema.ts +33 -0
  397. package/src/internal/types/base.ts +43 -0
  398. package/src/internal/types/entity.ts +54 -0
  399. package/src/internal/types/index.ts +5 -2
  400. package/src/internal/types/meta.ts +68 -0
  401. package/src/internal/types/typename.ts +55 -0
  402. package/src/internal/types/version.ts +19 -0
  403. package/src/testing/api.test.ts +126 -0
  404. package/src/testing/index.ts +3 -3
  405. package/src/testing/test-data.ts +130 -0
  406. package/src/testing/test-schema.ts +240 -0
  407. package/src/testing/util.ts +85 -0
  408. package/dist/lib/browser/chunk-MWLA34S5.mjs +0 -3843
  409. package/dist/lib/browser/chunk-MWLA34S5.mjs.map +0 -7
  410. package/dist/lib/browser/chunk-OAZJQHVO.mjs +0 -453
  411. package/dist/lib/browser/chunk-OAZJQHVO.mjs.map +0 -7
  412. package/dist/lib/browser/chunk-ORIE2FMS.mjs +0 -514
  413. package/dist/lib/browser/chunk-ORIE2FMS.mjs.map +0 -7
  414. package/dist/lib/browser/index.mjs +0 -43
  415. package/dist/lib/browser/internal/index.mjs +0 -326
  416. package/dist/lib/browser/meta.json +0 -1
  417. package/dist/lib/browser/query/index.mjs +0 -23
  418. package/dist/lib/browser/testing/index.mjs +0 -298
  419. package/dist/lib/browser/testing/index.mjs.map +0 -7
  420. package/dist/lib/node-esm/chunk-AXWVDOP7.mjs +0 -453
  421. package/dist/lib/node-esm/chunk-AXWVDOP7.mjs.map +0 -7
  422. package/dist/lib/node-esm/chunk-L4PBAJDP.mjs +0 -514
  423. package/dist/lib/node-esm/chunk-L4PBAJDP.mjs.map +0 -7
  424. package/dist/lib/node-esm/chunk-YTNLFBIK.mjs +0 -3843
  425. package/dist/lib/node-esm/chunk-YTNLFBIK.mjs.map +0 -7
  426. package/dist/lib/node-esm/index.mjs +0 -43
  427. package/dist/lib/node-esm/meta.json +0 -1
  428. package/dist/lib/node-esm/query/index.mjs +0 -23
  429. package/dist/lib/node-esm/testing/index.mjs +0 -298
  430. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  431. package/dist/types/src/errors.d.ts +0 -72
  432. package/dist/types/src/errors.d.ts.map +0 -1
  433. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  434. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  435. package/dist/types/src/internal/ast/annotations.d.ts +0 -119
  436. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  437. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  438. package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
  439. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  440. package/dist/types/src/internal/ast/index.d.ts +0 -5
  441. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  442. package/dist/types/src/internal/ast/types.d.ts +0 -6
  443. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  444. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  445. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  446. package/dist/types/src/internal/json/index.d.ts +0 -2
  447. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  448. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  449. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  450. package/dist/types/src/internal/object/accessors.d.ts +0 -29
  451. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  452. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  453. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  454. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  455. package/dist/types/src/internal/object/entity.d.ts +0 -22
  456. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  457. package/dist/types/src/internal/object/expando.d.ts +0 -14
  458. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  459. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  460. package/dist/types/src/internal/object/model.d.ts +0 -117
  461. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  462. package/dist/types/src/internal/object/relation.d.ts +0 -17
  463. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  464. package/dist/types/src/internal/object/typed-relation.d.ts +0 -32
  465. package/dist/types/src/internal/object/typed-relation.d.ts.map +0 -1
  466. package/dist/types/src/internal/object/typename.d.ts +0 -15
  467. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  468. package/dist/types/src/internal/object/version.d.ts +0 -14
  469. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  470. package/dist/types/src/internal/projection/compose.d.ts +0 -6
  471. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  472. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  473. package/dist/types/src/internal/projection/index.d.ts +0 -2
  474. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  475. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  476. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  477. package/dist/types/src/internal/query/index.d.ts +0 -2
  478. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  479. package/dist/types/src/internal/query/query.d.ts +0 -17
  480. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  481. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  482. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  483. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  484. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  485. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  486. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  487. package/dist/types/src/internal/testing/index.d.ts +0 -3
  488. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  489. package/dist/types/src/internal/testing/types.d.ts +0 -455
  490. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  491. package/dist/types/src/internal/testing/utils.d.ts +0 -10
  492. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  493. package/dist/types/src/internal/types/types.d.ts +0 -79
  494. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  495. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  496. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  497. package/dist/types/src/internal/types/util.d.ts +0 -5
  498. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  499. package/dist/types/src/query/index.d.ts +0 -3
  500. package/dist/types/src/query/index.d.ts.map +0 -1
  501. package/dist/types/src/query/query.d.ts +0 -247
  502. package/dist/types/src/query/query.d.ts.map +0 -1
  503. package/dist/types/src/query/query.test.d.ts +0 -2
  504. package/dist/types/src/query/query.test.d.ts.map +0 -1
  505. package/dist/types/src/query/tag.d.ts +0 -18
  506. package/dist/types/src/query/tag.d.ts.map +0 -1
  507. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  508. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  509. package/dist/types/src/testing/types.d.ts +0 -113
  510. package/dist/types/src/testing/types.d.ts.map +0 -1
  511. package/src/errors.ts +0 -18
  512. package/src/internal/ast/annotation-helper.ts +0 -22
  513. package/src/internal/ast/annotations.ts +0 -212
  514. package/src/internal/ast/entity-kind.ts +0 -15
  515. package/src/internal/ast/index.ts +0 -8
  516. package/src/internal/ast/types.ts +0 -17
  517. package/src/internal/json/index.ts +0 -5
  518. package/src/internal/object/accessors.ts +0 -115
  519. package/src/internal/object/entity.ts +0 -204
  520. package/src/internal/object/expando.ts +0 -21
  521. package/src/internal/object/meta.ts +0 -62
  522. package/src/internal/object/model.ts +0 -170
  523. package/src/internal/object/relation.ts +0 -24
  524. package/src/internal/object/typed-relation.ts +0 -85
  525. package/src/internal/object/typename.ts +0 -61
  526. package/src/internal/object/version.ts +0 -22
  527. package/src/internal/projection/index.ts +0 -5
  528. package/src/internal/proxy/reactive-object.ts +0 -108
  529. package/src/internal/query/index.ts +0 -5
  530. package/src/internal/query/query.ts +0 -23
  531. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  532. package/src/internal/schema/snapshot.ts +0 -25
  533. package/src/internal/schema/stored-schema.ts +0 -26
  534. package/src/internal/testing/index.ts +0 -6
  535. package/src/internal/testing/types.ts +0 -211
  536. package/src/internal/testing/utils.ts +0 -54
  537. package/src/internal/types/types.test.ts +0 -48
  538. package/src/internal/types/types.ts +0 -176
  539. package/src/internal/types/util.ts +0 -9
  540. package/src/query/index.ts +0 -6
  541. package/src/query/query.test.ts +0 -362
  542. package/src/query/query.ts +0 -784
  543. package/src/query/tag.ts +0 -35
  544. package/src/test/api.test.ts +0 -180
  545. package/src/testing/echo-schema.ts +0 -39
  546. package/src/testing/types.ts +0 -91
  547. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  548. /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
  549. /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
  550. /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
  551. /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Feed.mjs.map} +0 -0
  552. /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Filter.mjs.map} +0 -0
  553. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  554. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  555. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  556. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  557. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  558. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  559. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
@@ -12,7 +12,7 @@ import type * as Types from 'effect/Types';
12
12
 
13
13
  import { raise } from '@dxos/debug';
14
14
  import { mapAst } from '@dxos/effect';
15
- import { invariant } from '@dxos/invariant';
15
+ import { assertArgument, invariant } from '@dxos/invariant';
16
16
  import { DXN, ObjectId } from '@dxos/keys';
17
17
  import { log } from '@dxos/log';
18
18
  import { clearUndefined, orderKeys, removeProperties } from '@dxos/util';
@@ -21,33 +21,19 @@ import {
21
21
  type TypeAnnotation,
22
22
  TypeAnnotationId,
23
23
  TypeIdentifierAnnotationId,
24
- getTypeAnnotation,
25
- getTypeIdentifierAnnotation,
26
- } from '../ast';
27
- import { EntityKind, EntityKindSchema } from '../ast';
24
+ makeTypeJsonSchemaAnnotation,
25
+ } from '../annotations';
26
+ import { type JsonSchemaReferenceInfo, createEchoReferenceSchema } from '../ref';
27
+ import { ANY_OBJECT_TYPENAME, ANY_OBJECT_VERSION, EntityKind, EntityKindSchema } from '../types';
28
+
29
+ import { CustomAnnotations, DecodedAnnotations, EchoAnnotations } from './annotations';
28
30
  import {
29
31
  ECHO_ANNOTATIONS_NS_DEPRECATED_KEY,
30
32
  ECHO_ANNOTATIONS_NS_KEY,
31
33
  type JsonSchemaEchoAnnotations,
32
34
  type JsonSchemaType,
33
35
  getNormalizedEchoAnnotations,
34
- } from '../json-schema';
35
- import { Expando } from '../object';
36
- import { type JsonSchemaReferenceInfo, Ref, createEchoReferenceSchema } from '../ref';
37
-
38
- import { CustomAnnotations, DecodedAnnotations, EchoAnnotations } from './annotations';
39
-
40
- /**
41
- * Create object jsonSchema.
42
- */
43
- export const createJsonSchema = (schema: Schema.Struct<any> = Schema.Struct({})): JsonSchemaType => {
44
- const jsonSchema = _toJsonSchema(schema);
45
-
46
- // TODO(dmaretskyi): Fix those in the serializer.
47
- jsonSchema.type = 'object';
48
- delete jsonSchema.anyOf;
49
- return jsonSchema;
50
- };
36
+ } from './json-schema-type';
51
37
 
52
38
  // TODO(burdon): Are these values stored (can they be changed?)
53
39
  export enum PropType {
@@ -89,10 +75,18 @@ export type JsonSchemaOptions = {
89
75
 
90
76
  /**
91
77
  * Convert effect schema to JSON Schema.
78
+ * NOTE: This handles custom annotations.
92
79
  * @param schema
93
80
  */
94
- export const toJsonSchema = (schema: Schema.Schema.All, options: JsonSchemaOptions = {}): JsonSchemaType => {
95
- let jsonSchema = _toJsonSchema(schema);
81
+ // TODO(burdon): Reconcile with possibly extending @effect/Schema/JSONSchema
82
+ // We add additional propertyOrder (but the object properties ARE ordered); and type "string" for literals.
83
+ // TODO(wittjosiah): This is mutable because its a pojo, perhaps should be left as readonly at type level though?
84
+ export const toJsonSchema = (
85
+ schema: Schema.Schema.All,
86
+ options: JsonSchemaOptions = {},
87
+ ): Types.DeepMutable<JsonSchemaType> => {
88
+ assertArgument(Schema.isSchema(schema), 'schema');
89
+ let jsonSchema = _toJsonSchemaAST(schema.ast);
96
90
  if (options.strict) {
97
91
  // TOOD(burdon): Workaround to ensure JSON schema is valid (for agv parsing).
98
92
  jsonSchema = removeProperties(jsonSchema, (key, value) => {
@@ -113,71 +107,13 @@ export const toJsonSchema = (schema: Schema.Schema.All, options: JsonSchemaOptio
113
107
  return jsonSchema;
114
108
  };
115
109
 
116
- const _toJsonSchema = (schema: Schema.Schema.All): JsonSchemaType => {
117
- invariant(schema);
118
- const withRefinements = withEchoRefinements(schema.ast, '#');
119
- let jsonSchema = JSONSchema.fromAST(withRefinements, {
110
+ const _toJsonSchemaAST = (ast: SchemaAST.AST): Types.DeepMutable<JsonSchemaType> => {
111
+ const withRefinements = withEchoRefinements(ast, '#');
112
+ const jsonSchema = JSONSchema.fromAST(withRefinements, {
120
113
  definitions: {},
121
- }) as JsonSchemaType;
122
-
123
- jsonSchema.$schema = JSON_SCHEMA_URL;
124
-
125
- if (jsonSchema.properties && 'id' in jsonSchema.properties) {
126
- jsonSchema.properties = orderKeys(jsonSchema.properties, ['id']); // Put id first.
127
- }
128
-
129
- const echoIdentifier = getTypeIdentifierAnnotation(schema);
130
- if (echoIdentifier) {
131
- jsonSchema.$id = echoIdentifier;
132
- }
133
-
134
- const objectAnnotation = getTypeAnnotation(schema);
135
- if (objectAnnotation) {
136
- // EchoIdentifier annotation takes precedence but the id can also be defined by the typename.
137
- if (!jsonSchema.$id) {
138
- // TODO(dmaretskyi): Should this include the version?
139
- jsonSchema.$id = DXN.fromTypename(objectAnnotation.typename).toString();
140
- }
141
- jsonSchema.entityKind = objectAnnotation.kind;
142
- jsonSchema.version = objectAnnotation.version;
143
- jsonSchema.typename = objectAnnotation.typename;
144
- if (jsonSchema.entityKind === EntityKind.Relation) {
145
- jsonSchema.relationTarget = {
146
- $ref: objectAnnotation.sourceSchema,
147
- };
148
- jsonSchema.relationSource = {
149
- $ref: objectAnnotation.targetSchema,
150
- };
151
- }
152
- }
153
-
154
- // Fix field order.
155
- // TODO(dmaretskyi): Makes sure undefined is not left on optional fields for the resulting object.
156
- // TODO(dmaretskyi): `orderFields` util.
157
- jsonSchema = orderKeys(jsonSchema, [
158
- '$schema',
159
- '$id',
160
-
161
- 'entityKind',
162
- 'typename',
163
- 'version',
164
- 'relationTarget',
165
- 'relationSource',
166
-
167
- 'type',
168
- 'enum',
169
-
170
- 'properties',
171
- 'required',
172
- 'propertyOrder', // Custom.
173
- 'items',
174
- 'additionalProperties',
175
-
176
- 'anyOf',
177
- 'oneOf',
178
- ]);
114
+ }) as Types.DeepMutable<JsonSchemaType>;
179
115
 
180
- return jsonSchema;
116
+ return normalizeJsonSchema(jsonSchema);
181
117
  };
182
118
 
183
119
  const withEchoRefinements = (
@@ -201,7 +137,7 @@ const withEchoRefinements = (
201
137
  },
202
138
  });
203
139
  } else {
204
- const jsonSchema = _toJsonSchema(Schema.make(suspendedAst));
140
+ const jsonSchema = _toJsonSchemaAST(suspendedAst);
205
141
  recursiveResult = new SchemaAST.Suspend(() => withEchoRefinements(suspendedAst, path, suspendCache), {
206
142
  [SchemaAST.JSONSchemaAnnotationId]: jsonSchema,
207
143
  });
@@ -394,7 +330,7 @@ const objectToEffectSchema = (root: JsonSchemaType, defs: JsonSchemaType['$defs'
394
330
  }
395
331
 
396
332
  if (immutableIdField) {
397
- schema = Schema.extend(Schema.mutable(schema), Schema.Struct({ id: immutableIdField }));
333
+ schema = Schema.extend(schema, Schema.Struct({ id: immutableIdField }));
398
334
  }
399
335
 
400
336
  const annotations = jsonSchemaFieldsToAnnotations(root);
@@ -419,8 +355,10 @@ const anyToEffectSchema = (root: JSONSchema.JsonSchema7Any): Schema.Schema.AnyNo
419
355
  // TODO(dmaretskyi): Types.
420
356
  const refToEffectSchema = (root: any): Schema.Schema.AnyNoContext => {
421
357
  if (!('reference' in root)) {
422
- return Ref(Expando);
358
+ // Fallback to generic object ref when no reference info is provided.
359
+ return createEchoReferenceSchema(undefined, ANY_OBJECT_TYPENAME, ANY_OBJECT_VERSION);
423
360
  }
361
+
424
362
  const reference: JsonSchemaReferenceInfo = root.reference;
425
363
  if (typeof reference !== 'object') {
426
364
  throw new Error('Invalid reference field in ref schema');
@@ -443,7 +381,7 @@ const refToEffectSchema = (root: any): Schema.Schema.AnyNoContext => {
443
381
  const annotations_toJsonSchemaFields = (annotations: SchemaAST.Annotations): Record<symbol, any> => {
444
382
  const schemaFields: Record<string, any> = {};
445
383
 
446
- const echoAnnotations: JsonSchemaEchoAnnotations = {};
384
+ const echoAnnotations: Types.Mutable<JsonSchemaEchoAnnotations> = {};
447
385
  for (const [key, annotationId] of Object.entries(EchoAnnotations)) {
448
386
  if (annotations[annotationId] != null) {
449
387
  echoAnnotations[key as keyof JsonSchemaEchoAnnotations] = annotations[annotationId] as any;
@@ -527,8 +465,20 @@ const jsonSchemaFieldsToAnnotations = (schema: JsonSchemaType): SchemaAST.Annota
527
465
  }
528
466
  }
529
467
 
530
- annotations[TypeIdentifierAnnotationId] = decodeTypeIdentifierAnnotation(schema);
531
- annotations[TypeAnnotationId] = decodeTypeAnnotation(schema);
468
+ const typeIdentifier = decodeTypeIdentifierAnnotation(schema);
469
+ annotations[TypeIdentifierAnnotationId] = typeIdentifier;
470
+ const typeAnnotation = decodeTypeAnnotation(schema);
471
+ if (typeAnnotation) {
472
+ annotations[TypeAnnotationId] = typeAnnotation;
473
+ annotations[SchemaAST.JSONSchemaAnnotationId] = makeTypeJsonSchemaAnnotation({
474
+ identifier: typeIdentifier,
475
+ kind: typeAnnotation.kind,
476
+ typename: typeAnnotation.typename,
477
+ version: typeAnnotation.version,
478
+ relationSource: typeAnnotation.sourceSchema,
479
+ relationTarget: typeAnnotation.targetSchema,
480
+ });
481
+ }
532
482
 
533
483
  // Custom (at end).
534
484
  for (const [key, annotationId] of Object.entries({ ...CustomAnnotations, ...DecodedAnnotations })) {
@@ -546,3 +496,39 @@ const makeAnnotatedRefinement = (ast: SchemaAST.AST, annotations: SchemaAST.Anno
546
496
 
547
497
  const addJsonSchemaFields = (ast: SchemaAST.AST, schema: JsonSchemaType): SchemaAST.AST =>
548
498
  makeAnnotatedRefinement(ast, { [SchemaAST.JSONSchemaAnnotationId]: schema });
499
+
500
+ /**
501
+ * Fixes field order.
502
+ * Sets `$schema` prop.
503
+ */
504
+ const normalizeJsonSchema = (jsonSchema: Types.DeepMutable<JsonSchemaType>): Types.DeepMutable<JsonSchemaType> => {
505
+ if (jsonSchema.properties && 'id' in jsonSchema.properties) {
506
+ jsonSchema.properties = orderKeys(jsonSchema.properties, ['id']); // Put id first.
507
+ }
508
+
509
+ // TODO(dmaretskyi): Makes sure undefined is not left on optional fields for the resulting object.
510
+ jsonSchema.$schema = JSON_SCHEMA_URL;
511
+ jsonSchema = orderKeys(jsonSchema, [
512
+ '$schema',
513
+ '$id',
514
+
515
+ 'entityKind',
516
+ 'typename',
517
+ 'version',
518
+ 'relationTarget',
519
+ 'relationSource',
520
+
521
+ 'type',
522
+ 'enum',
523
+
524
+ 'properties',
525
+ 'required',
526
+ 'propertyOrder', // Custom.
527
+ 'items',
528
+ 'additionalProperties',
529
+
530
+ 'anyOf',
531
+ 'oneOf',
532
+ ]);
533
+ return jsonSchema;
534
+ };
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { invariant } from '@dxos/invariant';
6
+ import { deepMapValues } from '@dxos/util';
7
+
8
+ import type * as Obj from '../../Obj';
9
+ import { makeObject } from '../proxy';
10
+ import { Ref } from '../ref';
11
+ import { getMeta, getSchema } from '../types';
12
+
13
+ /**
14
+ * Clones an object or relation.
15
+ * This does not clone referenced objects, only the properties in the object.
16
+ * @returns A new object with the same schema and properties.
17
+ */
18
+ export const clone = <T extends Obj.Any>(obj: T, opts?: Obj.CloneOptions): T => {
19
+ const { id, ...data } = obj;
20
+ const schema = getSchema(obj);
21
+ invariant(schema != null, 'Object should have a schema');
22
+ const props: any = deepMapValues(data, (value, recurse) => {
23
+ if (Ref.isRef(value)) {
24
+ if (opts?.deep) {
25
+ // TODO(dmaretskyi): Will break on circular references.
26
+ return Ref.make(clone(value.target!, opts));
27
+ }
28
+ return value;
29
+ }
30
+ return recurse(value);
31
+ });
32
+
33
+ if (opts?.retainId) {
34
+ props.id = id;
35
+ }
36
+ const meta = deepMapValues(getMeta(obj), (value, recurse) => {
37
+ if (Ref.isRef(value)) {
38
+ if (opts?.deep) {
39
+ // TODO(dmaretskyi): Will break on circular references.
40
+ return Ref.make(clone(value.target!, opts));
41
+ }
42
+ return value;
43
+ }
44
+ return recurse(value);
45
+ });
46
+
47
+ return makeObject(schema, props, meta);
48
+ };
@@ -4,9 +4,8 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { type BaseObject } from '../types';
8
-
9
- import { getTypename } from './typename';
7
+ import { getTypename } from '../annotations';
8
+ import { type AnyProperties } from '../types';
10
9
 
11
10
  // TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).
12
11
  export type TypedObjectOptions = {
@@ -58,7 +57,7 @@ export const makeTypedEntityClass = (
58
57
  static readonly pipe = baseSchema.pipe.bind(baseSchema);
59
58
 
60
59
  // TODO(burdon): Comment required.
61
- static [Symbol.hasInstance](obj: BaseObject) {
60
+ static [Symbol.hasInstance](obj: AnyProperties) {
62
61
  return obj != null && getTypename(obj) === typename;
63
62
  }
64
63
 
@@ -9,15 +9,14 @@ import { describe, expect, test } from 'vitest';
9
9
 
10
10
  import { DXN } from '@dxos/keys';
11
11
 
12
- import { getSchemaDXN } from '../ast';
13
- import { Testing } from '../testing';
14
- import { isInstanceOf } from '../types';
12
+ import { Relation } from '../../index';
13
+ import { TestSchema } from '../../testing';
14
+ import { getSchemaDXN, getTypeDXN, isInstanceOf } from '../annotations';
15
+ import { ATTR_RELATION_SOURCE, ATTR_RELATION_TARGET } from '../entities';
16
+ import { ATTR_META, ATTR_TYPE, getSchema } from '../types';
15
17
 
16
- import { getSchema } from './accessors';
17
- import { create } from './create';
18
+ import { createObject } from './create-object';
18
19
  import { objectToJSON } from './json-serializer';
19
- import { RelationSourceId, RelationTargetId } from './model';
20
- import { getType } from './typename';
21
20
 
22
21
  describe('create (static version)', () => {
23
22
  test('defaults', ({ expect }) => {
@@ -34,7 +33,7 @@ describe('create (static version)', () => {
34
33
  });
35
34
 
36
35
  test('create static object', () => {
37
- const contact = create(Testing.Contact, {
36
+ const contact = createObject(TestSchema.Person, {
38
37
  name: 'Bot',
39
38
  email: 'bot@example.com',
40
39
  });
@@ -43,12 +42,12 @@ describe('create (static version)', () => {
43
42
  expect(contact.name).toBe('Bot');
44
43
  expect(contact.email).toBe('bot@example.com');
45
44
  expect((contact as any)['@type']).toBeUndefined();
46
- expect(getType(contact)?.toString()).toBe(getSchemaDXN(Testing.Contact)!.toString());
47
- expect(isInstanceOf(Testing.Contact, contact)).toBe(true);
45
+ expect(getTypeDXN(contact)?.toString()).toBe(getSchemaDXN(TestSchema.Person)!.toString());
46
+ expect(isInstanceOf(TestSchema.Person, contact)).toBe(true);
48
47
  });
49
48
 
50
49
  test('JSON encoding', () => {
51
- const contact = create(Testing.Contact, {
50
+ const contact = createObject(TestSchema.Person, {
52
51
  name: 'Bot',
53
52
  email: 'bot@example.com',
54
53
  });
@@ -56,7 +55,7 @@ describe('create (static version)', () => {
56
55
  const json = JSON.parse(JSON.stringify(contact));
57
56
  expect(json).toEqual({
58
57
  id: contact.id,
59
- '@type': DXN.fromTypenameAndVersion(Testing.Contact.typename, Testing.Contact.version).toString(),
58
+ '@type': DXN.fromTypenameAndVersion(TestSchema.Person.typename, TestSchema.Person.version).toString(),
60
59
  '@meta': {
61
60
  keys: [],
62
61
  },
@@ -67,52 +66,51 @@ describe('create (static version)', () => {
67
66
  });
68
67
 
69
68
  test('JSON encoding with relation', () => {
70
- const contactA = create(Testing.Contact, {
71
- name: 'Bot',
72
- email: 'bot@example.com',
69
+ const person1 = createObject(TestSchema.Person, {
70
+ name: 'Alice',
71
+ email: 'alice@example.com',
73
72
  });
74
- const contactB = create(Testing.Contact, {
75
- name: 'Bot',
76
- email: 'bot@example.com',
73
+ const person2 = createObject(TestSchema.Person, {
74
+ name: 'Bob',
75
+ email: 'bob@example.com',
77
76
  });
78
- const hasManager = create(Testing.HasManager, {
79
- [RelationSourceId]: contactA,
80
- [RelationTargetId]: contactB,
77
+
78
+ const manager = createObject(TestSchema.HasManager, {
79
+ [Relation.Source]: person1 as any,
80
+ [Relation.Target]: person2 as any,
81
81
  });
82
82
 
83
- const json = JSON.parse(JSON.stringify(hasManager));
83
+ const json = JSON.parse(JSON.stringify(manager));
84
84
  expect(json).toEqual({
85
- id: hasManager.id,
86
- '@type': DXN.fromTypenameAndVersion(Testing.HasManager.typename, Testing.HasManager.version).toString(),
87
- '@relationSource': DXN.fromLocalObjectId(contactA.id).toString(),
88
- '@relationTarget': DXN.fromLocalObjectId(contactB.id).toString(),
89
- '@meta': {
85
+ id: manager.id,
86
+ [ATTR_TYPE]: DXN.fromTypenameAndVersion(TestSchema.HasManager.typename, TestSchema.HasManager.version).toString(),
87
+ [ATTR_RELATION_SOURCE]: DXN.fromLocalObjectId(person1.id).toString(),
88
+ [ATTR_RELATION_TARGET]: DXN.fromLocalObjectId(person2.id).toString(),
89
+ [ATTR_META]: {
90
90
  keys: [],
91
91
  },
92
92
  });
93
93
  });
94
94
 
95
95
  test('getSchema', () => {
96
- const contact = create(Testing.Contact, {
96
+ const contact = createObject(TestSchema.Person, {
97
97
  name: 'Bot',
98
98
  email: 'bot@example.com',
99
99
  });
100
100
 
101
- expect(getSchema(contact)).toBe(Testing.Contact);
101
+ expect(getSchema(contact)).toBe(TestSchema.Person);
102
102
  });
103
103
 
104
104
  test('inspect', () => {
105
- const contact = create(Testing.Contact, {
105
+ const contact = createObject(TestSchema.Person, {
106
106
  name: 'Bot',
107
107
  email: 'bot@example.com',
108
108
  });
109
109
 
110
- // console.log(contact);
111
-
112
110
  const text = inspect(contact);
113
111
  expect(text).toContain('Bot');
114
112
  expect(text).toContain('bot@example.com');
115
- expect(text).toContain('example.com/type/Contact');
113
+ expect(text).toContain('example.com/type/Person');
116
114
  expect(text).toContain('0.1.0');
117
115
  });
118
116
  });
@@ -7,33 +7,30 @@ import type * as Schema from 'effect/Schema';
7
7
  import { raise } from '@dxos/debug';
8
8
  import { assertArgument, failedInvariant } from '@dxos/invariant';
9
9
  import { ObjectId } from '@dxos/keys';
10
- import { defineHiddenProperty } from '@dxos/live-object';
11
10
 
12
- import { EntityKind, getSchemaDXN, getTypeAnnotation } from '../ast';
13
-
14
- import { getObjectDXN, setSchema } from './accessors';
15
- import { attachedTypedObjectInspector } from './inspect';
16
- import { attachTypedJsonSerializer } from './json-serializer';
11
+ import { getSchemaDXN, getTypeAnnotation, setTypename } from '../annotations';
17
12
  import {
18
- EntityKindId,
19
- MetaId,
20
13
  RelationSourceDXNId,
21
14
  RelationSourceId,
22
15
  RelationTargetDXNId,
23
16
  RelationTargetId,
24
- assertObjectModelShape,
25
- } from './model';
26
- import { setTypename } from './typename';
17
+ assertObjectModel,
18
+ getObjectDXN,
19
+ } from '../entities';
20
+ import { defineHiddenProperty } from '../proxy';
21
+ import { EntityKind, KindId, MetaId, setSchema } from '../types';
22
+
23
+ import { attachedTypedObjectInspector } from './inspect';
24
+ import { attachTypedJsonSerializer } from './json-serializer';
27
25
 
28
- // Make `id` optional.
29
- type CreateData<T> = T extends { id: string } ? Omit<T, 'id' | typeof EntityKindId> & { id?: string } : T;
26
+ export type CreateObjectProps<T> = T extends { id: string } ? Omit<T, 'id' | KindId> & { id?: string } : T;
30
27
 
31
28
  /**
32
29
  * Creates a new object instance from a schema and data, without signal reactivity.
33
30
  * This static version creates plain JavaScript objects that are not reactive/observable.
34
31
  * For reactive objects that automatically update UI when changed, use the regular live() function.
35
32
  *
36
- * @param schema - The Effect schema that defines the object's structure and type, piped into EchoObject
33
+ * @param schema - The Effect schema that defines the object's structure and type, piped into EchoObjectSchema
37
34
  * @param data - The data to initialize the object with. The id and @type fields are handled automatically.
38
35
  * @returns A new non-reactive object instance conforming to the schema
39
36
  * @throws {Error} If the schema is not an object schema
@@ -44,53 +41,55 @@ type CreateData<T> = T extends { id: string } ? Omit<T, 'id' | typeof EntityKind
44
41
  * const Contact = Schema.Struct({
45
42
  * name: Schema.String,
46
43
  * email: Schema.String,
47
- * }).pipe(Type.Obj({
48
- * typename: 'example.com/type/Contact',
44
+ * }).pipe(Type.object({
45
+ * typename: 'example.com/type/Person',
49
46
  * version: '0.1.0',
50
47
  * }))
51
48
  *
52
- * // Creates a non-reactive contact object
53
- * const contact = create(Contact, {
49
+ * const contact = createObject(Contact, {
54
50
  * name: "John",
55
51
  * email: "john@example.com",
56
52
  * })
57
53
  * ```
58
54
  */
59
- // TODO(burdon): Rename make.
60
- // TODO(burdon): Handle defaults (see Schema.make).
61
- // TODO(dmaretskyi): Use `Obj.make` and `Relation.make` from '@dxos/echo' instead.
62
- export const create = <S extends Schema.Schema.AnyNoContext>(
55
+ // TODO(burdon): Make internal.
56
+ export const createObject = <S extends Schema.Schema.AnyNoContext>(
63
57
  schema: S,
64
- data: CreateData<Schema.Schema.Type<S>>,
65
- ): CreateData<Schema.Schema.Type<S>> & { id: string } => {
58
+ props: CreateObjectProps<Schema.Schema.Type<S>>,
59
+ ): CreateObjectProps<Schema.Schema.Type<S>> & { id: string; [KindId]: EntityKind } => {
66
60
  const annotation = getTypeAnnotation(schema);
67
61
  if (!annotation) {
68
- throw new Error('Schema is not an object schema');
62
+ throw new Error('Schema is not an ECHO schema');
69
63
  }
70
- assertArgument(!('@type' in data), 'data', '@type is not allowed');
71
- assertArgument(!(RelationSourceDXNId in data), 'data', 'Relation source DXN is not allowed in the constructor');
72
- assertArgument(!(RelationTargetDXNId in data), 'data', 'Relation target DXN is not allowed in the constructor');
64
+ assertArgument(!('@type' in props), 'data', '@type is not allowed');
65
+ assertArgument(!(RelationSourceDXNId in props), 'data', 'Relation source DXN is not allowed in the constructor');
66
+ assertArgument(!(RelationTargetDXNId in props), 'data', 'Relation target DXN is not allowed in the constructor');
73
67
  assertArgument(
74
- RelationSourceId in data === RelationTargetId in data,
68
+ RelationSourceId in props === RelationTargetId in props,
75
69
  'data',
76
70
  'Relation source and target must be provided together',
77
71
  );
78
72
 
79
- const obj = { ...data, id: data.id ?? ObjectId.random() };
80
- const kind = RelationSourceId in data ? EntityKind.Relation : EntityKind.Object;
81
- defineHiddenProperty(obj, EntityKindId, kind);
82
- setTypename(obj, getSchemaDXN(schema) ?? failedInvariant('Missing schema DXN'));
73
+ // Raw object.
74
+ const obj = { ...props, id: props.id ?? ObjectId.random() };
75
+
76
+ // Metadata.
77
+ const kind = RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
78
+ defineHiddenProperty(obj, KindId, kind);
79
+ defineHiddenProperty(obj, MetaId, { keys: [] });
83
80
  setSchema(obj, schema);
81
+ setTypename(obj, getSchemaDXN(schema) ?? failedInvariant('Missing schema DXN'));
84
82
  attachTypedJsonSerializer(obj);
85
83
  attachedTypedObjectInspector(obj);
86
- defineHiddenProperty(obj, MetaId, { keys: [] });
84
+
85
+ // Relation.
87
86
  if (kind === EntityKind.Relation) {
88
- const sourceDXN = getObjectDXN(data[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));
89
- const targetDXN = getObjectDXN(data[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));
87
+ const sourceDXN = getObjectDXN(props[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));
88
+ const targetDXN = getObjectDXN(props[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));
90
89
  defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
91
90
  defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
92
91
  }
93
92
 
94
- assertObjectModelShape(obj);
93
+ assertObjectModel(obj);
95
94
  return obj;
96
95
  };
@@ -2,18 +2,18 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import type { BaseObject } from '../types';
6
-
7
- import { DeletedId } from './model';
5
+ import { ObjectDeletedId } from '../entities';
6
+ import { type AnyProperties } from '../types';
8
7
 
9
8
  /**
10
9
  * @returns `true` if the object has been marked as deleted.
11
10
  */
12
- export const isDeleted = (obj: BaseObject): boolean => {
13
- if ((obj as any)[DeletedId] === undefined) {
11
+ export const isDeleted = (obj: AnyProperties): boolean => {
12
+ if ((obj as any)[ObjectDeletedId] === undefined) {
14
13
  // TODO(dmaretskyi): Return to prior behavior of throwing.
15
14
  // throw new Error('Object does not support deletion marker');
16
15
  return false;
17
16
  }
18
- return (obj as any)[DeletedId] ?? false;
17
+
18
+ return (obj as any)[ObjectDeletedId] ?? false;
19
19
  };
@@ -4,9 +4,9 @@
4
4
 
5
5
  import { DXN, ObjectId, QueueSubspaceTags, SpaceId } from '@dxos/keys';
6
6
 
7
- // TODO(burdon): Move to @dxos/keys once ObjectId is moved there.
8
7
  /**
9
8
  * @deprecated Use `db.queues.create()`
10
9
  */
10
+ // TODO(burdon): Move to @dxos/keys.
11
11
  export const createQueueDXN = (spaceId = SpaceId.random(), queueId = ObjectId.random()) =>
12
12
  new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId, queueId]);
@@ -3,18 +3,12 @@
3
3
  //
4
4
 
5
5
  export * from './common';
6
- export * from './create';
7
- export * from './entity';
8
- export * from './expando';
6
+ export * from './create-object';
7
+ export * from './deleted';
9
8
  export * from './ids';
10
9
  export * from './json-serializer';
11
- export * from './meta';
12
- export type * from './relation';
13
- export * from './typed-object';
14
- export * from './typed-relation';
15
- export * from './typename';
16
- export * from './deleted';
17
- export * from './model';
18
- export * from './accessors';
19
10
  export * from './schema-validator';
20
- export * from './version';
11
+ export * from './set-value';
12
+ export * from './snapshot';
13
+ export * from './typed-object';
14
+ export * from './clone';
@@ -6,10 +6,8 @@ import type { InspectOptionsStylized, inspect as inspectFn } from 'node:util';
6
6
 
7
7
  import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
8
8
 
9
- import { type AnyEchoObject } from '../types';
10
-
11
- import { ATTR_META, ATTR_TYPE, MetaId } from './model';
12
- import { getType } from './typename';
9
+ import { getTypeDXN } from '../annotations';
10
+ import { ATTR_META, ATTR_TYPE, type AnyEntity, MetaId } from '../types';
13
11
 
14
12
  /*
15
13
  * @internal
@@ -29,8 +27,8 @@ export const attachedTypedObjectInspector = (obj: any) => {
29
27
  };
30
28
 
31
29
  // NOTE: KEEP as function.
32
- const typedObjectInspectFunction: CustomInspectFunction<AnyEchoObject> = function (
33
- this: AnyEchoObject,
30
+ const typedObjectInspectFunction: CustomInspectFunction<AnyEntity> = function (
31
+ this: AnyEntity,
34
32
  depth: number,
35
33
  options: InspectOptionsStylized,
36
34
  inspect: typeof inspectFn,
@@ -39,7 +37,7 @@ const typedObjectInspectFunction: CustomInspectFunction<AnyEchoObject> = functio
39
37
  return inspect(
40
38
  {
41
39
  id,
42
- [ATTR_TYPE]: getType(this),
40
+ [ATTR_TYPE]: getTypeDXN(this),
43
41
  ...props,
44
42
  [ATTR_META]: (this as any)[MetaId], // TODO(dmaretskyi): Couldn't use getMeta since that throw's if the object has no meta.
45
43
  },