@dxos/echo 0.8.4-main.dedc0f3 → 0.8.4-main.e00bdcdb52

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 (536) hide show
  1. package/README.md +3 -4
  2. package/dist/lib/neutral/Annotation.mjs +37 -0
  3. package/dist/lib/neutral/Database.mjs +49 -0
  4. package/dist/lib/neutral/Entity.mjs +61 -0
  5. package/dist/lib/neutral/Entity.mjs.map +7 -0
  6. package/dist/lib/neutral/Err.mjs +12 -0
  7. package/dist/lib/neutral/Err.mjs.map +7 -0
  8. package/dist/lib/neutral/Extension.mjs +18 -0
  9. package/dist/lib/neutral/Extension.mjs.map +7 -0
  10. package/dist/lib/neutral/Feed.mjs +50 -0
  11. package/dist/lib/neutral/Feed.mjs.map +7 -0
  12. package/dist/lib/neutral/Filter.mjs +72 -0
  13. package/dist/lib/neutral/Filter.mjs.map +7 -0
  14. package/dist/lib/neutral/Format.mjs +66 -0
  15. package/dist/lib/neutral/Format.mjs.map +7 -0
  16. package/dist/lib/neutral/JsonSchema.mjs +19 -0
  17. package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
  18. package/dist/lib/neutral/Key.mjs +12 -0
  19. package/dist/lib/neutral/Key.mjs.map +7 -0
  20. package/dist/lib/neutral/Migration.mjs +17 -0
  21. package/dist/lib/neutral/Migration.mjs.map +7 -0
  22. package/dist/lib/neutral/Obj.mjs +113 -0
  23. package/dist/lib/neutral/Obj.mjs.map +7 -0
  24. package/dist/lib/neutral/Order.mjs +12 -0
  25. package/dist/lib/neutral/Order.mjs.map +7 -0
  26. package/dist/lib/neutral/Query.mjs +38 -0
  27. package/dist/lib/neutral/Query.mjs.map +7 -0
  28. package/dist/lib/neutral/QueryResult.mjs +2 -0
  29. package/dist/lib/neutral/QueryResult.mjs.map +7 -0
  30. package/dist/lib/neutral/Ref.mjs +24 -0
  31. package/dist/lib/neutral/Ref.mjs.map +7 -0
  32. package/dist/lib/neutral/Relation.mjs +94 -0
  33. package/dist/lib/neutral/Relation.mjs.map +7 -0
  34. package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
  35. package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
  36. package/dist/lib/neutral/Tag.mjs +29 -0
  37. package/dist/lib/neutral/Tag.mjs.map +7 -0
  38. package/dist/lib/neutral/Type.mjs +37 -0
  39. package/dist/lib/neutral/Type.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-2T22UGGN.mjs +206 -0
  41. package/dist/lib/neutral/chunk-2T22UGGN.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-44HT3MEC.mjs +73 -0
  43. package/dist/lib/neutral/chunk-44HT3MEC.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-6VC3FI5E.mjs +125 -0
  45. package/dist/lib/neutral/chunk-6VC3FI5E.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-7JFW72MX.mjs +132 -0
  47. package/dist/lib/neutral/chunk-7JFW72MX.mjs.map +7 -0
  48. package/dist/lib/neutral/chunk-7RVZT53K.mjs +21 -0
  49. package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-BICZKPQG.mjs +7 -0
  51. package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +7 -0
  52. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs +36 -0
  53. package/dist/lib/neutral/chunk-CIWZ5MHQ.mjs.map +7 -0
  54. package/dist/lib/neutral/chunk-DUNXPKAC.mjs +56 -0
  55. package/dist/lib/neutral/chunk-DUNXPKAC.mjs.map +7 -0
  56. package/dist/lib/neutral/chunk-FAW7PJRO.mjs +34 -0
  57. package/dist/lib/neutral/chunk-FAW7PJRO.mjs.map +7 -0
  58. package/dist/lib/neutral/chunk-FAYW32CW.mjs +27 -0
  59. package/dist/lib/neutral/chunk-FAYW32CW.mjs.map +7 -0
  60. package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
  61. package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
  62. package/dist/lib/neutral/chunk-I2MFJ76N.mjs +354 -0
  63. package/dist/lib/neutral/chunk-I2MFJ76N.mjs.map +7 -0
  64. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  65. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  66. package/dist/lib/neutral/chunk-JALF2CVV.mjs +345 -0
  67. package/dist/lib/neutral/chunk-JALF2CVV.mjs.map +7 -0
  68. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs +128 -0
  69. package/dist/lib/neutral/chunk-KQUQZ3CB.mjs.map +7 -0
  70. package/dist/lib/neutral/chunk-LOTZLYHB.mjs +420 -0
  71. package/dist/lib/neutral/chunk-LOTZLYHB.mjs.map +7 -0
  72. package/dist/lib/neutral/chunk-N4B7FHQT.mjs +67 -0
  73. package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +7 -0
  74. package/dist/lib/neutral/chunk-NKXEKBP5.mjs +81 -0
  75. package/dist/lib/neutral/chunk-NKXEKBP5.mjs.map +7 -0
  76. package/dist/lib/neutral/chunk-NSMLBSFS.mjs +270 -0
  77. package/dist/lib/neutral/chunk-NSMLBSFS.mjs.map +7 -0
  78. package/dist/lib/neutral/chunk-QBIGOSRF.mjs +45 -0
  79. package/dist/lib/neutral/chunk-QBIGOSRF.mjs.map +7 -0
  80. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs +734 -0
  81. package/dist/lib/neutral/chunk-QBLYZ4IV.mjs.map +7 -0
  82. package/dist/lib/neutral/chunk-QEVM3JUP.mjs +318 -0
  83. package/dist/lib/neutral/chunk-QEVM3JUP.mjs.map +7 -0
  84. package/dist/lib/neutral/chunk-REP7WWAQ.mjs +346 -0
  85. package/dist/lib/neutral/chunk-REP7WWAQ.mjs.map +7 -0
  86. package/dist/lib/neutral/chunk-TRPZU2HV.mjs +402 -0
  87. package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +7 -0
  88. package/dist/lib/neutral/chunk-TTCSATUD.mjs +42 -0
  89. package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
  90. package/dist/lib/neutral/chunk-TW76K7H5.mjs +45 -0
  91. package/dist/lib/neutral/chunk-TW76K7H5.mjs.map +7 -0
  92. package/dist/lib/neutral/chunk-UYJYDSD7.mjs +2436 -0
  93. package/dist/lib/neutral/chunk-UYJYDSD7.mjs.map +7 -0
  94. package/dist/lib/neutral/chunk-V72DY6LU.mjs +7 -0
  95. package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +7 -0
  96. package/dist/lib/neutral/chunk-ZISMEVKD.mjs +51 -0
  97. package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +7 -0
  98. package/dist/lib/neutral/index.mjs +107 -0
  99. package/dist/lib/neutral/index.mjs.map +7 -0
  100. package/dist/lib/neutral/internal/index.mjs +474 -0
  101. package/dist/lib/neutral/internal/index.mjs.map +7 -0
  102. package/dist/lib/neutral/meta.json +1 -0
  103. package/dist/lib/neutral/testing/index.mjs +375 -0
  104. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  105. package/dist/types/src/Annotation.d.ts +24 -0
  106. package/dist/types/src/Annotation.d.ts.map +1 -0
  107. package/dist/types/src/Collection.d.ts +16 -0
  108. package/dist/types/src/Collection.d.ts.map +1 -0
  109. package/dist/types/src/Database.d.ts +201 -0
  110. package/dist/types/src/Database.d.ts.map +1 -0
  111. package/dist/types/src/Dataset.d.ts +19 -0
  112. package/dist/types/src/Dataset.d.ts.map +1 -0
  113. package/dist/types/src/Entity.d.ts +174 -0
  114. package/dist/types/src/Entity.d.ts.map +1 -0
  115. package/dist/types/src/Entity.test.d.ts +2 -0
  116. package/dist/types/src/Entity.test.d.ts.map +1 -0
  117. package/dist/types/src/Err.d.ts +107 -0
  118. package/dist/types/src/Err.d.ts.map +1 -0
  119. package/dist/types/src/Extension.d.ts +80 -0
  120. package/dist/types/src/Extension.d.ts.map +1 -0
  121. package/dist/types/src/Extension.test.d.ts +2 -0
  122. package/dist/types/src/Extension.test.d.ts.map +1 -0
  123. package/dist/types/src/Feed.d.ts +182 -0
  124. package/dist/types/src/Feed.d.ts.map +1 -0
  125. package/dist/types/src/Filter.d.ts +149 -0
  126. package/dist/types/src/Filter.d.ts.map +1 -0
  127. package/dist/types/src/Filter.test.d.ts +2 -0
  128. package/dist/types/src/Filter.test.d.ts.map +1 -0
  129. package/dist/types/src/Format.d.ts +4 -0
  130. package/dist/types/src/Format.d.ts.map +1 -0
  131. package/dist/types/src/Hypergraph.d.ts +65 -0
  132. package/dist/types/src/Hypergraph.d.ts.map +1 -0
  133. package/dist/types/src/Json.d.ts +33 -0
  134. package/dist/types/src/Json.d.ts.map +1 -0
  135. package/dist/types/src/Json.test.d.ts +2 -0
  136. package/dist/types/src/Json.test.d.ts.map +1 -0
  137. package/dist/types/src/JsonSchema.d.ts +16 -0
  138. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  139. package/dist/types/src/Key.d.ts +1 -0
  140. package/dist/types/src/Key.d.ts.map +1 -1
  141. package/dist/types/src/Migration.d.ts +57 -0
  142. package/dist/types/src/Migration.d.ts.map +1 -0
  143. package/dist/types/src/Obj.d.ts +440 -91
  144. package/dist/types/src/Obj.d.ts.map +1 -1
  145. package/dist/types/src/Obj.test.d.ts +2 -0
  146. package/dist/types/src/Obj.test.d.ts.map +1 -0
  147. package/dist/types/src/Order.d.ts +16 -0
  148. package/dist/types/src/Order.d.ts.map +1 -0
  149. package/dist/types/src/Query.d.ts +213 -0
  150. package/dist/types/src/Query.d.ts.map +1 -0
  151. package/dist/types/src/Query.test.d.ts +2 -0
  152. package/dist/types/src/Query.test.d.ts.map +1 -0
  153. package/dist/types/src/QueryResult.d.ts +80 -0
  154. package/dist/types/src/QueryResult.d.ts.map +1 -0
  155. package/dist/types/src/Ref.d.ts +61 -11
  156. package/dist/types/src/Ref.d.ts.map +1 -1
  157. package/dist/types/src/Relation.d.ts +288 -21
  158. package/dist/types/src/Relation.d.ts.map +1 -1
  159. package/dist/types/src/Relation.test.d.ts +2 -0
  160. package/dist/types/src/Relation.test.d.ts.map +1 -0
  161. package/dist/types/src/SchemaRegistry.d.ts +84 -0
  162. package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
  163. package/dist/types/src/Tag.d.ts +18 -0
  164. package/dist/types/src/Tag.d.ts.map +1 -0
  165. package/dist/types/src/Type.d.ts +123 -100
  166. package/dist/types/src/Type.d.ts.map +1 -1
  167. package/dist/types/src/Type.test.d.ts +2 -0
  168. package/dist/types/src/Type.test.d.ts.map +1 -0
  169. package/dist/types/src/View.d.ts +68 -0
  170. package/dist/types/src/View.d.ts.map +1 -0
  171. package/dist/types/src/hierarchy.test.d.ts +2 -0
  172. package/dist/types/src/hierarchy.test.d.ts.map +1 -0
  173. package/dist/types/src/index.d.ts +22 -4
  174. package/dist/types/src/index.d.ts.map +1 -1
  175. package/dist/types/src/internal/Annotation/annotations.d.ts +231 -0
  176. package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
  177. package/dist/types/src/internal/Annotation/annotations.test.d.ts +2 -0
  178. package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
  179. package/dist/types/src/internal/Annotation/index.d.ts +4 -0
  180. package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
  181. package/dist/types/src/internal/Annotation/sorting.d.ts +24 -0
  182. package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
  183. package/dist/types/src/internal/Annotation/util.d.ts +39 -0
  184. package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
  185. package/dist/types/src/internal/Entity/api.d.ts +13 -0
  186. package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
  187. package/dist/types/src/internal/Entity/entity.d.ts +20 -0
  188. package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
  189. package/dist/types/src/internal/Entity/index.d.ts +8 -0
  190. package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
  191. package/dist/types/src/internal/Entity/model.d.ts +55 -0
  192. package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
  193. package/dist/types/src/internal/Entity/object.d.ts +18 -0
  194. package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
  195. package/dist/types/src/internal/Entity/relation.d.ts +35 -0
  196. package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
  197. package/dist/types/src/internal/Entity/util.d.ts +2 -0
  198. package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
  199. package/dist/types/src/internal/Entity/version.d.ts +42 -0
  200. package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
  201. package/dist/types/src/internal/Format/date.d.ts +63 -0
  202. package/dist/types/src/internal/Format/date.d.ts.map +1 -0
  203. package/dist/types/src/internal/Format/date.test.d.ts +2 -0
  204. package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
  205. package/dist/types/src/internal/Format/format.d.ts +32 -0
  206. package/dist/types/src/internal/Format/format.d.ts.map +1 -0
  207. package/dist/types/src/internal/Format/format.test.d.ts +2 -0
  208. package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
  209. package/dist/types/src/internal/Format/index.d.ts +8 -0
  210. package/dist/types/src/internal/Format/index.d.ts.map +1 -0
  211. package/dist/types/src/internal/Format/number.d.ts +31 -0
  212. package/dist/types/src/internal/Format/number.d.ts.map +1 -0
  213. package/dist/types/src/internal/Format/object.d.ts +35 -0
  214. package/dist/types/src/internal/Format/object.d.ts.map +1 -0
  215. package/dist/types/src/internal/Format/select.d.ts +13 -0
  216. package/dist/types/src/internal/Format/select.d.ts.map +1 -0
  217. package/dist/types/src/internal/Format/string.d.ts +42 -0
  218. package/dist/types/src/internal/Format/string.d.ts.map +1 -0
  219. package/dist/types/src/internal/Format/types.d.ts +72 -0
  220. package/dist/types/src/internal/Format/types.d.ts.map +1 -0
  221. package/dist/types/src/internal/JsonSchema/annotations.d.ts +19 -0
  222. package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
  223. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts +2 -0
  224. package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
  225. package/dist/types/src/internal/JsonSchema/index.d.ts +5 -0
  226. package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
  227. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts +7 -0
  228. package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
  229. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +351 -0
  230. package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
  231. package/dist/types/src/internal/JsonSchema/json-schema.d.ts +30 -0
  232. package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
  233. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts +2 -0
  234. package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
  235. package/dist/types/src/internal/Obj/clone.d.ts +8 -0
  236. package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
  237. package/dist/types/src/internal/Obj/common.d.ts +18 -0
  238. package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
  239. package/dist/types/src/internal/Obj/create-object.d.ts +39 -0
  240. package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
  241. package/dist/types/src/internal/Obj/create-object.test.d.ts +2 -0
  242. package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
  243. package/dist/types/src/internal/Obj/deleted.d.ts +6 -0
  244. package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
  245. package/dist/types/src/internal/Obj/ids.d.ts +6 -0
  246. package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
  247. package/dist/types/src/internal/Obj/index.d.ts +11 -0
  248. package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
  249. package/dist/types/src/internal/Obj/inspect.d.ts +2 -0
  250. package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
  251. package/dist/types/src/internal/Obj/json-serializer.d.ts +45 -0
  252. package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
  253. package/dist/types/src/internal/Obj/json-serializer.test.d.ts +2 -0
  254. package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
  255. package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
  256. package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
  257. package/dist/types/src/internal/Obj/schema-validator.test.d.ts +2 -0
  258. package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
  259. package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
  260. package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
  261. package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
  262. package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
  263. package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
  264. package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
  265. package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
  266. package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
  267. package/dist/types/src/internal/Obj/typed-object.test.d.ts +2 -0
  268. package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
  269. package/dist/types/src/internal/Query.d.ts +10 -0
  270. package/dist/types/src/internal/Query.d.ts.map +1 -0
  271. package/dist/types/src/internal/Ref/index.d.ts +3 -0
  272. package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
  273. package/dist/types/src/internal/Ref/ref-array.d.ts +21 -0
  274. package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
  275. package/dist/types/src/internal/Ref/ref.d.ts +244 -0
  276. package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
  277. package/dist/types/src/internal/Ref/ref.test.d.ts +2 -0
  278. package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
  279. package/dist/types/src/internal/Type/compose.d.ts +7 -0
  280. package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
  281. package/dist/types/src/internal/Type/compose.test.d.ts +2 -0
  282. package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
  283. package/dist/types/src/internal/Type/echo-schema.d.ts +181 -0
  284. package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
  285. package/dist/types/src/internal/Type/index.d.ts +4 -0
  286. package/dist/types/src/internal/Type/index.d.ts.map +1 -0
  287. package/dist/types/src/internal/Type/manipulation.d.ts +10 -0
  288. package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
  289. package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
  290. package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
  291. package/dist/types/src/internal/common/api/index.d.ts +11 -0
  292. package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
  293. package/dist/types/src/internal/common/api/meta.d.ts +42 -0
  294. package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
  295. package/dist/types/src/internal/common/index.d.ts +4 -0
  296. package/dist/types/src/internal/common/index.d.ts.map +1 -0
  297. package/dist/types/src/internal/common/proxy/change-context.d.ts +55 -0
  298. package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
  299. package/dist/types/src/internal/common/proxy/change.test.d.ts +2 -0
  300. package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
  301. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts +5 -0
  302. package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
  303. package/dist/types/src/internal/common/proxy/errors.d.ts +19 -0
  304. package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
  305. package/dist/types/src/internal/common/proxy/event-batch.d.ts +10 -0
  306. package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
  307. package/dist/types/src/internal/common/proxy/handler.test.d.ts +2 -0
  308. package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
  309. package/dist/types/src/internal/common/proxy/index.d.ts +14 -0
  310. package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
  311. package/dist/types/src/internal/common/proxy/json-serializer.d.ts +6 -0
  312. package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
  313. package/dist/types/src/internal/common/proxy/make-object.d.ts +14 -0
  314. package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
  315. package/dist/types/src/internal/common/proxy/ownership.d.ts +57 -0
  316. package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
  317. package/dist/types/src/internal/common/proxy/proxy-types.d.ts +18 -0
  318. package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
  319. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +47 -0
  320. package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
  321. package/dist/types/src/internal/common/proxy/reactive-array.d.ts +8 -0
  322. package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
  323. package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
  324. package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
  325. package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
  326. package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
  327. package/dist/types/src/internal/common/proxy/schema-validator.d.ts +15 -0
  328. package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
  329. package/dist/types/src/internal/common/proxy/schema.test.d.ts +2 -0
  330. package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
  331. package/dist/types/src/internal/common/proxy/symbols.d.ts +3 -0
  332. package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
  333. package/dist/types/src/internal/common/proxy/typed-handler.d.ts +48 -0
  334. package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
  335. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts +2 -0
  336. package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
  337. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts +2 -0
  338. package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
  339. package/dist/types/src/internal/common/types/base.d.ts +27 -0
  340. package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
  341. package/dist/types/src/internal/common/types/entity.d.ts +37 -0
  342. package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
  343. package/dist/types/src/internal/common/types/index.d.ts +7 -0
  344. package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
  345. package/dist/types/src/internal/common/types/meta.d.ts +33 -0
  346. package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
  347. package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
  348. package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
  349. package/dist/types/src/internal/common/types/typename.d.ts +21 -0
  350. package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
  351. package/dist/types/src/internal/common/types/version.d.ts +15 -0
  352. package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
  353. package/dist/types/src/internal/index.d.ts +11 -0
  354. package/dist/types/src/internal/index.d.ts.map +1 -0
  355. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  356. package/dist/types/src/testing/index.d.ts +3 -1
  357. package/dist/types/src/testing/index.d.ts.map +1 -1
  358. package/dist/types/src/testing/test-data.d.ts +18 -0
  359. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  360. package/dist/types/src/testing/test-schema.d.ts +304 -0
  361. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  362. package/dist/types/src/testing/util.d.ts +21 -0
  363. package/dist/types/src/testing/util.d.ts.map +1 -0
  364. package/dist/types/tsconfig.tsbuildinfo +1 -1
  365. package/package.json +119 -56
  366. package/src/Annotation.ts +48 -0
  367. package/src/Collection.ts +37 -0
  368. package/src/Database.ts +352 -0
  369. package/src/Dataset.ts +26 -0
  370. package/src/Entity.test.ts +22 -0
  371. package/src/Entity.ts +243 -0
  372. package/src/Err.ts +40 -0
  373. package/src/Extension.test.ts +235 -0
  374. package/src/Extension.ts +122 -0
  375. package/src/Feed.ts +304 -0
  376. package/src/Filter.test.ts +90 -0
  377. package/src/Filter.ts +454 -0
  378. package/src/Format.ts +9 -0
  379. package/src/Hypergraph.ts +79 -0
  380. package/src/Json.test.ts +175 -0
  381. package/src/Json.ts +102 -0
  382. package/src/JsonSchema.ts +26 -0
  383. package/src/Key.ts +3 -0
  384. package/src/Migration.ts +94 -0
  385. package/src/Obj.test.ts +539 -0
  386. package/src/Obj.ts +716 -212
  387. package/src/Order.ts +46 -0
  388. package/src/Query.test.ts +822 -0
  389. package/src/Query.ts +567 -0
  390. package/src/QueryResult.ts +106 -0
  391. package/src/Ref.ts +78 -9
  392. package/src/Relation.test.ts +88 -0
  393. package/src/Relation.ts +452 -53
  394. package/src/SchemaRegistry.ts +106 -0
  395. package/src/Tag.ts +41 -0
  396. package/src/Type.test.ts +52 -0
  397. package/src/Type.ts +168 -155
  398. package/src/View.ts +107 -0
  399. package/src/hierarchy.test.ts +33 -0
  400. package/src/index.ts +25 -5
  401. package/src/internal/Annotation/annotations.test.ts +145 -0
  402. package/src/internal/Annotation/annotations.ts +577 -0
  403. package/src/internal/Annotation/index.ts +7 -0
  404. package/src/internal/Annotation/sorting.ts +51 -0
  405. package/src/internal/Annotation/util.ts +85 -0
  406. package/src/internal/Entity/api.ts +30 -0
  407. package/src/internal/Entity/entity.ts +128 -0
  408. package/src/internal/Entity/index.ts +11 -0
  409. package/src/internal/Entity/model.ts +109 -0
  410. package/src/internal/Entity/object.ts +57 -0
  411. package/src/internal/Entity/relation.ts +154 -0
  412. package/src/internal/Entity/util.ts +33 -0
  413. package/src/internal/Entity/version.ts +96 -0
  414. package/src/internal/Format/date.test.ts +55 -0
  415. package/src/internal/Format/date.ts +217 -0
  416. package/src/internal/Format/format.test.ts +76 -0
  417. package/src/internal/Format/format.ts +54 -0
  418. package/src/internal/Format/index.ts +12 -0
  419. package/src/internal/Format/number.ts +89 -0
  420. package/src/internal/Format/object.ts +80 -0
  421. package/src/internal/Format/select.ts +18 -0
  422. package/src/internal/Format/string.ts +81 -0
  423. package/src/internal/Format/types.ts +186 -0
  424. package/src/internal/JsonSchema/annotations.ts +50 -0
  425. package/src/internal/JsonSchema/effect-schema.test.ts +143 -0
  426. package/src/internal/JsonSchema/index.ts +8 -0
  427. package/src/internal/JsonSchema/json-schema-normalize.ts +111 -0
  428. package/src/internal/JsonSchema/json-schema-type.ts +403 -0
  429. package/src/internal/JsonSchema/json-schema.test.ts +860 -0
  430. package/src/internal/JsonSchema/json-schema.ts +533 -0
  431. package/src/internal/Obj/clone.ts +48 -0
  432. package/src/internal/Obj/common.ts +75 -0
  433. package/src/internal/Obj/create-object.test.ts +114 -0
  434. package/src/internal/Obj/create-object.ts +94 -0
  435. package/src/internal/Obj/deleted.ts +19 -0
  436. package/src/internal/Obj/ids.ts +12 -0
  437. package/src/internal/Obj/index.ts +14 -0
  438. package/src/internal/Obj/inspect.ts +46 -0
  439. package/src/internal/Obj/json-serializer.test.ts +120 -0
  440. package/src/internal/Obj/json-serializer.ts +222 -0
  441. package/src/internal/Obj/schema-validator.test.ts +182 -0
  442. package/src/internal/Obj/schema-validator.ts +6 -0
  443. package/src/internal/Obj/set-value.test.ts +281 -0
  444. package/src/internal/Obj/set-value.ts +165 -0
  445. package/src/internal/Obj/snapshot.ts +105 -0
  446. package/src/internal/Obj/typed-object.test.ts +34 -0
  447. package/src/internal/Obj/typed-object.ts +30 -0
  448. package/src/internal/Query.ts +137 -0
  449. package/src/internal/Ref/index.ts +6 -0
  450. package/src/internal/Ref/ref-array.ts +38 -0
  451. package/src/internal/Ref/ref.test.ts +100 -0
  452. package/src/internal/Ref/ref.ts +589 -0
  453. package/src/internal/Type/compose.test.ts +41 -0
  454. package/src/internal/Type/compose.ts +41 -0
  455. package/src/internal/Type/echo-schema.ts +423 -0
  456. package/src/internal/Type/index.ts +7 -0
  457. package/src/internal/Type/manipulation.ts +92 -0
  458. package/src/internal/Type/persistent-schema.ts +33 -0
  459. package/src/internal/common/README.md +102 -0
  460. package/src/internal/common/api/index.ts +15 -0
  461. package/src/internal/common/api/meta.ts +88 -0
  462. package/src/internal/common/index.ts +7 -0
  463. package/src/internal/common/proxy/change-context.ts +138 -0
  464. package/src/internal/common/proxy/change.test.ts +519 -0
  465. package/src/internal/common/proxy/define-hidden-property.ts +14 -0
  466. package/src/internal/common/proxy/errors.ts +42 -0
  467. package/src/internal/common/proxy/event-batch.ts +44 -0
  468. package/src/internal/common/proxy/handler.test.ts +121 -0
  469. package/src/internal/common/proxy/index.ts +17 -0
  470. package/src/internal/common/proxy/json-serializer.ts +90 -0
  471. package/src/internal/common/proxy/make-object.ts +105 -0
  472. package/src/internal/common/proxy/ownership.ts +252 -0
  473. package/src/internal/common/proxy/proxy-types.ts +23 -0
  474. package/src/internal/common/proxy/proxy-utils.ts +150 -0
  475. package/src/internal/common/proxy/reactive-array.ts +71 -0
  476. package/src/internal/common/proxy/reactive.test.ts +54 -0
  477. package/src/internal/common/proxy/reactive.ts +77 -0
  478. package/src/internal/common/proxy/schema-validator.ts +244 -0
  479. package/src/internal/common/proxy/schema.test.ts +145 -0
  480. package/src/internal/common/proxy/symbols.ts +7 -0
  481. package/src/internal/common/proxy/typed-handler.test.ts +313 -0
  482. package/src/internal/common/proxy/typed-handler.ts +447 -0
  483. package/src/internal/common/proxy/typed-object.test.ts +115 -0
  484. package/src/internal/common/types/base.ts +43 -0
  485. package/src/internal/common/types/entity.ts +54 -0
  486. package/src/internal/common/types/index.ts +10 -0
  487. package/src/internal/common/types/meta.ts +67 -0
  488. package/src/internal/common/types/model-symbols.ts +69 -0
  489. package/src/internal/common/types/typename.ts +55 -0
  490. package/src/internal/common/types/version.ts +19 -0
  491. package/src/internal/index.ts +17 -0
  492. package/src/testing/api.test.ts +125 -0
  493. package/src/testing/index.ts +3 -1
  494. package/src/testing/test-data.ts +129 -0
  495. package/src/testing/test-schema.ts +240 -0
  496. package/src/testing/util.ts +85 -0
  497. package/dist/lib/browser/chunk-MTR3E5S2.mjs +0 -786
  498. package/dist/lib/browser/chunk-MTR3E5S2.mjs.map +0 -7
  499. package/dist/lib/browser/index.mjs +0 -26
  500. package/dist/lib/browser/meta.json +0 -1
  501. package/dist/lib/browser/testing/index.mjs +0 -70
  502. package/dist/lib/browser/testing/index.mjs.map +0 -7
  503. package/dist/lib/node-esm/chunk-MYZLAJSR.mjs +0 -786
  504. package/dist/lib/node-esm/chunk-MYZLAJSR.mjs.map +0 -7
  505. package/dist/lib/node-esm/index.mjs +0 -26
  506. package/dist/lib/node-esm/meta.json +0 -1
  507. package/dist/lib/node-esm/testing/index.mjs +0 -70
  508. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  509. package/dist/types/src/experimental/database.d.ts +0 -8
  510. package/dist/types/src/experimental/database.d.ts.map +0 -1
  511. package/dist/types/src/experimental/index.d.ts +0 -1
  512. package/dist/types/src/experimental/index.d.ts.map +0 -1
  513. package/dist/types/src/experimental/queue.d.ts +0 -8
  514. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  515. package/dist/types/src/experimental/space.d.ts +0 -8
  516. package/dist/types/src/experimental/space.d.ts.map +0 -1
  517. package/dist/types/src/query/dsl.d.ts +0 -238
  518. package/dist/types/src/query/dsl.d.ts.map +0 -1
  519. package/dist/types/src/query/dsl.test.d.ts +0 -2
  520. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  521. package/dist/types/src/query/index.d.ts +0 -2
  522. package/dist/types/src/query/index.d.ts.map +0 -1
  523. package/dist/types/src/testing/types.d.ts +0 -113
  524. package/dist/types/src/testing/types.d.ts.map +0 -1
  525. package/src/experimental/database.ts +0 -11
  526. package/src/experimental/index.ts +0 -7
  527. package/src/experimental/queue.ts +0 -11
  528. package/src/experimental/space.ts +0 -11
  529. package/src/query/dsl.test.ts +0 -332
  530. package/src/query/dsl.ts +0 -704
  531. package/src/query/index.ts +0 -5
  532. package/src/test/api.test.ts +0 -180
  533. package/src/testing/types.ts +0 -91
  534. /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
  535. /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
  536. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
