@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
@@ -0,0 +1,109 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import type * as SchemaAST from 'effect/SchemaAST';
7
+ import type * as Types from 'effect/Types';
8
+
9
+ import { type ToMutable } from '@dxos/util';
10
+
11
+ import { type TypeMeta } from '../annotations';
12
+ import { type HasId } from '../types';
13
+
14
+ // TODO(burdon): Define Schema type for `typename` and use consistently for all DXN-like properties.
15
+
16
+ // type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];
17
+ export type EchoTypeSchemaProps<T, ExtraFields = {}> = Types.Simplify<HasId & ToMutable<T> & ExtraFields>;
18
+
19
+ // TODO(burdon): Rename EchoEntitySchema.
20
+ export interface EchoTypeSchema<Self extends Schema.Schema.Any, ExtraFields = {}>
21
+ extends TypeMeta,
22
+ Schema.AnnotableClass<
23
+ EchoTypeSchema<Self, ExtraFields>,
24
+ EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields>,
25
+ EchoTypeSchemaProps<Schema.Schema.Encoded<Self>, ExtraFields>,
26
+ Schema.Schema.Context<Self>
27
+ > {
28
+ // make(
29
+ // props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
30
+ // ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
31
+ // : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
32
+ // options?: MakeOptions,
33
+ // ): Simplify<Schema.TypeLiteral.Type<Fields, []>>;
34
+
35
+ instanceOf(value: unknown): boolean;
36
+ }
37
+
38
+ // type MakeOptions =
39
+ // | boolean
40
+ // | {
41
+ // readonly disableValidation?: boolean;
42
+ // };
43
+
44
+ // NOTE: Utils copied from Effect `Schema.ts`.
45
+ // const _ownKeys = (o: object): Array<PropertyKey> =>
46
+ // (Object.keys(o) as Array<PropertyKey>).concat(Object.getOwnPropertySymbols(o));
47
+
48
+ // const _lazilyMergeDefaults = (
49
+ // fields: Schema.Struct.Fields,
50
+ // out: Record<PropertyKey, unknown>,
51
+ // ): { [x: string | symbol]: unknown } => {
52
+ // const ownKeys = _ownKeys(fields);
53
+ // for (const key of ownKeys) {
54
+ // const field = fields[key];
55
+ // if (out[key] === undefined && Schema.isPropertySignature(field)) {
56
+ // const ast = field.ast;
57
+ // const defaultValue = ast._tag === 'PropertySignatureDeclaration' ? ast.defaultValue : ast.to.defaultValue;
58
+ // if (defaultValue !== undefined) {
59
+ // out[key] = defaultValue();
60
+ // }
61
+ // }
62
+ // }
63
+ // return out;
64
+ // };
65
+
66
+ // const _getDisableValidationMakeOption = (options: MakeOptions | undefined): boolean =>
67
+ // Predicate.isBoolean(options) ? options : options?.disableValidation ?? false;
68
+
69
+ /**
70
+ * @internal
71
+ */
72
+ export const makeEchoTypeSchema = <Self extends Schema.Schema.Any>(
73
+ // fields: Fields,
74
+ ast: SchemaAST.AST,
75
+ typename: string,
76
+ version: string,
77
+ ): EchoTypeSchema<Self> => {
78
+ return class EchoObjectSchemaClass extends Schema.make<
79
+ EchoTypeSchemaProps<Schema.Schema.Type<Self>>,
80
+ EchoTypeSchemaProps<Schema.Schema.Encoded<Self>>,
81
+ Schema.Schema.Context<Self>
82
+ >(ast) {
83
+ static readonly typename = typename;
84
+ static readonly version = version;
85
+
86
+ static override annotations(
87
+ annotations: Schema.Annotations.GenericSchema<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>,
88
+ ): EchoTypeSchema<Self> {
89
+ const schema = Schema.make<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>(ast).annotations(annotations);
90
+ return makeEchoTypeSchema<Self>(/* fields, */ schema.ast, typename, version);
91
+ }
92
+
93
+ // static make(
94
+ // props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
95
+ // ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
96
+ // : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
97
+ // options?: MakeOptions,
98
+ // ): Simplify<Schema.TypeLiteral.Type<Fields, []>> {
99
+ // const propsWithDefaults: any = _lazilyMergeDefaults(fields, { ...(props as any) });
100
+ // return _getDisableValidationMakeOption(options)
101
+ // ? propsWithDefaults
102
+ // : ParseResult.validateSync(this)(propsWithDefaults);
103
+ // }
104
+
105
+ static instanceOf(value: unknown): boolean {
106
+ return Schema.is(this)(value);
107
+ }
108
+ };
109
+ };
@@ -4,18 +4,20 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
- import { EchoObject } from './entity';
7
+ import { EchoObjectSchema } from './object';
8
8
 
