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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/dist/lib/browser/chunk-7GH6RXJ3.mjs +3683 -0
  2. package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-E4UTVJNF.mjs +1111 -0
  4. package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +24 -1
  6. package/dist/lib/browser/internal/index.mjs +336 -0
  7. package/dist/lib/browser/internal/index.mjs.map +7 -0
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/testing/index.mjs +289 -31
  10. package/dist/lib/browser/testing/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +1111 -0
  12. package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +7 -0
  13. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs +3683 -0
  14. package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +24 -1
  16. package/dist/lib/node-esm/internal/index.mjs +336 -0
  17. package/dist/lib/node-esm/internal/index.mjs.map +7 -0
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/testing/index.mjs +289 -31
  20. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  21. package/dist/types/src/Annotation.d.ts +2 -0
  22. package/dist/types/src/Annotation.d.ts.map +1 -0
  23. package/dist/types/src/Database.d.ts +137 -0
  24. package/dist/types/src/Database.d.ts.map +1 -0
  25. package/dist/types/src/Entity.d.ts +36 -0
  26. package/dist/types/src/Entity.d.ts.map +1 -0
  27. package/dist/types/src/Format.d.ts +4 -0
  28. package/dist/types/src/Format.d.ts.map +1 -0
  29. package/dist/types/src/JsonSchema.d.ts +9 -0
  30. package/dist/types/src/JsonSchema.d.ts.map +1 -0
  31. package/dist/types/src/Key.d.ts +1 -0
  32. package/dist/types/src/Key.d.ts.map +1 -1
  33. package/dist/types/src/Obj.d.ts +121 -50
  34. package/dist/types/src/Obj.d.ts.map +1 -1
  35. package/dist/types/src/Ref.d.ts +10 -10
  36. package/dist/types/src/Ref.d.ts.map +1 -1
  37. package/dist/types/src/Relation.d.ts +18 -14
  38. package/dist/types/src/Relation.d.ts.map +1 -1
  39. package/dist/types/src/Tag.d.ts +17 -0
  40. package/dist/types/src/Tag.d.ts.map +1 -0
  41. package/dist/types/src/Type.d.ts +39 -50
  42. package/dist/types/src/Type.d.ts.map +1 -1
  43. package/dist/types/src/errors.d.ts +68 -0
  44. package/dist/types/src/errors.d.ts.map +1 -0
  45. package/dist/types/src/index.d.ts +9 -3
  46. package/dist/types/src/index.d.ts.map +1 -1
  47. package/dist/types/src/internal/annotations/annotations.d.ts +174 -0
  48. package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
  49. package/dist/types/src/internal/annotations/annotations.test.d.ts +2 -0
  50. package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
  51. package/dist/types/src/internal/annotations/index.d.ts +3 -0
  52. package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
  53. package/dist/types/src/internal/annotations/util.d.ts +26 -0
  54. package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
  55. package/dist/types/src/internal/entities/entity.d.ts +10 -0
  56. package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
  57. package/dist/types/src/internal/entities/expando.d.ts +16 -0
  58. package/dist/types/src/internal/entities/expando.d.ts.map +1 -0
  59. package/dist/types/src/internal/entities/index.d.ts +6 -0
  60. package/dist/types/src/internal/entities/index.d.ts.map +1 -0
  61. package/dist/types/src/internal/entities/model.d.ts +70 -0
  62. package/dist/types/src/internal/entities/model.d.ts.map +1 -0
  63. package/dist/types/src/internal/entities/object.d.ts +11 -0
  64. package/dist/types/src/internal/entities/object.d.ts.map +1 -0
  65. package/dist/types/src/internal/entities/relation.d.ts +55 -0
  66. package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
  67. package/dist/types/src/internal/entities/util.d.ts +2 -0
  68. package/dist/types/src/internal/entities/util.d.ts.map +1 -0
  69. package/dist/types/src/internal/formats/date.d.ts +63 -0
  70. package/dist/types/src/internal/formats/date.d.ts.map +1 -0
  71. package/dist/types/src/internal/formats/date.test.d.ts +2 -0
  72. package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
  73. package/dist/types/src/internal/formats/format.d.ts +32 -0
  74. package/dist/types/src/internal/formats/format.d.ts.map +1 -0
  75. package/dist/types/src/internal/formats/format.test.d.ts +2 -0
  76. package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
  77. package/dist/types/src/internal/formats/index.d.ts +8 -0
  78. package/dist/types/src/internal/formats/index.d.ts.map +1 -0
  79. package/dist/types/src/internal/formats/number.d.ts +31 -0
  80. package/dist/types/src/internal/formats/number.d.ts.map +1 -0
  81. package/dist/types/src/internal/formats/object.d.ts +35 -0
  82. package/dist/types/src/internal/formats/object.d.ts.map +1 -0
  83. package/dist/types/src/internal/formats/select.d.ts +11 -0
  84. package/dist/types/src/internal/formats/select.d.ts.map +1 -0
  85. package/dist/types/src/internal/formats/string.d.ts +38 -0
  86. package/dist/types/src/internal/formats/string.d.ts.map +1 -0
  87. package/dist/types/src/internal/formats/types.d.ts +68 -0
  88. package/dist/types/src/internal/formats/types.d.ts.map +1 -0
  89. package/dist/types/src/internal/index.d.ts +11 -0
  90. package/dist/types/src/internal/index.d.ts.map +1 -0
  91. package/dist/types/src/internal/json-schema/annotations.d.ts +19 -0
  92. package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
  93. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts +2 -0
  94. package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
  95. package/dist/types/src/internal/json-schema/index.d.ts +5 -0
  96. package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
  97. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
  98. package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
  99. package/dist/types/src/internal/json-schema/json-schema-type.d.ts +250 -0
  100. package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
  101. package/dist/types/src/internal/json-schema/json-schema.d.ts +29 -0
  102. package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
  103. package/dist/types/src/internal/json-schema/json-schema.test.d.ts +2 -0
  104. package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
  105. package/dist/types/src/internal/object/common.d.ts +18 -0
  106. package/dist/types/src/internal/object/common.d.ts.map +1 -0
  107. package/dist/types/src/internal/object/create-object.d.ts +39 -0
  108. package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
  109. package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
  110. package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
  111. package/dist/types/src/internal/object/deleted.d.ts +6 -0
  112. package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
  113. package/dist/types/src/internal/object/ids.d.ts +6 -0
  114. package/dist/types/src/internal/object/ids.d.ts.map +1 -0
  115. package/dist/types/src/internal/object/index.d.ts +8 -0
  116. package/dist/types/src/internal/object/index.d.ts.map +1 -0
  117. package/dist/types/src/internal/object/inspect.d.ts +2 -0
  118. package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
  119. package/dist/types/src/internal/object/json-serializer.d.ts +31 -0
  120. package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
  121. package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
  122. package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
  123. package/dist/types/src/internal/object/schema-validator.d.ts +15 -0
  124. package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
  125. package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
  126. package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
  127. package/dist/types/src/internal/object/typed-object.d.ts +31 -0
  128. package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
  129. package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
  130. package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
  131. package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
  132. package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
  133. package/dist/types/src/internal/proxy/index.d.ts +3 -0
  134. package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
  135. package/dist/types/src/internal/proxy/make-object.d.ts +16 -0
  136. package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
  137. package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
  138. package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
  139. package/dist/types/src/internal/proxy/typed-handler.d.ts +44 -0
  140. package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
  141. package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
  142. package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
  143. package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
  144. package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
  145. package/dist/types/src/internal/ref/index.d.ts +3 -0
  146. package/dist/types/src/internal/ref/index.d.ts.map +1 -0
  147. package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
  148. package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
  149. package/dist/types/src/internal/ref/ref.d.ts +209 -0
  150. package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
  151. package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
  152. package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
  153. package/dist/types/src/internal/schema/compose.d.ts +6 -0
  154. package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
  155. package/dist/types/src/internal/schema/compose.test.d.ts +2 -0
  156. package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
  157. package/dist/types/src/internal/schema/echo-schema.d.ts +168 -0
  158. package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
  159. package/dist/types/src/internal/schema/index.d.ts +6 -0
  160. package/dist/types/src/internal/schema/index.d.ts.map +1 -0
  161. package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
  162. package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
  163. package/dist/types/src/internal/schema/persistent-schema.d.ts +18 -0
  164. package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
  165. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +18 -0
  166. package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -0
  167. package/dist/types/src/internal/schema/snapshot.d.ts +6 -0
  168. package/dist/types/src/internal/schema/snapshot.d.ts.map +1 -0
  169. package/dist/types/src/internal/types/base.d.ts +37 -0
  170. package/dist/types/src/internal/types/base.d.ts.map +1 -0
  171. package/dist/types/src/internal/types/entity.d.ts +12 -0
  172. package/dist/types/src/internal/types/entity.d.ts.map +1 -0
  173. package/dist/types/src/internal/types/index.d.ts +6 -0
  174. package/dist/types/src/internal/types/index.d.ts.map +1 -0
  175. package/dist/types/src/internal/types/meta.d.ts +40 -0
  176. package/dist/types/src/internal/types/meta.d.ts.map +1 -0
  177. package/dist/types/src/internal/types/typename.d.ts +13 -0
  178. package/dist/types/src/internal/types/typename.d.ts.map +1 -0
  179. package/dist/types/src/internal/types/version.d.ts +15 -0
  180. package/dist/types/src/internal/types/version.d.ts.map +1 -0
  181. package/dist/types/src/query/filter.d.ts +167 -0
  182. package/dist/types/src/query/filter.d.ts.map +1 -0
  183. package/dist/types/src/query/index.d.ts +4 -1
  184. package/dist/types/src/query/index.d.ts.map +1 -1
  185. package/dist/types/src/query/order.d.ts +12 -0
  186. package/dist/types/src/query/order.d.ts.map +1 -0
  187. package/dist/types/src/query/query.d.ts +112 -0
  188. package/dist/types/src/query/query.d.ts.map +1 -0
  189. package/dist/types/src/query/query.test.d.ts +2 -0
  190. package/dist/types/src/query/query.test.d.ts.map +1 -0
  191. package/dist/types/src/query/testing.d.ts +51 -0
  192. package/dist/types/src/query/testing.d.ts.map +1 -0
  193. package/dist/types/src/query/types.d.ts +17 -0
  194. package/dist/types/src/query/types.d.ts.map +1 -0
  195. package/dist/types/src/query/util.d.ts +8 -0
  196. package/dist/types/src/query/util.d.ts.map +1 -0
  197. package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
  198. package/dist/types/src/testing/index.d.ts +3 -1
  199. package/dist/types/src/testing/index.d.ts.map +1 -1
  200. package/dist/types/src/testing/test-data.d.ts +18 -0
  201. package/dist/types/src/testing/test-data.d.ts.map +1 -0
  202. package/dist/types/src/testing/test-schema.d.ts +337 -0
  203. package/dist/types/src/testing/test-schema.d.ts.map +1 -0
  204. package/dist/types/src/testing/util.d.ts +16 -0
  205. package/dist/types/src/testing/util.d.ts.map +1 -0
  206. package/dist/types/tsconfig.tsbuildinfo +1 -1
  207. package/package.json +49 -29
  208. package/src/Annotation.ts +17 -0
  209. package/src/Database.ts +189 -0
  210. package/src/Entity.ts +51 -0
  211. package/src/Format.ts +11 -0
  212. package/src/JsonSchema.ts +16 -0
  213. package/src/Key.ts +3 -0
  214. package/src/Obj.ts +353 -107
  215. package/src/Ref.ts +9 -10
  216. package/src/Relation.ts +68 -43
  217. package/src/Tag.ts +40 -0
  218. package/src/Type.ts +97 -85
  219. package/src/errors.ts +18 -0
  220. package/src/index.ts +13 -4
  221. package/src/internal/README.md +83 -0
  222. package/src/internal/annotations/annotations.test.ts +96 -0
  223. package/src/internal/annotations/annotations.ts +463 -0
  224. package/src/internal/annotations/index.ts +6 -0
  225. package/src/internal/annotations/util.ts +70 -0
  226. package/src/internal/entities/entity.ts +109 -0
  227. package/src/internal/entities/expando.ts +23 -0
  228. package/src/internal/entities/index.ts +9 -0
  229. package/src/internal/entities/model.ts +129 -0
  230. package/src/internal/entities/object.ts +45 -0
  231. package/src/internal/entities/relation.ts +155 -0
  232. package/src/internal/entities/util.ts +33 -0
  233. package/src/internal/formats/date.test.ts +56 -0
  234. package/src/internal/formats/date.ts +217 -0
  235. package/src/internal/formats/format.test.ts +77 -0
  236. package/src/internal/formats/format.ts +55 -0
  237. package/src/internal/formats/index.ts +12 -0
  238. package/src/internal/formats/number.ts +89 -0
  239. package/src/internal/formats/object.ts +80 -0
  240. package/src/internal/formats/select.ts +16 -0
  241. package/src/internal/formats/string.ts +76 -0
  242. package/src/internal/formats/types.ts +180 -0
  243. package/src/internal/index.ts +38 -0
  244. package/src/internal/json-schema/annotations.ts +50 -0
  245. package/src/internal/json-schema/effect-schema.test.ts +143 -0
  246. package/src/internal/json-schema/index.ts +8 -0
  247. package/src/internal/json-schema/json-schema-normalize.ts +109 -0
  248. package/src/internal/json-schema/json-schema-type.ts +404 -0
  249. package/src/internal/json-schema/json-schema.test.ts +859 -0
  250. package/src/internal/json-schema/json-schema.ts +528 -0
  251. package/src/internal/object/common.ts +75 -0
  252. package/src/internal/object/create-object.test.ts +116 -0
  253. package/src/internal/object/create-object.ts +95 -0
  254. package/src/internal/object/deleted.ts +19 -0
  255. package/src/internal/object/ids.ts +12 -0
  256. package/src/internal/object/index.ts +11 -0
  257. package/src/internal/object/inspect.ts +46 -0
  258. package/src/internal/object/json-serializer.test.ts +94 -0
  259. package/src/internal/object/json-serializer.ts +230 -0
  260. package/src/internal/object/schema-validator.test.ts +186 -0
  261. package/src/internal/object/schema-validator.ts +242 -0
  262. package/src/internal/object/typed-object.test.ts +34 -0
  263. package/src/internal/object/typed-object.ts +94 -0
  264. package/src/internal/proxy/handler.test.ts +173 -0
  265. package/src/internal/proxy/index.ts +6 -0
  266. package/src/internal/proxy/make-object.ts +113 -0
  267. package/src/internal/proxy/schema.test.ts +137 -0
  268. package/src/internal/proxy/typed-handler.test.ts +102 -0
  269. package/src/internal/proxy/typed-handler.ts +233 -0
  270. package/src/internal/proxy/typed-object.test.ts +105 -0
  271. package/src/internal/ref/index.ts +6 -0
  272. package/src/internal/ref/ref-array.ts +39 -0
  273. package/src/internal/ref/ref.test.ts +101 -0
  274. package/src/internal/ref/ref.ts +525 -0
  275. package/src/internal/schema/compose.test.ts +42 -0
  276. package/src/internal/schema/compose.ts +37 -0
  277. package/src/internal/schema/echo-schema.ts +385 -0
  278. package/src/internal/schema/index.ts +9 -0
  279. package/src/internal/schema/manipulation.ts +92 -0
  280. package/src/internal/schema/persistent-schema.ts +28 -0
  281. package/src/internal/schema/runtime-schema-registry.ts +78 -0
  282. package/src/internal/schema/snapshot.ts +25 -0
  283. package/src/internal/types/base.ts +58 -0
  284. package/src/internal/types/entity.ts +23 -0
  285. package/src/internal/types/index.ts +9 -0
  286. package/src/internal/types/meta.ts +76 -0
  287. package/src/internal/types/typename.ts +45 -0
  288. package/src/internal/types/version.ts +20 -0
  289. package/src/query/filter.ts +455 -0
  290. package/src/query/index.ts +5 -1
  291. package/src/query/order.ts +34 -0
  292. package/src/query/query.test.ts +334 -0
  293. package/src/query/query.ts +303 -0
  294. package/src/query/testing.ts +64 -0
  295. package/src/query/types.ts +23 -0
  296. package/src/query/util.ts +25 -0
  297. package/src/testing/api.test.ts +100 -0
  298. package/src/testing/index.ts +3 -1
  299. package/src/testing/test-data.ts +130 -0
  300. package/src/testing/test-schema.ts +213 -0
  301. package/src/testing/util.ts +78 -0
  302. package/dist/lib/browser/chunk-2KNTYMIW.mjs +0 -697
  303. package/dist/lib/browser/chunk-2KNTYMIW.mjs.map +0 -7
  304. package/dist/lib/node-esm/chunk-EXNNC62J.mjs +0 -697
  305. package/dist/lib/node-esm/chunk-EXNNC62J.mjs.map +0 -7
  306. package/dist/types/src/experimental/database.d.ts +0 -8
  307. package/dist/types/src/experimental/database.d.ts.map +0 -1
  308. package/dist/types/src/experimental/index.d.ts +0 -1
  309. package/dist/types/src/experimental/index.d.ts.map +0 -1
  310. package/dist/types/src/experimental/queue.d.ts +0 -8
  311. package/dist/types/src/experimental/queue.d.ts.map +0 -1
  312. package/dist/types/src/experimental/space.d.ts +0 -8
  313. package/dist/types/src/experimental/space.d.ts.map +0 -1
  314. package/dist/types/src/query/dsl.d.ts +0 -218
  315. package/dist/types/src/query/dsl.d.ts.map +0 -1
  316. package/dist/types/src/query/dsl.test.d.ts +0 -2
  317. package/dist/types/src/query/dsl.test.d.ts.map +0 -1
  318. package/dist/types/src/testing/types.d.ts +0 -113
  319. package/dist/types/src/testing/types.d.ts.map +0 -1
  320. package/src/experimental/database.ts +0 -11
  321. package/src/experimental/index.ts +0 -7
  322. package/src/experimental/queue.ts +0 -11
  323. package/src/experimental/space.ts +0 -11
  324. package/src/query/dsl.test.ts +0 -324
  325. package/src/query/dsl.ts +0 -646
  326. package/src/test/api.test.ts +0 -173
  327. package/src/testing/types.ts +0 -91
  328. /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
