@dxos/echo 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (328) hide show
  1. package/dist/lib/browser/chunk-7GH6RXJ3.mjs +3683 -0
  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 +24 -1
  6. package/dist/lib/browser/internal/index.mjs +336 -0
  7. package/dist/lib/browser/internal/index.mjs.map +7 -0
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/testing/index.mjs +289 -31
  10. package/dist/lib/browser/testing/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +1111 -0
  12. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +7 -0
  13. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs +3683 -0
  14. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +24 -1
  16. package/dist/lib/node-esm/internal/index.mjs +336 -0
  17. package/dist/lib/node-esm/internal/index.mjs.map +7 -0
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/testing/index.mjs +289 -31
  20. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  21. package/dist/types/src/Annotation.d.ts +2 -0
  22. package/dist/types/src/Annotation.d.ts.map +1 -0
  23. package/dist/types/src/Database.d.ts +137 -0
  24. package/dist/types/src/Database.d.ts.map +1 -0
  25. package/dist/types/src/Entity.d.ts +36 -0
  26. package/dist/types/src/Entity.d.ts.map +1 -0
  27. package/dist/types/src/Format.d.ts +4 -0
  28. package/dist/types/src/Format.d.ts.map +1 -0
  29. package/dist/types/src/JsonSchema.d.ts +9 -0
  30. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  31. package/dist/types/src/Key.d.ts +1 -0
  32. package/dist/types/src/Key.d.ts.map +1 -1
  33. package/dist/types/src/Obj.d.ts +121 -50
  34. package/dist/types/src/Obj.d.ts.map +1 -1
  35. package/dist/types/src/Ref.d.ts +10 -10
  36. package/dist/types/src/Ref.d.ts.map +1 -1
  37. package/dist/types/src/Relation.d.ts +18 -14
  38. package/dist/types/src/Relation.d.ts.map +1 -1
  39. package/dist/types/src/Tag.d.ts +17 -0
  40. package/dist/types/src/Tag.d.ts.map +1 -0
  41. package/dist/types/src/Type.d.ts +39 -50
  42. package/dist/types/src/Type.d.ts.map +1 -1
  43. package/dist/types/src/errors.d.ts +68 -0
  44. package/dist/types/src/errors.d.ts.map +1 -0
  45. package/dist/types/src/index.d.ts +9 -3
  46. package/dist/types/src/index.d.ts.map +1 -1
  47. package/dist/types/src/internal/annotations/annotations.d.ts +174 -0
  48. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  49. package/dist/types/src/internal/annotations/annotations.test.d.ts +2 -0
  50. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  51. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  52. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  53. package/dist/types/src/internal/annotations/util.d.ts +26 -0
  54. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  55. package/dist/types/src/internal/entities/entity.d.ts +10 -0
  56. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  57. package/dist/types/src/internal/entities/expando.d.ts +16 -0
  58. package/dist/types/src/internal/entities/expando.d.ts.map +1 -0
  59. package/dist/types/src/internal/entities/index.d.ts +6 -0
  60. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  61. package/dist/types/src/internal/entities/model.d.ts +70 -0
  62. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  63. package/dist/types/src/internal/entities/object.d.ts +11 -0
  64. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  65. package/dist/types/src/internal/entities/relation.d.ts +55 -0
  66. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  67. package/dist/types/src/internal/entities/util.d.ts +2 -0
  68. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  69. package/dist/types/src/internal/formats/date.d.ts +63 -0
  70. package/dist/types/src/internal/formats/date.d.ts.map +1 -0
  71. package/dist/types/src/internal/formats/date.test.d.ts +2 -0
  72. package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
  73. package/dist/types/src/internal/formats/format.d.ts +32 -0
  74. package/dist/types/src/internal/formats/format.d.ts.map +1 -0
  75. package/dist/types/src/internal/formats/format.test.d.ts +2 -0
  76. package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
  77. package/dist/types/src/internal/formats/index.d.ts +8 -0
  78. package/dist/types/src/internal/formats/index.d.ts.map +1 -0
  79. package/dist/types/src/internal/formats/number.d.ts +31 -0
  80. package/dist/types/src/internal/formats/number.d.ts.map +1 -0
  81. package/dist/types/src/internal/formats/object.d.ts +35 -0
  82. package/dist/types/src/internal/formats/object.d.ts.map +1 -0
  83. package/dist/types/src/internal/formats/select.d.ts +11 -0
  84. package/dist/types/src/internal/formats/select.d.ts.map +1 -0
  85. package/dist/types/src/internal/formats/string.d.ts +38 -0
  86. package/dist/types/src/internal/formats/string.d.ts.map +1 -0
  87. package/dist/types/src/internal/formats/types.d.ts +68 -0
  88. package/dist/types/src/internal/formats/types.d.ts.map +1 -0
  89. package/dist/types/src/internal/index.d.ts +11 -0
  90. package/dist/types/src/internal/index.d.ts.map +1 -0
  91. package/dist/types/src/internal/json-schema/annotations.d.ts +19 -0
  92. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  93. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts +2 -0
  94. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  95. package/dist/types/src/internal/json-schema/index.d.ts +5 -0
  96. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
  97. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
  98. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
  99. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +250 -0
  100. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
  101. package/dist/types/src/internal/json-schema/json-schema.d.ts +29 -0
  102. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  103. package/dist/types/src/internal/json-schema/json-schema.test.d.ts +2 -0
  104. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  105. package/dist/types/src/internal/object/common.d.ts +18 -0
  106. package/dist/types/src/internal/object/common.d.ts.map +1 -0
  107. package/dist/types/src/internal/object/create-object.d.ts +39 -0
  108. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  109. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  110. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  111. package/dist/types/src/internal/object/deleted.d.ts +6 -0
  112. package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
  113. package/dist/types/src/internal/object/ids.d.ts +6 -0
  114. package/dist/types/src/internal/object/ids.d.ts.map +1 -0
  115. package/dist/types/src/internal/object/index.d.ts +8 -0
  116. package/dist/types/src/internal/object/index.d.ts.map +1 -0
  117. package/dist/types/src/internal/object/inspect.d.ts +2 -0
  118. package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
  119. package/dist/types/src/internal/object/json-serializer.d.ts +31 -0
  120. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
  121. package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
  122. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
  123. package/dist/types/src/internal/object/schema-validator.d.ts +15 -0
  124. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
  125. package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
  126. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
  127. package/dist/types/src/internal/object/typed-object.d.ts +31 -0
  128. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
  129. package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
  130. package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
  131. package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
  132. package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
  133. package/dist/types/src/internal/proxy/index.d.ts +3 -0
  134. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  135. package/dist/types/src/internal/proxy/make-object.d.ts +16 -0
  136. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  137. package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
  138. package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
  139. package/dist/types/src/internal/proxy/typed-handler.d.ts +44 -0
  140. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
  141. package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
  142. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
  143. package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
  144. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
  145. package/dist/types/src/internal/ref/index.d.ts +3 -0
  146. package/dist/types/src/internal/ref/index.d.ts.map +1 -0
  147. package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
  148. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
  149. package/dist/types/src/internal/ref/ref.d.ts +209 -0
  150. package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
  151. package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
  152. package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
  153. package/dist/types/src/internal/schema/compose.d.ts +6 -0
  154. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  155. package/dist/types/src/internal/schema/compose.test.d.ts +2 -0
  156. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  157. package/dist/types/src/internal/schema/echo-schema.d.ts +168 -0
  158. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
  159. package/dist/types/src/internal/schema/index.d.ts +6 -0
  160. package/dist/types/src/internal/schema/index.d.ts.map +1 -0
  161. package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
  162. package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
  163. package/dist/types/src/internal/schema/persistent-schema.d.ts +18 -0
  164. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  165. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +18 -0
  166. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -0
  167. package/dist/types/src/internal/schema/snapshot.d.ts +6 -0
  168. package/dist/types/src/internal/schema/snapshot.d.ts.map +1 -0
  169. package/dist/types/src/internal/types/base.d.ts +37 -0
  170. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  171. package/dist/types/src/internal/types/entity.d.ts +12 -0
  172. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  173. package/dist/types/src/internal/types/index.d.ts +6 -0
  174. package/dist/types/src/internal/types/index.d.ts.map +1 -0
  175. package/dist/types/src/internal/types/meta.d.ts +40 -0
  176. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  177. package/dist/types/src/internal/types/typename.d.ts +13 -0
  178. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  179. package/dist/types/src/internal/types/version.d.ts +15 -0
  180. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  181. package/dist/types/src/query/filter.d.ts +167 -0
  182. package/dist/types/src/query/filter.d.ts.map +1 -0
  183. package/dist/types/src/query/index.d.ts +4 -1
  184. package/dist/types/src/query/index.d.ts.map +1 -1
  185. package/dist/types/src/query/order.d.ts +12 -0
  186. package/dist/types/src/query/order.d.ts.map +1 -0
  187. package/dist/types/src/query/query.d.ts +112 -0
  188. package/dist/types/src/query/query.d.ts.map +1 -0
  189. package/dist/types/src/query/query.test.d.ts +2 -0
  190. package/dist/types/src/query/query.test.d.ts.map +1 -0
  191. package/dist/types/src/query/testing.d.ts +51 -0
  192. package/dist/types/src/query/testing.d.ts.map +1 -0
  193. package/dist/types/src/query/types.d.ts +17 -0
  194. package/dist/types/src/query/types.d.ts.map +1 -0
  195. package/dist/types/src/query/util.d.ts +8 -0
  196. package/dist/types/src/query/util.d.ts.map +1 -0
  197. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  198. package/dist/types/src/testing/index.d.ts +3 -1
  199. package/dist/types/src/testing/index.d.ts.map +1 -1
  200. package/dist/types/src/testing/test-data.d.ts +18 -0
  201. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  202. package/dist/types/src/testing/test-schema.d.ts +337 -0
  203. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  204. package/dist/types/src/testing/util.d.ts +16 -0
  205. package/dist/types/src/testing/util.d.ts.map +1 -0
  206. package/dist/types/tsconfig.tsbuildinfo +1 -1
  207. package/package.json +49 -29
  208. package/src/Annotation.ts +17 -0
  209. package/src/Database.ts +189 -0
  210. package/src/Entity.ts +51 -0
  211. package/src/Format.ts +11 -0
  212. package/src/JsonSchema.ts +16 -0
  213. package/src/Key.ts +3 -0
  214. package/src/Obj.ts +353 -107
  215. package/src/Ref.ts +9 -10
  216. package/src/Relation.ts +68 -43
  217. package/src/Tag.ts +40 -0
  218. package/src/Type.ts +97 -85
  219. package/src/errors.ts +18 -0
  220. package/src/index.ts +13 -4
  221. package/src/internal/README.md +83 -0
  222. package/src/internal/annotations/annotations.test.ts +96 -0
  223. package/src/internal/annotations/annotations.ts +463 -0
  224. package/src/internal/annotations/index.ts +6 -0
  225. package/src/internal/annotations/util.ts +70 -0
  226. package/src/internal/entities/entity.ts +109 -0
  227. package/src/internal/entities/expando.ts +23 -0
  228. package/src/internal/entities/index.ts +9 -0
  229. package/src/internal/entities/model.ts +129 -0
  230. package/src/internal/entities/object.ts +45 -0
  231. package/src/internal/entities/relation.ts +155 -0
  232. package/src/internal/entities/util.ts +33 -0
  233. package/src/internal/formats/date.test.ts +56 -0
  234. package/src/internal/formats/date.ts +217 -0
  235. package/src/internal/formats/format.test.ts +77 -0
  236. package/src/internal/formats/format.ts +55 -0
  237. package/src/internal/formats/index.ts +12 -0
  238. package/src/internal/formats/number.ts +89 -0
  239. package/src/internal/formats/object.ts +80 -0
  240. package/src/internal/formats/select.ts +16 -0
  241. package/src/internal/formats/string.ts +76 -0
  242. package/src/internal/formats/types.ts +180 -0
  243. package/src/internal/index.ts +38 -0
  244. package/src/internal/json-schema/annotations.ts +50 -0
  245. package/src/internal/json-schema/effect-schema.test.ts +143 -0
  246. package/src/internal/json-schema/index.ts +8 -0
  247. package/src/internal/json-schema/json-schema-normalize.ts +109 -0
  248. package/src/internal/json-schema/json-schema-type.ts +404 -0
  249. package/src/internal/json-schema/json-schema.test.ts +859 -0
  250. package/src/internal/json-schema/json-schema.ts +528 -0
  251. package/src/internal/object/common.ts +75 -0
  252. package/src/internal/object/create-object.test.ts +116 -0
  253. package/src/internal/object/create-object.ts +95 -0
  254. package/src/internal/object/deleted.ts +19 -0
  255. package/src/internal/object/ids.ts +12 -0
  256. package/src/internal/object/index.ts +11 -0
  257. package/src/internal/object/inspect.ts +46 -0
  258. package/src/internal/object/json-serializer.test.ts +94 -0
  259. package/src/internal/object/json-serializer.ts +230 -0
  260. package/src/internal/object/schema-validator.test.ts +186 -0
  261. package/src/internal/object/schema-validator.ts +242 -0
  262. package/src/internal/object/typed-object.test.ts +34 -0
  263. package/src/internal/object/typed-object.ts +94 -0
  264. package/src/internal/proxy/handler.test.ts +173 -0
  265. package/src/internal/proxy/index.ts +6 -0
  266. package/src/internal/proxy/make-object.ts +113 -0
  267. package/src/internal/proxy/schema.test.ts +137 -0
  268. package/src/internal/proxy/typed-handler.test.ts +102 -0
  269. package/src/internal/proxy/typed-handler.ts +233 -0
  270. package/src/internal/proxy/typed-object.test.ts +105 -0
  271. package/src/internal/ref/index.ts +6 -0
  272. package/src/internal/ref/ref-array.ts +39 -0
  273. package/src/internal/ref/ref.test.ts +101 -0
  274. package/src/internal/ref/ref.ts +525 -0
  275. package/src/internal/schema/compose.test.ts +42 -0
  276. package/src/internal/schema/compose.ts +37 -0
  277. package/src/internal/schema/echo-schema.ts +385 -0
  278. package/src/internal/schema/index.ts +9 -0
  279. package/src/internal/schema/manipulation.ts +92 -0
  280. package/src/internal/schema/persistent-schema.ts +28 -0
  281. package/src/internal/schema/runtime-schema-registry.ts +78 -0
  282. package/src/internal/schema/snapshot.ts +25 -0
  283. package/src/internal/types/base.ts +58 -0
  284. package/src/internal/types/entity.ts +23 -0
  285. package/src/internal/types/index.ts +9 -0
  286. package/src/internal/types/meta.ts +76 -0
  287. package/src/internal/types/typename.ts +45 -0
  288. package/src/internal/types/version.ts +20 -0
  289. package/src/query/filter.ts +455 -0
  290. package/src/query/index.ts +5 -1
  291. package/src/query/order.ts +34 -0
  292. package/src/query/query.test.ts +334 -0
  293. package/src/query/query.ts +303 -0
  294. package/src/query/testing.ts +64 -0
  295. package/src/query/types.ts +23 -0
  296. package/src/query/util.ts +25 -0
  297. package/src/testing/api.test.ts +100 -0
  298. package/src/testing/index.ts +3 -1
  299. package/src/testing/test-data.ts +130 -0
  300. package/src/testing/test-schema.ts +213 -0
  301. package/src/testing/util.ts +78 -0
  302. package/dist/lib/browser/chunk-2KNTYMIW.mjs +0 -697
  303. package/dist/lib/browser/chunk-2KNTYMIW.mjs.map +0 -7
  304. package/dist/lib/node-esm/chunk-EXNNC62J.mjs +0 -697
  305. package/dist/lib/node-esm/chunk-EXNNC62J.mjs.map +0 -7
  306. package/dist/types/src/experimental/database.d.ts +0 -8
  307. package/dist/types/src/experimental/database.d.ts.map +0 -1
  308. package/dist/types/src/experimental/index.d.ts +0 -1
  309. package/dist/types/src/experimental/index.d.ts.map +0 -1
  310. package/dist/types/src/experimental/queue.d.ts +0 -8
  311. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  312. package/dist/types/src/experimental/space.d.ts +0 -8
  313. package/dist/types/src/experimental/space.d.ts.map +0 -1
  314. package/dist/types/src/query/dsl.d.ts +0 -218
  315. package/dist/types/src/query/dsl.d.ts.map +0 -1
  316. package/dist/types/src/query/dsl.test.d.ts +0 -2
  317. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  318. package/dist/types/src/testing/types.d.ts +0 -113
  319. package/dist/types/src/testing/types.d.ts.map +0 -1
  320. package/src/experimental/database.ts +0 -11
  321. package/src/experimental/index.ts +0 -7
  322. package/src/experimental/queue.ts +0 -11
  323. package/src/experimental/space.ts +0 -11
  324. package/src/query/dsl.test.ts +0 -324
  325. package/src/query/dsl.ts +0 -646
  326. package/src/test/api.test.ts +0 -173
  327. package/src/testing/types.ts +0 -91
  328. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