9
9
  export const EXPANDO_TYPENAME = 'dxos.org/type/Expando';
10
10
 
11
11
  const ExpandoSchema = Schema.Struct({}, { key: Schema.String, value: Schema.Any }).pipe(
12
- EchoObject({ typename: EXPANDO_TYPENAME, version: '0.1.0' }),
12
+ EchoObjectSchema({
13
+ typename: EXPANDO_TYPENAME,
14
+ version: '0.1.0',
15
+ }),
13
16
  );
14
17
 
15
18
  /**
16
19
  * Expando object is an object with an arbitrary set of properties.
17
20
  */
18
- // TODO(dmaretskyi): Can we consider expando a top-type, i.e. have a ref to expando potentially be a valid ref to any object?
19
21
  export interface Expando extends Schema.Schema.Type<typeof ExpandoSchema> {}
20
-
21
- export const Expando: Schema.Schema<Expando> = ExpandoSchema;
22
+ export interface ExpandoEncoded extends Schema.Schema.Encoded<typeof ExpandoSchema> {}
23
+ export const Expando: Schema.Schema<Expando, ExpandoEncoded> = ExpandoSchema;
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './expando';
6
+ export * from './model'; // TODO(burdon): Rename.
7
+ export * from './object';
8
+ export * from './relation';
9
+ export * from './util';
@@ -9,49 +9,40 @@ import { invariant } from '@dxos/invariant';
9
9
  import { DXN, ObjectId } from '@dxos/keys';
10
10
  import { assumeType } from '@dxos/util';
11
11
 
12
- import { EntityKind } from '../ast';
13
-
14
- import { type ObjectMeta } from './meta';
15
- import type { Version } from './version';
12
+ import {
13
+ type ATTR_META,
14
+ type ATTR_TYPE,
15
+ EntityKind,
16
+ KindId,
17
+ type MetaId,
18
+ type ObjectMeta,
19
+ type SchemaId,
20
+ TypeId,
21
+ type Version,
22
+ } from '../types';
23
+
24
+ import {
25
+ type ATTR_RELATION_SOURCE,
26
+ type ATTR_RELATION_TARGET,
27
+ RelationSourceDXNId,
28
+ RelationSourceId,
29
+ RelationTargetDXNId,
30
+ RelationTargetId,
31
+ } from './relation';
16
32
 
17
33
  //
18
34
  // Defines the internal model of the echo object.
19
35
  //
20
36
 
21
- /**
22
- * Entity kind.
23
- */
24
- export const EntityKindId = Symbol.for('@dxos/echo/EntityKind');
25
-
26
- /**
27
- * DXN to the object itself.
28
- */
29
- export const SelfDXNId = Symbol.for('@dxos/echo/DXN');
30
-
31
37
  /**
32
38
  * Property name for self DXN when object is serialized to JSON.
33
39
  */
34
40
  export const ATTR_SELF_DXN = '@dxn';
35
41
 
