@dxos/echo 0.8.4-main.406dc2a → 0.8.4-main.4a85c3132b

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 (554) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +45 -0
  4. package/dist/lib/neutral/Entity.mjs +56 -0
  5. package/dist/lib/neutral/Err.mjs +12 -0
  6. package/dist/lib/neutral/Feed.mjs +43 -0
  7. package/dist/lib/neutral/Filter.mjs +61 -0
  8. package/dist/lib/neutral/Format.mjs +66 -0
  9. package/dist/lib/neutral/Format.mjs.map +7 -0
  10. package/dist/lib/neutral/JsonSchema.mjs +18 -0
  11. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  12. package/dist/lib/neutral/Key.mjs +12 -0
  13. package/dist/lib/neutral/Key.mjs.map +7 -0
  14. package/dist/lib/neutral/Obj.mjs +107 -0
  15. package/dist/lib/neutral/Obj.mjs.map +7 -0
  16. package/dist/lib/neutral/Order.mjs +12 -0
  17. package/dist/lib/neutral/Order.mjs.map +7 -0
  18. package/dist/lib/neutral/Query.mjs +32 -0
  19. package/dist/lib/neutral/Query.mjs.map +7 -0
  20. package/dist/lib/neutral/QueryResult.mjs +2 -0
  21. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  22. package/dist/lib/neutral/Ref.mjs +24 -0
  23. package/dist/lib/neutral/Ref.mjs.map +7 -0
  24. package/dist/lib/neutral/Relation.mjs +90 -0
  25. package/dist/lib/neutral/Relation.mjs.map +7 -0
  26. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  27. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  28. package/dist/lib/neutral/Tag.mjs +25 -0
  29. package/dist/lib/neutral/Tag.mjs.map +7 -0
  30. package/dist/lib/neutral/Type.mjs +34 -0
  31. package/dist/lib/neutral/Type.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-4KG6IGL4.mjs +67 -0
  33. package/dist/lib/neutral/chunk-4KG6IGL4.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-5ELDDYWE.mjs +130 -0
  35. package/dist/lib/neutral/chunk-5ELDDYWE.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-ALOGSVBP.mjs +299 -0
  37. package/dist/lib/neutral/chunk-ALOGSVBP.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
  39. package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-AQP4QKYP.mjs +283 -0
  41. package/dist/lib/neutral/chunk-AQP4QKYP.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-BRJSLACP.mjs +152 -0
  43. package/dist/lib/neutral/chunk-BRJSLACP.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-DZQSL6RW.mjs +73 -0
  45. package/dist/lib/neutral/chunk-DZQSL6RW.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs +327 -0
  47. package/dist/lib/neutral/chunk-F7KMHDPJ.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs +56 -0
  49. package/dist/lib/neutral/chunk-GAWKQ5DZ.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-GFNCSK7F.mjs +101 -0
  51. package/dist/lib/neutral/chunk-GFNCSK7F.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  53. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-KGV3QIRX.mjs +313 -0
  55. package/dist/lib/neutral/chunk-KGV3QIRX.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-M2KVTHZM.mjs +402 -0
  57. package/dist/lib/neutral/chunk-M2KVTHZM.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-MXQJZCPY.mjs +51 -0
  59. package/dist/lib/neutral/chunk-MXQJZCPY.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-O3TZFQCT.mjs +27 -0
  61. package/dist/lib/neutral/chunk-O3TZFQCT.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
  63. package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-OVUBTQLT.mjs +45 -0
  65. package/dist/lib/neutral/chunk-OVUBTQLT.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-PP4DNUZU.mjs +3919 -0
  67. package/dist/lib/neutral/chunk-PP4DNUZU.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-QXF3LGN2.mjs +43 -0
  69. package/dist/lib/neutral/chunk-QXF3LGN2.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs +97 -0
  71. package/dist/lib/neutral/chunk-T4MPQJ7X.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-T6JEFNP6.mjs +7 -0
  73. package/dist/lib/neutral/chunk-T6JEFNP6.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs +121 -0
  75. package/dist/lib/neutral/chunk-W7OP5HGZ.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs +42 -0
  77. package/dist/lib/neutral/chunk-ZTUBYOGB.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs +298 -0
  79. package/dist/lib/neutral/chunk-ZWKJ4LZJ.mjs.map +7 -0
  80. package/dist/lib/neutral/index.mjs +94 -0
  81. package/dist/lib/neutral/index.mjs.map +7 -0
  82. package/dist/lib/{node-esm → neutral}/internal/index.mjs +253 -121
  83. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  84. package/dist/lib/neutral/meta.json +1 -0
  85. package/dist/lib/neutral/testing/index.mjs +369 -0
  86. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  87. package/dist/types/src/Annotation.d.ts +24 -0
  88. package/dist/types/src/Annotation.d.ts.map +1 -0
  89. package/dist/types/src/Collection.d.ts +16 -0
  90. package/dist/types/src/Collection.d.ts.map +1 -0
  91. package/dist/types/src/Database.d.ts +189 -0
  92. package/dist/types/src/Database.d.ts.map +1 -0
  93. package/dist/types/src/Dataset.d.ts +18 -0
  94. package/dist/types/src/Dataset.d.ts.map +1 -0
  95. package/dist/types/src/Entity.d.ts +168 -0
  96. package/dist/types/src/Entity.d.ts.map +1 -0
  97. package/dist/types/src/Entity.test.d.ts +2 -0
  98. package/dist/types/src/Entity.test.d.ts.map +1 -0
  99. package/dist/types/src/Err.d.ts +107 -0
  100. package/dist/types/src/Err.d.ts.map +1 -0
  101. package/dist/types/src/Feed.d.ts +165 -0
  102. package/dist/types/src/Feed.d.ts.map +1 -0
  103. package/dist/types/src/Filter.d.ts +120 -0
  104. package/dist/types/src/Filter.d.ts.map +1 -0
  105. package/dist/types/src/Format.d.ts +4 -0
  106. package/dist/types/src/Format.d.ts.map +1 -0
  107. package/dist/types/src/Hypergraph.d.ts +60 -0
  108. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  109. package/dist/types/src/JsonSchema.d.ts +16 -0
  110. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  111. package/dist/types/src/Key.d.ts +1 -0
  112. package/dist/types/src/Key.d.ts.map +1 -1
  113. package/dist/types/src/Obj.d.ts +417 -101
  114. package/dist/types/src/Obj.d.ts.map +1 -1
  115. package/dist/types/src/Obj.test.d.ts +2 -0
  116. package/dist/types/src/Obj.test.d.ts.map +1 -0
  117. package/dist/types/src/Order.d.ts +16 -0
  118. package/dist/types/src/Order.d.ts.map +1 -0
  119. package/dist/types/src/Query.d.ts +202 -0
  120. package/dist/types/src/Query.d.ts.map +1 -0
  121. package/dist/types/src/Query.test.d.ts +2 -0
  122. package/dist/types/src/Query.test.d.ts.map +1 -0
  123. package/dist/types/src/QueryResult.d.ts +80 -0
  124. package/dist/types/src/QueryResult.d.ts.map +1 -0
  125. package/dist/types/src/Ref.d.ts +61 -11
  126. package/dist/types/src/Ref.d.ts.map +1 -1
  127. package/dist/types/src/Relation.d.ts +287 -21
  128. package/dist/types/src/Relation.d.ts.map +1 -1
  129. package/dist/types/src/Relation.test.d.ts +2 -0
  130. package/dist/types/src/Relation.test.d.ts.map +1 -0
  131. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  132. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  133. package/dist/types/src/Tag.d.ts +18 -0
  134. package/dist/types/src/Tag.d.ts.map +1 -0
  135. package/dist/types/src/Type.d.ts +120 -97
  136. package/dist/types/src/Type.d.ts.map +1 -1
  137. package/dist/types/src/Type.test.d.ts +2 -0
  138. package/dist/types/src/Type.test.d.ts.map +1 -0
  139. package/dist/types/src/View.d.ts +68 -0
  140. package/dist/types/src/View.d.ts.map +1 -0
  141. package/dist/types/src/hierarchy.test.d.ts +2 -0
  142. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  143. package/dist/types/src/index.d.ts +19 -5
  144. package/dist/types/src/index.d.ts.map +1 -1
  145. package/dist/types/src/internal/annotations/annotations.d.ts +209 -0
  146. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  147. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  148. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  149. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  150. package/dist/types/src/internal/annotations/util.d.ts +39 -0
  151. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  152. package/dist/types/src/internal/api/annotations.d.ts +23 -0
  153. package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
  154. package/dist/types/src/internal/api/entity.d.ts +13 -0
  155. package/dist/types/src/internal/api/entity.d.ts.map +1 -0
  156. package/dist/types/src/internal/api/index.d.ts +15 -0
  157. package/dist/types/src/internal/api/index.d.ts.map +1 -0
  158. package/dist/types/src/internal/api/meta.d.ts +42 -0
  159. package/dist/types/src/internal/api/meta.d.ts.map +1 -0
  160. package/dist/types/src/internal/api/sorting.d.ts +24 -0
  161. package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
  162. package/dist/types/src/internal/api/version.d.ts +42 -0
  163. package/dist/types/src/internal/api/version.d.ts.map +1 -0
  164. package/dist/types/src/internal/entities/entity.d.ts +20 -0
  165. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  166. package/dist/types/src/internal/entities/index.d.ts +6 -0
  167. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  168. package/dist/types/src/internal/entities/model.d.ts +79 -0
  169. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  170. package/dist/types/src/internal/entities/object.d.ts +18 -0
  171. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  172. package/dist/types/src/internal/entities/relation.d.ts +62 -0
  173. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  174. package/dist/types/src/internal/entities/util.d.ts +2 -0
  175. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  176. package/dist/types/src/internal/formats/format.d.ts +4 -2
  177. package/dist/types/src/internal/formats/format.d.ts.map +1 -1
  178. package/dist/types/src/internal/formats/select.d.ts +6 -4
  179. package/dist/types/src/internal/formats/select.d.ts.map +1 -1
  180. package/dist/types/src/internal/formats/string.d.ts +4 -0
  181. package/dist/types/src/internal/formats/string.d.ts.map +1 -1
  182. package/dist/types/src/internal/formats/types.d.ts +13 -9
  183. package/dist/types/src/internal/formats/types.d.ts.map +1 -1
  184. package/dist/types/src/internal/index.d.ts +7 -10
  185. package/dist/types/src/internal/index.d.ts.map +1 -1
  186. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  187. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  188. package/dist/types/src/internal/json-schema/index.d.ts +2 -0
  189. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
  190. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
  191. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
  192. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
  193. package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +4 -2
  194. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  195. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  196. package/dist/types/src/internal/object/clone.d.ts +8 -0
  197. package/dist/types/src/internal/object/clone.d.ts.map +1 -0
  198. package/dist/types/src/internal/object/common.d.ts.map +1 -1
  199. package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +10 -11
  200. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  201. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  202. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  203. package/dist/types/src/internal/object/deleted.d.ts +2 -2
  204. package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
  205. package/dist/types/src/internal/object/ids.d.ts.map +1 -1
  206. package/dist/types/src/internal/object/index.d.ts +6 -11
  207. package/dist/types/src/internal/object/index.d.ts.map +1 -1
  208. package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
  209. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
  210. package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
  211. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
  212. package/dist/types/src/internal/object/set-value.d.ts +7 -0
  213. package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
  214. package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
  215. package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
  216. package/dist/types/src/internal/object/snapshot.d.ts +6 -0
  217. package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
  218. package/dist/types/src/internal/object/typed-object.d.ts +8 -14
  219. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
  220. package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
  221. package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
  222. package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
  223. package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
  224. package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
  225. package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
  226. package/dist/types/src/internal/proxy/errors.d.ts +19 -0
  227. package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
  228. package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
  229. package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
  230. package/dist/types/src/internal/proxy/index.d.ts +14 -0
  231. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  232. package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
  233. package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
  234. package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
  235. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  236. package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
  237. package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
  238. package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
  239. package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
  240. package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
  241. package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
  242. package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
  243. package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
  244. package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
  245. package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
  246. package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
  247. package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
  248. package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
  249. package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
  250. package/dist/types/src/internal/proxy/typed-handler.d.ts +16 -12
  251. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
  252. package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
  253. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
  254. package/dist/types/src/internal/ref/ref.d.ts +43 -18
  255. package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
  256. package/dist/types/src/internal/schema/compose.d.ts +7 -0
  257. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  258. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/schema/echo-schema.d.ts +25 -12
  260. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
  261. package/dist/types/src/internal/schema/index.d.ts +1 -4
  262. package/dist/types/src/internal/schema/index.d.ts.map +1 -1
  263. package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
  264. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  265. package/dist/types/src/internal/types/base.d.ts +27 -0
  266. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  267. package/dist/types/src/internal/types/entity.d.ts +37 -0
  268. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  269. package/dist/types/src/internal/types/index.d.ts +5 -2
  270. package/dist/types/src/internal/types/index.d.ts.map +1 -1
  271. package/dist/types/src/internal/{object → types}/meta.d.ts +16 -14
  272. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  273. package/dist/types/src/internal/types/typename.d.ts +21 -0
  274. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  275. package/dist/types/src/internal/types/version.d.ts +15 -0
  276. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  277. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  278. package/dist/types/src/testing/index.d.ts +3 -3
  279. package/dist/types/src/testing/index.d.ts.map +1 -1
  280. package/dist/types/src/testing/test-data.d.ts +18 -0
  281. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  282. package/dist/types/src/testing/test-schema.d.ts +304 -0
  283. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  284. package/dist/types/src/testing/util.d.ts +21 -0
  285. package/dist/types/src/testing/util.d.ts.map +1 -0
  286. package/dist/types/tsconfig.tsbuildinfo +1 -1
  287. package/package.json +106 -65
  288. package/src/Annotation.ts +46 -0
  289. package/src/Collection.ts +30 -0
  290. package/src/Database.ts +315 -0
  291. package/src/Dataset.ts +24 -0
  292. package/src/Entity.test.ts +22 -0
  293. package/src/Entity.ts +234 -0
  294. package/src/Err.ts +38 -0
  295. package/src/Feed.ts +254 -0
  296. package/src/Filter.ts +389 -0
  297. package/src/Format.ts +9 -0
  298. package/src/Hypergraph.ts +74 -0
  299. package/src/JsonSchema.ts +24 -0
  300. package/src/Key.ts +3 -0
  301. package/src/Obj.test.ts +447 -0
  302. package/src/Obj.ts +580 -267
  303. package/src/Order.ts +44 -0
  304. package/src/Query.test.ts +632 -0
  305. package/src/Query.ts +520 -0
  306. package/src/QueryResult.ts +106 -0
  307. package/src/Ref.ts +77 -9
  308. package/src/Relation.test.ts +88 -0
  309. package/src/Relation.ts +440 -58
  310. package/src/SchemaRegistry.ts +106 -0
  311. package/src/{query/tag.ts → Tag.ts} +10 -8
  312. package/src/Type.test.ts +52 -0
  313. package/src/Type.ts +162 -151
  314. package/src/View.ts +100 -0
  315. package/src/hierarchy.test.ts +33 -0
  316. package/src/index.ts +20 -6
  317. package/src/internal/README.md +102 -0
  318. package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
  319. package/src/internal/annotations/annotations.ts +526 -0
  320. package/src/internal/annotations/index.ts +6 -0
  321. package/src/internal/annotations/util.ts +85 -0
  322. package/src/internal/api/annotations.ts +60 -0
  323. package/src/internal/api/entity.ts +29 -0
  324. package/src/internal/api/index.ts +19 -0
  325. package/src/internal/api/meta.ts +88 -0
  326. package/src/internal/api/sorting.ts +53 -0
  327. package/src/internal/api/version.ts +96 -0
  328. package/src/internal/entities/entity.ts +128 -0
  329. package/src/internal/entities/index.ts +9 -0
  330. package/src/internal/entities/model.ts +138 -0
  331. package/src/internal/entities/object.ts +58 -0
  332. package/src/internal/entities/relation.ts +171 -0
  333. package/src/internal/entities/util.ts +33 -0
  334. package/src/internal/formats/date.test.ts +1 -1
  335. package/src/internal/formats/date.ts +5 -5
  336. package/src/internal/formats/format.test.ts +6 -6
  337. package/src/internal/formats/format.ts +8 -6
  338. package/src/internal/formats/number.ts +5 -5
  339. package/src/internal/formats/object.ts +4 -4
  340. package/src/internal/formats/select.ts +6 -4
  341. package/src/internal/formats/string.ts +14 -9
  342. package/src/internal/formats/types.ts +53 -42
  343. package/src/internal/index.ts +30 -13
  344. package/src/internal/{json → json-schema}/annotations.ts +1 -1
  345. package/src/internal/json-schema/index.ts +2 -0
  346. package/src/internal/json-schema/json-schema-normalize.ts +4 -2
  347. package/src/internal/json-schema/json-schema-type.ts +35 -35
  348. package/src/internal/{json → json-schema}/json-schema.test.ts +73 -69
  349. package/src/internal/{json → json-schema}/json-schema.ts +30 -15
  350. package/src/internal/object/clone.ts +48 -0
  351. package/src/internal/object/common.ts +3 -4
  352. package/src/internal/object/{create.test.ts → create-object.test.ts} +31 -33
  353. package/src/internal/object/{create.ts → create-object.ts} +36 -37
  354. package/src/internal/object/deleted.ts +6 -6
  355. package/src/internal/object/ids.ts +1 -1
  356. package/src/internal/object/index.ts +6 -11
  357. package/src/internal/object/inspect.ts +5 -7
  358. package/src/internal/object/json-serializer.test.ts +59 -37
  359. package/src/internal/object/json-serializer.ts +87 -108
  360. package/src/internal/object/schema-validator.test.ts +3 -7
  361. package/src/internal/object/schema-validator.ts +2 -237
  362. package/src/internal/object/set-value.test.ts +281 -0
  363. package/src/internal/object/set-value.ts +165 -0
  364. package/src/internal/object/snapshot.ts +96 -0
  365. package/src/internal/object/typed-object.test.ts +11 -11
  366. package/src/internal/object/typed-object.ts +8 -66
  367. package/src/internal/proxy/change-context.ts +138 -0
  368. package/src/internal/proxy/change.test.ts +519 -0
  369. package/src/internal/proxy/define-hidden-property.ts +14 -0
  370. package/src/internal/proxy/errors.ts +42 -0
  371. package/src/internal/proxy/event-batch.ts +44 -0
  372. package/src/internal/proxy/handler.test.ts +51 -91
  373. package/src/internal/proxy/index.ts +17 -0
  374. package/src/internal/proxy/json-serializer.ts +87 -0
  375. package/src/internal/proxy/make-object.ts +106 -0
  376. package/src/internal/proxy/ownership.ts +253 -0
  377. package/src/internal/proxy/proxy-types.ts +23 -0
  378. package/src/internal/proxy/proxy-utils.ts +150 -0
  379. package/src/internal/proxy/reactive-array.ts +71 -0
  380. package/src/internal/proxy/reactive.ts +69 -0
  381. package/src/internal/proxy/schema-validator.ts +244 -0
  382. package/src/internal/proxy/schema.test.ts +27 -18
  383. package/src/internal/proxy/symbols.ts +7 -0
  384. package/src/internal/proxy/typed-handler.test.ts +260 -48
  385. package/src/internal/proxy/typed-handler.ts +283 -61
  386. package/src/internal/proxy/typed-object.test.ts +54 -38
  387. package/src/internal/ref/ref-array.ts +4 -4
  388. package/src/internal/ref/ref.test.ts +10 -9
  389. package/src/internal/ref/ref.ts +107 -56
  390. package/src/internal/{projection → schema}/compose.test.ts +8 -9
  391. package/src/internal/{projection → schema}/compose.ts +13 -8
  392. package/src/internal/schema/echo-schema.ts +74 -33
  393. package/src/internal/schema/index.ts +1 -4
  394. package/src/internal/schema/manipulation.ts +1 -1
  395. package/src/internal/schema/persistent-schema.ts +33 -0
  396. package/src/internal/types/base.ts +43 -0
  397. package/src/internal/types/entity.ts +54 -0
  398. package/src/internal/types/index.ts +5 -2
  399. package/src/internal/types/meta.ts +68 -0
  400. package/src/internal/types/typename.ts +55 -0
  401. package/src/internal/types/version.ts +19 -0
  402. package/src/testing/api.test.ts +126 -0
  403. package/src/testing/index.ts +3 -3
  404. package/src/testing/test-data.ts +130 -0
  405. package/src/testing/test-schema.ts +240 -0
  406. package/src/testing/util.ts +85 -0
  407. package/dist/lib/browser/chunk-HKFCK2GL.mjs +0 -175
  408. package/dist/lib/browser/chunk-HKFCK2GL.mjs.map +0 -7
  409. package/dist/lib/browser/chunk-MAAYELT7.mjs +0 -830
  410. package/dist/lib/browser/chunk-MAAYELT7.mjs.map +0 -7
  411. package/dist/lib/browser/chunk-MB6MMNFP.mjs +0 -3857
  412. package/dist/lib/browser/chunk-MB6MMNFP.mjs.map +0 -7
  413. package/dist/lib/browser/index.mjs +0 -35
  414. package/dist/lib/browser/internal/index.mjs +0 -332
  415. package/dist/lib/browser/meta.json +0 -1
  416. package/dist/lib/browser/query/index.mjs +0 -15
  417. package/dist/lib/browser/testing/index.mjs +0 -298
  418. package/dist/lib/browser/testing/index.mjs.map +0 -7
  419. package/dist/lib/node-esm/chunk-5NWDGIBT.mjs +0 -830
  420. package/dist/lib/node-esm/chunk-5NWDGIBT.mjs.map +0 -7
  421. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs +0 -175
  422. package/dist/lib/node-esm/chunk-AUAH4E2J.mjs.map +0 -7
  423. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs +0 -3857
  424. package/dist/lib/node-esm/chunk-BQRA4VLX.mjs.map +0 -7
  425. package/dist/lib/node-esm/index.mjs +0 -35
  426. package/dist/lib/node-esm/meta.json +0 -1
  427. package/dist/lib/node-esm/query/index.mjs +0 -15
  428. package/dist/lib/node-esm/testing/index.mjs +0 -298
  429. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  430. package/dist/types/src/errors.d.ts +0 -72
  431. package/dist/types/src/errors.d.ts.map +0 -1
  432. package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
  433. package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
  434. package/dist/types/src/internal/ast/annotations.d.ts +0 -125
  435. package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
  436. package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
  437. package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
  438. package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
  439. package/dist/types/src/internal/ast/index.d.ts +0 -5
  440. package/dist/types/src/internal/ast/index.d.ts.map +0 -1
  441. package/dist/types/src/internal/ast/types.d.ts +0 -6
  442. package/dist/types/src/internal/ast/types.d.ts.map +0 -1
  443. package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
  444. package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
  445. package/dist/types/src/internal/json/index.d.ts +0 -2
  446. package/dist/types/src/internal/json/index.d.ts.map +0 -1
  447. package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
  448. package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
  449. package/dist/types/src/internal/object/accessors.d.ts +0 -37
  450. package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
  451. package/dist/types/src/internal/object/create.d.ts.map +0 -1
  452. package/dist/types/src/internal/object/create.test.d.ts +0 -2
  453. package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
  454. package/dist/types/src/internal/object/entity.d.ts +0 -33
  455. package/dist/types/src/internal/object/entity.d.ts.map +0 -1
  456. package/dist/types/src/internal/object/expando.d.ts +0 -14
  457. package/dist/types/src/internal/object/expando.d.ts.map +0 -1
  458. package/dist/types/src/internal/object/meta.d.ts.map +0 -1
  459. package/dist/types/src/internal/object/model.d.ts +0 -117
  460. package/dist/types/src/internal/object/model.d.ts.map +0 -1
  461. package/dist/types/src/internal/object/relation.d.ts +0 -17
  462. package/dist/types/src/internal/object/relation.d.ts.map +0 -1
  463. package/dist/types/src/internal/object/typename.d.ts +0 -15
  464. package/dist/types/src/internal/object/typename.d.ts.map +0 -1
  465. package/dist/types/src/internal/object/version.d.ts +0 -14
  466. package/dist/types/src/internal/object/version.d.ts.map +0 -1
  467. package/dist/types/src/internal/projection/compose.d.ts +0 -6
  468. package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
  469. package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
  470. package/dist/types/src/internal/projection/index.d.ts +0 -2
  471. package/dist/types/src/internal/projection/index.d.ts.map +0 -1
  472. package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
  473. package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
  474. package/dist/types/src/internal/query/index.d.ts +0 -2
  475. package/dist/types/src/internal/query/index.d.ts.map +0 -1
  476. package/dist/types/src/internal/query/query.d.ts +0 -17
  477. package/dist/types/src/internal/query/query.d.ts.map +0 -1
  478. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
  479. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
  480. package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
  481. package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
  482. package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
  483. package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
  484. package/dist/types/src/internal/testing/index.d.ts +0 -3
  485. package/dist/types/src/internal/testing/index.d.ts.map +0 -1
  486. package/dist/types/src/internal/testing/types.d.ts +0 -455
  487. package/dist/types/src/internal/testing/types.d.ts.map +0 -1
  488. package/dist/types/src/internal/testing/utils.d.ts +0 -10
  489. package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
  490. package/dist/types/src/internal/types/types.d.ts +0 -79
  491. package/dist/types/src/internal/types/types.d.ts.map +0 -1
  492. package/dist/types/src/internal/types/types.test.d.ts +0 -2
  493. package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
  494. package/dist/types/src/internal/types/util.d.ts +0 -5
  495. package/dist/types/src/internal/types/util.d.ts.map +0 -1
  496. package/dist/types/src/query/index.d.ts +0 -3
  497. package/dist/types/src/query/index.d.ts.map +0 -1
  498. package/dist/types/src/query/query.d.ts +0 -248
  499. package/dist/types/src/query/query.d.ts.map +0 -1
  500. package/dist/types/src/query/query.test.d.ts +0 -2
  501. package/dist/types/src/query/query.test.d.ts.map +0 -1
  502. package/dist/types/src/query/tag.d.ts +0 -17
  503. package/dist/types/src/query/tag.d.ts.map +0 -1
  504. package/dist/types/src/testing/echo-schema.d.ts +0 -7
  505. package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
  506. package/dist/types/src/testing/types.d.ts +0 -113
  507. package/dist/types/src/testing/types.d.ts.map +0 -1
  508. package/src/errors.ts +0 -18
  509. package/src/internal/ast/annotation-helper.ts +0 -22
  510. package/src/internal/ast/annotations.ts +0 -219
  511. package/src/internal/ast/entity-kind.ts +0 -15
  512. package/src/internal/ast/index.ts +0 -8
  513. package/src/internal/ast/types.ts +0 -17
  514. package/src/internal/json/index.ts +0 -5
  515. package/src/internal/object/accessors.ts +0 -153
  516. package/src/internal/object/entity.ts +0 -248
  517. package/src/internal/object/expando.ts +0 -21
  518. package/src/internal/object/meta.ts +0 -61
  519. package/src/internal/object/model.ts +0 -170
  520. package/src/internal/object/relation.ts +0 -24
  521. package/src/internal/object/typename.ts +0 -61
  522. package/src/internal/object/version.ts +0 -22
  523. package/src/internal/projection/index.ts +0 -5
  524. package/src/internal/proxy/reactive-object.ts +0 -108
  525. package/src/internal/query/index.ts +0 -5
  526. package/src/internal/query/query.ts +0 -23
  527. package/src/internal/schema/runtime-schema-registry.ts +0 -78
  528. package/src/internal/schema/snapshot.ts +0 -25
  529. package/src/internal/schema/stored-schema.ts +0 -26
  530. package/src/internal/testing/index.ts +0 -6
  531. package/src/internal/testing/types.ts +0 -211
  532. package/src/internal/testing/utils.ts +0 -54
  533. package/src/internal/types/types.test.ts +0 -48
  534. package/src/internal/types/types.ts +0 -176
  535. package/src/internal/types/util.ts +0 -9
  536. package/src/query/index.ts +0 -6
  537. package/src/query/query.test.ts +0 -401
  538. package/src/query/query.ts +0 -789
  539. package/src/test/api.test.ts +0 -180
  540. package/src/testing/echo-schema.ts +0 -39
  541. package/src/testing/types.ts +0 -91
  542. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  543. /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
  544. /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
  545. /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
  546. /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Feed.mjs.map} +0 -0
  547. /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Filter.mjs.map} +0 -0
  548. /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
  549. /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
  550. /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
  551. /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
  552. /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
  553. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
  554. /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