package/src/Obj.ts CHANGED
@@ -2,24 +2,61 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
6
- import { dual } from 'effect/Function';
5
+ import * as Function from 'effect/Function';
6
+ import * as Schema from 'effect/Schema';
7
7
 
8
- import * as EchoSchema from '@dxos/echo-schema';
8
+ import { type ForeignKey } from '@dxos/echo-protocol';
9
9
  import { assertArgument, invariant } from '@dxos/invariant';
10
- import { type DXN } from '@dxos/keys';
11
- import type * as LiveObject from '@dxos/live-object';
12
- import { live } from '@dxos/live-object';
10
+ import { type DXN, ObjectId } from '@dxos/keys';
11
+ import { getSnapshot as getSnapshot$ } from '@dxos/live-object';
13
12
  import { assumeType, deepMapValues } from '@dxos/util';
14
13
 
15
- import type * as Ref from './Ref';
16
- import type * as Relation from './Relation';
17
- import type * as Type from './Type';
14
+ import * as Entity from './Entity';
15
+ import {
16
+ type AnyEchoObject,
17
+ type AnyProperties,
18
+ type InternalObjectProps,
19
+ MetaId,
20
+ type ObjectJSON,
21
+ type ObjectMeta,
22
+ ObjectVersionId,
23
+ VersionTypeId,
24
+ getDescription as getDescription$,
25
+ getLabel as getLabel$,
26
+ getMeta as getMeta$,
27
+ getObjectDXN,
28
+ getSchema as getSchema$,
29
+ getSchemaTypename,
30
+ getTypeAnnotation,
31
+ getTypeDXN as getTypeDXN$,
32
+ isDeleted as isDeleted$,
33
+ isInstanceOf,
34
+ makeObject,
35
+ objectFromJSON,
36
+ objectToJSON,
37
+ setDescription as setDescription$,
38
+ setLabel as setLabel$,
39
+ } from './internal';
40
+ import * as Ref from './Ref';
41
+ import * as Type from './Type';
18
42
 