36
42
  /**
37
- * DXN to the object type.
38
- */
39
- export const TypeId = Symbol.for('@dxos/echo/Type');
40
-
41
- /**
42
- * Property name for typename when object is serialized to JSON.
43
- */
44
- export const ATTR_TYPE = '@type';
45
-
46
- /**
47
- * Reference to the object schema.
48
- */
49
- export const SchemaId = Symbol.for('@dxos/echo/Schema');
50
-
51
- /**
52
- * Deletion marker.
43
+ * DXN to the object itself.
53
44
  */
54
- export const DeletedId = Symbol.for('@dxos/echo/Deleted');
45
+ export const SelfDXNId = Symbol.for('@dxos/echo/DXN');
55
46
 
56
47
  /**
57
48
  * Property name for deleted when object is serialized to JSON.
@@ -59,53 +50,14 @@ export const DeletedId = Symbol.for('@dxos/echo/Deleted');
59
50
  export const ATTR_DELETED = '@deleted';
60
51
 
61
52
  /**
62
- * Metadata section.
63
- */
64
- export const MetaId = Symbol.for('@dxos/echo/Meta');
65
-
66
- /**
67
- * Property name for meta when object is serialized to JSON.
68
- */
69
- export const ATTR_META = '@meta';
70
-
71
- /**
72
- * Used to access relation source ref on live ECHO objects.
73
- * Reading this symbol must return `Live<EchoObject<any>>` or a DXN.
74
- */
75
- export const RelationSourceDXNId: unique symbol = Symbol.for('@dxos/echo/RelationSourceDXN');
76
-
77
- /**
78
- * Property name for relation source when object is serialized to JSON.
79
- */
80
- export const ATTR_RELATION_SOURCE = '@relationSource';
81
-
82
- /**
83
- * Used to access relation target ref on live ECHO objects.
84
- * Reading this symbol must return `Live<EchoObject<any>>` or a DXN.
85
- */
86
- export const RelationTargetDXNId: unique symbol = Symbol.for('@dxos/echo/RelationTargetDXN');
87
-
88
- /**
89
- * Property name for relation target when object is serialized to JSON.
90
- */
91
- export const ATTR_RELATION_TARGET = '@relationTarget';
92
-
93
- /**
94
- * Used to access relation source ref on live ECHO objects.
95
- * Reading this symbol must return `Live<EchoObject<any>>` or a DXN.
96
- */
97
- export const RelationSourceId: unique symbol = Symbol.for('@dxos/echo/RelationSource');
98
-
99
- /**
100
- * Used to access relation target ref on live ECHO objects.
101
- * Reading this symbol must return `Live<EchoObject<any>>` or a DXN.
53
+ * Deletion marker.
102
54
  */
103
- export const RelationTargetId: unique symbol = Symbol.for('@dxos/echo/RelationTarget');
55
+ export const ObjectDeletedId = Symbol.for('@dxos/echo/Deleted');
104
56
 
105
57
  /**
106
- * Getter to get object version.
58
+ * Object version accessor symbol.
107
59
  */
108
- export const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/ObjectVersion');
60
+ export const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/Version');
109
61
 
110
62
  /**
111
63
  * Internal runtime representation of an object.
@@ -113,55 +65,62 @@ export const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/ObjectVersi
113
65
  */
114
66
  export interface InternalObjectProps {
115
67
  id: ObjectId;
116
- readonly [SelfDXNId]?: DXN;
117
68
 
118
69
  // Echo supports untyped objects O_O.
119
70
  readonly [TypeId]?: DXN;
120
71
 
72
+ //
73
+ readonly [SelfDXNId]?: DXN;
74
+
121
75
  /**
122
76
  * Returns the schema for the object.
123
77
  */
124
78
  readonly [SchemaId]?: Schema.Schema.AnyNoContext;
125
- readonly [EntityKindId]: EntityKind;
126
- readonly [DeletedId]?: boolean;
79
+ readonly [KindId]: EntityKind;
127
80
  readonly [MetaId]?: ObjectMeta;
81
+ readonly [ObjectDeletedId]?: boolean;
82
+ readonly [ObjectVersionId]?: Version;
128
83
  readonly [RelationSourceDXNId]?: DXN;
129
84
  readonly [RelationTargetDXNId]?: DXN;
130
85
  readonly [RelationSourceId]?: InternalObjectProps;
131
86
  readonly [RelationTargetId]?: InternalObjectProps;
132
- readonly [ObjectVersionId]?: Version;
133
87
  }
