@dxos/echo 0.8.4-main.72ec0f3 → 0.8.4-main.7ace549

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 (332) hide show
  1. package/dist/lib/browser/{chunk-BIDAASFK.mjs → chunk-7GH6RXJ3.mjs} +2246 -2290
  2. package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-E4UTVJNF.mjs +1111 -0
  4. package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +18 -8
  6. package/dist/lib/browser/internal/index.mjs +45 -45
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +252 -191
  9. package/dist/lib/browser/testing/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +1111 -0
  11. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +7 -0
  12. package/dist/lib/node-esm/{chunk-3SVRRCUU.mjs → chunk-M4B6BMD2.mjs} +2246 -2290
  13. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
  14. package/dist/lib/node-esm/index.mjs +18 -8
  15. package/dist/lib/node-esm/internal/index.mjs +45 -45
  16. package/dist/lib/node-esm/meta.json +1 -1
  17. package/dist/lib/node-esm/testing/index.mjs +252 -191
  18. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  19. package/dist/types/src/Annotation.d.ts +2 -0
  20. package/dist/types/src/Annotation.d.ts.map +1 -0
  21. package/dist/types/src/Database.d.ts +137 -0
  22. package/dist/types/src/Database.d.ts.map +1 -0
  23. package/dist/types/src/Entity.d.ts +36 -0
  24. package/dist/types/src/Entity.d.ts.map +1 -0
  25. package/dist/types/src/Format.d.ts +4 -0
  26. package/dist/types/src/Format.d.ts.map +1 -0
  27. package/dist/types/src/JsonSchema.d.ts +9 -0
  28. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  29. package/dist/types/src/Key.d.ts +1 -0
  30. package/dist/types/src/Key.d.ts.map +1 -1
  31. package/dist/types/src/Obj.d.ts +79 -70
  32. package/dist/types/src/Obj.d.ts.map +1 -1
  33. package/dist/types/src/Ref.d.ts +10 -10
  34. package/dist/types/src/Ref.d.ts.map +1 -1
  35. package/dist/types/src/Relation.d.ts +14 -11
  36. package/dist/types/src/Relation.d.ts.map +1 -1
  37. package/dist/types/src/Tag.d.ts +1 -1
  38. package/dist/types/src/Tag.d.ts.map +1 -1
  39. package/dist/types/src/Type.d.ts +39 -49
  40. package/dist/types/src/Type.d.ts.map +1 -1
  41. package/dist/types/src/index.d.ts +6 -3
  42. package/dist/types/src/index.d.ts.map +1 -1
  43. package/dist/types/src/internal/annotations/annotations.d.ts +174 -0
  44. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  45. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  46. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  47. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  48. package/dist/types/src/internal/annotations/util.d.ts +26 -0
  49. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  50. package/dist/types/src/internal/entities/entity.d.ts +10 -0
  51. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  52. package/dist/types/src/internal/{object → entities}/expando.d.ts +3 -1
  53. package/dist/types/src/internal/entities/expando.d.ts.map +1 -0
  54. package/dist/types/src/internal/entities/index.d.ts +6 -0
  55. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  56. package/dist/types/src/internal/entities/model.d.ts +70 -0
  57. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  58. package/dist/types/src/internal/entities/object.d.ts +11 -0
  59. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  60. package/dist/types/src/internal/entities/relation.d.ts +55 -0
  61. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  62. package/dist/types/src/internal/entities/util.d.ts +2 -0
  63. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  64. package/dist/types/src/internal/formats/format.d.ts +2 -0
  65. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  66. package/dist/types/src/internal/formats/types.d.ts +7 -7
  67. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  68. package/dist/types/src/internal/index.d.ts +6 -10
  69. package/dist/types/src/internal/index.d.ts.map +1 -1
  70. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  71. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  72. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  73. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  74. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  75. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +2 -1
  76. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  77. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  78. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  79. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +8 -9
  80. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  81. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  82. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  83. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  84. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  85. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  86. package/dist/types/src/internal/object/index.d.ts +3 -11
  87. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  88. package/dist/types/src/internal/object/json-serializer.d.ts +1 -2
  89. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  90. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  91. package/dist/types/src/internal/object/typed-object.d.ts +1 -1
  92. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  93. package/dist/types/src/internal/proxy/index.d.ts +3 -0
  94. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  95. package/dist/types/src/internal/proxy/make-object.d.ts +16 -0
  96. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  97. package/dist/types/src/internal/proxy/typed-handler.d.ts +1 -1
  98. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  99. package/dist/types/src/internal/ref/ref.d.ts +15 -12
  100. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  101. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  102. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  103. package/dist/types/src/internal/schema/echo-schema.d.ts +9 -9
  104. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  105. package/dist/types/src/internal/schema/index.d.ts +3 -4
  106. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  107. package/dist/types/src/internal/schema/persistent-schema.d.ts +18 -0
  108. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  109. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +1 -1
  110. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -1
  111. package/dist/types/src/internal/types/base.d.ts +37 -0
  112. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  113. package/dist/types/src/internal/{ast/entity-kind.d.ts → types/entity.d.ts} +3 -1
  114. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  115. package/dist/types/src/internal/types/index.d.ts +5 -2
  116. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  117. package/dist/types/src/internal/{object → types}/meta.d.ts +20 -11
  118. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  119. package/dist/types/src/internal/types/typename.d.ts +13 -0
  120. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  121. package/dist/types/src/internal/{object → types}/version.d.ts +3 -2
  122. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  123. package/dist/types/src/query/filter.d.ts +167 -0
  124. package/dist/types/src/query/filter.d.ts.map +1 -0
  125. package/dist/types/src/query/index.d.ts +3 -0
  126. package/dist/types/src/query/index.d.ts.map +1 -1
  127. package/dist/types/src/query/order.d.ts +12 -0
  128. package/dist/types/src/query/order.d.ts.map +1 -0
  129. package/dist/types/src/query/query.d.ts +9 -145
  130. package/dist/types/src/query/query.d.ts.map +1 -1
  131. package/dist/types/src/query/testing.d.ts +51 -0
  132. package/dist/types/src/query/testing.d.ts.map +1 -0
  133. package/dist/types/src/{internal/query/query.d.ts → query/types.d.ts} +1 -1
  134. package/dist/types/src/query/types.d.ts.map +1 -0
  135. package/dist/types/src/query/util.d.ts +8 -0
  136. package/dist/types/src/query/util.d.ts.map +1 -0
  137. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  138. package/dist/types/src/testing/index.d.ts +3 -3
  139. package/dist/types/src/testing/index.d.ts.map +1 -1
  140. package/dist/types/src/testing/test-data.d.ts +18 -0
  141. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  142. package/dist/types/src/testing/{types.d.ts → test-schema.d.ts} +166 -57
  143. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  144. package/dist/types/src/{internal/testing/utils.d.ts → testing/util.d.ts} +11 -5
  145. package/dist/types/src/testing/util.d.ts.map +1 -0
  146. package/dist/types/tsconfig.tsbuildinfo +1 -1
  147. package/package.json +46 -38
  148. package/src/Annotation.ts +17 -0
  149. package/src/Database.ts +189 -0
  150. package/src/Entity.ts +51 -0
  151. package/src/Format.ts +11 -0
  152. package/src/JsonSchema.ts +16 -0
  153. package/src/Key.ts +3 -0
  154. package/src/Obj.ts +248 -181
  155. package/src/Ref.ts +9 -9
  156. package/src/Relation.ts +58 -44
  157. package/src/Tag.ts +2 -1
  158. package/src/Type.ts +96 -83
  159. package/src/index.ts +9 -4
  160. package/src/internal/README.md +83 -0
  161. package/src/internal/{ast → annotations}/annotations.test.ts +13 -15
  162. package/src/internal/annotations/annotations.ts +463 -0
  163. package/src/internal/annotations/index.ts +6 -0
  164. package/src/internal/annotations/util.ts +70 -0
  165. package/src/internal/entities/entity.ts +109 -0
  166. package/src/internal/{object → entities}/expando.ts +7 -5
  167. package/src/internal/entities/index.ts +9 -0
  168. package/src/internal/{object → entities}/model.ts +49 -90
  169. package/src/internal/entities/object.ts +45 -0
  170. package/src/internal/entities/relation.ts +155 -0
  171. package/src/internal/entities/util.ts +33 -0
  172. package/src/internal/formats/date.test.ts +1 -1
  173. package/src/internal/formats/date.ts +5 -5
  174. package/src/internal/formats/format.test.ts +5 -5
  175. package/src/internal/formats/format.ts +3 -0
  176. package/src/internal/formats/number.ts +5 -5
  177. package/src/internal/formats/object.ts +2 -2
  178. package/src/internal/formats/string.ts +9 -9
  179. package/src/internal/formats/types.ts +44 -39
  180. package/src/internal/index.ts +29 -13
  181. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  182. package/src/internal/json-schema/index.ts +2 -0
  183. package/src/internal/json-schema/json-schema-type.ts +4 -3
  184. package/src/internal/{json → json-schema}/json-schema.test.ts +48 -38
  185. package/src/internal/{json → json-schema}/json-schema.ts +16 -7
  186. package/src/internal/object/common.ts +3 -4
  187. package/src/internal/object/{create.test.ts → create-object.test.ts} +30 -32
  188. package/src/internal/object/{create.ts → create-object.ts} +33 -34
  189. package/src/internal/object/deleted.ts +6 -6
  190. package/src/internal/object/ids.ts +1 -1
  191. package/src/internal/object/index.ts +3 -11
  192. package/src/internal/object/inspect.ts +3 -5
  193. package/src/internal/object/json-serializer.test.ts +33 -38
  194. package/src/internal/object/json-serializer.ts +43 -38
  195. package/src/internal/object/schema-validator.ts +3 -2
  196. package/src/internal/object/typed-object.test.ts +1 -1
  197. package/src/internal/object/typed-object.ts +11 -5
  198. package/src/internal/proxy/handler.test.ts +30 -20
  199. package/src/internal/proxy/index.ts +6 -0
  200. package/src/internal/proxy/{reactive-object.ts → make-object.ts} +19 -14
  201. package/src/internal/proxy/schema.test.ts +5 -4
  202. package/src/internal/proxy/typed-handler.test.ts +28 -28
  203. package/src/internal/proxy/typed-handler.ts +8 -3
  204. package/src/internal/proxy/typed-object.test.ts +16 -11
  205. package/src/internal/ref/ref.test.ts +8 -7
  206. package/src/internal/ref/ref.ts +24 -20
  207. package/src/internal/{projection → schema}/compose.test.ts +5 -6
  208. package/src/internal/{projection → schema}/compose.ts +2 -1
  209. package/src/internal/schema/echo-schema.ts +30 -28
  210. package/src/internal/schema/index.ts +3 -4
  211. package/src/internal/schema/manipulation.ts +1 -1
  212. package/src/internal/schema/persistent-schema.ts +28 -0
  213. package/src/internal/schema/runtime-schema-registry.ts +4 -4
  214. package/src/internal/types/base.ts +58 -0
  215. package/src/internal/{ast/entity-kind.ts → types/entity.ts} +8 -0
  216. package/src/internal/types/index.ts +5 -2
  217. package/src/internal/{object → types}/meta.ts +32 -17
  218. package/src/internal/types/typename.ts +45 -0
  219. package/src/internal/types/version.ts +20 -0
  220. package/src/query/filter.ts +455 -0
  221. package/src/query/index.ts +4 -1
  222. package/src/query/order.ts +34 -0
  223. package/src/query/query.test.ts +48 -115
  224. package/src/query/query.ts +16 -502
  225. package/src/query/testing.ts +64 -0
  226. package/src/query/util.ts +25 -0
  227. package/src/testing/api.test.ts +100 -0
  228. package/src/testing/index.ts +3 -3
  229. package/src/testing/test-data.ts +130 -0
  230. package/src/testing/test-schema.ts +213 -0
  231. package/src/{internal/testing/utils.ts → testing/util.ts} +38 -14
  232. package/dist/lib/browser/chunk-BIDAASFK.mjs.map +0 -7
  233. package/dist/lib/browser/chunk-ZDLCWGEW.mjs +0 -410
  234. package/dist/lib/browser/chunk-ZDLCWGEW.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-ZFRJKT4A.mjs +0 -585
  236. package/dist/lib/browser/chunk-ZFRJKT4A.mjs.map +0 -7
  237. package/dist/lib/browser/query/index.mjs +0 -13
  238. package/dist/lib/browser/query/index.mjs.map +0 -7
  239. package/dist/lib/node-esm/chunk-3SVRRCUU.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-CGDHRZWH.mjs +0 -585
  241. package/dist/lib/node-esm/chunk-CGDHRZWH.mjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-HWS6VBQC.mjs +0 -410
  243. package/dist/lib/node-esm/chunk-HWS6VBQC.mjs.map +0 -7
  244. package/dist/lib/node-esm/query/index.mjs +0 -13
  245. package/dist/lib/node-esm/query/index.mjs.map +0 -7
  246. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  247. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  248. package/dist/types/src/internal/ast/annotations.d.ts +0 -131
  249. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  250. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  251. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  252. package/dist/types/src/internal/ast/index.d.ts +0 -5
  253. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  254. package/dist/types/src/internal/ast/types.d.ts +0 -6
  255. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  256. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  257. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  258. package/dist/types/src/internal/json/index.d.ts +0 -2
  259. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  260. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  261. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  262. package/dist/types/src/internal/object/accessors.d.ts +0 -37
  263. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  264. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  265. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  266. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  267. package/dist/types/src/internal/object/entity.d.ts +0 -33
  268. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  269. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  270. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  271. package/dist/types/src/internal/object/model.d.ts +0 -117
  272. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  273. package/dist/types/src/internal/object/relation.d.ts +0 -17
  274. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  275. package/dist/types/src/internal/object/typename.d.ts +0 -15
  276. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  277. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  278. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  279. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  280. package/dist/types/src/internal/projection/index.d.ts +0 -2
  281. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  282. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  283. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  284. package/dist/types/src/internal/query/index.d.ts +0 -2
  285. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  286. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  287. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  288. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  289. package/dist/types/src/internal/testing/index.d.ts +0 -3
  290. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  291. package/dist/types/src/internal/testing/types.d.ts +0 -381
  292. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  293. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  294. package/dist/types/src/internal/types/types.d.ts +0 -79
  295. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  296. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  297. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  298. package/dist/types/src/internal/types/util.d.ts +0 -5
  299. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  300. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  301. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  302. package/dist/types/src/testing/types.d.ts.map +0 -1
  303. package/src/internal/ast/annotation-helper.ts +0 -22
  304. package/src/internal/ast/annotations.ts +0 -226
  305. package/src/internal/ast/index.ts +0 -8
  306. package/src/internal/ast/types.ts +0 -17
  307. package/src/internal/json/index.ts +0 -5
  308. package/src/internal/object/accessors.ts +0 -153
  309. package/src/internal/object/entity.ts +0 -248
  310. package/src/internal/object/relation.ts +0 -24
  311. package/src/internal/object/typename.ts +0 -61
  312. package/src/internal/object/version.ts +0 -22
  313. package/src/internal/projection/index.ts +0 -5
  314. package/src/internal/query/index.ts +0 -5
  315. package/src/internal/schema/stored-schema.ts +0 -26
  316. package/src/internal/testing/index.ts +0 -6
  317. package/src/internal/testing/types.ts +0 -144
  318. package/src/internal/types/types.test.ts +0 -48
  319. package/src/internal/types/types.ts +0 -176
  320. package/src/internal/types/util.ts +0 -9
  321. package/src/test/api.test.ts +0 -180
  322. package/src/testing/echo-schema.ts +0 -39
  323. package/src/testing/types.ts +0 -108
  324. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  325. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  326. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  327. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  328. /package/dist/types/src/internal/{projection → schema}/compose.d.ts +0 -0
  329. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  330. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  331. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
  332. /package/src/{internal/query/query.ts → query/types.ts} +0 -0