19
43
  /**
20
- * NOTE: Don't export: Obj.Any and Obj.Obj form the public API.
44
+ * Base type for all ECHO objects.
45
+ * @private
21
46
  */
22
- interface BaseObj extends EchoSchema.HasId, Type.OfKind<EchoSchema.EntityKind.Object> {}
47
+ interface BaseObj extends AnyEchoObject, Entity.OfKind<typeof Entity.Kind.Object> {}
48
+
49
+ /**
50
+ * Base type for all Obj objects.
51
+ */
52
+ export interface Any extends BaseObj {}
53
+
54
+ export const Any = Schema.Struct({}).pipe(
55
+ Type.Obj({
56
+ typename: 'dxos.org/type/Any',
57
+ version: '0.1.0',
58
+ }),
59
+ );
23
60
 
24
61
  /**
25
62
  * Object type with specific properties.
@@ -27,22 +64,30 @@ interface BaseObj extends EchoSchema.HasId, Type.OfKind<EchoSchema.EntityKind.Ob
27
64
  export type Obj<Props> = BaseObj & Props;
28
65
 
29
66
  /**
30
- * Base type for all ECHO objects.
67
+ * Object with arbitrary properties.
68
+ *
69
+ * NOTE: Due to how typescript works, this type is not assignable to a specific schema type.
70
+ * In that case, use `Obj.instanceOf` to check if an object is of a specific type.
31
71
  */