134
88
 
135
89
  /**
136
- * JSON representation of an object or relation.
90
+ * Entity metadata.
91
+ */
92
+ export interface ObjectMetaJSON {
93
+ keys: ForeignKey[];
94
+ tags?: string[];
95
+ }
96
+
97
+ /**
98
+ * JSON representation of an object or relation metadata.
137
99
  */
138
100
  export interface ObjectJSON {
139
101
  id: string;
140
- [ATTR_SELF_DXN]?: DXN.String;
141
102
  [ATTR_TYPE]: DXN.String;
103
+ [ATTR_SELF_DXN]?: DXN.String;
142
104
  [ATTR_DELETED]?: boolean;
143
105
  [ATTR_META]?: ObjectMetaJSON;
144
106
  [ATTR_RELATION_SOURCE]?: DXN.String;
145
107
  [ATTR_RELATION_TARGET]?: DXN.String;
146
108
  }
147
109
 
148
- export interface ObjectMetaJSON {
149
- keys: ForeignKey[];
150
- tags?: string[];
151
- }
152
-
153
- // NOTE: Keep as `function` to avoid type inference issues.
154
- // eslint-disable-next-line prefer-arrow-functions/prefer-arrow-functions
155
- export function assertObjectModelShape(obj: unknown): asserts obj is InternalObjectProps {
110
+ /**
111
+ * NOTE: Keep as `function` to avoid type inference issues.
112
+ */
113
+ export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
156
114
  invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
157
115
  assumeType<InternalObjectProps>(obj);
158
116
  invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');
159
117
  invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');
160
118
  invariant(
161
- obj[EntityKindId] === EntityKind.Object || obj[EntityKindId] === EntityKind.Relation,
119
+ obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
162
120
  'Invalid object model: invalid entity kind',
163
121
  );
164
- if (obj[EntityKindId] === EntityKind.Relation) {
122
+
123
+ if (obj[KindId] === EntityKind.Relation) {
165
124
  invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');
166
125
  invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');
167
126
  invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import { invariant } from '@dxos/invariant';
9
+
10
+ import { type TypeAnnotation, TypeAnnotationId, type TypeMeta, makeTypeJsonSchemaAnnotation } from '../annotations';
11
+ import { EntityKind } from '../types';
12
+
13
+ import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
14
+
15
+ /**
16
+ * Schema for Obj entity types.
17
+ * Pipeable function to add ECHO object annotations to a schema.
18
+ */
19
+ export const EchoObjectSchema: {
20
+ // TODO(burdon): Tighten Self type to Schema.TypeLiteral or Schema.Struct to facilitate definition of `make` method.
21
+ // (meta: TypeMeta): <Self extends Schema.Struct<Fields>, Fields extends Schema.Struct.Fields>(self: Self) => EchoObjectSchema<Self, Fields>;
22
+ (meta: TypeMeta): <Self extends Schema.Schema.Any>(self: Self) => EchoTypeSchema<Self>;
23
+ } = ({ typename, version }) => {
24
+ return <Self extends Schema.Schema.Any>(self: Self): EchoTypeSchema<Self> => {
25
+ invariant(typeof TypeAnnotationId === 'symbol', 'Sanity.');
26
+ invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
27
+
28
+ // TODO(dmaretskyi): Does `Schema.mutable` work for deep mutability here?
29
+ // TODO(dmaretskyi): Do not do mutable here.
30
+ const schemaWithId = Schema.extend(Schema.mutable(self), Schema.Struct({ id: Schema.String }));
31
+ const ast = SchemaAST.annotations(schemaWithId.ast, {
32
+ // TODO(dmaretskyi): `extend` kills the annotations.
33
+ ...self.ast.annotations,
34
+ [TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,
35
+ // TODO(dmaretskyi): TypeIdentifierAnnotationId?
36
+ [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
37
+ kind: EntityKind.Object,
38
+ typename,
39
+ version,
40
+ }),
41
+ });
42
+
43
+ return makeEchoTypeSchema<Self>(/* self.fields, */ ast, typename, version);
44
+ };
45
+ };
@@ -0,0 +1,155 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import { raise } from '@dxos/debug';
9
+ import { assertArgument, invariant } from '@dxos/invariant';
10
+ import { DXN } from '@dxos/keys';
11
+
12
+ import {
13
+ type TypeAnnotation,
14
+ TypeAnnotationId,
15
+ type TypeMeta,
16
+ getEntityKind,
17
+ getSchemaTypename,
18
+ getTypeIdentifierAnnotation,
19
+ makeTypeJsonSchemaAnnotation,
20
+ } from '../annotations';
21
+ import { EntityKind } from '../types';
22
+
23
+ import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
24
+
25
+ /**
26
+ * Property name for relation source when object is serialized to JSON.
27
+ */
28
+ export const ATTR_RELATION_SOURCE = '@relationSource';
29
+
30
+ /**
31
+ * Used to access relation source ref on live ECHO objects.
32
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
33
+ */
34
+ export const RelationSourceId: unique symbol = Symbol.for('@dxos/echo/RelationSource');
35
+
36
+ /**
37
+ * Used to access relation source ref on live ECHO objects.
38
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
39
+ */
40
+ export const RelationSourceDXNId: unique symbol = Symbol.for('@dxos/echo/RelationSourceDXN');
41
+
42
+ /**
43
+ * Property name for relation target when object is serialized to JSON.
44
+ */
45
+ export const ATTR_RELATION_TARGET = '@relationTarget';
46
+
47
+ /**
48
+ * Used to access relation target ref on live ECHO objects.
49
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
50
+ */
51
+ export const RelationTargetId: unique symbol = Symbol.for('@dxos/echo/RelationTarget');
52
+
53
+ /**
54
+ * Used to access relation target ref on live ECHO objects.
55
+ * Reading this symbol must return `Live<EchoObjectSchema<any>>` or a DXN.
56
+ */
57
+ export const RelationTargetDXNId: unique symbol = Symbol.for('@dxos/echo/RelationTargetDXN');
58
+
59
+ /**
60
+ * Source and target props on relations.
61
+ */
62
+ // TODO(burdon): any?
63
+ export type RelationSourceTargetRefs<Source = any, Target = any> = {
64
+ /**
65
+ * Source ECHO live object.
66
+ */
67
+ [RelationSourceId]: Source;
68
+
69
+ /**
70
+ * Target ECHO live object.
71
+ */
72
+ [RelationTargetId]: Target;
73
+ };
74
+
75
+ export type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;
76
+ export type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;
77
+
78
+ export type EchoRelationSchemaOptions<
79
+ TSource extends Schema.Schema.AnyNoContext,
80
+ TTarget extends Schema.Schema.AnyNoContext,
81
+ > = TypeMeta & {
82
+ source: TSource;
83
+ target: TTarget;
84
+ };
85
+
86
+ /**
87
+ * Schema for Relation entity types.
88
+ */
89
+ export const EchoRelationSchema = <
90
+ Source extends Schema.Schema.AnyNoContext,
91
+ Target extends Schema.Schema.AnyNoContext,
92
+ >({
93
+ source,
94
+ target,
95
+ typename,
96
+ version,
97
+ }: EchoRelationSchemaOptions<Source, Target>) => {
98
+ assertArgument(Schema.isSchema(source), 'source');
99
+ assertArgument(Schema.isSchema(target), 'target');
100
+ const sourceDXN = getDXNForRelationSchemaRef(source);
101
+ const targetDXN = getDXNForRelationSchemaRef(target);
102
+ if (getEntityKind(source) !== EntityKind.Object) {
103
+ raise(new Error('Source schema must be an echo object schema.'));
104
+ }
105
+ if (getEntityKind(target) !== EntityKind.Object) {
106
+ raise(new Error('Target schema must be an echo object schema.'));
107
+ }
108
+
109
+ return <Self extends Schema.Schema.Any>(
110
+ self: Self,
111
+ ): EchoTypeSchema<Self, RelationSourceTargetRefs<Schema.Schema.Type<Source>, Schema.Schema.Type<Target>>> => {
112
+ invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
113
+
114
+ // TODO(dmaretskyi): Does `Schema.mutable` work for deep mutability here?
115
+ // TODO(dmaretskyi): Do not do mutable here.
116
+ const schemaWithId = Schema.extend(Schema.mutable(self), Schema.Struct({ id: Schema.String }));
117
+ const ast = SchemaAST.annotations(schemaWithId.ast, {
118
+ // TODO(dmaretskyi): `extend` kills the annotations.
119
+ ...self.ast.annotations,
120
+ [TypeAnnotationId]: {
121
+ kind: EntityKind.Relation,
122
+ typename,
123
+ version,
124
+ sourceSchema: sourceDXN,
125
+ targetSchema: targetDXN,
126
+ } satisfies TypeAnnotation,
127
+ // TODO(dmaretskyi): TypeIdentifierAnnotationId?
128
+
129
+ [SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
130
+ kind: EntityKind.Relation,
131
+ typename,
132
+ version,
133
+ relationSource: sourceDXN,
134
+ relationTarget: targetDXN,
135
+ }),
136
+ });
137
+
138
+ return makeEchoTypeSchema<Self>(/* self.fields, */ ast, typename, version);
139
+ };
140
+ };
141
+
142
+ const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): string => {
143
+ assertArgument(Schema.isSchema(schema), 'schema');
144
+ const identifier = getTypeIdentifierAnnotation(schema);
145
+ if (identifier) {
146
+ return identifier;
147
+ }
148
+
149
+ const typename = getSchemaTypename(schema);
150
+ if (!typename) {
151
+ throw new Error('Schema must have a typename');
152
+ }
153
+
154
+ return DXN.fromTypename(typename).toString();
155
+ };
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { assertArgument, invariant } from '@dxos/invariant';
8
+ import { DXN, ObjectId } from '@dxos/keys';
9
+ import { assumeType } from '@dxos/util';
10
+
11
+ import { type InternalObjectProps, SelfDXNId } from './model';
12
+
13
+ /**
14
+ * Returns a DXN for an object or schema.
15
+ *
16
+ * @internal
17
+ */
18
+ export const getObjectDXN = (object: any): DXN | undefined => {
19
+ invariant(!Schema.isSchema(object), 'schema not allowed in this function');
20
+ assertArgument(typeof object === 'object' && object != null, 'object', 'expected object');
21
+ assumeType<InternalObjectProps>(object);
22
+
23
+ if (object[SelfDXNId]) {
24
+ invariant(object[SelfDXNId] instanceof DXN, 'Invalid object model: invalid self dxn');
25
+ return object[SelfDXNId];
26
+ }
27
+
28
+ if (!ObjectId.isValid(object.id)) {
29
+ throw new TypeError('Object id is not valid.');
30
+ }
31
+
32
+ return DXN.fromLocalObjectId(object.id);
33
+ };
@@ -7,7 +7,7 @@ import { describe, expect, test } from 'vitest';
7
7
 
8
8
  import { log } from '@dxos/log';
9
9
 
10
- import { toJsonSchema } from '../json';
10
+ import { toJsonSchema } from '../json-schema';
11
11
 
12
12
  import {
13
13
  DateOnly,
@@ -5,7 +5,7 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import * as SchemaAST from 'effect/SchemaAST';
7
7
 
8
- import { FormatAnnotation, FormatEnum } from './types';
8
+ import { FormatAnnotation, TypeFormat } from './types';
9
9
 
10
10
  /**
11
11
  * Datetime values should be stored as ISO strings or unix numbers (ms) in UTC.
@@ -102,7 +102,7 @@ export const DateOnly = /* Schema.transformOrFail(Schema.String, SimpleDate, {
102
102
  );
103
103
  },
104
104
  }) */ Schema.String.pipe(
105
- FormatAnnotation.set(FormatEnum.Date),
105
+ FormatAnnotation.set(TypeFormat.Date),
106
106
  Schema.annotations({
107
107
  title: 'Date',
108
108
  description: 'Valid date in ISO format',
@@ -132,7 +132,7 @@ export const TimeOnly = /* Schema.transformOrFail(Schema.String, SimpleTime, {
132
132
  );
133
133
  },
134
134
  }) */ Schema.String.pipe(
135
- FormatAnnotation.set(FormatEnum.Time),
135
+ FormatAnnotation.set(TypeFormat.Time),
136
136
  Schema.annotations({
137
137
  title: 'Time',
138
138
  description: 'Valid time in ISO format',
@@ -177,7 +177,7 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
177
177
  );
178
178
  },
179
179
  }) */ Schema.String.pipe(
180
- FormatAnnotation.set(FormatEnum.DateTime),
180
+ FormatAnnotation.set(TypeFormat.DateTime),
181
181
  Schema.annotations({
182
182
  title: 'DateTime',
183
183
  description: 'Valid date and time in ISO format',
@@ -189,7 +189,7 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
189
189
  */
190
190
  // TODO(burdon): Define duration type.
191
191
  export const Duration = Schema.String.pipe(
192
- FormatAnnotation.set(FormatEnum.Duration),
192
+ FormatAnnotation.set(TypeFormat.Duration),
193
193
  Schema.annotations({
194
194
  title: 'Duration',
195
195
  description: 'Duration in ISO 8601 format',
@@ -5,10 +5,10 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, test } from 'vitest';
7
7
 
8
- import { toJsonSchema } from '../json';
8
+ import { toJsonSchema } from '../json-schema';
9
9
 
10
10
  import { Format } from './format';
11
- import { FormatEnum, TypeEnum, getTypeEnum } from './types';
11
+ import { TypeEnum, TypeFormat, getTypeEnum } from './types';
12
12
 
13
13
  describe('formats', () => {
14
14
  test('annotations', ({ expect }) => {
@@ -48,7 +48,7 @@ describe('formats', () => {
48
48
  expect(getTypeEnum(prop)).to.eq(TypeEnum.String);
49
49
  expect(prop).includes({
50
50
  type: TypeEnum.String,
51
- format: FormatEnum.Email,
51
+ format: TypeFormat.Email,
52
52
  title: 'Email',
53
53
  });
54
54
  }
@@ -58,7 +58,7 @@ describe('formats', () => {
58
58
  expect(getTypeEnum(prop)).to.eq(TypeEnum.Number);
59
59
  expect(prop).includes({
60
60
  type: TypeEnum.Number,
61
- format: FormatEnum.Currency,
61
+ format: TypeFormat.Currency,
62
62
  title: 'Currency',
63
63
  multipleOf: 0.01,
64
64
  currency: 'USD',
@@ -70,7 +70,7 @@ describe('formats', () => {
70
70
  expect(getTypeEnum(prop)).to.eq(TypeEnum.String);
71
71
  expect(prop).includes({
72
72
  type: TypeEnum.String,
73
- format: FormatEnum.Date,
73
+ format: TypeFormat.Date,
74
74
  });
75
75
  }
76
76
  });