@@ -0,0 +1,404 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { JsonPath, type JsonProp } from '@dxos/effect';
8
+
9
+ import { FormatAnnotation, TypeFormat } from '../formats';
10
+ import { EntityKindSchema } from '../types';
11
+
12
+ //
13
+ // JSON Schema
14
+ //
15
+
16
+ // TODO(burdon): Reuse/reconcile with ScalarTypeEnum (handle arrays).
17
+ const SimpleTypes = Schema.Literal('array', 'boolean', 'integer', 'null', 'number', 'object', 'string');
18
+
19
+ const NonNegativeInteger = Schema.Number.pipe(Schema.greaterThanOrEqualTo(0));
20
+
21
+ const StringArray = Schema.Array(Schema.String).pipe(Schema.mutable);
22
+
23
+ const JsonSchemaOrBoolean = Schema.Union(
24
+ Schema.suspend(() => JsonSchemaType),
25
+ Schema.Boolean,
26
+ );
27
+
28
+ /**
29
+ * Go under the `annotations` property.
30
+ */
31
+ export const JsonSchemaEchoAnnotations = Schema.Struct({
32
+ /**
33
+ * Label for this schema.
34
+ * Mapped from {@link LabelAnnotationId}.
35
+ */
36
+ labelProp: Schema.optional(Schema.Union(JsonPath, Schema.Array(JsonPath))),
37
+
38
+ /**
39
+ * Generator function for this schema.
40
+ * Mapped from {@link GeneratorAnnotationId}.
41
+ */
42
+ generator: Schema.optional(Schema.Union(Schema.String, Schema.Tuple(Schema.String, Schema.Number))),
43
+
44
+ /**
45
+ * {@link PropertyMeta} annotations get serialized here.
46
+ */
47
+ meta: Schema.optional(
48
+ Schema.Record({
49
+ key: Schema.String,
50
+ value: Schema.Any,
51
+ }).pipe(Schema.mutable),
52
+ ),
53
+
54
+ /**
55
+ * @deprecated
56
+ */
57
+ // TODO(dmaretskyi): We risk old schema not passing validation due to the extra fields. Remove when we are sure this is safe
58
+ type: Schema.optional(
59
+ Schema.Struct({
60
+ typename: Schema.String,
61
+ version: Schema.String,
62
+
63
+ // Not used.
64
+ schemaId: Schema.optional(Schema.String),
65
+ }).pipe(Schema.mutable),
66
+ ),
67
+
68
+ /**
69
+ * @deprecated Superseded by `meta`.
70
+ */
71
+ annotations: Schema.optional(
72
+ Schema.Record({
73
+ key: Schema.String,
74
+ value: Schema.Any,
75
+ }).pipe(Schema.mutable),
76
+ ),
77
+ }).pipe(Schema.mutable);
78
+ export type JsonSchemaEchoAnnotations = Schema.Schema.Type<typeof JsonSchemaEchoAnnotations>;
79
+
80
+ /**
81
+ * Describes a schema for the JSON-schema objects stored in ECHO.
82
+ * Contains extensions for ECHO (e.g., references).
83
+ * Ref: https://json-schema.org/draft-07/schema
84
+ */
85
+ // TODO(burdon): Integrate with Effect Serializable?
86
+ // TODO(dmaretskyi): Update to latest draft: https://json-schema.org/draft/2020-12
87
+ const _JsonSchemaType = Schema.Struct({
88
+ /**
89
+ * Identifier for this schema.
90
+ * This schema might be referenced by $ref clause in other schemas.
91
+ */
92
+ // TODO(dmaretskyi): Specify how the ids are generated.
93
+ // TODO(dmaretskyi): For type dxns, should this include the version?
94
+ $id: Schema.optional(Schema.String),
95
+
96
+ /**
97
+ * Schema of this schema.
98
+ * Set to "https://json-schema.org/draft-07/schema".
99
+ */
100
+ $schema: Schema.optional(Schema.String),
101
+
102
+ /**
103
+ * Reference to another schema.
104
+ */
105
+ $ref: Schema.optional(Schema.String),
106
+
107
+ /**
108
+ * Comments are ignored when interpreting the schema.
109
+ */
110
+ $comment: Schema.optional(Schema.String),
111
+
112
+ /**
113
+ * Defines whether this schema is an object schema or a relation schema.
114
+ */
115
+ entityKind: Schema.optional(EntityKindSchema),
116
+
117
+ /**
118
+ * Typename of this schema.
119
+ * Only on schema representing an ECHO object.
120
+ *
121
+ * @example 'example.com/type/MyType'
122
+ */
123
+ typename: Schema.optional(Schema.String),
124
+
125
+ /**
126
+ * Version of this schema.
127
+ * Custom dialect for ECHO.
128
+ */
129
+ version: Schema.optional(Schema.String),
130
+
131
+ /**
132
+ * Target of this relation.
133
+ * Only for relation schemas.
134
+ * The referenced schema must be an object schema.
135
+ */
136
+ relationTarget: Schema.optional(Schema.suspend(() => JsonSchemaType)),
137
+
138
+ /**
139
+ * Source of this relation.
140
+ * Only for relation schemas.
141
+ * The referenced schema must be an object schema.
142
+ */
143
+ relationSource: Schema.optional(Schema.suspend(() => JsonSchemaType)),
144
+
145
+ /**
146
+ * Title of this schema.
147
+ */
148
+ title: Schema.optional(Schema.String),
149
+
150
+ /**
151
+ * Description of this schema.
152
+ */
153
+ description: Schema.optional(Schema.String),
154
+
155
+ /**
156
+ * Whether this schema is read-only.
157
+ */
158
+ readOnly: Schema.optional(Schema.Boolean),
159
+
160
+ /**
161
+ * Whether this schema is write-only.
162
+ */
163
+ writeOnly: Schema.optional(Schema.Boolean),
164
+
165
+ /**
166
+ * Examples of instances of this schema.
167
+ */
168
+ examples: Schema.optional(Schema.Array(Schema.Any)),
169
+
170
+ /**
171
+ * Default value for this schema.
172
+ */
173
+ default: Schema.optional(Schema.Any),
174
+
175
+ /**
176
+ * This schema only matches values that are equal to this value.
177
+ */
178
+ const: Schema.optional(Schema.Any),
179
+
180
+ /**
181
+ * This schema only matches one of the values in this array.
182
+ */
183
+ enum: Schema.optional(Schema.Array(Schema.Any)),
184
+
185
+ /**
186
+ * Base type of the schema.
187
+ */
188
+ type: Schema.optional(Schema.Union(SimpleTypes, Schema.Array(SimpleTypes))),
189
+
190
+ //
191
+ // Numbers.
192
+ //
193
+
194
+ multipleOf: Schema.optional(Schema.Number.pipe(Schema.greaterThan(0))),
195
+ maximum: Schema.optional(Schema.Number),
196
+ exclusiveMaximum: Schema.optional(Schema.Number),
197
+ minimum: Schema.optional(Schema.Number),
198
+ exclusiveMinimum: Schema.optional(Schema.Number),
199
+
200
+ //
201
+ // Strings.
202
+ //
203
+
204
+ maxLength: Schema.optional(NonNegativeInteger),
205
+
206
+ /**
207
+ * Regex pattern for strings.
208
+ */
209
+ pattern: Schema.optional(Schema.String.pipe(FormatAnnotation.set(TypeFormat.Regex))),
210
+
211
+ /**
212
+ * Serialized from {@link FormatAnnotationId}.
213
+ */
214
+ format: Schema.optional(Schema.String),
215
+
216
+ //
217
+ // Arrays
218
+ //
219
+
220
+ minLength: Schema.optional(NonNegativeInteger),
221
+ items: Schema.optional(
222
+ Schema.Union(
223
+ Schema.suspend(() => JsonSchemaType),
224
+ Schema.Array(Schema.suspend(() => JsonSchemaType)),
225
+ ),
226
+ ),
227
+ additionalItems: Schema.optional(
228
+ Schema.Union(
229
+ Schema.suspend(() => JsonSchemaType),
230
+ Schema.Boolean,
231
+ ),
232
+ ),
233
+ maxItems: Schema.optional(NonNegativeInteger),
234
+ minItems: Schema.optional(NonNegativeInteger),
235
+ uniqueItems: Schema.optional(Schema.Boolean),
236
+ contains: Schema.optional(Schema.suspend(() => JsonSchemaType)),
237
+
238
+ //
239
+ // Objects
240
+ //
241
+
242
+ maxProperties: Schema.optional(NonNegativeInteger),
243
+ minProperties: Schema.optional(NonNegativeInteger),
244
+ required: Schema.optional(StringArray),
245
+
246
+ /**
247
+ * Non-standard JSON Schema extension.
248
+ * Defines the order of properties in the object.
249
+ * The unmentioned properties are placed at the end.
250
+ *
251
+ * Related: https://github.com/json-schema/json-schema/issues/119
252
+ */
253
+ propertyOrder: Schema.optional(StringArray),
254
+
255
+ additionalProperties: Schema.optional(JsonSchemaOrBoolean),
256
+ properties: Schema.optional(
257
+ Schema.Record({
258
+ key: Schema.String,
259
+ value: Schema.suspend(() => JsonSchemaType),
260
+ }).pipe(Schema.mutable),
261
+ ),
262
+ patternProperties: Schema.optional(
263
+ Schema.Record({
264
+ key: Schema.String,
265
+ value: Schema.suspend(() => JsonSchemaType),
266
+ }).pipe(Schema.mutable),
267
+ ),
268
+ propertyNames: Schema.optional(Schema.suspend(() => JsonSchemaType)),
269
+
270
+ definitions: Schema.optional(
271
+ Schema.mutable(
272
+ Schema.Record({
273
+ key: Schema.String,
274
+ value: Schema.suspend(() => JsonSchemaType),
275
+ }),
276
+ ),
277
+ ),
278
+ dependencies: Schema.optional(
279
+ Schema.Record({
280
+ key: Schema.String,
281
+ value: Schema.suspend(() => Schema.Union(Schema.String, StringArray, JsonSchemaType)).annotations({
282
+ identifier: 'dependency',
283
+ description: 'Dependency',
284
+ }),
285
+ }),
286
+ ),
287
+
288
+ contentMediaType: Schema.optional(Schema.String),
289
+ contentEncoding: Schema.optional(Schema.String),
290
+
291
+ if: Schema.optional(Schema.suspend(() => JsonSchemaType)),
292
+ then: Schema.optional(Schema.suspend(() => JsonSchemaType)),
293
+ else: Schema.optional(Schema.suspend(() => JsonSchemaType)),
294
+ allOf: Schema.optional(Schema.Array(Schema.suspend(() => JsonSchemaType))),
295
+ anyOf: Schema.optional(Schema.Array(Schema.suspend(() => JsonSchemaType))),
296
+ oneOf: Schema.optional(Schema.Array(Schema.suspend(() => JsonSchemaType))),
297
+ not: Schema.optional(Schema.suspend(() => JsonSchemaType)),
298
+ $defs: Schema.optional(
299
+ Schema.mutable(
300
+ Schema.Record({
301
+ key: Schema.String,
302
+ value: Schema.suspend(() => JsonSchemaType),
303
+ }),
304
+ ),
305
+ ),
306
+
307
+ //
308
+ // ECHO extensions.
309
+ //
310
+
311
+ currency: Schema.optional(Schema.String),
312
+
313
+ reference: Schema.optional(
314
+ Schema.mutable(
315
+ Schema.Struct({
316
+ schema: Schema.suspend(() => JsonSchemaType),
317
+ schemaVersion: Schema.optional(Schema.String),
318
+ schemaObject: Schema.optional(Schema.String),
319
+ }),
320
+ ),
321
+ ),
322
+
323
+ /**
324
+ * ECHO-specific annotations.
325
+ */
326
+ // TODO(dmaretskyi): Since we are adding a lot of new extensions to the JSON Schema, it is safer to namespace them here.
327
+ annotations: Schema.optional(Schema.mutable(JsonSchemaEchoAnnotations)),
328
+
329
+ /**
330
+ * @deprecated Use `annotations` instead.
331
+ */
332
+ echo: Schema.optional(Schema.mutable(JsonSchemaEchoAnnotations)),
333
+ }).annotations({ identifier: 'jsonSchema', description: 'JSON Schema' });
334
+
335
+ export const JsonSchemaFields = Object.keys(_JsonSchemaType.fields);
336
+
337
+ /**
338
+ * https://json-schema.org/draft-07/schema
339
+ */
340
+ // TODO(burdon): Reconcile with @effect/Schema/JSONSchema
341
+ export interface JsonSchemaType extends Schema.Schema.Type<Schema.mutable<typeof _JsonSchemaType>> {}
342
+
343
+ export const JsonSchemaType: Schema.Schema<JsonSchemaType> = _JsonSchemaType.pipe(Schema.mutable);
344
+
345
+ // TODO(burdon): Factor out JSON schema utils.
346
+
347
+ export const getSchemaProperty = (schema: JsonSchemaType, property: JsonProp): JsonSchemaType | undefined => {
348
+ return schema.properties?.[property];
349
+ };
350
+
351
+ // TODO(burdon): Properties should be ordered.
352
+ export const setSchemaProperty = (schema: JsonSchemaType, property: JsonProp, value: JsonSchemaType) => {
353
+ schema.properties ??= {};
354
+ schema.properties[property] = value;
355
+ return schema;
356
+ };
357
+
358
+ /**
359
+ * @internal
360
+ */
361
+ export const ECHO_ANNOTATIONS_NS_DEPRECATED_KEY: keyof JsonSchemaType = 'echo';
362
+
363
+ /**
364
+ * @internal
365
+ */
366
+ export const ECHO_ANNOTATIONS_NS_KEY = 'annotations';
367
+
368
+ /**
369
+ * @internal
370
+ * @returns ECHO annotations namespace object in its normalized form.
371
+ *
372
+ * `meta` holds PropertyMeta annotations.
373
+ * `annotations` holds other annotations.
374
+ */
375
+ export const getNormalizedEchoAnnotations = (obj: JsonSchemaType): JsonSchemaEchoAnnotations | undefined => {
376
+ if (obj[ECHO_ANNOTATIONS_NS_KEY] != null && obj[ECHO_ANNOTATIONS_NS_DEPRECATED_KEY] != null) {
377
+ return normalizeEchoAnnotations({
378
+ ...obj[ECHO_ANNOTATIONS_NS_DEPRECATED_KEY],
379
+ ...obj[ECHO_ANNOTATIONS_NS_KEY],
380
+ });
381
+ } else if (obj[ECHO_ANNOTATIONS_NS_KEY] != null) {
382
+ return normalizeEchoAnnotations(obj[ECHO_ANNOTATIONS_NS_KEY]!);
383
+ } else if (obj[ECHO_ANNOTATIONS_NS_DEPRECATED_KEY] != null) {
384
+ return normalizeEchoAnnotations(obj[ECHO_ANNOTATIONS_NS_DEPRECATED_KEY]!);
385
+ } else {
386
+ return undefined;
387
+ }
388
+ };
389
+
390
+ const normalizeEchoAnnotations = (obj: JsonSchemaEchoAnnotations): JsonSchemaEchoAnnotations => {
391
+ if (!obj.annotations) {
392
+ return obj;
393
+ } else {
394
+ const res = {
395
+ ...obj,
396
+ meta: {
397
+ ...obj.annotations,
398
+ ...(obj.meta ?? {}),
399
+ },
400
+ };
401
+ delete res.annotations;
402
+ return res;
403
+ }
404
+ };