@@ -0,0 +1,96 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { assertArgument } from '@dxos/invariant';
6
+
7
+ import { type AnyEntity, VersionTypeId } from '../common/types';
8
+ import { ObjectVersionId } from './model';
9
+
10
+ /**
11
+ * Represent entity version.
12
+ * May be backed by Automerge.
13
+ * Entities with no history are not versioned.
14
+ * Named EntityVersion to avoid conflict with types/version.ts.
15
+ */
16
+ export interface EntityVersion {
17
+ [VersionTypeId]: {};
18
+
19
+ /**
20
+ * Whether the entity is versioned.
21
+ */
22
+ versioned: boolean;
23
+
24
+ /**
25
+ * Automerge heads.
26
+ */
27
+ automergeHeads?: string[];
28
+ }
29
+
30
+ const unversioned: EntityVersion = {
31
+ [VersionTypeId]: {},
32
+ versioned: false,
33
+ };
34
+
35
+ /**
36
+ * Checks that `obj` is a version object.
37
+ */
38
+ export const isVersion = (entity: unknown): entity is EntityVersion => {
39
+ return entity != null && typeof entity === 'object' && VersionTypeId in entity;
40
+ };
41
+
42
+ /**
43
+ * Returns the version of an entity.
44
+ * Accepts both reactive entities and snapshots.
45
+ */
46
+ export const version = (entity: AnyEntity): EntityVersion => {
47
+ const ver = (entity as any)[ObjectVersionId];
48
+ if (ver === undefined) {
49
+ return unversioned;
50
+ }
51
+ return ver;
52
+ };
53
+
54
+ /**
55
+ * Checks that `version` is a valid version object.
56
+ */
57
+ export const versionValid = (ver: EntityVersion): boolean => {
58
+ assertArgument(isVersion(ver), 'version', 'Invalid version object');
59
+ return !!ver.versioned;
60
+ };
61
+
62
+ export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
63
+
64
+ /**
65
+ * Compares two versions.
66
+ * @param version1
67
+ * @param version2
68
+ * @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
69
+ */
70
+ export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
71
+ assertArgument(isVersion(version1), 'version1', 'Invalid version object');
72
+ assertArgument(isVersion(version2), 'version2', 'Invalid version object');
73
+
74
+ if (!versionValid(version1) || !versionValid(version2)) {
75
+ return 'unversioned';
76
+ }
77
+
78
+ if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
79
+ return 'different';
80
+ }
81
+ if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
82
+ return 'different';
83
+ }
84
+
85
+ return 'equal';
86
+ };
87
+
88
+ export const encodeVersion = (ver: EntityVersion): string => {
89
+ return JSON.stringify(ver);
90
+ };
91
+
92
+ export const decodeVersion = (ver: string): EntityVersion => {
93
+ const parsed = JSON.parse(ver);
94
+ parsed[VersionTypeId] = {};
95
+ return parsed;
96
+ };
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { describe, expect, test } from 'vitest';
7
+
8
+ import { log } from '@dxos/log';
9
+
10
+ import { toJsonSchema } from '../JsonSchema';
11
+ import {
12
+ DateOnly,
13
+ DateTime,
14
+ type SimpleDate,
15
+ type SimpleDateTime,
16
+ type SimpleTime,
17
+ TimeOnly,
18
+ toSimpleDate,
19
+ toSimpleTime,
20
+ } from './date';
21
+
22
+ describe.skip('date', () => {
23
+ test('basic', () => {
24
+ const date = new Date('2024-12-31T23:59:59Z');
25
+ expect(toSimpleDate(date)).to.deep.eq({ year: 2024, month: 12, day: 31 });
26
+ expect(toSimpleTime(date)).to.deep.eq({ hours: 23, minutes: 59, seconds: 59 });
27
+ });
28
+
29
+ test('Date', ({ expect }) => {
30
+ const jsonSchema = toJsonSchema(DateOnly);
31
+ log('schema', { jsonSchema });
32
+ const v1: SimpleDate = { year: 1999, month: 12, day: 31 };
33
+ const str = Schema.encodeUnknownSync(DateOnly)(v1);
34
+ const v2 = Schema.decodeUnknownSync(DateOnly)(str);
35
+ expect(v1).to.deep.eq(v2);
36
+ });
37
+
38
+ test('Time', ({ expect }) => {
39
+ const jsonSchema = toJsonSchema(TimeOnly);
40
+ log('schema', { jsonSchema });
41
+ const v1: SimpleTime = { hours: 23, minutes: 59, seconds: 59 };
42
+ const str = Schema.encodeUnknownSync(TimeOnly)(v1);
43
+ const v2 = Schema.decodeUnknownSync(TimeOnly)(str);
44
+ expect(v1).to.deep.eq(v2);
45
+ });
46
+
47
+ test('DateTime', ({ expect }) => {
48
+ const jsonSchema = toJsonSchema(DateTime);
49
+ log('schema', { jsonSchema });
50
+ const v1: SimpleDateTime = { year: 1999, month: 12, day: 31, hours: 23, minutes: 59, seconds: 59 };
51
+ const str = Schema.encodeUnknownSync(DateTime)(v1);
52
+ const v2 = Schema.decodeUnknownSync(DateTime)(str);
53
+ expect(v1).to.deep.eq(v2);
54
+ });
55
+ });
@@ -0,0 +1,217 @@
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 { FormatAnnotation, TypeFormat } from './types';
9
+
10
+ /**
11
+ * Datetime values should be stored as ISO strings or unix numbers (ms) in UTC.
12
+ *
13
+ * NOTE: HyperFormula uses Excel's time format (null date 1900/01/01)
14
+ * It can be configured to use a different parser via `parseDateTime`.
15
+ * https://hyperformula.handsontable.com/guide/date-and-time-handling.html#date-and-time-handling
16
+ * https://github.com/handsontable/hyperformula/blob/master/src/DateTimeHelper.ts
17
+ */
18
+
19
+ // TODO(burdon): Annotations not present in JSON.
20
+ // TODO(burdon): Timezone.
21
+ // TODO(burdon): Format for timestamp (Unix UTC or ISO 8601)?
22
+ // TODO(burdon): Refs
23
+ // - https://www.npmjs.com/package/numfmt
24
+ // - https://date-fns.org/docs/Getting-Started
25
+ // - https://github.com/date-fns/tz
26
+
27
+ /**
28
+ * Simple date compatible with HF.
29
+ */
30
+ export const SimpleDate = Schema.Struct({
31
+ year: Schema.Number.pipe(Schema.between(1900, 9999)),
32
+ month: Schema.Number.pipe(Schema.between(1, 12)),
33
+ day: Schema.Number.pipe(Schema.between(1, 31)),
34
+ });
35
+
36
+ export type SimpleDate = Schema.Schema.Type<typeof SimpleDate>;
37
+
38
+ export const toSimpleDate = (date: Date): SimpleDate => ({
39
+ year: date.getUTCFullYear(),
40
+ month: date.getUTCMonth() + 1,
41
+ day: date.getUTCDate(),
42
+ });
43
+
44
+ /**
45
+ * Simple time compatible with HF.
46
+ */
47
+ export const SimpleTime = Schema.Struct({
48
+ hours: Schema.Number.pipe(Schema.between(0, 23)),
49
+ minutes: Schema.Number.pipe(Schema.between(0, 59)),
50
+ seconds: Schema.Number.pipe(Schema.between(0, 59)),
51
+ });
52
+
53
+ export type SimpleTime = Schema.Schema.Type<typeof SimpleTime>;
54
+
55
+ export const toSimpleTime = (date: Date): SimpleTime => ({
56
+ hours: date.getUTCHours(),
57
+ minutes: date.getUTCSeconds(),
58
+ seconds: date.getUTCSeconds(),
59
+ });
60
+
61
+ /**
62
+ * Simple date-time compatible with HF.
63
+ */
64
+ export const SimpleDateTime = Schema.extend(SimpleDate, SimpleTime);
65
+
66
+ export type SimpleDateTime = Schema.Schema.Type<typeof SimpleDateTime>;
67
+
68
+ export const toSimpleDateTime = (date: Date): SimpleDateTime => ({
69
+ ...toSimpleDate(date),
70
+ ...toSimpleTime(date),
71
+ });
72
+
73
+ /**
74
+ * https://effect.website/docs/guides/schema/transformations#date-transformations
75
+ */
76
+
77
+ // TODO(burdon): Consider if transformations should be supported with Automerge.
78
+
79
+ /**
80
+ * Format: 2018-11-13
81
+ */
82
+ export const DateOnly = /* Schema.transformOrFail(Schema.String, SimpleDate, {
83
+ strict: true,
84
+ decode: (str, _, ast) => {
85
+ if (!isValidDateFormat(str)) {
86
+ return ParseResult.fail(new ParseResult.Type(ast, str, 'Expected YYYY-MM-DD format'));
87
+ }
88
+ if (!isValidDate(str)) {
89
+ return ParseResult.fail(new ParseResult.Type(ast, str, 'Invalid date'));
90
+ }
91
+
92
+ const [year, month, day] = str.split('-').map(Number);
93
+ return ParseResult.succeed({ year, month, day });
94
+ },
95
+ encode: (date) => {
96
+ return ParseResult.succeed(
97
+ [
98
+ date.year.toString().padStart(4, '0'),
99
+ date.month.toString().padStart(2, '0'),
100
+ date.day.toString().padStart(2, '0'),
101
+ ].join('-'),
102
+ );
103
+ },
104
+ }) */ Schema.String.pipe(
105
+ FormatAnnotation.set(TypeFormat.Date),
106
+ Schema.annotations({
107
+ title: 'Date',
108
+ description: 'Valid date in ISO format',
109
+ }),
110
+ );
111
+
112
+ /**
113
+ * Format: 20:20:39+00:00
114
+ */
115
+ export const TimeOnly = /* Schema.transformOrFail(Schema.String, SimpleTime, {
116
+ strict: true,
117
+ decode: (str, _, ast) => {
118
+ if (!isValidTimeFormat(str)) {
119
+ return ParseResult.fail(new ParseResult.Type(ast, str, 'Expected HH:mm:ss format'));
120
+ }
121
+
122
+ const [hours, minutes, seconds] = str.split(':').map(Number);
123
+ return ParseResult.succeed({ hours, minutes, seconds });
124
+ },
125
+ encode: (time) => {
126
+ return ParseResult.succeed(
127
+ [
128
+ time.hours.toString().padStart(2, '0'),
129
+ time.minutes.toString().padStart(2, '0'),
130
+ time.seconds.toString().padStart(2, '0'),
131
+ ].join(':'),
132
+ );
133
+ },
134
+ }) */ Schema.String.pipe(
135
+ FormatAnnotation.set(TypeFormat.Time),
136
+ Schema.annotations({
137
+ title: 'Time',
138
+ description: 'Valid time in ISO format',
139
+ }),
140
+ );
141
+
142
+ /**
143
+ * Format: 2018-11-13T20:20:39+00:00
144
+ */
145
+ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime, {
146
+ strict: false,
147
+ decode: (str, _, ast) => {
148
+ const [date, time] = str.split('T');
149
+ if (!isValidDateFormat(date)) {
150
+ return ParseResult.fail(new ParseResult.Type(ast, date, 'Expected YYYY-MM-DD format'));
151
+ }
152
+ if (!isValidDate(date)) {
153
+ return ParseResult.fail(new ParseResult.Type(ast, date, 'Invalid date'));
154
+ }
155
+ if (!isValidTimeFormat(time)) {
156
+ return ParseResult.fail(new ParseResult.Type(ast, str, 'Expected HH:mm:ss format'));
157
+ }
158
+
159
+ const [year, month, day] = date.split('-').map(Number);
160
+ const [hours, minutes, seconds] = time.split(':').map(Number);
161
+ return ParseResult.succeed({ year, month, day, hours, minutes, seconds });
162
+ },
163
+ encode: (datetime) => {
164
+ return ParseResult.succeed(
165
+ [
166
+ [
167
+ datetime.year.toString().padStart(4, '0'),
168
+ datetime.month.toString().padStart(2, '0'),
169
+ datetime.day.toString().padStart(2, '0'),
170
+ ].join('-'),
171
+ [
172
+ datetime.hours.toString().padStart(2, '0'),
173
+ datetime.minutes.toString().padStart(2, '0'),
174
+ datetime.seconds.toString().padStart(2, '0'),
175
+ ].join(':'),
176
+ ].join('T'),
177
+ );
178
+ },
179
+ }) */ Schema.String.pipe(
180
+ FormatAnnotation.set(TypeFormat.DateTime),
181
+ Schema.annotations({
182
+ title: 'DateTime',
183
+ description: 'Valid date and time in ISO format',
184
+ }),
185
+ );
186
+
187
+ /**
188
+ * https://datatracker.ietf.org/doc/html/rfc3339#appendix-A
189
+ */
190
+ // TODO(burdon): Define duration type.
191
+ export const Duration = Schema.String.pipe(
192
+ FormatAnnotation.set(TypeFormat.Duration),
193
+ Schema.annotations({
194
+ title: 'Duration',
195
+ description: 'Duration in ISO 8601 format',
196
+ [SchemaAST.ExamplesAnnotationId]: ['1h', '3D'],
197
+ }),
198
+ );
199
+
200
+ //
201
+ // Utils
202
+ //
203
+
204
+ // YYYY-MM-DD
205
+ const DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
206
+
207
+ const _isValidDateFormat = (str: string) => DATE_REGEX.test(str);
208
+
209
+ const _isValidDate = (str: string) => {
210
+ const date = new Date(str);
211
+ return !isNaN(date.getTime()) && date.toISOString().startsWith(str);
212
+ };
213
+
214
+ // HH:mm:ss
215
+ const TIME_REGEX = /^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$/;
216
+
217
+ const _isValidTimeFormat = (str: string) => TIME_REGEX.test(str);
@@ -0,0 +1,76 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import { describe, test } from 'vitest';
7
+
8
+ import { toJsonSchema } from '../JsonSchema';
9
+ import { Format } from './format';
10
+ import { TypeEnum, TypeFormat, getTypeEnum } from './types';
11
+
12
+ describe('formats', () => {
13
+ test('annotations', ({ expect }) => {
14
+ const TestSchema = Schema.Struct({
15
+ name: Schema.String,
16
+ email: Schema.optional(Format.Email),
17
+ salary: Schema.optional(Format.Currency({ decimals: 2, code: 'usd' })),
18
+ website: Schema.optional(Format.URL),
19
+ birthday: Schema.optional(Format.Date),
20
+ started: Schema.optional(Format.DateTime),
21
+ active: Schema.optional(Schema.Boolean),
22
+ });
23
+
24
+ type TestType = Schema.Schema.Type<typeof TestSchema>;
25
+
26
+ const jsonSchema = toJsonSchema(TestSchema);
27
+
28
+ const data: TestType = {
29
+ name: 'Alice',
30
+ email: 'alice@example.com',
31
+ birthday: '1999-06-11',
32
+ };
33
+
34
+ const validate = Schema.validateSync(TestSchema);
35
+ validate(data);
36
+
37
+ {
38
+ const prop = jsonSchema.properties!['active' as const];
39
+ expect(getTypeEnum(prop)).to.eq(TypeEnum.Boolean);
40
+ expect(prop).includes({
41
+ type: TypeEnum.Boolean,
42
+ });
43
+ }
44
+
45
+ {
46
+ const prop = jsonSchema.properties!['email' as const];
47
+ expect(getTypeEnum(prop)).to.eq(TypeEnum.String);
48
+ expect(prop).includes({
49
+ type: TypeEnum.String,
50
+ format: TypeFormat.Email,
51
+ title: 'Email',
52
+ });
53
+ }
54
+
55
+ {
56
+ const prop = jsonSchema.properties!['salary' as const];
57
+ expect(getTypeEnum(prop)).to.eq(TypeEnum.Number);
58
+ expect(prop).includes({
59
+ type: TypeEnum.Number,
60
+ format: TypeFormat.Currency,
61
+ title: 'Currency',
62
+ multipleOf: 0.01,
63
+ currency: 'USD',
64
+ });
65
+ }
66
+
67
+ {
68
+ const prop = jsonSchema.properties!['birthday' as const];
69
+ expect(getTypeEnum(prop)).to.eq(TypeEnum.String);
70
+ expect(prop).includes({
71
+ type: TypeEnum.String,
72
+ format: TypeFormat.Date,
73
+ });
74
+ }
75
+ });
76
+ });
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import * as Keys from '@dxos/keys';
8
+
9
+ import * as DateUtil from './date';
10
+ import * as NumberUtil from './number';
11
+ import * as ObjectUtil from './object';
12
+ import * as StringUtil from './string';
13
+ import { TypeFormat as TypeFormat$ } from './types';
14
+
15
+ // TODO(burdon): Media encoding.
16
+ // - https://json-schema.org/understanding-json-schema/reference/non_json_data
17
+
18
+ /**
19
+ * Formats.
20
+ * https://json-schema.org/understanding-json-schema/reference/string#built-in-formats
21
+ * NOTE: A JSON Schema validator will ignore any format type that it does not understand.
22
+ */
23
+ // TODO(burdon): Add fields for `examples`, `message`, etc.
24
+ export namespace Format {
25
+ export import TypeFormat = TypeFormat$;
26
+
27
+ // String
28
+ export const DXN = Keys.DXN.Schema;
29
+ export const Email = StringUtil.Email;
30
+ export const Formula = StringUtil.Formula;
31
+ export const Hostname = StringUtil.Hostname;
32
+ export const JSON = StringUtil.JSON;
33
+ export const Markdown = StringUtil.Markdown;
34
+ export const Regex = StringUtil.Regex;
35
+ export const URL = StringUtil.URL;
36
+ export const UUID = Schema.UUID;
37
+
38
+ // Numbers
39
+ // TODO(burdon): BigInt.
40
+ export const Currency = NumberUtil.Currency;
41
+ export const Integer = NumberUtil.Integer;
42
+ export const Percent = NumberUtil.Percent;
43
+ export const Timestamp = NumberUtil.Timestamp;
44
+
45
+ // Dates and times
46
+ export const Date = DateUtil.DateOnly;
47
+ export const DateTime = DateUtil.DateTime;
48
+ export const Duration = DateUtil.Duration;
49
+ export const Time = DateUtil.TimeOnly;
50
+
51
+ // Objects
52
+ export const GeoPoint = ObjectUtil.GeoPoint;
53
+ export type GeoPoint = ObjectUtil.GeoPoint; // TODO(burdon): Export types.
54
+ }
@@ -0,0 +1,12 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export type { SimpleDate, SimpleDateTime, SimpleTime } from './date';
6
+ export { CurrencyAnnotationId, DecimalPrecision, Currency } from './number';
7
+ export { GeoPoint, GeoLocation } from './object';
8
+
9
+ export * from './format';
10
+ export * from './select';
11
+ export * from './string';
12
+ export * from './types';
@@ -0,0 +1,89 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { FormatAnnotation, TypeFormat } from './types';
8
+
9
+ const encodeMultipleOf = (divisor: number) => 1 / Math.pow(10, divisor);
10
+
11
+ const encodeMultiple =
12
+ <A extends number>(divisor?: number) =>
13
+ <I, R>(self: Schema.Schema<A, I, R>) =>
14
+ divisor === undefined || divisor === 0 ? self : self.pipe(Schema.multipleOf(encodeMultipleOf(divisor)));
15
+
16
+ /**
17
+ * Convert number of digits to multipleOf annotation.
18
+ */
19
+ export const DecimalPrecision = Schema.transform(Schema.Number, Schema.Number, {
20
+ strict: true,
21
+ encode: (value) => encodeMultipleOf(value),
22
+ decode: (value) => Math.log10(1 / value),
23
+ }).annotations({
24
+ title: 'Number of digits',
25
+ });
26
+
27
+ export const CurrencyAnnotationId = Symbol.for('@dxos/schema/annotation/Currency');
28
+
29
+ export type CurrencyAnnotation = {
30
+ decimals?: number;
31
+ code?: string;
32
+ };
33
+
34
+ /**
35
+ * ISO 4217 currency code.
36
+ */
37
+ export const Currency = ({ decimals, code }: CurrencyAnnotation = { decimals: 2 }) =>
38
+ Schema.Number.pipe(
39
+ encodeMultiple(decimals),
40
+ FormatAnnotation.set(TypeFormat.Currency),
41
+ Schema.annotations({
42
+ title: 'Currency',
43
+ description: 'Currency value',
44
+ ...(code ? { [CurrencyAnnotationId]: code.toUpperCase() } : {}),
45
+ }),
46
+ );
47
+
48
+ export type PercentAnnotation = {
49
+ decimals?: number;
50
+ };
51
+
52
+ /**
53
+ * Integer.
54
+ */
55
+ export const Integer = () =>
56
+ Schema.Number.pipe(
57
+ Schema.int(),
58
+ FormatAnnotation.set(TypeFormat.Integer),
59
+ Schema.annotations({
60
+ title: 'Integer',
61
+ description: 'Integer value',
62
+ }),
63
+ );
64
+
65
+ /**
66
+ * Percent.
67
+ */
68
+ // TODO(burdon): Define min/max (e.g., 0, 1).
69
+ export const Percent = ({ decimals }: PercentAnnotation = { decimals: 2 }) =>
70
+ Schema.Number.pipe(
71
+ encodeMultiple(decimals),
72
+ FormatAnnotation.set(TypeFormat.Percent),
73
+ Schema.annotations({
74
+ title: 'Percent',
75
+ description: 'Percentage value',
76
+ }),
77
+ );
78
+
79
+ /**
80
+ * Unix timestamp.
81
+ * https://en.wikipedia.org/wiki/Unix_time
82
+ */
83
+ export const Timestamp = Schema.Number.pipe(
84
+ FormatAnnotation.set(TypeFormat.Timestamp),
85
+ Schema.annotations({
86
+ title: 'Timestamp',
87
+ description: 'Unix timestamp',
88
+ }),
89
+ );
@@ -0,0 +1,80 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { clamp } from '@dxos/util';
8
+
9
+ import { FormatAnnotation, TypeFormat } from './types';
10
+
11
+ /**
12
+ * GeoJSON Format
13
+ * https://datatracker.ietf.org/doc/html/rfc7946
14
+ * https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.1
15
+ * https://en.wikipedia.org/wiki/Geographic_coordinate_system
16
+ * https://geojson.org
17
+ * {
18
+ * "type": "Point",
19
+ * "coordinates": [0, 51.47] // [longitude, latitude]
20
+ * }
21
+ * Note: optional third element for altitude.
22
+ */
23
+ export const GeoPoint = Schema.Tuple(
24
+ Schema.Number.pipe(Schema.annotations({ title: 'Longitude' }), Schema.clamp(-180, 180), Schema.multipleOf(0.000001)),
25
+ Schema.Number.pipe(Schema.annotations({ title: 'Latitude' }), Schema.clamp(-90, 90), Schema.multipleOf(0.000001)),
26
+ Schema.optionalElement(Schema.Number).annotations({
27
+ title: 'Height ASL (m)',
28
+ }),
29
+ ).pipe(
30
+ FormatAnnotation.set(TypeFormat.GeoPoint),
31
+ Schema.annotations({
32
+ title: 'GeoPoint',
33
+ description: 'GeoJSON Position',
34
+ }),
35
+ );
36
+
37
+ export type GeoPoint = Schema.Schema.Type<typeof GeoPoint>;
38
+
39
+ export type GeoLocation = {
40
+ longitude: number;
41
+ latitude: number;
42
+ height?: number;
43
+ };
44
+
45
+ /**
46
+ * Geolocation utilities for working with GeoPoint format.
47
+ */
48
+ export namespace GeoLocation {
49
+ /**
50
+ * Convert latitude and longitude to GeoPoint (GeoJSON format [longitude, latitude, height?]).
51
+ * Clamps values to valid ranges: latitude [-90, 90], longitude [-180, 180].
52
+ */
53
+ export const toGeoPoint = ({ longitude, latitude, height }: GeoLocation): GeoPoint => {
54
+ // TODO(ZaymonFC): Use schema validation instead of doing this manually.
55
+ const clampedLongitude = clamp(longitude, -180, 180);
56
+ const clampedLatitude = clamp(latitude, -90, 90);
57
+ return height !== undefined ? [clampedLongitude, clampedLatitude, height] : [clampedLongitude, clampedLatitude];
58
+ };
59
+
60
+ /**
61
+ * Extract latitude and longitude from GeoPoint (GeoJSON format [longitude, latitude, height?]).
62
+ */
63
+ export const fromGeoPoint = (geoPoint: GeoPoint | undefined): GeoLocation => {
64
+ if (!geoPoint) {
65
+ return { longitude: 0, latitude: 0 };
66
+ }
67
+
68
+ const result: GeoLocation = {
69
+ longitude: geoPoint[0],
70
+ latitude: geoPoint[1],
71
+ };
72
+
73
+ // Add height if defined.
74
+ if (geoPoint[2] !== undefined) {
75
+ result.height = geoPoint[2];
76
+ }
77
+
78
+ return result;
79
+ };
80
+ }
@@ -0,0 +1,18 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ /**
8
+ * Schema for a single select option. Used to define choices in a {single|multi}-select field.
9
+ */
10
+ export const SelectOption = Schema.Struct({
11
+ /** Stable identifier for the option. */
12
+ id: Schema.NonEmptyString,
13
+ title: Schema.String,
14
+ /** Color palette used for visual styling. */
15
+ color: Schema.String,
16
+ });
17
+
18
+ export type SelectOption = Schema.Schema.Type<typeof SelectOption>;