32
- export interface Any extends BaseObj {}
33
-
34
- type Props<T = any> = { id?: EchoSchema.ObjectId } & Type.Properties<T>;
72
+ export interface AnyProps extends BaseObj, AnyProperties {}
35
73
 
36
- export type MakeProps<T extends Type.Obj.Any> = NoInfer<Props<Schema.Schema.Type<T>>> & {
37
- [Meta]?: Partial<EchoSchema.ObjectMeta>;
74
+ const defaultMeta: ObjectMeta = {
75
+ keys: [],
38
76
  };
39
77
 
40
- export const Meta: unique symbol = EchoSchema.MetaId as any;
78
+ type Props<T = any> = {
79
+ id?: ObjectId;
80
+ [Meta]?: Partial<ObjectMeta>;
81
+ } & Type.Properties<T>;
41
82
 
42
- // TODO(dmaretskyi): Expose Meta = EchoSchema.MetaId.
83
+ // TODO(burdon): Should we allow the caller to set the id?
84
+ export type MakeProps<T extends Schema.Schema.AnyNoContext> = {
85
+ id?: ObjectId;
86
+ [Meta]?: Partial<ObjectMeta>;
87
+ } & NoInfer<Props<Schema.Schema.Type<T>>>;
43
88
 
44
89
  /**
45
- * Creates new object.
90
+ * Creates a new object of the given types.
46
91
  * @param schema - Object schema.
47
92
  * @param props - Object properties.
48
93
  * @param meta - Object metadata (deprecated) -- pass with Obj.Meta.
@@ -54,89 +99,157 @@ export const Meta: unique symbol = EchoSchema.MetaId as any;
54
99
  * const obj = Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' });
55
100
  * ```
56
101
  */
57
- export const make = <S extends Type.Obj.Any>(
102
+ export const make = <S extends Schema.Schema.AnyNoContext>(
58
103
  schema: S,
59
104
  props: MakeProps<S>,
60
- meta?: EchoSchema.ObjectMeta,
61
- ): LiveObject.Live<Schema.Schema.Type<S>> => {
62
- assertArgument(
63
- EchoSchema.getTypeAnnotation(schema)?.kind === EchoSchema.EntityKind.Object,
64
- 'Expected an object schema',
65
- );
66
-
67
- if (props[EchoSchema.MetaId] != null) {
68
- meta = props[EchoSchema.MetaId] as any;
69
- delete props[EchoSchema.MetaId];
105
+ meta?: Partial<ObjectMeta>,
106
+ ): Obj<Schema.Schema.Type<S>> => {
107
+ assertArgument(getTypeAnnotation(schema)?.kind === Entity.Kind.Object, 'schema', 'Expected an object schema');
108
+
109
+ // Set default fields on meta on creation.
110
+ if (props[MetaId] != null) {
111
+ meta = { ...structuredClone(defaultMeta), ...props[MetaId] };
112
+ delete props[MetaId];
70
113
  }
71
114
 
72
- return live<Schema.Schema.Type<S>>(schema, props as any, meta);
115
+ // Filter undefined values.
116
+ const filterUndefined = Object.fromEntries(Object.entries(props).filter(([_, v]) => v !== undefined));
117
+
118
+ return makeObject<Schema.Schema.Type<S>>(schema, filterUndefined as any, {
119
+ ...defaultMeta,
120
+ ...meta,
121
+ });
73
122
  };
74
123
 
124
+ /**
125
+ * Determine if object is an ECHO object.
126
+ */
75
127
  export const isObject = (obj: unknown): obj is Any => {
76
- assumeType<EchoSchema.InternalObjectProps>(obj);
77
- return typeof obj === 'object' && obj !== null && obj[EchoSchema.EntityKindId] === EchoSchema.EntityKind.Object;
128
+ assumeType<InternalObjectProps>(obj);
129
+ return typeof obj === 'object' && obj !== null && obj[Entity.KindId] === Entity.Kind.Object;
130
+ };
131
+
132
+ //
133
+ // Snapshot
134
+ //
135
+
136
+ /**
137
+ * Returns an immutable snapshot of an object.
138
+ */
139
+ export const getSnapshot: <T extends Any>(obj: Obj<T>) => T = getSnapshot$;
140
+
141
+ export type CloneOptions = {
142
+ /**
143
+ * Retain the original object's ID.
144
+ * @default false
145
+ */
146
+ retainId?: boolean;
147
+ };
148
+
149
+ /**
150
+ * Clones an object or relation.
151
+ * This does not clone referenced objects, only the properties in the object.
152
+ * @returns A new object with the same schema and properties.
153
+ */
154
+ export const clone = <T extends Any>(obj: T, opts?: CloneOptions): T => {
155
+ const { id, ...data } = obj;
156
+ const schema = getSchema$(obj);
157
+ invariant(schema != null, 'Object should have a schema');
158
+ const props: any = deepMapValues(data, (value, recurse) => {
159
+ if (Ref.isRef(value)) {
160
+ return value;
161
+ }
162
+ return recurse(value);
163
+ });
164
+
165
+ if (opts?.retainId) {
166
+ props.id = id;
167
+ }
168
+ const meta = getMeta(obj);
169
+ props[MetaId] = deepMapValues(meta, (value, recurse) => {
170
+ if (Ref.isRef(value)) {
171
+ return value;
172
+ }
173
+ return recurse(value);
174
+ });
175
+
176
+ return make(schema as Type.Obj.Any, props);
78
177
  };
79
178
 
179
+ //
180
+ // Type
181
+ //
182
+
183
+ // TODO(burdon): To discuss: prefer over ObjectId or Key.ObjectId or Type.ID?
184
+ export const ID = ObjectId;
185
+ export type ID = ObjectId;
186
+
80
187
  /**
81
188
  * Test if object or relation is an instance of a schema.
82
189
  * @example
83
190
  * ```ts
84
191
  * const john = Obj.make(Person, { name: 'John' });
85
- * const johnIsPerson = Obj.instanceOf(Person)(john);
86
- *
87
192
  * const isPerson = Obj.instanceOf(Person);
88
- * if(isPerson(john)) {
193
+ * if (isPerson(john)) {
89
194
  * // john is Person
90
195
  * }
91
196
  * ```
92
197
  */
93
198
  export const instanceOf: {
94
- <S extends Type.Relation.Any | Type.Obj.Any>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
95
- <S extends Type.Relation.Any | Type.Obj.Any>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
96
- } = ((
97
- ...args: [schema: Type.Relation.Any | Type.Obj.Any, value: unknown] | [schema: Type.Relation.Any | Type.Obj.Any]
98
- ) => {
199
+ <S extends Type.Entity.Any>(schema: S): (value: unknown) => value is Schema.Schema.Type<S>;
200
+ <S extends Type.Entity.Any>(schema: S, value: unknown): value is Schema.Schema.Type<S>;
201
+ } = ((...args: [schema: Type.Entity.Any, value: unknown] | [schema: Type.Entity.Any]) => {
99
202
  if (args.length === 1) {
100
- return (obj: unknown) => EchoSchema.isInstanceOf(args[0], obj);
203
+ return (entity: unknown) => isInstanceOf(args[0], entity);
101
204
  }
102
205
 
103
- return EchoSchema.isInstanceOf(args[0], args[1]);
206
+ return isInstanceOf(args[0], args[1]);
104
207
  }) as any;
105
208
 
106
- export const getSchema = EchoSchema.getSchema;
107
-
108
209
  // TODO(dmaretskyi): Allow returning undefined.
109
- export const getDXN = (obj: Any | Relation.Any): DXN => {
110
- assertArgument(!Schema.isSchema(obj), 'Object should not be a schema.');
111
- const dxn = EchoSchema.getObjectDXN(obj);
210
+ export const getDXN = (entity: Entity.Unknown): DXN => {
211
+ assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
212
+ const dxn = getObjectDXN(entity);
112
213
  invariant(dxn != null, 'Invalid object.');
113
214
  return dxn;
114
215
  };
115
216
 
116
217
  /**
117
218
  * @returns The DXN of the object's type.
118
- * @example dxn:example.com/type/Contact:1.0.0
219
+ * @example dxn:example.com/type/Person:1.0.0
220
+ */
221
+ // TODO(burdon): Must define and return type for expando.
222
+ export const getTypeDXN = getTypeDXN$;
223
+
224
+ /**
225
+ * Get the schema of the object.
119
226
  */
120
- // TODO(burdon): Expando does not have a type.
121
- export const getTypeDXN = EchoSchema.getType;
227
+ export const getSchema = getSchema$;
122
228
 
123
229
  /**
124
230
  * @returns The typename of the object's type.
125
- * @example `example.com/type/Contact`
231
+ * @example `example.com/type/Person`
126
232
  */
127
- export const getTypename = (obj: Any | Relation.Any): string | undefined => {
128
- const schema = getSchema(obj);
233
+ export const getTypename = (entity: Entity.Unknown): string | undefined => {
234
+ const schema = getSchema$(entity);
129
235
  if (schema == null) {
130
236
  // Try to extract typename from DXN.
131
- return EchoSchema.getType(obj)?.asTypeDXN()?.type;
237
+ return getTypeDXN$(entity)?.asTypeDXN()?.type;
132
238
  }
133
239
 
134
- return EchoSchema.getSchemaTypename(schema);
240
+ return getSchemaTypename(schema);
135
241
  };
136
242
 
243
+ //
244
+ // Meta
245
+ //
246
+
247
+ export const Meta: unique symbol = MetaId as any;
248
+
249
+ // TODO(burdon): Narrow type.
137
250
  // TODO(dmaretskyi): Allow returning undefined.
138
- export const getMeta = (obj: Any | Relation.Any): EchoSchema.ObjectMeta => {
139
- const meta = EchoSchema.getMeta(obj);
251
+ export const getMeta = (entity: AnyProperties): ObjectMeta => {
252
+ const meta = getMeta$(entity);
140
253
  invariant(meta != null, 'Invalid object.');
141
254
  return meta;
142
255
  };
@@ -145,21 +258,21 @@ export const getMeta = (obj: Any | Relation.Any): EchoSchema.ObjectMeta => {
145
258
  * @returns Foreign keys for the object from the specified source.
146
259
  */
147
260
  export const getKeys: {
148
- (obj: Any | Relation.Any, source: string): EchoSchema.ForeignKey[];
149
- (source: string): (obj: Any | Relation.Any) => EchoSchema.ForeignKey[];
150
- } = dual(2, (obj: Any | Relation.Any, source?: string): EchoSchema.ForeignKey[] => {
151
- const meta = EchoSchema.getMeta(obj);
261
+ (entity: Entity.Unknown, source: string): ForeignKey[];
262
+ (source: string): (entity: Entity.Unknown) => ForeignKey[];
263
+ } = Function.dual(2, (entity: Entity.Unknown, source?: string): ForeignKey[] => {
264
+ const meta = getMeta(entity);
152
265
  invariant(meta != null, 'Invalid object.');
153
266
  return meta.keys.filter((key) => key.source === source);
154
267
  });
155
268
 
156
269
  /**
157
270
  * Delete all keys from the object for the specified source.
158
- * @param obj
271
+ * @param entity
159
272
  * @param source
160
273
  */
161
- export const deleteKeys = (obj: Any | Relation.Any, source: string) => {
162
- const meta = EchoSchema.getMeta(obj);
274
+ export const deleteKeys = (entity: Entity.Unknown, source: string) => {
275
+ const meta = getMeta(entity);
163
276
  for (let i = 0; i < meta.keys.length; i++) {
164
277
  if (meta.keys[i].source === source) {
165
278
  meta.keys.splice(i, 1);
@@ -168,85 +281,218 @@ export const deleteKeys = (obj: Any | Relation.Any, source: string) => {
168
281
  }
169
282
  };
170
283
 
284
+ export const addTag = (entity: Entity.Unknown, tag: string) => {
285
+ const meta = getMeta(entity);
286
+ meta.tags ??= [];
287
+ meta.tags.push(tag);
288
+ };
289
+
290
+ export const removeTag = (entity: Entity.Unknown, tag: string) => {
291
+ const meta = getMeta(entity);
292
+ if (!meta.tags) {
293
+ return;
294
+ }
295
+ for (let i = 0; i < meta.tags.length; i++) {
296
+ if (meta.tags[i] === tag) {
297
+ meta.tags.splice(i, 1);
298
+ i--;
299
+ }
300
+ }
301
+ };
302
+
171
303
  // TODO(dmaretskyi): Default to `false`.
172
- export const isDeleted = (obj: Any | Relation.Any): boolean => {
173
- const deleted = EchoSchema.isDeleted(obj);
304
+ export const isDeleted = (entity: Entity.Unknown): boolean => {
305
+ const deleted = isDeleted$(entity);
174
306
  invariant(typeof deleted === 'boolean', 'Invalid object.');
175
307
  return deleted;
176
308
  };
177
309
 
178
- // TODO(burdon): Rename "label"
179
- export const getLabel = (obj: Any | Relation.Any): string | undefined => {
180
- const schema = getSchema(obj);
310
+ //
311
+ // Annotations
312
+ //
313
+
314
+ export const getLabel = (entity: Entity.Unknown): string | undefined => {
315
+ const schema = getSchema$(entity);
181
316
  if (schema != null) {
182
- return EchoSchema.getLabel(schema, obj);
317
+ return getLabel$(schema, entity);
183
318
  }
184
319
  };
185
320
 
186
- export const setLabel = (obj: Any | Relation.Any, label: string) => {
187
- const schema = getSchema(obj);
321
+ export const setLabel = (entity: Entity.Unknown, label: string) => {
322
+ const schema = getSchema$(entity);
188
323
  if (schema != null) {
189
- EchoSchema.setLabel(schema, obj, label);
324
+ setLabel$(schema, entity, label);
190
325
  }
191
326
  };
192
327
 
328
+ export const getDescription = (entity: Entity.Unknown): string | undefined => {
329
+ const schema = getSchema$(entity);
330
+ if (schema != null) {
331
+ return getDescription$(schema, entity);
332
+ }
333
+ };
334
+
335
+ export const setDescription = (entity: Entity.Unknown, description: string) => {
336
+ const schema = getSchema$(entity);
337
+ if (schema != null) {
338
+ setDescription$(schema, entity, description);
339
+ }
340
+ };
341
+
342
+ //
343
+ // JSON
344
+ //
345
+
193
346
  /**
194
347
  * JSON representation of an object.
195
348
  */
196
- export type JSON = EchoSchema.ObjectJSON;
349
+ export type JSON = ObjectJSON;
197
350
 
198
351
  /**
199
352
  * Converts object to its JSON representation.
200
353
  *
201
354
  * The same algorithm is used when calling the standard `JSON.stringify(obj)` function.
202
355
  */
203
- // TODO(burdon): Base util type for Obj/Relation?
204
- export const toJSON = (obj: Any | Relation.Any): JSON => EchoSchema.objectToJSON(obj);
356
+ export const toJSON = (entity: Entity.Unknown): JSON => objectToJSON(entity);
205
357
 
206
358
  /**
207
359
  * Creates an object from its json representation, performing schema validation.
208
360
  * References and schemas will be resolvable if the `refResolver` is provided.
209
361
  *
210
- * The function need to be async to support resolving the schema as well as the relation endpoints.
362
+ * The function must be async to support resolving the schema as well as the relation endpoints.
211
363
  *
212
364
  * @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
213
365
  * @param options.dxn - Override object DXN. Changes the result of `Obj.getDXN`.
214
366
  */
215
367
  export const fromJSON: (json: unknown, options?: { refResolver?: Ref.Resolver; dxn?: DXN }) => Promise<Any> =
216
- EchoSchema.objectFromJSON as any;
368
+ objectFromJSON as any;
369
+
370
+ //
371
+ // Sorting
372
+ //
373
+
374
+ const compare = (a?: string, b?: string) => {
375
+ if (a == null) {
376
+ return b == null ? 0 : 1;
377
+ }
378
+
379
+ if (b == null) {
380
+ return -1;
381
+ }
382
+
383
+ return a.localeCompare(b);
384
+ };
385
+
386
+ export type Comparator = (a: Entity.Unknown, b: Entity.Unknown) => number;
387
+
388
+ export const sortByLabel: Comparator = (a: Entity.Unknown, b: Entity.Unknown) => compare(getLabel(a), getLabel(b));
389
+ export const sortByTypename: Comparator = (a: Entity.Unknown, b: Entity.Unknown) =>
390
+ compare(getTypename(a), getTypename(b));
391
+ export const sort = (...comparators: Comparator[]): Comparator => {
392
+ return (a: Entity.Unknown, b: Entity.Unknown) => {
393
+ for (const comparator of comparators) {
394
+ const result = comparator(a, b);
395
+ if (result !== 0) {
396
+ return result;
397
+ }
398
+ }
399
+
400
+ return 0;
401
+ };
402
+ };
403
+
404
+ //
405
+ // Version
406
+ //
407
+
408
+ /**
409
+ * Unique symbol for version type identification.
410
+ */
411
+ export { VersionTypeId };
412
+
413
+ /**
414
+ * Represent object version.
415
+ * May be backed by Automerge.
416
+ * Objects with no history are not versioned.
417
+ */
418
+ export interface Version {
419
+ [VersionTypeId]: {};
217
420
 
218
- export type CloneOptions = {
219
421
  /**
220
- * Retain the original object's ID.
221
- * @default false
422
+ * Whether the object is versioned.
222
423
  */
223
- retainId?: boolean;
424
+ versioned: boolean;
425
+
426
+ /**
427
+ * Automerge heads.
428
+ */
429
+ automergeHeads?: string[];
430
+ }
431
+
432
+ const unversioned: Version = {
433
+ [VersionTypeId]: {},
434
+ versioned: false,
224
435
  };
225
436
 
226
437
  /**
227
- * Clones an object or relation.
228
- * This does not clone referenced objects, only the properties in the object.
229
- * @returns A new object with the same schema and properties.
438
+ * Checks that `obj` is a version object.
230
439
  */
231
- export const clone = <T extends Any | Relation.Any>(obj: T, opts?: CloneOptions): T => {
232
- const { id, ...data } = obj;
233
- const schema = getSchema(obj);
234
- invariant(schema != null, 'Object should have a schema');
235
- const props: any = deepMapValues(data, (value, recurse) => {
236
- if (EchoSchema.Ref.isRef(value)) {
237
- return value;
238
- }
239
- return recurse(value);
240
- });
241
- if (opts?.retainId) {
242
- props.id = id;
440
+ export const isVersion = (entity: unknown): entity is Version => {
441
+ return entity != null && typeof entity === 'object' && VersionTypeId in entity;
442
+ };
443
+
444
+ /**
445
+ * Returns the version of the object.
446
+ */
447
+ export const version = (entity: Entity.Unknown): Version => {
448
+ const version = (entity as any)[ObjectVersionId];
449
+ if (version === undefined) {
450
+ return unversioned;
243
451
  }
244
- const meta = getMeta(obj);
245
- props[EchoSchema.MetaId] = deepMapValues(meta, (value, recurse) => {
246
- if (EchoSchema.Ref.isRef(value)) {
247
- return value;
248
- }
249
- return recurse(value);
250
- });
251
- return make(schema, props);
452
+
453
+ return version;
454
+ };
455
+
456
+ /**
457
+ * Checks that `version` is a valid version object.
458
+ */
459
+ export const versionValid = (version: Version): boolean => {
460
+ assertArgument(isVersion(version), 'version', 'Invalid version object');
461
+ return !!version.versioned;
462
+ };
463
+
464
+ export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
465
+
466
+ /**
467
+ * Compares two versions.
468
+ * @param version1
469
+ * @param version2
470
+ * @returns 'unversioned' if either object is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
471
+ */
472
+ export const compareVersions = (version1: Version, version2: Version): VersionCompareResult => {
473
+ assertArgument(isVersion(version1), 'version1', 'Invalid version object');
474
+ assertArgument(isVersion(version2), 'version2', 'Invalid version object');
475
+
476
+ if (!versionValid(version1) || !versionValid(version2)) {
477
+ return 'unversioned';
478
+ }
479
+
480
+ if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
481
+ return 'different';
482
+ }
483
+ if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
484
+ return 'different';
485
+ }
486
+
487
+ return 'equal';
488
+ };
489
+
490
+ export const encodeVersion = (version: Version): string => {
491
+ return JSON.stringify(version);
492
+ };
493
+
494
+ export const decodeVersion = (version: string): Version => {
495
+ const parsed = JSON.parse(version);
496
+ parsed[VersionTypeId] = {};
497
+ return parsed;
252
498
  };
package/src/Ref.ts CHANGED
@@ -2,28 +2,27 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import * as EchoSchema from '@dxos/echo-schema';
6
-
5
+ import { Ref as Ref$, RefArray, type RefResolver } from './internal';
7
6
  import type * as Obj from './Obj';
8
7
 
9
- export type Ref<T> = EchoSchema.Ref<T>;
10
- export type Any = EchoSchema.Ref<Obj.Any>;
8
+ export type Ref<T> = Ref$<T>;
9
+ export type Any = Ref$<Obj.Any>;
11
10
 
12
- export const Array = EchoSchema.RefArray;
11
+ export const Array = RefArray;
13
12
 
14
13
  /**
15
14
  * Extract reference target.
16
15
  */
17
- export type Target<R extends Any> = R extends EchoSchema.Ref<infer T> ? T : never;
16
+ export type Target<R extends Any> = R extends Ref$<infer T> ? T : never;
18
17
 
19
18
  /**
20
19
  * Reference resolver.
21
20
  */
22
- export type Resolver = EchoSchema.RefResolver;
21
+ export type Resolver = RefResolver;
23
22
 
24
- export const isRef: (value: unknown) => value is Any = EchoSchema.Ref.isRef;
23
+ export const isRef: (value: unknown) => value is Any = Ref$.isRef;
25
24
 
26
- export const make = EchoSchema.Ref.make;
25
+ export const make = Ref$.make;
27
26
 
28
27
  // TODO(dmaretskyi): Consider just allowing `make` to accept DXN.
29
- export const fromDXN = EchoSchema.Ref.fromDXN;
28
+ export const fromDXN = Ref$.fromDXN;