@@ -5,48 +5,62 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
7
  import { raise } from '@dxos/debug';
8
- import { type EncodedReference, type ObjectMeta, isEncodedReference } from '@dxos/echo-protocol';
8
+ import { type EncodedReference, ObjectStructure, isEncodedReference } from '@dxos/echo-protocol';
9
9
  import { assertArgument, invariant } from '@dxos/invariant';
10
10
  import { DXN, ObjectId } from '@dxos/keys';
11
- import { defineHiddenProperty } from '@dxos/live-object';
12
11
  import { assumeType, deepMapValues, visitValues } from '@dxos/util';
13
12
 
14
- import { EntityKind } from '../ast';
15
- import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../ref';
16
- import { type AnyEchoObject } from '../types';
17
-
18
- import { setSchema } from './accessors';
19
- import { ObjectMetaSchema } from './meta';
13
+ import type * as Obj from '../../Obj';
14
+ import { getTypeDXN, setTypename } from '../annotations';
20
15
  import {
21
16
  ATTR_DELETED,
22
- ATTR_META,
23
17
  ATTR_RELATION_SOURCE,
24
18
  ATTR_RELATION_TARGET,
25
19
  ATTR_SELF_DXN,
26
- ATTR_TYPE,
27
- EntityKindId,
28
- MetaId,
29
20
  type ObjectJSON,
30
21
  RelationSourceDXNId,
31
22
  RelationSourceId,
32
23
  RelationTargetDXNId,
33
24
  RelationTargetId,
34
25
  SelfDXNId,
35
- TypeId,
36
- assertObjectModelShape,
37
- } from './model';
38
- import { getType, setTypename } from './typename';
26
+ assertObjectModel,
27
+ } from '../entities';
28
+ import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../proxy';
29
+ import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../ref';
30
+ import {
31
+ ATTR_META,
32
+ ATTR_PARENT,
33
+ ATTR_TYPE,
34
+ type AnyEntity,
35
+ EntityKind,
36
+ KindId,
37
+ MetaId,
38
+ ObjectMetaSchema,
39
+ ParentId,
40
+ setSchema,
41
+ } from '../types';
39
42
 