@@ -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.Person, {
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.Person)!.toString());
47
- expect(isInstanceOf(Testing.Person, 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.Person, {
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.Person.typename, Testing.Person.version).toString(),
58
+ '@type': DXN.fromTypenameAndVersion(TestSchema.Person.typename, TestSchema.Person.version).toString(),
60
59
  '@meta': {
61
60
  keys: [],
62
61
  },
@@ -67,48 +66,47 @@ describe('create (static version)', () => {
67
66
  });
68
67
 
69
68
  test('JSON encoding with relation', () => {
70
- const contactA = create(Testing.Person, {
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.Person, {
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.Person, {
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.Person);
101
+ expect(getSchema(contact)).toBe(TestSchema.Person);
102
102
  });
103
103
 
104
104
  test('inspect', () => {
105
- const contact = create(Testing.Person, {
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');
@@ -9,31 +9,28 @@ import { assertArgument, failedInvariant } from '@dxos/invariant';
9
9
  import { ObjectId } from '@dxos/keys';
10
10
  import { defineHiddenProperty } from '@dxos/live-object';
11
11
 
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';
12
+ import { getSchemaDXN, getTypeAnnotation, setTypename } from '../annotations';
17
13
  import {
18
- EntityKindId,
19
- MetaId,
20
14
  RelationSourceDXNId,
21
15
  RelationSourceId,
22
16
  RelationTargetDXNId,
23
17
  RelationTargetId,
24
- assertObjectModelShape,
25
- } from './model';
26
- import { setTypename } from './typename';
18
+ assertObjectModel,
19
+ getObjectDXN,
20
+ } from '../entities';
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
@@ -49,48 +46,50 @@ type CreateData<T> = T extends { id: string } ? Omit<T, 'id' | typeof EntityKind
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,17 +3,9 @@
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 './typename';
15
- export * from './deleted';
16
- export * from './model';
17
- export * from './accessors';
18
10
  export * from './schema-validator';
19
- export * from './version';
11
+ export * from './typed-object';
@@ -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 AnyEchoObject, MetaId } from '../types';
13
11
 
14
12
  /*
15
13
  * @internal
@@ -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
  },
@@ -6,26 +6,23 @@ import { describe, expect, test } from 'vitest';
6
6
 
7
7
  import { DXN } from '@dxos/keys';
8
8
 
9
- import { EntityKind, getSchemaDXN, getSchemaTypename } from '../ast';
9
+ import { TestSchema } from '../../testing';
10
+ import { getSchemaDXN, getSchemaTypename, getTypeDXN, getTypename } from '../annotations';
11
+ import { RelationSourceId, RelationTargetId, getObjectDXN } from '../entities';
12
+ import { makeObject } from '../proxy';
10
13
  import { Ref, StaticRefResolver } from '../ref';
11
- import { Testing } from '../testing';
14
+ import { ATTR_TYPE, EntityKind, KindId, MetaId, TypeId, getMeta, getSchema } from '../types';
12
15
 
13
- import { getObjectDXN, getSchema } from './accessors';
14
- import { create } from './create';
16
+ import { createObject } from './create-object';
15
17
  import { objectFromJSON, objectToJSON } from './json-serializer';
16
- import { getMeta } from './meta';
17
- import { ATTR_TYPE, EntityKindId, MetaId, RelationSourceId, RelationTargetId, TypeId } from './model';
18
- import { getType, getTypename } from './typename';
19
18
 
20
19
  describe('Object JSON serializer', () => {
21
20
  test('should serialize and deserialize object', async () => {
22
- const contact = create(Testing.Person, {
23
- name: 'John Doe',
24
- });
25
- getMeta(contact).keys.push({ id: '12345', source: 'crm.example.com' });
21
+ const contact = makeObject(TestSchema.Person, { name: 'Alice' });
22
+ getMeta(contact).keys.push({ id: '12345', source: 'example.com' });
26
23
 
27
- const task = create(Testing.Task, {
28
- title: 'Polish my shoes',
24
+ const task = createObject(TestSchema.Task, {
25
+ title: 'Fix the tests',
29
26
  assignee: Ref.make(contact),
30
27
  });
31
28
 
@@ -33,67 +30,65 @@ describe('Object JSON serializer', () => {
33
30
  const taskJson = objectToJSON(task);
34
31
 
35
32
  expect(contactJson.id).toBe(contact.id);
36
- expect(contactJson[ATTR_TYPE]).toEqual(getSchemaDXN(Testing.Person)!.toString());
37
- expect(contactJson.name).toEqual('John Doe');
33
+ expect(contactJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Person)!.toString());
34
+ expect(contactJson.name).toEqual('Alice');
38
35
 
39
36
  expect(taskJson.id).toBe(task.id);
40
- expect(taskJson[ATTR_TYPE]).toEqual(getSchemaDXN(Testing.Task)!.toString());
41
- expect(taskJson.title).toEqual('Polish my shoes');
37
+ expect(taskJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Task)!.toString());
38
+ expect(taskJson.title).toEqual('Fix the tests');
42
39
  expect(taskJson.assignee).toEqual({ '/': DXN.fromLocalObjectId(contact.id).toString() });
43
40
 
44
41
  const refResolver = new StaticRefResolver()
45
- .addSchema(Testing.Person)
46
- .addSchema(Testing.Task)
42
+ .addSchema(TestSchema.Person)
43
+ .addSchema(TestSchema.Task)
47
44
  .addObject(contact)
48
45
  .addObject(task);
49
46
 
50
- const contactFromJson = (await objectFromJSON(contactJson, { refResolver })) as Testing.Person;
51
- const taskFromJson = (await objectFromJSON(taskJson, { refResolver })) as Testing.Task;
47
+ const contactFromJson = (await objectFromJSON(contactJson, { refResolver })) as TestSchema.Person;
48
+ const taskFromJson = (await objectFromJSON(taskJson, { refResolver })) as TestSchema.Task;
52
49
 
53
50
  expect(contactFromJson.id).toBe(contact.id);
54
- expect(contactFromJson.name).toBe('John Doe');
55
- expect((contactFromJson as any)[TypeId]).toEqual(getSchemaDXN(Testing.Person));
56
- expect((contactFromJson as any)[EntityKindId]).toBe(EntityKind.Object);
51
+ expect(contactFromJson.name).toBe('Alice');
52
+ expect((contactFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Person));
53
+ expect((contactFromJson as any)[KindId]).toBe(EntityKind.Object);
57
54
  expect((contactFromJson as any)[RelationSourceId]).toBeUndefined();
58
55
  expect((contactFromJson as any)[RelationTargetId]).toBeUndefined();
59
56
  expect((contactFromJson as any)[MetaId]).toEqual({
60
57
  keys: [
61
58
  {
62
59
  id: '12345',
63
- source: 'crm.example.com',
60
+ source: 'example.com',
64
61
  },
65
62
  ],
66
63
  });
67
- expect(getType(contactFromJson)?.toString()).toBe(getSchemaDXN(Testing.Person)!.toString());
68
- expect(getTypename(contactFromJson)).toBe(getSchemaTypename(Testing.Person));
64
+ expect(getTypeDXN(contactFromJson)?.toString()).toBe(getSchemaDXN(TestSchema.Person)!.toString());
65
+ expect(getTypename(contactFromJson)).toBe(getSchemaTypename(TestSchema.Person));
69
66
  expect(getObjectDXN(contactFromJson)?.toString()).toEqual(getObjectDXN(contact)?.toString());
70
- expect(getSchema(contactFromJson)).toEqual(Testing.Person);
67
+ expect(getSchema(contactFromJson)).toEqual(TestSchema.Person);
71
68
 
72
69
  expect(taskFromJson.id).toBe(task.id);
73
- expect(taskFromJson.title).toBe('Polish my shoes');
70
+ expect(taskFromJson.title).toBe('Fix the tests');
74
71
  expect(taskFromJson.assignee!.dxn).toEqual(DXN.fromLocalObjectId(contact.id));
75
72
  expect(taskFromJson.assignee!.target).toEqual(contact);
76
73
  expect(await taskFromJson.assignee!.load()).toEqual(contact);
77
- expect((taskFromJson as any)[TypeId]).toEqual(getSchemaDXN(Testing.Task));
78
- expect((taskFromJson as any)[EntityKindId]).toBe(EntityKind.Object);
74
+ expect((taskFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Task));
75
+ expect((taskFromJson as any)[KindId]).toBe(EntityKind.Object);
79
76
  expect((taskFromJson as any)[RelationSourceId]).toBeUndefined();
80
77
  expect((taskFromJson as any)[RelationTargetId]).toBeUndefined();
81
78
  expect((taskFromJson as any)[MetaId]).toEqual({ keys: [] });
82
- expect(getSchema(taskFromJson)).toEqual(Testing.Task);
79
+ expect(getSchema(taskFromJson)).toEqual(TestSchema.Task);
83
80
  });
84
81
 
85
82
  test('serialize with unresolved schema', async () => {
86
- const contact = create(Testing.Person, {
87
- name: 'John Doe',
88
- });
83
+ const contact = createObject(TestSchema.Person, { name: 'Alice' });
89
84
  const contactJson = objectToJSON(contact);
90
85
  const contactFromJson: any = await objectFromJSON(contactJson);
91
86
 
92
87
  expect(contactFromJson.id).toBe(contact.id);
93
- expect(contactFromJson.name).toBe('John Doe');
88
+ expect(contactFromJson.name).toBe('Alice');
94
89
  expect(getSchema(contactFromJson)).toBeUndefined();
95
- expect(getTypename(contactFromJson)).toEqual(getSchemaTypename(Testing.Person));
90
+ expect(getTypename(contactFromJson)).toEqual(getSchemaTypename(TestSchema.Person));
96
91
  expect(getObjectDXN(contactFromJson)).toEqual(getObjectDXN(contact));
97
- expect(getType(contactFromJson)).toEqual(getSchemaDXN(Testing.Person));
92
+ expect(getTypeDXN(contactFromJson)).toEqual(getSchemaDXN(TestSchema.Person));
98
93
  });
99
94
  });