40
- type DeepReplaceRef<T> =
41
- T extends Ref<any> ? EncodedReference : T extends object ? { [K in keyof T]: DeepReplaceRef<T[K]> } : T;
43
+ // Re-export for backward compatibility.
44
+ export { attachTypedJsonSerializer };
42
45
 
43
- type SerializedObject<T extends { id: string }> = { [K in keyof T]: DeepReplaceRef<T[K]> } & ObjectJSON;
46
+ type DeepReplaceRef<T> =
47
+ T extends Ref<any>
48
+ ? EncodedReference
49
+ : T extends object
50
+ ? {
51
+ [K in keyof T]: DeepReplaceRef<T[K]>;
52
+ }
53
+ : T;
54
+
55
+ type SerializedObject<T extends { id: string }> = {
56
+ [K in keyof T]: DeepReplaceRef<T[K]>;
57
+ } & ObjectJSON;
44
58
 
45
59
  /**
46
60
  * Converts object to it's JSON representation.
47
61
  */
48
- export const objectToJSON = <T extends AnyEchoObject>(obj: T): SerializedObject<T> => {
49
- const typename = getType(obj)?.toString();
62
+ export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {
63
+ const typename = getTypeDXN(obj)?.toString();
50
64
  invariant(typename && typeof typename === 'string');
51
65
  return typedJsonSerializer.call(obj);
52
66
  };
@@ -55,13 +69,12 @@ export const objectToJSON = <T extends AnyEchoObject>(obj: T): SerializedObject<
55
69
  * Creates an object from it's json representation.
56
70
  * Performs schema validation.
57
71
  * References and schema will be resolvable if the `refResolver` is provided.
58
- *
59
72
  * The function need to be async to support resolving the schema as well as the relation endpoints.
60
73
  */
61
74
  export const objectFromJSON = async (
62
75
  jsonData: unknown,
63
76
  { refResolver, dxn }: { refResolver?: RefResolver; dxn?: DXN } = {},
64
- ): Promise<AnyEchoObject> => {
77
+ ): Promise<AnyEntity> => {
65
78
  assumeType<ObjectJSON>(jsonData);
66
79
  assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');
67
80
  assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');
@@ -70,19 +83,19 @@ export const objectFromJSON = async (
70
83
  const type = DXN.parse(jsonData[ATTR_TYPE]);
71
84
  const schema = await refResolver?.resolveSchema(type);
72
85
  invariant(schema === undefined || Schema.isSchema(schema));
86
+ const decodedInput = stripInternalJsonKeys(jsonData);
73
87
 
74
88
  let obj: any;
75
89
  if (schema != null) {
76
- obj = await schema.pipe(Schema.decodeUnknownPromise)(jsonData);
90
+ obj = await schema.pipe(Schema.decodeUnknownPromise)(decodedInput);
77
91
  if (refResolver) {
78
92
  setRefResolverOnData(obj, refResolver);
79
93
  }
80
94
  } else {
81
- obj = decodeGeneric(jsonData, { refResolver });
95
+ obj = decodeGeneric(decodedInput, { refResolver });
82
96
  }
83
97
 
84
98
  invariant(ObjectId.isValid(obj.id), 'Invalid object id');
85
-
86
99
  setTypename(obj, type);
87
100
  if (schema) {
88
101
  setSchema(obj, schema);
@@ -94,132 +107,98 @@ export const objectFromJSON = async (
94
107
  const sourceDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source')));
95
108
  const targetDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target')));
96
109
 
97
- // TODO(dmaretskyi): Async!
98
- const source = (await refResolver?.resolve(sourceDxn)) as AnyEchoObject | undefined;
99
- const target = (await refResolver?.resolve(targetDxn)) as AnyEchoObject | undefined;
110
+ const source = (await refResolver?.resolve(sourceDxn)) as AnyEntity | undefined;
111
+ const target = (await refResolver?.resolve(targetDxn)) as AnyEntity | undefined;
100
112
 
101
- defineHiddenProperty(obj, EntityKindId, EntityKind.Relation);
113
+ defineHiddenProperty(obj, KindId, EntityKind.Relation);
102
114
  defineHiddenProperty(obj, RelationSourceDXNId, sourceDxn);
103
115
  defineHiddenProperty(obj, RelationTargetDXNId, targetDxn);
104
116
  defineHiddenProperty(obj, RelationSourceId, source);
105
117
  defineHiddenProperty(obj, RelationTargetId, target);
106
118
  } else {
107
- defineHiddenProperty(obj, EntityKindId, EntityKind.Object);
119
+ defineHiddenProperty(obj, KindId, EntityKind.Object);
108
120
  }
109
121
 
110
122
  if (typeof jsonData[ATTR_META] === 'object') {
111
123
  const meta = await ObjectMetaSchema.pipe(Schema.decodeUnknownPromise)(jsonData[ATTR_META]);
112
-
113
- // Defensive programming.
114
124
  invariant(Array.isArray(meta.keys));
115
-
116
125
  defineHiddenProperty(obj, MetaId, meta);
126
+ } else {
127
+ defineHiddenProperty(obj, MetaId, {
128
+ keys: [],
129
+ });
130
+ }
131
+
132
+ if (jsonData[ATTR_PARENT]) {
133
+ const parentDxn = DXN.parse(jsonData[ATTR_PARENT]);
134
+ const parent = (await refResolver?.resolve(parentDxn)) as Obj.Unknown | undefined;
135
+ defineHiddenProperty(obj, ParentId, parent);
117
136
  }
118
137
 
119
138
  if (dxn) {
120
139
  defineHiddenProperty(obj, SelfDXNId, dxn);
121
140
  }
122
141
 
123
- assertObjectModelShape(obj);
142
+ assertObjectModel(obj);
124
143
  invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');
125
- invariant((obj as any)[ATTR_SELF_DXN] === undefined, 'Invalid object model');
144
+ invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
126
145
  invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');
146
+ invariant((obj as any)[ATTR_SELF_DXN] === undefined, 'Invalid object model');
127
147
  invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');
128
148
  invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');
129
- invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
130
149
  return obj;
131
150
  };
132
151
 
133
152
  const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {
153
+ const props = stripInternalJsonKeys(jsonData);
154
+
155
+ return deepMapValues(props, (value, visitor) => {
156
+ if (isEncodedReference(value)) {
157
+ return refFromEncodedReference(value, options.refResolver);
158
+ }
159
+
160
+ return visitor(value);
161
+ });
162
+ };
163
+
164
+ const stripInternalJsonKeys = (jsonData: unknown) => {
134
165
  const {
135
166
  [ATTR_TYPE]: _type,
136
167
  [ATTR_META]: _meta,
137
168
  [ATTR_DELETED]: _deleted,
169
+ [ATTR_SELF_DXN]: _selfDxn,
138
170
  [ATTR_RELATION_SOURCE]: _relationSource,
139
171
  [ATTR_RELATION_TARGET]: _relationTarget,
140
- [ATTR_SELF_DXN]: _selfDxn,
141
172
  ...props
142
173
  } = jsonData as any;
143
174
 
144
- return deepMapValues(props, (value, recurse) => {
145
- if (isEncodedReference(value)) {
146
- return refFromEncodedReference(value, options.refResolver);
147
- }
148
- return recurse(value);
149
- });
175
+ return props;
150
176
  };
151
177
 
152
- export const setRefResolverOnData = (obj: AnyEchoObject, refResolver: RefResolver) => {
153
- const go = (value: unknown) => {
178
+ export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) => {
179
+ const visitor = (value: unknown) => {
154
180
  if (Ref.isRef(value)) {
155
181
  setRefResolver(value, refResolver);
156
182
  } else {
157
- visitValues(value, go);
183
+ visitValues(value, visitor);
158
184
  }
159
185
  };
160
186
 
161
- go(obj);
187
+ visitor(obj);
162
188
  };
163
189
 
164
- export const attachTypedJsonSerializer = (obj: any) => {
165
- const descriptor = Object.getOwnPropertyDescriptor(obj, 'toJSON');
166
- if (descriptor) {
167
- return;
168
- }
169
-
170
- Object.defineProperty(obj, 'toJSON', {
171
- value: typedJsonSerializer,
172
- writable: false,
173
- enumerable: false,
174
- // Setting `configurable` to false breaks proxy invariants, should be fixable.
175
- configurable: true,
176
- });
177
- };
178
-
179
- // NOTE: KEEP as function.
180
- const typedJsonSerializer = function (this: any) {
181
- const { id, ...rest } = this;
182
- const result: any = {
183
- id,
190
+ /**
191
+ * Convert ObjectStructure to JSON data for indexing.
192
+ * Different from {@link objectToJSON} as it takes the internal {@link ObjectStructure} representation directly
193
+ */
194
+ export const objectStructureToJson = (objectId: string, structure: ObjectStructure): Obj.JSON => {
195
+ return {
196
+ ...structure.data,
197
+ id: objectId,
198
+ [ATTR_TYPE]: (ObjectStructure.getTypeReference(structure)?.['/'] ?? '') as DXN.String,
199
+ [ATTR_DELETED]: ObjectStructure.isDeleted(structure),
200
+ [ATTR_PARENT]: ObjectStructure.getParent(structure)?.['/'] as DXN.String | undefined,
201
+ [ATTR_RELATION_SOURCE]: ObjectStructure.getRelationSource(structure)?.['/'] as DXN.String | undefined,
202
+ [ATTR_RELATION_TARGET]: ObjectStructure.getRelationTarget(structure)?.['/'] as DXN.String | undefined,
184
203
  };
185
-
186
- if (this[TypeId]) {
187
- result[ATTR_TYPE] = this[TypeId].toString();
188
- }
189
-
190
- if (this[SelfDXNId]) {
191
- result[ATTR_SELF_DXN] = this[SelfDXNId].toString();
192
- }
193
-
194
- if (this[RelationSourceDXNId]) {
195
- const sourceDXN = this[RelationSourceDXNId];
196
- invariant(sourceDXN instanceof DXN);
197
- result[ATTR_RELATION_SOURCE] = sourceDXN.toString();
198
- }
199
- if (this[RelationTargetDXNId]) {
200
- const targetDXN = this[RelationTargetDXNId];
201
- invariant(targetDXN instanceof DXN);
202
- result[ATTR_RELATION_TARGET] = targetDXN.toString();
203
- }
204
-
205
- if (this[MetaId]) {
206
- result[ATTR_META] = serializeMeta(this[MetaId]);
207
- }
208
-
209
- Object.assign(result, serializeData(rest));
210
- return result;
211
- };
212
-
213
- const serializeData = (data: unknown) => {
214
- return deepMapValues(data, (value, recurse) => {
215
- if (Ref.isRef(value)) {
216
- // TODO(dmaretskyi): Should this be configurable?
217
- return value.noInline().encode();
218
- }
219
- return recurse(value);
220
- });
221
- };
222
-
223
- const serializeMeta = (meta: ObjectMeta) => {
224
- return deepMapValues(meta, (value, recurse) => recurse(value));
225
204
  };
@@ -27,9 +27,7 @@ describe('schema-validator', () => {
27
27
  const TestSchema: Schema.Schema.AnyNoContext = Schema.Struct({
28
28
  name: Schema.String.annotations({ [annotationId]: annotationValue }),
29
29
  parent: Schema.optional(Schema.suspend(() => TestSchema.annotations({ [annotationId]: annotationValue }))),
30
- friends: Schema.suspend(() =>
31
- Schema.mutable(Schema.Array(TestSchema.annotations({ [annotationId]: annotationValue }))),
32
- ),
30
+ friends: Schema.suspend(() => Schema.Array(TestSchema.annotations({ [annotationId]: annotationValue }))),
33
31
  });
34
32
  expect(SchemaValidator.hasTypeAnnotation(TestSchema, 'name', annotationId)).to.be.true;
35
33
  expect(SchemaValidator.hasTypeAnnotation(TestSchema, 'parent', annotationId)).to.be.true;
@@ -41,7 +39,7 @@ describe('schema-validator', () => {
41
39
  const Person: Schema.Schema.AnyNoContext = Schema.Struct({
42
40
  name: Schema.String,
43
41
  parent: Schema.optional(Schema.suspend(() => Person)),
44
- friends: Schema.suspend(() => Schema.mutable(Schema.Array(Person))),
42
+ friends: Schema.suspend(() => Schema.Array(Person)),
45
43
  });
46
44
  expect(SchemaValidator.hasTypeAnnotation(Person, 'name', annotationId)).to.be.false;
47
45
  expect(SchemaValidator.hasTypeAnnotation(Person, 'parent', annotationId)).to.be.false;
@@ -87,9 +85,7 @@ describe('schema-validator', () => {
87
85
  const annotationValue = 'bar';
88
86
  const Person: Schema.Schema.AnyNoContext = Schema.Struct({
89
87
  parent: Schema.optional(Schema.suspend(() => Person.annotations({ [annotationId]: annotationValue }))),
90
- friends: Schema.suspend(() =>
91
- Schema.mutable(Schema.Array(Person.annotations({ [annotationId]: annotationValue }))),
92
- ),
88
+ friends: Schema.suspend(() => Schema.Array(Person.annotations({ [annotationId]: annotationValue }))),
93
89
  });
94
90
  expect(SchemaValidator.getPropertySchema(Person, ['parent']).ast.annotations[annotationId]).to.eq(
95
91
  annotationValue,
@@ -2,240 +2,5 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
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 { SchemaId } from './model';
11
-
12
- // TODO(burdon): Reconcile with @dxos/effect visit().
13
-
14
- export class SchemaValidator {
15
- /**
16
- * Recursively check that schema specifies constructions we can handle.
17
- * Validates there are no ambiguous discriminated union types.
18
- */
19
- public static validateSchema(schema: Schema.Schema.AnyNoContext): void {
20
- const visitAll = (nodes: SchemaAST.AST[]) => nodes.forEach((node) => this.validateSchema(Schema.make(node)));
21
- if (SchemaAST.isUnion(schema.ast)) {
22
- const typeAstList = schema.ast.types.filter((type) => SchemaAST.isTypeLiteral(type)) as SchemaAST.TypeLiteral[];
23
- // Check we can handle a discriminated union.
24
- if (typeAstList.length > 1) {
25
- getTypeDiscriminators(typeAstList);
26
- }
27
- visitAll(typeAstList);
28
- } else if (SchemaAST.isTupleType(schema.ast)) {
29
- const positionalTypes = schema.ast.elements.map((t) => t.type);
30
- const allTypes = positionalTypes.concat(schema.ast.rest.map((t) => t.type));
31
- visitAll(allTypes);
32
- } else if (SchemaAST.isTypeLiteral(schema.ast)) {
33
- visitAll(SchemaAST.getPropertySignatures(schema.ast).map((p) => p.type));
34
- }
35
- }
36
-
37
- public static hasTypeAnnotation(
38
- rootObjectSchema: Schema.Schema.AnyNoContext,
39
- property: string,
40
- annotation: symbol,
41
- ): boolean {
42
- try {
43
- let type = this.getPropertySchema(rootObjectSchema, [property]);
44
- if (SchemaAST.isTupleType(type.ast)) {
45
- type = this.getPropertySchema(rootObjectSchema, [property, '0']);
46
- }
47
-
48
- return type.ast.annotations[annotation] != null;
49
- } catch (err) {
50
- return false;
51
- }
52
- }
53
-
54
- public static getPropertySchema(
55
- rootObjectSchema: Schema.Schema.AnyNoContext,
56
- propertyPath: KeyPath,
57
- getProperty: (path: KeyPath) => any = () => null,
58
- ): Schema.Schema.AnyNoContext {
59
- let schema: Schema.Schema.AnyNoContext = rootObjectSchema;
60
- for (let i = 0; i < propertyPath.length; i++) {
61
- const propertyName = propertyPath[i];
62
- const tupleAst = unwrapArray(schema.ast);
63
- if (tupleAst != null) {
64
- schema = getArrayElementSchema(tupleAst, propertyName);
65
- } else {
66
- const propertyType = getPropertyType(schema.ast, propertyName.toString(), (propertyName) =>
67
- getProperty([...propertyPath.slice(0, i), propertyName]),
68
- );
69
- if (propertyType == null) {
70
- throw new TypeError(`unknown property: ${String(propertyName)} on object. Path: ${propertyPath}`);
71
- }
72
-
73
- schema = Schema.make(propertyType).annotations(propertyType.annotations);
74
- }
75
- }
76
-
77
- return schema;
78
- }
79
-
80
- public static getTargetPropertySchema(target: any, prop: string | symbol): Schema.Schema.AnyNoContext {
81
- const schema: Schema.Schema.AnyNoContext | undefined = (target as any)[SchemaId];
82
- invariant(schema, 'target has no schema');
83
- const arrayAst = unwrapArray(schema.ast);
84
- if (arrayAst != null) {
85
- return getArrayElementSchema(arrayAst, prop);
86
- }
87
-
88
- const propertyType = getPropertyType(schema.ast, prop.toString(), (prop) => target[prop]);
89
- if (propertyType == null) {
90
- return Schema.Any; // TODO(burdon): HACK.
91
- }
92
-
93
- invariant(propertyType, `invalid property: ${prop.toString()}`);
94
- return Schema.make(propertyType);
95
- }
96
- }
97
-
98
- /**
99
- * Tuple AST is used both for:
100
- * fixed-length tuples ([string, number]) in which case AST will be { elements: [Schema.String, Schema.Number] }
101
- * variable-length arrays (Array<string | number>) in which case AST will be { rest: [Schema.Union(Schema.String, Schema.Number)] }
102
- */
103
- const getArrayElementSchema = (
104
- tupleAst: SchemaAST.TupleType,
105
- property: string | symbol | number,
106
- ): Schema.Schema.AnyNoContext => {
107
- const elementIndex = typeof property === 'string' ? parseInt(property, 10) : Number.NaN;
108
- if (Number.isNaN(elementIndex)) {
109
- invariant(property === 'length', `invalid array property: ${String(property)}`);
110
- return Schema.Number;
111
- }
112
- if (elementIndex < tupleAst.elements.length) {
113
- const elementType = tupleAst.elements[elementIndex].type;
114
- return Schema.make(elementType).annotations(elementType.annotations);
115
- }
116
-
117
- const restType = tupleAst.rest;
118
- return Schema.make(restType[0].type).annotations(restType[0].annotations);
119
- };
120
-
121
- const flattenUnion = (typeAst: SchemaAST.AST): SchemaAST.AST[] =>
122
- SchemaAST.isUnion(typeAst) ? typeAst.types.flatMap(flattenUnion) : [typeAst];
123
-
124
- const getProperties = (
125
- typeAst: SchemaAST.AST,
126
- getTargetPropertyFn: (propertyName: string) => any,
127
- ): SchemaAST.PropertySignature[] => {
128
- const astCandidates = flattenUnion(typeAst);
129
- const typeAstList = astCandidates.filter((type) => SchemaAST.isTypeLiteral(type)) as SchemaAST.TypeLiteral[];
130
- if (typeAstList.length === 0) {
131
- return [];
132
- }
133
- if (typeAstList.length === 1) {
134
- return SchemaAST.getPropertySignatures(typeAstList[0]);
135
- }
136
-
137
- const typeDiscriminators = getTypeDiscriminators(typeAstList);
138
- const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));
139
- const typeIndex = typeDiscriminators.findIndex((p) => targetPropertyValue === (p.type as SchemaAST.Literal).literal);
140
- invariant(typeIndex !== -1, 'discriminator field not set on target');
141
- return SchemaAST.getPropertySignatures(typeAstList[typeIndex]);
142
- };
143
-
144
- const getPropertyType = (
145
- ast: SchemaAST.AST,
146
- propertyName: string,
147
- getTargetPropertyFn: (propertyName: string) => any,
148
- ): SchemaAST.AST | null => {
149
- const anyOrObject = unwrapAst(
150
- ast,
151
- (candidate) => SchemaAST.isAnyKeyword(candidate) || SchemaAST.isObjectKeyword(candidate),
152
- );
153
- if (anyOrObject != null) {
154
- return ast;
155
- }
156
-
157
- const typeOrDiscriminatedUnion = unwrapAst(ast, (t) => {
158
- return SchemaAST.isTypeLiteral(t) || (SchemaAST.isUnion(t) && t.types.some((t) => SchemaAST.isTypeLiteral(t)));
159
- });
160
- if (typeOrDiscriminatedUnion == null) {
161
- return null;
162
- }
163
-
164
- const targetProperty = getProperties(typeOrDiscriminatedUnion, getTargetPropertyFn).find(
165
- (p) => p.name === propertyName,
166
- );
167
- if (targetProperty != null) {
168
- return unwrapAst(targetProperty.type);
169
- }
170
-
171
- const indexSignatureType = unwrapAst(ast, SchemaAST.isTypeLiteral);
172
- if (
173
- indexSignatureType &&
174
- SchemaAST.isTypeLiteral(indexSignatureType) &&
175
- indexSignatureType.indexSignatures.length > 0
176
- ) {
177
- return unwrapAst(indexSignatureType.indexSignatures[0].type);
178
- }
179
-
180
- return null;
181
- };
182
-
183
- const getTypeDiscriminators = (typeAstList: SchemaAST.TypeLiteral[]): SchemaAST.PropertySignature[] => {
184
- const discriminatorPropCandidates = typeAstList
185
- .flatMap(SchemaAST.getPropertySignatures)
186
- .filter((p) => SchemaAST.isLiteral(p.type));
187
- const propertyName = discriminatorPropCandidates[0].name;
188
- const isValidDiscriminator = discriminatorPropCandidates.every((p) => p.name === propertyName && !p.isOptional);
189
- const everyTypeHasDiscriminator = discriminatorPropCandidates.length === typeAstList.length;
190
- const isDiscriminatedUnion = isValidDiscriminator && everyTypeHasDiscriminator;
191
- invariant(isDiscriminatedUnion, 'type ambiguity: every type in a union must have a single unique-literal field');
192
- return discriminatorPropCandidates;
193
- };
194
-
195
- /**
196
- * Used to check that rootAst is for a type matching the provided predicate.
197
- * That's not always straightforward because types of optionality and recursive types.
198
- * const Task = Schema.Struct({
199
- * ...,
200
- * previous?: Schema.optional(Schema.suspend(() => Task)),
201
- * });
202
- * Here the AST for `previous` field is going to be Union(Suspend(Type), Undefined).
203
- * SchemaAST.isTypeLiteral(field) will return false, but unwrapAst(field, (ast) => SchemaAST.isTypeLiteral(ast))
204
- * will return true.
205
- */
206
- const unwrapAst = (rootAst: SchemaAST.AST, predicate?: (ast: SchemaAST.AST) => boolean): SchemaAST.AST | null => {
207
- let ast: SchemaAST.AST | undefined = rootAst;
208
- while (ast != null) {
209
- if (predicate?.(ast)) {
210
- return ast;
211
- }
212
-
213
- if (SchemaAST.isUnion(ast)) {
214
- const next: any = ast.types.find((t) => (predicate != null && predicate(t)) || SchemaAST.isSuspend(t));
215
- if (next != null) {
216
- ast = next;
217
- continue;
218
- }
219
- }
220
-
221
- if (SchemaAST.isSuspend(ast)) {
222
- ast = ast.f();
223
- } else {
224
- return predicate == null ? ast : null;
225
- }
226
- }
227
-
228
- return null;
229
- };
230
-
231
- const unwrapArray = (ast: SchemaAST.AST) => unwrapAst(ast, SchemaAST.isTupleType) as SchemaAST.TupleType | null;
232
-
233
- export const checkIdNotPresentOnSchema = (schema: Schema.Schema<any, any, any>) => {
234
- invariant(SchemaAST.isTypeLiteral(schema.ast));
235
- const idProperty = SchemaAST.getPropertySignatures(schema.ast).find((prop) => prop.name === 'id');
236
- if (idProperty != null) {
237
- throw new Error('"id" property name is reserved');
238
- }
239
- };
240
-
241
- type KeyPath = readonly (string | number)[];
5
+ // Re-export from proxy for backward compatibility.
6
+ export { SchemaValidator, checkIdNotPresentOnSchema } from '../proxy';