@atproto/lex-schema 0.0.5 → 0.0.7

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 (269) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/core/$type.d.ts +6 -3
  3. package/dist/core/$type.d.ts.map +1 -1
  4. package/dist/core/$type.js.map +1 -1
  5. package/dist/core/property-key.d.ts.map +1 -0
  6. package/dist/core/property-key.js.map +1 -0
  7. package/dist/core/schema.d.ts.map +1 -0
  8. package/dist/core/schema.js.map +1 -0
  9. package/dist/core/validation-error.d.ts +19 -0
  10. package/dist/core/validation-error.d.ts.map +1 -0
  11. package/dist/{validation → core}/validation-error.js +12 -5
  12. package/dist/core/validation-error.js.map +1 -0
  13. package/dist/{validation → core}/validation-issue.d.ts +43 -0
  14. package/dist/core/validation-issue.d.ts.map +1 -0
  15. package/dist/{validation → core}/validation-issue.js +45 -0
  16. package/dist/core/validation-issue.js.map +1 -0
  17. package/dist/{validation → core}/validator.d.ts +1 -1
  18. package/dist/core/validator.d.ts.map +1 -0
  19. package/dist/{validation → core}/validator.js +4 -4
  20. package/dist/core/validator.js.map +1 -0
  21. package/dist/core.d.ts +5 -0
  22. package/dist/core.d.ts.map +1 -1
  23. package/dist/core.js +5 -0
  24. package/dist/core.js.map +1 -1
  25. package/dist/external.d.ts +15 -16
  26. package/dist/external.d.ts.map +1 -1
  27. package/dist/external.js +38 -55
  28. package/dist/external.js.map +1 -1
  29. package/dist/helpers.d.ts +7 -2
  30. package/dist/helpers.d.ts.map +1 -1
  31. package/dist/helpers.js +10 -0
  32. package/dist/helpers.js.map +1 -1
  33. package/dist/schema/_parameters.d.ts +1 -1
  34. package/dist/schema/_parameters.d.ts.map +1 -1
  35. package/dist/schema/_parameters.js.map +1 -1
  36. package/dist/schema/array.d.ts +1 -1
  37. package/dist/schema/array.d.ts.map +1 -1
  38. package/dist/schema/array.js +2 -2
  39. package/dist/schema/array.js.map +1 -1
  40. package/dist/schema/blob.d.ts +3 -7
  41. package/dist/schema/blob.d.ts.map +1 -1
  42. package/dist/schema/blob.js +2 -2
  43. package/dist/schema/blob.js.map +1 -1
  44. package/dist/schema/boolean.d.ts +1 -1
  45. package/dist/schema/boolean.d.ts.map +1 -1
  46. package/dist/schema/boolean.js +2 -2
  47. package/dist/schema/boolean.js.map +1 -1
  48. package/dist/schema/bytes.d.ts +1 -1
  49. package/dist/schema/bytes.d.ts.map +1 -1
  50. package/dist/schema/bytes.js +2 -2
  51. package/dist/schema/bytes.js.map +1 -1
  52. package/dist/schema/cid.d.ts +1 -1
  53. package/dist/schema/cid.d.ts.map +1 -1
  54. package/dist/schema/cid.js +2 -2
  55. package/dist/schema/cid.js.map +1 -1
  56. package/dist/schema/custom.d.ts +1 -1
  57. package/dist/schema/custom.d.ts.map +1 -1
  58. package/dist/schema/custom.js +3 -3
  59. package/dist/schema/custom.js.map +1 -1
  60. package/dist/schema/dict.d.ts +1 -1
  61. package/dist/schema/dict.d.ts.map +1 -1
  62. package/dist/schema/dict.js +2 -2
  63. package/dist/schema/dict.js.map +1 -1
  64. package/dist/schema/discriminated-union.d.ts +1 -1
  65. package/dist/schema/discriminated-union.d.ts.map +1 -1
  66. package/dist/schema/discriminated-union.js +2 -2
  67. package/dist/schema/discriminated-union.js.map +1 -1
  68. package/dist/schema/enum.d.ts +1 -1
  69. package/dist/schema/enum.d.ts.map +1 -1
  70. package/dist/schema/enum.js +2 -2
  71. package/dist/schema/enum.js.map +1 -1
  72. package/dist/schema/integer.d.ts +1 -1
  73. package/dist/schema/integer.d.ts.map +1 -1
  74. package/dist/schema/integer.js +4 -4
  75. package/dist/schema/integer.js.map +1 -1
  76. package/dist/schema/intersection.d.ts +1 -2
  77. package/dist/schema/intersection.d.ts.map +1 -1
  78. package/dist/schema/intersection.js +2 -2
  79. package/dist/schema/intersection.js.map +1 -1
  80. package/dist/schema/literal.d.ts +1 -1
  81. package/dist/schema/literal.d.ts.map +1 -1
  82. package/dist/schema/literal.js +2 -2
  83. package/dist/schema/literal.js.map +1 -1
  84. package/dist/schema/never.d.ts +1 -1
  85. package/dist/schema/never.d.ts.map +1 -1
  86. package/dist/schema/never.js +2 -2
  87. package/dist/schema/never.js.map +1 -1
  88. package/dist/schema/null.d.ts +1 -1
  89. package/dist/schema/null.d.ts.map +1 -1
  90. package/dist/schema/null.js +2 -2
  91. package/dist/schema/null.js.map +1 -1
  92. package/dist/schema/nullable.d.ts +1 -1
  93. package/dist/schema/nullable.d.ts.map +1 -1
  94. package/dist/schema/nullable.js +2 -2
  95. package/dist/schema/nullable.js.map +1 -1
  96. package/dist/schema/object.d.ts +1 -2
  97. package/dist/schema/object.d.ts.map +1 -1
  98. package/dist/schema/object.js +2 -2
  99. package/dist/schema/object.js.map +1 -1
  100. package/dist/schema/optional.d.ts +1 -1
  101. package/dist/schema/optional.d.ts.map +1 -1
  102. package/dist/schema/optional.js +2 -2
  103. package/dist/schema/optional.js.map +1 -1
  104. package/dist/schema/params.d.ts +1 -2
  105. package/dist/schema/params.d.ts.map +1 -1
  106. package/dist/schema/params.js +2 -2
  107. package/dist/schema/params.js.map +1 -1
  108. package/dist/schema/payload.d.ts +1 -1
  109. package/dist/schema/payload.d.ts.map +1 -1
  110. package/dist/schema/payload.js.map +1 -1
  111. package/dist/schema/record.d.ts +9 -14
  112. package/dist/schema/record.d.ts.map +1 -1
  113. package/dist/schema/record.js +5 -3
  114. package/dist/schema/record.js.map +1 -1
  115. package/dist/schema/ref.d.ts +1 -1
  116. package/dist/schema/ref.d.ts.map +1 -1
  117. package/dist/schema/ref.js +2 -2
  118. package/dist/schema/ref.js.map +1 -1
  119. package/dist/schema/refine.d.ts +18 -1
  120. package/dist/schema/refine.d.ts.map +1 -1
  121. package/dist/schema/refine.js +2 -2
  122. package/dist/schema/refine.js.map +1 -1
  123. package/dist/schema/regexp.d.ts +1 -1
  124. package/dist/schema/regexp.d.ts.map +1 -1
  125. package/dist/schema/regexp.js +2 -2
  126. package/dist/schema/regexp.js.map +1 -1
  127. package/dist/schema/string.d.ts +1 -2
  128. package/dist/schema/string.d.ts.map +1 -1
  129. package/dist/schema/string.js +1 -2
  130. package/dist/schema/string.js.map +1 -1
  131. package/dist/schema/subscription.d.ts +1 -2
  132. package/dist/schema/subscription.d.ts.map +1 -1
  133. package/dist/schema/subscription.js.map +1 -1
  134. package/dist/schema/token.d.ts +1 -1
  135. package/dist/schema/token.d.ts.map +1 -1
  136. package/dist/schema/token.js +2 -2
  137. package/dist/schema/token.js.map +1 -1
  138. package/dist/schema/typed-object.d.ts +8 -13
  139. package/dist/schema/typed-object.d.ts.map +1 -1
  140. package/dist/schema/typed-object.js +5 -3
  141. package/dist/schema/typed-object.js.map +1 -1
  142. package/dist/schema/typed-ref.d.ts +1 -1
  143. package/dist/schema/typed-ref.d.ts.map +1 -1
  144. package/dist/schema/typed-ref.js +2 -2
  145. package/dist/schema/typed-ref.js.map +1 -1
  146. package/dist/schema/typed-union.d.ts +2 -3
  147. package/dist/schema/typed-union.d.ts.map +1 -1
  148. package/dist/schema/typed-union.js +2 -2
  149. package/dist/schema/typed-union.js.map +1 -1
  150. package/dist/schema/union.d.ts +1 -1
  151. package/dist/schema/union.d.ts.map +1 -1
  152. package/dist/schema/union.js +3 -3
  153. package/dist/schema/union.js.map +1 -1
  154. package/dist/schema/unknown-object.d.ts +1 -2
  155. package/dist/schema/unknown-object.d.ts.map +1 -1
  156. package/dist/schema/unknown-object.js +2 -2
  157. package/dist/schema/unknown-object.js.map +1 -1
  158. package/dist/schema/unknown.d.ts +1 -1
  159. package/dist/schema/unknown.d.ts.map +1 -1
  160. package/dist/schema/unknown.js +2 -2
  161. package/dist/schema/unknown.js.map +1 -1
  162. package/dist/util/memoize.d.ts +3 -0
  163. package/dist/util/memoize.d.ts.map +1 -0
  164. package/dist/util/memoize.js +52 -0
  165. package/dist/util/memoize.js.map +1 -0
  166. package/package.json +6 -6
  167. package/src/core/$type.ts +13 -2
  168. package/src/{validation → core}/validation-error.ts +11 -3
  169. package/src/{validation → core}/validation-issue.ts +52 -0
  170. package/src/{validation → core}/validator.ts +1 -1
  171. package/src/core.ts +5 -0
  172. package/src/external.ts +67 -48
  173. package/src/helpers.test.ts +1 -0
  174. package/src/helpers.ts +16 -2
  175. package/src/schema/_parameters.test.ts +1 -0
  176. package/src/schema/_parameters.ts +1 -1
  177. package/src/schema/array.test.ts +1 -0
  178. package/src/schema/array.ts +1 -1
  179. package/src/schema/blob.test.ts +1 -0
  180. package/src/schema/blob.ts +3 -6
  181. package/src/schema/boolean.test.ts +1 -0
  182. package/src/schema/boolean.ts +1 -1
  183. package/src/schema/bytes.test.ts +1 -0
  184. package/src/schema/bytes.ts +1 -1
  185. package/src/schema/cid.test.ts +1 -0
  186. package/src/schema/cid.ts +1 -1
  187. package/src/schema/custom.test.ts +3 -2
  188. package/src/schema/custom.ts +1 -1
  189. package/src/schema/dict.test.ts +1 -0
  190. package/src/schema/dict.ts +1 -1
  191. package/src/schema/discriminated-union.test.ts +1 -0
  192. package/src/schema/discriminated-union.ts +1 -1
  193. package/src/schema/enum.test.ts +1 -0
  194. package/src/schema/enum.ts +1 -1
  195. package/src/schema/integer.test.ts +1 -0
  196. package/src/schema/integer.ts +3 -3
  197. package/src/schema/intersection.test.ts +1 -0
  198. package/src/schema/intersection.ts +2 -2
  199. package/src/schema/literal.test.ts +1 -0
  200. package/src/schema/literal.ts +1 -1
  201. package/src/schema/never.test.ts +1 -0
  202. package/src/schema/never.ts +1 -1
  203. package/src/schema/null.test.ts +1 -0
  204. package/src/schema/null.ts +1 -1
  205. package/src/schema/nullable.test.ts +1 -0
  206. package/src/schema/nullable.ts +1 -1
  207. package/src/schema/object.test.ts +1 -0
  208. package/src/schema/object.ts +3 -3
  209. package/src/schema/optional.test.ts +1 -0
  210. package/src/schema/optional.ts +1 -1
  211. package/src/schema/params.test.ts +1 -0
  212. package/src/schema/params.ts +3 -3
  213. package/src/schema/payload.test.ts +1 -0
  214. package/src/schema/payload.ts +1 -1
  215. package/src/schema/permission-set.test.ts +1 -0
  216. package/src/schema/permission.test.ts +1 -0
  217. package/src/schema/procedure.test.ts +1 -0
  218. package/src/schema/query.test.ts +1 -0
  219. package/src/schema/record.test.ts +1 -0
  220. package/src/schema/record.ts +11 -9
  221. package/src/schema/ref.test.ts +2 -1
  222. package/src/schema/ref.ts +1 -1
  223. package/src/schema/refine.test.ts +1 -0
  224. package/src/schema/refine.ts +18 -1
  225. package/src/schema/regexp.test.ts +1 -0
  226. package/src/schema/regexp.ts +1 -1
  227. package/src/schema/string.test.ts +1 -0
  228. package/src/schema/string.ts +8 -2
  229. package/src/schema/subscription.test.ts +1 -0
  230. package/src/schema/subscription.ts +1 -2
  231. package/src/schema/token.test.ts +1 -0
  232. package/src/schema/token.ts +1 -1
  233. package/src/schema/typed-object.test.ts +1 -0
  234. package/src/schema/typed-object.ts +10 -6
  235. package/src/schema/typed-ref.test.ts +1 -0
  236. package/src/schema/typed-ref.ts +1 -1
  237. package/src/schema/typed-union.test.ts +1 -0
  238. package/src/schema/typed-union.ts +4 -4
  239. package/src/schema/union.test.ts +1 -0
  240. package/src/schema/union.ts +1 -1
  241. package/src/schema/unknown-object.test.ts +1 -0
  242. package/src/schema/unknown-object.ts +1 -2
  243. package/src/schema/unknown.test.ts +1 -0
  244. package/src/schema/unknown.ts +1 -1
  245. package/src/util/array-agg.test.ts +1 -0
  246. package/src/util/memoize.ts +57 -0
  247. package/tsconfig.tests.json +1 -1
  248. package/dist/validation/property-key.d.ts.map +0 -1
  249. package/dist/validation/property-key.js.map +0 -1
  250. package/dist/validation/schema.d.ts.map +0 -1
  251. package/dist/validation/schema.js.map +0 -1
  252. package/dist/validation/validation-error.d.ts +0 -9
  253. package/dist/validation/validation-error.d.ts.map +0 -1
  254. package/dist/validation/validation-error.js.map +0 -1
  255. package/dist/validation/validation-issue.d.ts.map +0 -1
  256. package/dist/validation/validation-issue.js.map +0 -1
  257. package/dist/validation/validator.d.ts.map +0 -1
  258. package/dist/validation/validator.js.map +0 -1
  259. package/dist/validation.d.ts +0 -6
  260. package/dist/validation.d.ts.map +0 -1
  261. package/dist/validation.js +0 -9
  262. package/dist/validation.js.map +0 -1
  263. package/src/validation.ts +0 -5
  264. /package/dist/{validation → core}/property-key.d.ts +0 -0
  265. /package/dist/{validation → core}/property-key.js +0 -0
  266. /package/dist/{validation → core}/schema.d.ts +0 -0
  267. /package/dist/{validation → core}/schema.js +0 -0
  268. /package/src/{validation → core}/property-key.ts +0 -0
  269. /package/src/{validation → core}/schema.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import { LexValue } from '@atproto/lex-data';
2
- import { Infer, Schema } from '../validation.js';
2
+ import { Infer, Schema } from '../core.js';
3
3
  export type InferPayload<P extends Payload, B> = P['encoding'] extends infer E extends string ? {
4
4
  encoding: SchemaEncodingToDataEncoding<E>;
5
5
  body: InferPayloadBody<P, B>;
@@ -1 +1 @@
1
- {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../src/schema/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,MAAM,YAAY,CACtB,CAAC,SAAS,OAAO,EACjB,CAAC,IACC,CAAC,CAAC,UAAU,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM,GAC5C;IACE,QAAQ,EAAE,4BAA4B,CAAC,CAAC,CAAC,CAAA;IACzC,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC7B,GACD,IAAI,GAAG,SAAS,CAAA;AAEpB,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,GACxE,GAAG,MAAM,IAAI,MAAM,EAAE,GACrB,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,MAAM,IAAI,GACrC,GAAG,CAAC,IAAI,MAAM,EAAE,GAChB,CAAC,CAAA;AAEP,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,OAAO,IAChD,CAAC,CAAC,UAAU,CAAC,SAAS,MAAM,GACxB,4BAA4B,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAC3C,SAAS,CAAA;AAEf,MAAM,MAAM,gBAAgB,CAC1B,CAAC,SAAS,OAAO,EACjB,CAAC,IACC,CAAC,CAAC,UAAU,CAAC,SAAS,SAAS,GAC/B,SAAS,GACT,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,GACxB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAClB,CAAC,CAAC,UAAU,CAAC,SAAS,kBAAkB,GACtC,QAAQ,GACR,CAAC,CAAA;AAET,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI,CAAC,SAAS,SAAS,GACzE,SAAS,GACT,MAAM,GAAG,SAAS,CAAA;AAEtB,qBAAa,OAAO,CAClB,KAAK,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EAC9D,KAAK,CAAC,MAAM,SAAS,aAAa,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC;IAGpE,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM;IAOzB;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO;CA6B1D"}
1
+ {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../src/schema/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,MAAM,YAAY,CACtB,CAAC,SAAS,OAAO,EACjB,CAAC,IACC,CAAC,CAAC,UAAU,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM,GAC5C;IACE,QAAQ,EAAE,4BAA4B,CAAC,CAAC,CAAC,CAAA;IACzC,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC7B,GACD,IAAI,GAAG,SAAS,CAAA;AAEpB,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,GACxE,GAAG,MAAM,IAAI,MAAM,EAAE,GACrB,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,MAAM,IAAI,GACrC,GAAG,CAAC,IAAI,MAAM,EAAE,GAChB,CAAC,CAAA;AAEP,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,OAAO,IAChD,CAAC,CAAC,UAAU,CAAC,SAAS,MAAM,GACxB,4BAA4B,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAC3C,SAAS,CAAA;AAEf,MAAM,MAAM,gBAAgB,CAC1B,CAAC,SAAS,OAAO,EACjB,CAAC,IACC,CAAC,CAAC,UAAU,CAAC,SAAS,SAAS,GAC/B,SAAS,GACT,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,GACxB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAClB,CAAC,CAAC,UAAU,CAAC,SAAS,kBAAkB,GACtC,QAAQ,GACR,CAAC,CAAA;AAET,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI,CAAC,SAAS,SAAS,GACzE,SAAS,GACT,MAAM,GAAG,SAAS,CAAA;AAEtB,qBAAa,OAAO,CAClB,KAAK,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EAC9D,KAAK,CAAC,MAAM,SAAS,aAAa,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC;IAGpE,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM;IAOzB;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO;CA6B1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/schema/payload.ts"],"names":[],"mappings":";;;AAuCA,MAAa,OAAO;IAKP;IACA;IAFX,YACW,QAAkB,EAClB,MAAc;QADd,aAAQ,GAAR,QAAQ,CAAU;QAClB,WAAM,GAAN,MAAM,CAAQ;QAEvB,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,WAA+B;QAC7C,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAEjD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QAEzB,yBAAyB;QACzB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,oBAAoB;YACpB,OAAO,IAAI,KAAK,SAAS,CAAA;QAC3B,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,4CAA4C;YAC5C,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;QAED,gEAAgE;QAChE,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,QAAQ,KAAK,IAAI,CAAA;IAC1B,CAAC;CACF;AA9CD,0BA8CC","sourcesContent":["import { LexValue } from '@atproto/lex-data'\nimport { Infer, Schema } from '../validation.js'\n\nexport type InferPayload<\n P extends Payload,\n B,\n> = P['encoding'] extends infer E extends string\n ? {\n encoding: SchemaEncodingToDataEncoding<E>\n body: InferPayloadBody<P, B>\n }\n : void | undefined\n\nexport type SchemaEncodingToDataEncoding<E extends string> = E extends '*/*'\n ? `${string}/${string}`\n : E extends `${infer T extends string}/*`\n ? `${T}/${string}`\n : E\n\nexport type InferPayloadEncoding<P extends Payload> =\n P['encoding'] extends string\n ? SchemaEncodingToDataEncoding<P['encoding']>\n : undefined\n\nexport type InferPayloadBody<\n P extends Payload,\n B,\n> = P['encoding'] extends undefined\n ? undefined // No encoding, no payload\n : P['schema'] extends Schema\n ? Infer<P['schema']>\n : P['encoding'] extends `application/json`\n ? LexValue\n : B\n\nexport type PayloadSchema<E extends string | undefined> = E extends undefined\n ? undefined\n : Schema | undefined\n\nexport class Payload<\n const Encoding extends string | undefined = string | undefined,\n const Schema extends PayloadSchema<Encoding> = PayloadSchema<Encoding>,\n> {\n constructor(\n readonly encoding: Encoding,\n readonly schema: Schema,\n ) {\n if (encoding === undefined && schema !== undefined) {\n throw new TypeError('schema cannot be defined when encoding is undefined')\n }\n }\n\n /**\n * Checks whether the given content-type matches the expected payload schema's\n * encoding.\n */\n matchesEncoding(contentType: string | undefined): boolean {\n const mime = contentType?.split(';', 1)[0].trim()\n\n const { encoding } = this\n\n // Handle undefined cases\n if (encoding === undefined) {\n // Expecting no body\n return mime === undefined\n } else if (mime === undefined) {\n // Expecting a body, but got no content-type\n return false\n }\n\n if (encoding === '*/*') {\n return true\n }\n\n if (encoding.endsWith('/*')) {\n return mime.startsWith(encoding.slice(0, -1))\n }\n\n // Invalid: Lexicon can only specify \"*/*\" or \"type/*\" wildcards\n if (encoding.includes('*')) {\n return false\n }\n\n return encoding === mime\n }\n}\n"]}
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/schema/payload.ts"],"names":[],"mappings":";;;AAuCA,MAAa,OAAO;IAKP;IACA;IAFX,YACW,QAAkB,EAClB,MAAc;QADd,aAAQ,GAAR,QAAQ,CAAU;QAClB,WAAM,GAAN,MAAM,CAAQ;QAEvB,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,WAA+B;QAC7C,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAEjD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QAEzB,yBAAyB;QACzB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,oBAAoB;YACpB,OAAO,IAAI,KAAK,SAAS,CAAA;QAC3B,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,4CAA4C;YAC5C,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;QAED,gEAAgE;QAChE,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,QAAQ,KAAK,IAAI,CAAA;IAC1B,CAAC;CACF;AA9CD,0BA8CC","sourcesContent":["import { LexValue } from '@atproto/lex-data'\nimport { Infer, Schema } from '../core.js'\n\nexport type InferPayload<\n P extends Payload,\n B,\n> = P['encoding'] extends infer E extends string\n ? {\n encoding: SchemaEncodingToDataEncoding<E>\n body: InferPayloadBody<P, B>\n }\n : void | undefined\n\nexport type SchemaEncodingToDataEncoding<E extends string> = E extends '*/*'\n ? `${string}/${string}`\n : E extends `${infer T extends string}/*`\n ? `${T}/${string}`\n : E\n\nexport type InferPayloadEncoding<P extends Payload> =\n P['encoding'] extends string\n ? SchemaEncodingToDataEncoding<P['encoding']>\n : undefined\n\nexport type InferPayloadBody<\n P extends Payload,\n B,\n> = P['encoding'] extends undefined\n ? undefined // No encoding, no payload\n : P['schema'] extends Schema\n ? Infer<P['schema']>\n : P['encoding'] extends `application/json`\n ? LexValue\n : B\n\nexport type PayloadSchema<E extends string | undefined> = E extends undefined\n ? undefined\n : Schema | undefined\n\nexport class Payload<\n const Encoding extends string | undefined = string | undefined,\n const Schema extends PayloadSchema<Encoding> = PayloadSchema<Encoding>,\n> {\n constructor(\n readonly encoding: Encoding,\n readonly schema: Schema,\n ) {\n if (encoding === undefined && schema !== undefined) {\n throw new TypeError('schema cannot be defined when encoding is undefined')\n }\n }\n\n /**\n * Checks whether the given content-type matches the expected payload schema's\n * encoding.\n */\n matchesEncoding(contentType: string | undefined): boolean {\n const mime = contentType?.split(';', 1)[0].trim()\n\n const { encoding } = this\n\n // Handle undefined cases\n if (encoding === undefined) {\n // Expecting no body\n return mime === undefined\n } else if (mime === undefined) {\n // Expecting a body, but got no content-type\n return false\n }\n\n if (encoding === '*/*') {\n return true\n }\n\n if (encoding.endsWith('/*')) {\n return mime.startsWith(encoding.slice(0, -1))\n }\n\n // Invalid: Lexicon can only specify \"*/*\" or \"type/*\" wildcards\n if (encoding.includes('*')) {\n return false\n }\n\n return encoding === mime\n }\n}\n"]}
@@ -1,12 +1,9 @@
1
- import { LexiconRecordKey, NsidString, Simplify, TidString } from '../core.js';
2
- import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
1
+ import { $Typed, Infer, LexiconRecordKey, NsidString, Schema, TidString, ValidationResult, Validator, ValidatorContext } from '../core.js';
3
2
  import { TypedObject } from './typed-union.js';
4
3
  export type InferRecordKey<R extends RecordSchema> = R extends RecordSchema<infer K> ? RecordKeySchemaOutput<K> : never;
5
4
  export type RecordSchemaOutput<T extends NsidString, S extends Validator<{
6
5
  [k: string]: unknown;
7
- }>> = Simplify<{
8
- $type: T;
9
- } & Omit<Infer<S>, '$type'>>;
6
+ }>> = $Typed<Infer<S>, T>;
10
7
  export declare class RecordSchema<K extends LexiconRecordKey = any, T extends NsidString = any, S extends Validator<{
11
8
  [k: string]: unknown;
12
9
  }> = any> extends Schema<RecordSchemaOutput<T, S>> {
@@ -18,20 +15,18 @@ export declare class RecordSchema<K extends LexiconRecordKey = any, T extends Ns
18
15
  isTypeOf<X extends {
19
16
  $type?: unknown;
20
17
  }>(value: X): value is Exclude<X extends {
21
- $type?: T;
22
- } ? X : X & {
23
- $type?: T;
24
- }, TypedObject>;
25
- build<X extends Omit<Infer<S>, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
26
18
  $type: T;
27
- }>;
19
+ } ? X : $Typed<X, T>, TypedObject>;
20
+ build<X extends Omit<Infer<S>, '$type'>>(input: X): $Typed<Omit<X, '$type'>, T>;
28
21
  $isTypeOf<X extends {
29
22
  $type?: unknown;
30
23
  }>(value: X): value is Exclude<X extends {
31
- $type?: T;
24
+ $type: T;
32
25
  } ? X : X & {
33
- $type?: T;
34
- }, TypedObject>;
26
+ $type: T;
27
+ } extends infer T_1 ? { [K_1 in keyof T_1]: (X & {
28
+ $type: T;
29
+ })[K_1]; } : never, TypedObject>;
35
30
  $build<X extends Omit<Infer<S>, '$type'>>(input: X): Omit<X, "$type"> & {
36
31
  $type: T;
37
32
  } extends infer T_1 ? { [K_1 in keyof T_1]: (Omit<X, "$type"> & {
@@ -1 +1 @@
1
- {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,YAAY,IAC/C,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAEpE,MAAM,MAAM,kBAAkB,CAC5B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,IAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEvB,qBAAa,YAAY,CACvB,CAAC,SAAS,gBAAgB,GAAG,GAAG,EAChC,CAAC,SAAS,UAAU,GAAG,GAAG,EAC1B,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,GAAG,CACnD,SAAQ,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAItC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,CAAC;IALpB,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;gBAGlB,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC;IAMpB,QAAQ,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EACpC,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,OAAO,CAAC,CAAC,SAAS;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC;IAI3E,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAM9B,SAAS,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,EAAE,CAAC;eAZV,CAAC;;;;;;IAgBxC,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;;;;;IAIlD,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAa9C;AAED,MAAM,MAAM,qBAAqB,CAAC,GAAG,SAAS,gBAAgB,IAC5D,GAAG,SAAS,KAAK,GACb,MAAM,GACN,GAAG,SAAS,KAAK,GACf,SAAS,GACT,GAAG,SAAS,MAAM,GAChB,UAAU,GACV,GAAG,SAAS,WAAW,MAAM,CAAC,SAAS,MAAM,EAAE,GAC7C,CAAC,GACD,KAAK,CAAA;AAEjB,MAAM,MAAM,eAAe,CAAC,GAAG,SAAS,gBAAgB,IAAI,MAAM,CAChE,qBAAqB,CAAC,GAAG,CAAC,CAC3B,CAAA"}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RecordSchema = void 0;
4
- const validation_js_1 = require("../validation.js");
4
+ const core_js_1 = require("../core.js");
5
5
  const literal_js_1 = require("./literal.js");
6
6
  const string_js_1 = require("./string.js");
7
- class RecordSchema extends validation_js_1.Schema {
7
+ class RecordSchema extends core_js_1.Schema {
8
8
  key;
9
9
  $type;
10
10
  schema;
@@ -20,7 +20,9 @@ class RecordSchema extends validation_js_1.Schema {
20
20
  return value.$type === this.$type;
21
21
  }
22
22
  build(input) {
23
- return { ...input, $type: this.$type };
23
+ return input.$type === this.$type
24
+ ? input
25
+ : { ...input, $type: this.$type };
24
26
  }
25
27
  $isTypeOf(value) {
26
28
  return this.isTypeOf(value);
@@ -1 +1 @@
1
- {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":";;;AACA,oDAMyB;AACzB,6CAA4C;AAC5C,2CAA0C;AAW1C,MAAa,YAIX,SAAQ,sBAAgC;IAI7B;IACA;IACA;IALX,SAAS,CAAoB;IAE7B,YACW,GAAM,EACN,KAAQ,EACR,MAAS;QAElB,KAAK,EAAE,CAAA;QAJE,QAAG,GAAH,GAAG,CAAG;QACN,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;QAGlB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,QAAQ,CACN,KAAQ;QAKR,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IACnC,CAAC;IAED,KAAK,CACH,KAAQ;QAER,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,SAAS,CAAgC,KAAQ;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAI,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,CAAoC,KAAQ;QAChD,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,yBAAyB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,MAAoD,CAAA;IAC7D,CAAC;CACF;AAvDD,oCAuDC;AAiBD,MAAM,SAAS,GAAG,IAAI,wBAAY,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,IAAI,wBAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AACrD,MAAM,UAAU,GAAG,IAAI,wBAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AACvD,MAAM,iBAAiB,GAAG,IAAI,0BAAa,CAAC,MAAM,CAAC,CAAA;AAEnD,SAAS,SAAS,CAChB,GAAQ;IAER,gDAAgD;IAChD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,SAAgB,CAAA;IAC1C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,SAAgB,CAAA;IAC1C,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,UAAiB,CAAA;IAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAA+B,CAAA;QACxD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,iBAAwB,CAAA;QACrD,OAAO,IAAI,0BAAa,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAA;AACxD,CAAC","sourcesContent":["import { LexiconRecordKey, NsidString, Simplify, TidString } from '../core.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { LiteralSchema } from './literal.js'\nimport { StringSchema } from './string.js'\nimport { TypedObject } from './typed-union.js'\n\nexport type InferRecordKey<R extends RecordSchema> =\n R extends RecordSchema<infer K> ? RecordKeySchemaOutput<K> : never\n\nexport type RecordSchemaOutput<\n T extends NsidString,\n S extends Validator<{ [k: string]: unknown }>,\n> = Simplify<{ $type: T } & Omit<Infer<S>, '$type'>>\n\nexport class RecordSchema<\n K extends LexiconRecordKey = any,\n T extends NsidString = any,\n S extends Validator<{ [k: string]: unknown }> = any,\n> extends Schema<RecordSchemaOutput<T, S>> {\n keySchema: RecordKeySchema<K>\n\n constructor(\n readonly key: K,\n readonly $type: T,\n readonly schema: S,\n ) {\n super()\n this.keySchema = recordKey(key)\n }\n\n isTypeOf<X extends { $type?: unknown }>(\n value: X,\n ): value is Exclude<\n X extends { $type?: T } ? X : X & { $type?: T },\n TypedObject\n > {\n return value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): Simplify<Omit<X, '$type'> & { $type: T }> {\n return { ...input, $type: this.$type }\n }\n\n $isTypeOf<X extends { $type?: unknown }>(value: X) {\n return this.isTypeOf<X>(value)\n }\n\n $build<X extends Omit<Infer<S>, '$type'>>(input: X) {\n return this.build<X>(input)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<RecordSchemaOutput<T, S>> {\n const result = ctx.validate(input, this.schema)\n\n if (!result.success) {\n return result\n }\n\n if (this.$type !== result.value.$type) {\n return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type])\n }\n\n return result as ValidationResult<RecordSchemaOutput<T, S>>\n }\n}\n\nexport type RecordKeySchemaOutput<Key extends LexiconRecordKey> =\n Key extends 'any'\n ? string\n : Key extends 'tid'\n ? TidString\n : Key extends 'nsid'\n ? NsidString\n : Key extends `literal:${infer L extends string}`\n ? L\n : never\n\nexport type RecordKeySchema<Key extends LexiconRecordKey> = Schema<\n RecordKeySchemaOutput<Key>\n>\n\nconst keySchema = new StringSchema({ minLength: 1 })\nconst tidSchema = new StringSchema({ format: 'tid' })\nconst nsidSchema = new StringSchema({ format: 'nsid' })\nconst selfLiteralSchema = new LiteralSchema('self')\n\nfunction recordKey<Key extends LexiconRecordKey>(\n key: Key,\n): RecordKeySchema<Key> {\n // @NOTE Use cached instances for common schemas\n if (key === 'any') return keySchema as any\n if (key === 'tid') return tidSchema as any\n if (key === 'nsid') return nsidSchema as any\n if (key.startsWith('literal:')) {\n const value = key.slice(8) as RecordKeySchemaOutput<Key>\n if (value === 'self') return selfLiteralSchema as any\n return new LiteralSchema(value)\n }\n\n throw new Error(`Unsupported record key type: ${key}`)\n}\n"]}
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/schema/record.ts"],"names":[],"mappings":";;;AAAA,wCAUmB;AACnB,6CAA4C;AAC5C,2CAA0C;AAW1C,MAAa,YAIX,SAAQ,gBAAgC;IAI7B;IACA;IACA;IALX,SAAS,CAAoB;IAE7B,YACW,GAAM,EACN,KAAQ,EACR,MAAS;QAElB,KAAK,EAAE,CAAA;QAJE,QAAG,GAAH,GAAG,CAAG;QACN,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;QAGlB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,QAAQ,CACN,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IACnC,CAAC;IAED,KAAK,CACH,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YAC/B,CAAC,CAAE,KAAsB;YACzB,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACrC,CAAC;IAED,SAAS,CAAgC,KAAQ;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAI,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,CAAoC,KAAQ;QAChD,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,yBAAyB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,MAAoD,CAAA;IAC7D,CAAC;CACF;AAtDD,oCAsDC;AAiBD,MAAM,SAAS,GAAG,IAAI,wBAAY,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,IAAI,wBAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AACrD,MAAM,UAAU,GAAG,IAAI,wBAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AACvD,MAAM,iBAAiB,GAAG,IAAI,0BAAa,CAAC,MAAM,CAAC,CAAA;AAEnD,SAAS,SAAS,CAChB,GAAQ;IAER,gDAAgD;IAChD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,SAAgB,CAAA;IAC1C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,SAAgB,CAAA;IAC1C,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,UAAiB,CAAA;IAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAA+B,CAAA;QACxD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,iBAAwB,CAAA;QACrD,OAAO,IAAI,0BAAa,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAA;AACxD,CAAC","sourcesContent":["import {\n $Typed,\n Infer,\n LexiconRecordKey,\n NsidString,\n Schema,\n TidString,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../core.js'\nimport { LiteralSchema } from './literal.js'\nimport { StringSchema } from './string.js'\nimport { TypedObject } from './typed-union.js'\n\nexport type InferRecordKey<R extends RecordSchema> =\n R extends RecordSchema<infer K> ? RecordKeySchemaOutput<K> : never\n\nexport type RecordSchemaOutput<\n T extends NsidString,\n S extends Validator<{ [k: string]: unknown }>,\n> = $Typed<Infer<S>, T>\n\nexport class RecordSchema<\n K extends LexiconRecordKey = any,\n T extends NsidString = any,\n S extends Validator<{ [k: string]: unknown }> = any,\n> extends Schema<RecordSchemaOutput<T, S>> {\n keySchema: RecordKeySchema<K>\n\n constructor(\n readonly key: K,\n readonly $type: T,\n readonly schema: S,\n ) {\n super()\n this.keySchema = recordKey(key)\n }\n\n isTypeOf<X extends { $type?: unknown }>(\n value: X,\n ): value is Exclude<X extends { $type: T } ? X : $Typed<X, T>, TypedObject> {\n return value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): $Typed<Omit<X, '$type'>, T> {\n return input.$type === this.$type\n ? (input as $Typed<X, T>)\n : { ...input, $type: this.$type }\n }\n\n $isTypeOf<X extends { $type?: unknown }>(value: X) {\n return this.isTypeOf<X>(value)\n }\n\n $build<X extends Omit<Infer<S>, '$type'>>(input: X) {\n return this.build<X>(input)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<RecordSchemaOutput<T, S>> {\n const result = ctx.validate(input, this.schema)\n\n if (!result.success) {\n return result\n }\n\n if (this.$type !== result.value.$type) {\n return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type])\n }\n\n return result as ValidationResult<RecordSchemaOutput<T, S>>\n }\n}\n\nexport type RecordKeySchemaOutput<Key extends LexiconRecordKey> =\n Key extends 'any'\n ? string\n : Key extends 'tid'\n ? TidString\n : Key extends 'nsid'\n ? NsidString\n : Key extends `literal:${infer L extends string}`\n ? L\n : never\n\nexport type RecordKeySchema<Key extends LexiconRecordKey> = Schema<\n RecordKeySchemaOutput<Key>\n>\n\nconst keySchema = new StringSchema({ minLength: 1 })\nconst tidSchema = new StringSchema({ format: 'tid' })\nconst nsidSchema = new StringSchema({ format: 'nsid' })\nconst selfLiteralSchema = new LiteralSchema('self')\n\nfunction recordKey<Key extends LexiconRecordKey>(\n key: Key,\n): RecordKeySchema<Key> {\n // @NOTE Use cached instances for common schemas\n if (key === 'any') return keySchema as any\n if (key === 'tid') return tidSchema as any\n if (key === 'nsid') return nsidSchema as any\n if (key.startsWith('literal:')) {\n const value = key.slice(8) as RecordKeySchemaOutput<Key>\n if (value === 'self') return selfLiteralSchema as any\n return new LiteralSchema(value)\n }\n\n throw new Error(`Unsupported record key type: ${key}`)\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
1
+ import { Schema, ValidationResult, Validator, ValidatorContext } from '../core.js';
2
2
  export type RefSchemaGetter<V> = () => Validator<V>;
3
3
  export declare class RefSchema<V = any> extends Schema<V> {
4
4
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/schema/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC,CAAC,CAAC,CAAA;AAEnD,qBAAa,SAAS,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;;gBAGnC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAStC,IAAI,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAgBzB;IAED,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;CAGvB"}
1
+ {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../../src/schema/ref.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC,CAAC,CAAC,CAAA;AAEnD,qBAAa,SAAS,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;;gBAGnC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAStC,IAAI,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAgBzB;IAED,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;CAGvB"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RefSchema = void 0;
4
- const validation_js_1 = require("../validation.js");
5
- class RefSchema extends validation_js_1.Schema {
4
+ const core_js_1 = require("../core.js");
5
+ class RefSchema extends core_js_1.Schema {
6
6
  #getter;
7
7
  constructor(getter) {
8
8
  // @NOTE In order to avoid circular dependency issues, we don't resolve
@@ -1 +1 @@
1
- {"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/schema/ref.ts"],"names":[],"mappings":";;;AAAA,oDAKyB;AAIzB,MAAa,SAAmB,SAAQ,sBAAS;IAC/C,OAAO,CAAoB;IAE3B,YAAY,MAA0B;QACpC,uEAAuE;QACvE,sEAAsE;QAEtE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,MAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErC,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAA;QAEjC,mEAAmE;QACnE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;YACpC,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;CACF;AApCD,8BAoCC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;AAC3D,CAAC","sourcesContent":["import {\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type RefSchemaGetter<V> = () => Validator<V>\n\nexport class RefSchema<V = any> extends Schema<V> {\n #getter: RefSchemaGetter<V>\n\n constructor(getter: RefSchemaGetter<V>) {\n // @NOTE In order to avoid circular dependency issues, we don't resolve\n // the schema here. Instead, we resolve it lazily when first accessed.\n\n super()\n\n this.#getter = getter\n }\n\n get schema(): Validator<V> {\n const value = this.#getter.call(null)\n\n // Prevents a getter from depending on itself recursively, also allows GC to\n // clean up the getter function.\n this.#getter = throwAlreadyCalled\n\n // Disable the getter and cache the resolved schema on the instance\n Object.defineProperty(this, 'schema', {\n value,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return value\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V> {\n return ctx.validate(input, this.schema)\n }\n}\n\nfunction throwAlreadyCalled(): never {\n throw new Error('RefSchema getter called multiple times')\n}\n"]}
1
+ {"version":3,"file":"ref.js","sourceRoot":"","sources":["../../src/schema/ref.ts"],"names":[],"mappings":";;;AAAA,wCAKmB;AAInB,MAAa,SAAmB,SAAQ,gBAAS;IAC/C,OAAO,CAAoB;IAE3B,YAAY,MAA0B;QACpC,uEAAuE;QACvE,sEAAsE;QAEtE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,MAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErC,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAA;QAEjC,mEAAmE;QACnE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;YACpC,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;CACF;AApCD,8BAoCC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;AAC3D,CAAC","sourcesContent":["import {\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../core.js'\n\nexport type RefSchemaGetter<V> = () => Validator<V>\n\nexport class RefSchema<V = any> extends Schema<V> {\n #getter: RefSchemaGetter<V>\n\n constructor(getter: RefSchemaGetter<V>) {\n // @NOTE In order to avoid circular dependency issues, we don't resolve\n // the schema here. Instead, we resolve it lazily when first accessed.\n\n super()\n\n this.#getter = getter\n }\n\n get schema(): Validator<V> {\n const value = this.#getter.call(null)\n\n // Prevents a getter from depending on itself recursively, also allows GC to\n // clean up the getter function.\n this.#getter = throwAlreadyCalled\n\n // Disable the getter and cache the resolved schema on the instance\n Object.defineProperty(this, 'schema', {\n value,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return value\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V> {\n return ctx.validate(input, this.schema)\n }\n}\n\nfunction throwAlreadyCalled(): never {\n throw new Error('RefSchema getter called multiple times')\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Infer, PropertyKey, Validator } from '../validation.js';
1
+ import { Infer, PropertyKey, Validator } from '../core.js';
2
2
  import { CustomAssertionContext } from './custom.js';
3
3
  export type RefinementCheck<T> = {
4
4
  check: (value: T, ctx: CustomAssertionContext) => boolean;
@@ -12,6 +12,23 @@ export type RefinementAssertion<T, Out extends T> = {
12
12
  };
13
13
  export type InferRefinement<R> = R extends RefinementCheck<infer T> ? T : R extends RefinementAssertion<infer T, any> ? T : never;
14
14
  export type Refinement<T = any, Out extends T = T> = RefinementCheck<T> | RefinementAssertion<T, Out>;
15
+ /**
16
+ * Create a refined schema based on an existing schema and a refinement check.
17
+ *
18
+ * @param schema - The base schema to refine.
19
+ * @param refinement - The refinement check to apply.
20
+ * @returns A new schema that includes the refinement.
21
+ * @example
22
+ *
23
+ * ```ts
24
+ * const PositiveInt = refine(l.integer(), {
25
+ * check: (value) => value > 0,
26
+ * message: 'Value must be a positive integer',
27
+ * })
28
+ * const result = PositiveInt.validate(-5)
29
+ * // result.success === false
30
+ * ```
31
+ */
15
32
  export declare function refine<S extends Validator, Out extends Infer<S>>(schema: S, refinement: RefinementAssertion<Infer<S>, Out>): S & Validator<Out>;
16
33
  export declare function refine<S extends Validator>(schema: S, refinement: RefinementCheck<Infer<S>>): S;
17
34
  export declare function refine<R extends Refinement, S extends Validator<InferRefinement<R>>>(schema: S, refinement: R): S;
@@ -1 +1 @@
1
- {"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../src/schema/refine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAEL,WAAW,EAEX,SAAS,EAEV,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAA;IACzD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI;IAClD,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,sBAAsB,KAAK,KAAK,IAAI,GAAG,CAAA;IAC1E,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IAC3B,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,CAAC,GAC9B,CAAC,GACD,CAAC,SAAS,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GACzC,CAAC,GACD,KAAK,CAAA;AAEb,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAC7C,eAAe,CAAC,CAAC,CAAC,GAClB,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAE/B,wBAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,EAC9D,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAC7C,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;AACrB,wBAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,EACxC,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GACpC,CAAC,CAAA;AACJ,wBAAgB,MAAM,CACpB,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EACvC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAA"}
1
+ {"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../src/schema/refine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAEL,WAAW,EAEX,SAAS,EAEV,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAA;IACzD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI;IAClD,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,sBAAsB,KAAK,KAAK,IAAI,GAAG,CAAA;IAC1E,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IAC3B,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,CAAC,GAC9B,CAAC,GACD,CAAC,SAAS,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GACzC,CAAC,GACD,KAAK,CAAA;AAEb,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAC7C,eAAe,CAAC,CAAC,CAAC,GAClB,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAE/B;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,EAC9D,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAC7C,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;AACrB,wBAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,EACxC,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GACpC,CAAC,CAAA;AACJ,wBAAgB,MAAM,CACpB,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EACvC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.refine = refine;
4
- const validation_js_1 = require("../validation.js");
4
+ const core_js_1 = require("../core.js");
5
5
  /*@__NO_SIDE_EFFECTS__*/
6
6
  function refine(schema, refinement) {
7
7
  // This is basically the same as monkey patching the "validateInContext"
@@ -26,7 +26,7 @@ function validateInContextUnbound(input, ctx) {
26
26
  const checkResult = this.refinement.check.call(null, result.value, ctx);
27
27
  if (!checkResult) {
28
28
  const path = ctx.concatPath(this.refinement.path);
29
- return ctx.issue(new validation_js_1.IssueCustom(path, input, this.refinement.message));
29
+ return ctx.issue(new core_js_1.IssueCustom(path, input, this.refinement.message));
30
30
  }
31
31
  return result;
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/schema/refine.ts"],"names":[],"mappings":";;AA8CA,wBAiBC;AA/DD,oDAOyB;AAsCzB,wBAAwB;AACxB,SAAgB,MAAM,CACpB,MAAS,EACT,UAAgC;IAEhC,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,6BAA6B;IAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QAC3B,iBAAiB,EAAE;YACjB,8DAA8D;YAC9D,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC5D,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,IAAI;SACnB;KACF,CAAC,CAAA;AACJ,CAAC;AAED,wBAAwB;AACxB,SAAS,wBAAwB,CAK/B,KAAc,EACd,GAAqB;IAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAA;IAElC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACjD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,2BAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import {\n Infer,\n IssueCustom,\n PropertyKey,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { CustomAssertionContext } from './custom.js'\n\nexport type RefinementCheck<T> = {\n check: (value: T, ctx: CustomAssertionContext) => boolean\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type RefinementAssertion<T, Out extends T> = {\n check: (this: null, value: T, ctx: CustomAssertionContext) => value is Out\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type InferRefinement<R> =\n R extends RefinementCheck<infer T>\n ? T\n : R extends RefinementAssertion<infer T, any>\n ? T\n : never\n\nexport type Refinement<T = any, Out extends T = T> =\n | RefinementCheck<T>\n | RefinementAssertion<T, Out>\n\nexport function refine<S extends Validator, Out extends Infer<S>>(\n schema: S,\n refinement: RefinementAssertion<Infer<S>, Out>,\n): S & Validator<Out>\nexport function refine<S extends Validator>(\n schema: S,\n refinement: RefinementCheck<Infer<S>>,\n): S\nexport function refine<\n R extends Refinement,\n S extends Validator<InferRefinement<R>>,\n>(schema: S, refinement: R): S\n/*@__NO_SIDE_EFFECTS__*/\nexport function refine<S extends Validator>(\n schema: S,\n refinement: Refinement<Infer<S>>,\n): S {\n // This is basically the same as monkey patching the \"validateInContext\"\n // method to the schema, but done in a way that does not mutate the original\n // schema. This is safe to do because Validators don't update their internal\n // state over their lifetime.\n return Object.create(schema, {\n validateInContext: {\n // We do not use an arrow function to avoid creating a closure\n value: validateInContextUnbound.bind({ schema, refinement }),\n enumerable: false,\n writable: false,\n configurable: true,\n },\n })\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction validateInContextUnbound<S extends Validator>(\n this: {\n schema: S\n refinement: Refinement<Infer<S>>\n },\n input: unknown,\n ctx: ValidatorContext,\n): ValidationResult<Infer<S>> {\n const result = ctx.validate(input, this.schema)\n if (!result.success) return result\n\n const checkResult = this.refinement.check.call(null, result.value, ctx)\n if (!checkResult) {\n const path = ctx.concatPath(this.refinement.path)\n return ctx.issue(new IssueCustom(path, input, this.refinement.message))\n }\n\n return result\n}\n"]}
1
+ {"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/schema/refine.ts"],"names":[],"mappings":";;AA+DA,wBAiBC;AAhFD,wCAOmB;AAuDnB,wBAAwB;AACxB,SAAgB,MAAM,CACpB,MAAS,EACT,UAAgC;IAEhC,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,6BAA6B;IAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QAC3B,iBAAiB,EAAE;YACjB,8DAA8D;YAC9D,KAAK,EAAE,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC5D,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,IAAI;SACnB;KACF,CAAC,CAAA;AACJ,CAAC;AAED,wBAAwB;AACxB,SAAS,wBAAwB,CAK/B,KAAc,EACd,GAAqB;IAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAA;IAElC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACjD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,qBAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import {\n Infer,\n IssueCustom,\n PropertyKey,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../core.js'\nimport { CustomAssertionContext } from './custom.js'\n\nexport type RefinementCheck<T> = {\n check: (value: T, ctx: CustomAssertionContext) => boolean\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type RefinementAssertion<T, Out extends T> = {\n check: (this: null, value: T, ctx: CustomAssertionContext) => value is Out\n message: string\n path?: PropertyKey | readonly PropertyKey[]\n}\n\nexport type InferRefinement<R> =\n R extends RefinementCheck<infer T>\n ? T\n : R extends RefinementAssertion<infer T, any>\n ? T\n : never\n\nexport type Refinement<T = any, Out extends T = T> =\n | RefinementCheck<T>\n | RefinementAssertion<T, Out>\n\n/**\n * Create a refined schema based on an existing schema and a refinement check.\n *\n * @param schema - The base schema to refine.\n * @param refinement - The refinement check to apply.\n * @returns A new schema that includes the refinement.\n * @example\n *\n * ```ts\n * const PositiveInt = refine(l.integer(), {\n * check: (value) => value > 0,\n * message: 'Value must be a positive integer',\n * })\n * const result = PositiveInt.validate(-5)\n * // result.success === false\n * ```\n */\nexport function refine<S extends Validator, Out extends Infer<S>>(\n schema: S,\n refinement: RefinementAssertion<Infer<S>, Out>,\n): S & Validator<Out>\nexport function refine<S extends Validator>(\n schema: S,\n refinement: RefinementCheck<Infer<S>>,\n): S\nexport function refine<\n R extends Refinement,\n S extends Validator<InferRefinement<R>>,\n>(schema: S, refinement: R): S\n/*@__NO_SIDE_EFFECTS__*/\nexport function refine<S extends Validator>(\n schema: S,\n refinement: Refinement<Infer<S>>,\n): S {\n // This is basically the same as monkey patching the \"validateInContext\"\n // method to the schema, but done in a way that does not mutate the original\n // schema. This is safe to do because Validators don't update their internal\n // state over their lifetime.\n return Object.create(schema, {\n validateInContext: {\n // We do not use an arrow function to avoid creating a closure\n value: validateInContextUnbound.bind({ schema, refinement }),\n enumerable: false,\n writable: false,\n configurable: true,\n },\n })\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nfunction validateInContextUnbound<S extends Validator>(\n this: {\n schema: S\n refinement: Refinement<Infer<S>>\n },\n input: unknown,\n ctx: ValidatorContext,\n): ValidationResult<Infer<S>> {\n const result = ctx.validate(input, this.schema)\n if (!result.success) return result\n\n const checkResult = this.refinement.check.call(null, result.value, ctx)\n if (!checkResult) {\n const path = ctx.concatPath(this.refinement.path)\n return ctx.issue(new IssueCustom(path, input, this.refinement.message))\n }\n\n return result\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Schema, ValidationResult, ValidatorContext } from '../validation';
1
+ import { Schema, ValidationResult, ValidatorContext } from '../core.js';
2
2
  export declare class RegexpSchema<T extends string> extends Schema<T> {
3
3
  readonly pattern: RegExp;
4
4
  constructor(pattern: RegExp);
@@ -1 +1 @@
1
- {"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../../src/schema/regexp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE1E,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;aAC/B,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;IAI3C,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;CAWvB"}
1
+ {"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../../src/schema/regexp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEvE,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;aAC/B,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;IAI3C,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;CAWvB"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RegexpSchema = void 0;
4
- const validation_1 = require("../validation");
5
- class RegexpSchema extends validation_1.Schema {
4
+ const core_js_1 = require("../core.js");
5
+ class RegexpSchema extends core_js_1.Schema {
6
6
  pattern;
7
7
  constructor(pattern) {
8
8
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"regexp.js","sourceRoot":"","sources":["../../src/schema/regexp.ts"],"names":[],"mappings":";;;AAAA,8CAA0E;AAE1E,MAAa,YAA+B,SAAQ,mBAAS;IAC/B;IAA5B,YAA4B,OAAe;QACzC,KAAK,EAAE,CAAA;QADmB,YAAO,GAAP,OAAO,CAAQ;IAE3C,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAU,CAAC,CAAA;IAChC,CAAC;CACF;AAnBD,oCAmBC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../validation'\n\nexport class RegexpSchema<T extends string> extends Schema<T> {\n constructor(public readonly pattern: RegExp) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<T> {\n if (typeof input !== 'string') {\n return ctx.issueInvalidType(input, 'string')\n }\n\n if (!this.pattern.test(input)) {\n return ctx.issueInvalidFormat(input, this.pattern.toString())\n }\n\n return ctx.success(input as T)\n }\n}\n"]}
1
+ {"version":3,"file":"regexp.js","sourceRoot":"","sources":["../../src/schema/regexp.ts"],"names":[],"mappings":";;;AAAA,wCAAuE;AAEvE,MAAa,YAA+B,SAAQ,gBAAS;IAC/B;IAA5B,YAA4B,OAAe;QACzC,KAAK,EAAE,CAAA;QADmB,YAAO,GAAP,OAAO,CAAQ;IAE3C,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAU,CAAC,CAAA;IAChC,CAAC;CACF;AAnBD,oCAmBC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../core.js'\n\nexport class RegexpSchema<T extends string> extends Schema<T> {\n constructor(public readonly pattern: RegExp) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<T> {\n if (typeof input !== 'string') {\n return ctx.issueInvalidType(input, 'string')\n }\n\n if (!this.pattern.test(input)) {\n return ctx.issueInvalidFormat(input, this.pattern.toString())\n }\n\n return ctx.success(input as T)\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
- import { InferStringFormat, StringFormat } from '../core.js';
2
- import { Schema, ValidationResult, ValidatorContext } from '../validation.js';
1
+ import { InferStringFormat, Schema, StringFormat, ValidationResult, ValidatorContext } from '../core.js';
3
2
  export type StringSchemaOptions = {
4
3
  default?: string;
5
4
  format?: StringFormat;
@@ -1 +1 @@
1
- {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/schema/string.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAA;AAChF,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAG7E,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAEpC,OAAO,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,SAAS,YAAY,CAAA;CAAE,GACpD,iBAAiB,CAAC,CAAC,CAAC,GACpB,MAAM,CAAA;AAEZ,qBAAa,YAAY,CACvB,KAAK,CAAC,OAAO,SAAS,mBAAmB,GAAG,GAAG,CAC/C,SAAQ,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO;gBAAhB,OAAO,EAAE,OAAO;IAIrC,iBAAiB,CAEf,KAAK,EAAE,OAAO,YAAuB,EACrC,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;CA6DjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAsC5D"}
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/schema/string.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,YAAY,CAAA;AAGnB,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAEpC,OAAO,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,SAAS,YAAY,CAAA;CAAE,GACpD,iBAAiB,CAAC,CAAC,CAAC,GACpB,MAAM,CAAA;AAEZ,qBAAa,YAAY,CACvB,KAAK,CAAC,OAAO,SAAS,mBAAmB,GAAG,GAAG,CAC/C,SAAQ,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO;gBAAhB,OAAO,EAAE,OAAO;IAIrC,iBAAiB,CAEf,KAAK,EAAE,OAAO,YAAuB,EACrC,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;CA6DjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAsC5D"}
@@ -4,9 +4,8 @@ exports.StringSchema = void 0;
4
4
  exports.coerceToString = coerceToString;
5
5
  const lex_data_1 = require("@atproto/lex-data");
6
6
  const core_js_1 = require("../core.js");
7
- const validation_js_1 = require("../validation.js");
8
7
  const token_js_1 = require("./token.js");
9
- class StringSchema extends validation_js_1.Schema {
8
+ class StringSchema extends core_js_1.Schema {
10
9
  options;
11
10
  constructor(options) {
12
11
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/schema/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { asCid, graphemeLen, utf8Len } from '@atproto/lex-data'\nimport { InferStringFormat, StringFormat, assertStringFormat } from '../core.js'\nimport { Schema, ValidationResult, ValidatorContext } from '../validation.js'\nimport { TokenSchema } from './token.js'\n\nexport type StringSchemaOptions = {\n default?: string\n format?: StringFormat\n minLength?: number\n maxLength?: number\n minGraphemes?: number\n maxGraphemes?: number\n}\n\nexport type StringSchemaOutput<Options> =\n //\n Options extends { format: infer F extends StringFormat }\n ? InferStringFormat<F>\n : string\n\nexport class StringSchema<\n const Options extends StringSchemaOptions = any,\n> extends Schema<StringSchemaOutput<Options>> {\n constructor(readonly options: Options) {\n super()\n }\n\n validateInContext(\n // @NOTE validation will be applied on the default value as well\n input: unknown = this.options.default,\n ctx: ValidatorContext,\n ): ValidationResult<StringSchemaOutput<Options>> {\n const { options } = this\n\n const str = coerceToString(input)\n if (str == null) {\n return ctx.issueInvalidType(input, 'string')\n }\n\n let lazyUtf8Len: number\n\n const { minLength } = options\n if (minLength != null) {\n if ((lazyUtf8Len ??= utf8Len(str)) < minLength) {\n return ctx.issueTooSmall(str, 'string', minLength, lazyUtf8Len)\n }\n }\n\n const { maxLength } = options\n if (maxLength != null) {\n // Optimization: we can avoid computing the UTF-8 length if the maximum\n // possible length, in bytes, of the input JS string is smaller than the\n // maxLength (in UTF-8 string bytes).\n if (str.length * 3 <= maxLength) {\n // Input string so small it can't possibly exceed maxLength\n } else if ((lazyUtf8Len ??= utf8Len(str)) > maxLength) {\n return ctx.issueTooBig(str, 'string', maxLength, lazyUtf8Len)\n }\n }\n\n let lazyGraphLen: number\n\n const { minGraphemes } = options\n if (minGraphemes != null) {\n // Optimization: avoid counting graphemes if the length check already fails\n if (str.length < minGraphemes) {\n return ctx.issueTooSmall(str, 'grapheme', minGraphemes, str.length)\n } else if ((lazyGraphLen ??= graphemeLen(str)) < minGraphemes) {\n return ctx.issueTooSmall(str, 'grapheme', minGraphemes, lazyGraphLen)\n }\n }\n\n const { maxGraphemes } = options\n if (maxGraphemes != null) {\n if ((lazyGraphLen ??= graphemeLen(str)) > maxGraphemes) {\n return ctx.issueTooBig(str, 'grapheme', maxGraphemes, lazyGraphLen)\n }\n }\n\n if (options.format !== undefined) {\n try {\n // @TODO optimize to avoid throw cost (requires re-writing utilities\n // from @atproto/syntax)\n assertStringFormat(str, options.format)\n } catch (err) {\n const message = err instanceof Error ? err.message : undefined\n return ctx.issueInvalidFormat(str, options.format, message)\n }\n }\n\n return ctx.success(str as StringSchemaOutput<Options>)\n }\n}\n\nexport function coerceToString(input: unknown): string | null {\n switch (typeof input) {\n // @NOTE We do *not* coerce numbers/booleans to strings because that can\n // lead to them being accepted as string instead of being coerced to\n // number/boolean when the input is a string and the expected result is\n // number/boolean (e.g. in params).\n case 'string':\n return input\n case 'object': {\n if (input == null) return null\n\n // @NOTE Allow using TokenSchema instances in places expecting strings,\n // converting them to their string value.\n if (input instanceof TokenSchema) {\n return input.toString()\n }\n\n if (input instanceof Date) {\n if (Number.isNaN(input.getTime())) return null\n return input.toISOString()\n }\n\n if (input instanceof URL) {\n return input.toString()\n }\n\n const cid = asCid(input)\n if (cid) return cid.toString()\n\n if (input instanceof String) {\n return input.valueOf()\n }\n }\n\n // falls through\n default:\n return null\n }\n}\n"]}
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/schema/string.ts"],"names":[],"mappings":"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","sourcesContent":["import { asCid, graphemeLen, utf8Len } from '@atproto/lex-data'\nimport {\n InferStringFormat,\n Schema,\n StringFormat,\n ValidationResult,\n ValidatorContext,\n assertStringFormat,\n} from '../core.js'\nimport { TokenSchema } from './token.js'\n\nexport type StringSchemaOptions = {\n default?: string\n format?: StringFormat\n minLength?: number\n maxLength?: number\n minGraphemes?: number\n maxGraphemes?: number\n}\n\nexport type StringSchemaOutput<Options> =\n //\n Options extends { format: infer F extends StringFormat }\n ? InferStringFormat<F>\n : string\n\nexport class StringSchema<\n const Options extends StringSchemaOptions = any,\n> extends Schema<StringSchemaOutput<Options>> {\n constructor(readonly options: Options) {\n super()\n }\n\n validateInContext(\n // @NOTE validation will be applied on the default value as well\n input: unknown = this.options.default,\n ctx: ValidatorContext,\n ): ValidationResult<StringSchemaOutput<Options>> {\n const { options } = this\n\n const str = coerceToString(input)\n if (str == null) {\n return ctx.issueInvalidType(input, 'string')\n }\n\n let lazyUtf8Len: number\n\n const { minLength } = options\n if (minLength != null) {\n if ((lazyUtf8Len ??= utf8Len(str)) < minLength) {\n return ctx.issueTooSmall(str, 'string', minLength, lazyUtf8Len)\n }\n }\n\n const { maxLength } = options\n if (maxLength != null) {\n // Optimization: we can avoid computing the UTF-8 length if the maximum\n // possible length, in bytes, of the input JS string is smaller than the\n // maxLength (in UTF-8 string bytes).\n if (str.length * 3 <= maxLength) {\n // Input string so small it can't possibly exceed maxLength\n } else if ((lazyUtf8Len ??= utf8Len(str)) > maxLength) {\n return ctx.issueTooBig(str, 'string', maxLength, lazyUtf8Len)\n }\n }\n\n let lazyGraphLen: number\n\n const { minGraphemes } = options\n if (minGraphemes != null) {\n // Optimization: avoid counting graphemes if the length check already fails\n if (str.length < minGraphemes) {\n return ctx.issueTooSmall(str, 'grapheme', minGraphemes, str.length)\n } else if ((lazyGraphLen ??= graphemeLen(str)) < minGraphemes) {\n return ctx.issueTooSmall(str, 'grapheme', minGraphemes, lazyGraphLen)\n }\n }\n\n const { maxGraphemes } = options\n if (maxGraphemes != null) {\n if ((lazyGraphLen ??= graphemeLen(str)) > maxGraphemes) {\n return ctx.issueTooBig(str, 'grapheme', maxGraphemes, lazyGraphLen)\n }\n }\n\n if (options.format !== undefined) {\n try {\n // @TODO optimize to avoid throw cost (requires re-writing utilities\n // from @atproto/syntax)\n assertStringFormat(str, options.format)\n } catch (err) {\n const message = err instanceof Error ? err.message : undefined\n return ctx.issueInvalidFormat(str, options.format, message)\n }\n }\n\n return ctx.success(str as StringSchemaOutput<Options>)\n }\n}\n\nexport function coerceToString(input: unknown): string | null {\n switch (typeof input) {\n // @NOTE We do *not* coerce numbers/booleans to strings because that can\n // lead to them being accepted as string instead of being coerced to\n // number/boolean when the input is a string and the expected result is\n // number/boolean (e.g. in params).\n case 'string':\n return input\n case 'object': {\n if (input == null) return null\n\n // @NOTE Allow using TokenSchema instances in places expecting strings,\n // converting them to their string value.\n if (input instanceof TokenSchema) {\n return input.toString()\n }\n\n if (input instanceof Date) {\n if (Number.isNaN(input.getTime())) return null\n return input.toISOString()\n }\n\n if (input instanceof URL) {\n return input.toString()\n }\n\n const cid = asCid(input)\n if (cid) return cid.toString()\n\n if (input instanceof String) {\n return input.valueOf()\n }\n }\n\n // falls through\n default:\n return null\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
- import { NsidString } from '../core.js';
2
- import { Infer, Schema } from '../validation.js';
1
+ import { Infer, NsidString, Schema } from '../core.js';
3
2
  import { ParamsSchema } from './params.js';
4
3
  export type InferSubscriptionParameters<S extends Subscription> = Infer<S['parameters']>;
5
4
  export type InferSubscriptionMessage<S extends Subscription> = Infer<S['message']>;
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,YAAY,IAAI,KAAK,CACrE,CAAC,CAAC,YAAY,CAAC,CAChB,CAAA;AAED,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,YAAY,IAAI,KAAK,CAClE,CAAC,CAAC,SAAS,CAAC,CACb,CAAA;AAED,qBAAa,YAAY,CACvB,KAAK,SAAS,UAAU,GAAG,UAAU,EACrC,WAAW,SAAS,YAAY,GAAG,YAAY,EAC/C,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,OAAO,SAAS,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE;IAK3E,QAAQ,CAAC,IAAI,EAAE,KAAK;IACpB,QAAQ,CAAC,UAAU,EAAE,WAAW;IAChC,QAAQ,CAAC,OAAO,EAAE,QAAQ;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO;IAN1B,QAAQ,CAAC,IAAI,EAAG,cAAc,CAAS;gBAG5B,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,OAAO;CAE3B"}
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,YAAY,IAAI,KAAK,CACrE,CAAC,CAAC,YAAY,CAAC,CAChB,CAAA;AAED,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,YAAY,IAAI,KAAK,CAClE,CAAC,CAAC,SAAS,CAAC,CACb,CAAA;AAED,qBAAa,YAAY,CACvB,KAAK,SAAS,UAAU,GAAG,UAAU,EACrC,WAAW,SAAS,YAAY,GAAG,YAAY,EAC/C,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,OAAO,SAAS,SAAS,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE;IAK3E,QAAQ,CAAC,IAAI,EAAE,KAAK;IACpB,QAAQ,CAAC,UAAU,EAAE,WAAW;IAChC,QAAQ,CAAC,OAAO,EAAE,QAAQ;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO;IAN1B,QAAQ,CAAC,IAAI,EAAG,cAAc,CAAS;gBAG5B,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,OAAO;CAE3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":";;;AAYA,MAAa,YAAY;IASZ;IACA;IACA;IACA;IANF,IAAI,GAAG,cAAuB,CAAA;IAEvC,YACW,IAAW,EACX,UAAuB,EACvB,OAAiB,EACjB,MAAe;QAHf,SAAI,GAAJ,IAAI,CAAO;QACX,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAU;QACjB,WAAM,GAAN,MAAM,CAAS;IACvB,CAAC;CACL;AAdD,oCAcC","sourcesContent":["import { NsidString } from '../core.js'\nimport { Infer, Schema } from '../validation.js'\nimport { ParamsSchema } from './params.js'\n\nexport type InferSubscriptionParameters<S extends Subscription> = Infer<\n S['parameters']\n>\n\nexport type InferSubscriptionMessage<S extends Subscription> = Infer<\n S['message']\n>\n\nexport class Subscription<\n TNsid extends NsidString = NsidString,\n TParameters extends ParamsSchema = ParamsSchema,\n TMessage extends Schema = Schema,\n TErrors extends undefined | readonly string[] = undefined | readonly string[],\n> {\n readonly type = 'subscription' as const\n\n constructor(\n readonly nsid: TNsid,\n readonly parameters: TParameters,\n readonly message: TMessage,\n readonly errors: TErrors,\n ) {}\n}\n"]}
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/schema/subscription.ts"],"names":[],"mappings":";;;AAWA,MAAa,YAAY;IASZ;IACA;IACA;IACA;IANF,IAAI,GAAG,cAAuB,CAAA;IAEvC,YACW,IAAW,EACX,UAAuB,EACvB,OAAiB,EACjB,MAAe;QAHf,SAAI,GAAJ,IAAI,CAAO;QACX,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAU;QACjB,WAAM,GAAN,MAAM,CAAS;IACvB,CAAC;CACL;AAdD,oCAcC","sourcesContent":["import { Infer, NsidString, Schema } from '../core.js'\nimport { ParamsSchema } from './params.js'\n\nexport type InferSubscriptionParameters<S extends Subscription> = Infer<\n S['parameters']\n>\n\nexport type InferSubscriptionMessage<S extends Subscription> = Infer<\n S['message']\n>\n\nexport class Subscription<\n TNsid extends NsidString = NsidString,\n TParameters extends ParamsSchema = ParamsSchema,\n TMessage extends Schema = Schema,\n TErrors extends undefined | readonly string[] = undefined | readonly string[],\n> {\n readonly type = 'subscription' as const\n\n constructor(\n readonly nsid: TNsid,\n readonly parameters: TParameters,\n readonly message: TMessage,\n readonly errors: TErrors,\n ) {}\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Schema, ValidationResult, ValidatorContext } from '../validation.js';
1
+ import { Schema, ValidationResult, ValidatorContext } from '../core.js';
2
2
  export declare class TokenSchema<V extends string = any> extends Schema<V> {
3
3
  protected readonly value: V;
4
4
  constructor(value: V);
@@ -1 +1 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/schema/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAAR,KAAK,EAAE,CAAC;IAIvC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;IAqBtB,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,MAAM;CAGnB"}
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/schema/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEvE,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAAR,KAAK,EAAE,CAAC;IAIvC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;IAqBtB,MAAM,IAAI,MAAM;IAIhB,QAAQ,IAAI,MAAM;CAGnB"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TokenSchema = void 0;
4
- const validation_js_1 = require("../validation.js");
5
- class TokenSchema extends validation_js_1.Schema {
4
+ const core_js_1 = require("../core.js");
5
+ class TokenSchema extends core_js_1.Schema {
6
6
  value;
7
7
  constructor(value) {
8
8
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/schema/token.ts"],"names":[],"mappings":";;;AAAA,oDAA6E;AAE7E,MAAa,WAAoC,SAAQ,sBAAS;IACjC;IAA/B,YAA+B,KAAQ;QACrC,KAAK,EAAE,CAAA;QADsB,UAAK,GAAL,KAAK,CAAG;IAEvC,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QAED,0EAA0E;QAC1E,eAAe;QACf,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/D,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,yEAAyE;IACzE,cAAc;IAEd,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF;AApCD,kCAoCC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../validation.js'\n\nexport class TokenSchema<V extends string = any> extends Schema<V> {\n constructor(protected readonly value: V) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V> {\n if (input === this.value) {\n return ctx.success(this.value)\n }\n\n // @NOTE: allow using the token instance itself (but convert to the actual\n // token value)\n if (input instanceof TokenSchema && input.value === this.value) {\n return ctx.success(this.value)\n }\n\n if (typeof input !== 'string') {\n return ctx.issueInvalidType(input, 'token')\n }\n\n return ctx.issueInvalidValue(input, [this.value])\n }\n\n // When using the TokenSchema instance as data, let's serialize it to the\n // token value\n\n toJSON(): string {\n return this.value\n }\n\n toString(): string {\n return this.value\n }\n}\n"]}
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/schema/token.ts"],"names":[],"mappings":";;;AAAA,wCAAuE;AAEvE,MAAa,WAAoC,SAAQ,gBAAS;IACjC;IAA/B,YAA+B,KAAQ;QACrC,KAAK,EAAE,CAAA;QADsB,UAAK,GAAL,KAAK,CAAG;IAEvC,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QAED,0EAA0E;QAC1E,eAAe;QACf,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/D,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,yEAAyE;IACzE,cAAc;IAEd,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF;AApCD,kCAoCC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../core.js'\n\nexport class TokenSchema<V extends string = any> extends Schema<V> {\n constructor(protected readonly value: V) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V> {\n if (input === this.value) {\n return ctx.success(this.value)\n }\n\n // @NOTE: allow using the token instance itself (but convert to the actual\n // token value)\n if (input instanceof TokenSchema && input.value === this.value) {\n return ctx.success(this.value)\n }\n\n if (typeof input !== 'string') {\n return ctx.issueInvalidType(input, 'token')\n }\n\n return ctx.issueInvalidValue(input, [this.value])\n }\n\n // When using the TokenSchema instance as data, let's serialize it to the\n // token value\n\n toJSON(): string {\n return this.value\n }\n\n toString(): string {\n return this.value\n }\n}\n"]}
@@ -1,11 +1,8 @@
1
- import { $Type, Simplify } from '../core.js';
2
- import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
1
+ import { $Type, $Typed, $TypedMaybe, Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../core.js';
3
2
  import { TypedObject } from './typed-union.js';
4
3
  export type TypedObjectSchemaOutput<T extends $Type, S extends Validator<{
5
4
  [k: string]: unknown;
6
- }>> = Simplify<Infer<S> & {
7
- $type?: T;
8
- }>;
5
+ }>> = $TypedMaybe<Infer<S>, T>;
9
6
  export declare class TypedObjectSchema<const T extends $Type = any, const S extends Validator<{
10
7
  [k: string]: unknown;
11
8
  }> = any> extends Schema<TypedObjectSchemaOutput<T, S>> {
@@ -14,17 +11,15 @@ export declare class TypedObjectSchema<const T extends $Type = any, const S exte
14
11
  constructor($type: T, schema: S);
15
12
  isTypeOf<X extends Record<string, unknown>>(value: X): value is Exclude<X extends {
16
13
  $type?: T;
17
- } ? X : X & {
18
- $type?: T;
19
- }, TypedObject>;
20
- build<X extends Omit<Infer<S>, '$type'>>(input: X): Simplify<Omit<X, '$type'> & {
21
- $type: T;
22
- }>;
14
+ } ? X : $TypedMaybe<X, T>, TypedObject>;
15
+ build<X extends Omit<Infer<S>, '$type'>>(input: X): $Typed<Omit<X, '$type'>, T>;
23
16
  $isTypeOf<X extends Record<string, unknown>>(value: X): value is Exclude<X extends {
24
17
  $type?: T;
25
18
  } ? X : X & {
26
- $type?: T;
27
- }, TypedObject>;
19
+ $type?: T | undefined;
20
+ } extends infer T_1 ? { [K in keyof T_1]: (X & {
21
+ $type?: T | undefined;
22
+ })[K]; } : never, TypedObject>;
28
23
  $build<X extends Omit<Infer<S>, '$type'>>(input: X): Omit<X, "$type"> & {
29
24
  $type: T;
30
25
  } extends infer T_1 ? { [K in keyof T_1]: (Omit<X, "$type"> & {
@@ -1 +1 @@
1
- {"version":3,"file":"typed-object.d.ts","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,uBAAuB,CACjC,CAAC,SAAS,KAAK,EACf,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,IAC3C,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,CAAA;AAEtC,qBAAa,iBAAiB,CAC5B,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,GAAG,EAC3B,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,GAAG,CACzD,SAAQ,MAAM,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3C,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,CAAC;gBADT,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC;IAKpB,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,OAAO,CACjB,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,EAC/C,WAAW,CACZ;IAID,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC;IAI5C,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;gBAZ/B,CAAC;;gBAAuB,CAAC;;IAgB/C,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;eARV,CAAC;;eAAD,CAAC;;IAYzC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAiBnD"}
1
+ {"version":3,"file":"typed-object.d.ts","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,MAAM,EACN,WAAW,EACX,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,uBAAuB,CACjC,CAAC,SAAS,KAAK,EACf,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,IAC3C,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAE5B,qBAAa,iBAAiB,CAC5B,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,GAAG,EAC3B,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAAG,GAAG,CACzD,SAAQ,MAAM,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3C,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,CAAC;gBADT,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC;IAKpB,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,OAAO,CACjB,CAAC,SAAS;QAAE,KAAK,CAAC,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAC/C,WAAW,CACZ;IAID,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,GACP,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAM9B,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;gBAd/B,CAAC;;;;;;IAkBvB,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;;;;;IAIlD,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAiBnD"}
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TypedObjectSchema = void 0;
4
4
  const lex_data_1 = require("@atproto/lex-data");
5
- const validation_js_1 = require("../validation.js");
6
- class TypedObjectSchema extends validation_js_1.Schema {
5
+ const core_js_1 = require("../core.js");
6
+ class TypedObjectSchema extends core_js_1.Schema {
7
7
  $type;
8
8
  schema;
9
9
  constructor($type, schema) {
@@ -15,7 +15,9 @@ class TypedObjectSchema extends validation_js_1.Schema {
15
15
  return value.$type === undefined || value.$type === this.$type;
16
16
  }
17
17
  build(input) {
18
- return { ...input, $type: this.$type };
18
+ return input.$type === this.$type
19
+ ? input
20
+ : { ...input, $type: this.$type };
19
21
  }
20
22
  $isTypeOf(value) {
21
23
  return this.isTypeOf(value);
@@ -1 +1 @@
1
- {"version":3,"file":"typed-object.js","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AAEjD,oDAMyB;AAQzB,MAAa,iBAGX,SAAQ,sBAAqC;IAElC;IACA;IAFX,YACW,KAAQ,EACR,MAAS;QAElB,KAAK,EAAE,CAAA;QAHE,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;IAGpB,CAAC;IAED,QAAQ,CACN,KAAQ;QAKR,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IAChE,CAAC;IAED,KAAK,CACH,KAAQ;QAER,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,SAAS,CAAoC,KAAQ;QACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,CAAoC,KAAQ;QAChD,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAED,IACE,OAAO,IAAI,KAAK;YAChB,KAAK,CAAC,KAAK,KAAK,SAAS;YACzB,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAC1B,CAAC;YACD,OAAO,GAAG,CAAC,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAErC,CAAA;IACH,CAAC;CACF;AAtDD,8CAsDC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { $Type, Simplify } from '../core.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { TypedObject } from './typed-union.js'\n\nexport type TypedObjectSchemaOutput<\n T extends $Type,\n S extends Validator<{ [k: string]: unknown }>,\n> = Simplify<Infer<S> & { $type?: T }>\n\nexport class TypedObjectSchema<\n const T extends $Type = any,\n const S extends Validator<{ [k: string]: unknown }> = any,\n> extends Schema<TypedObjectSchemaOutput<T, S>> {\n constructor(\n readonly $type: T,\n readonly schema: S,\n ) {\n super()\n }\n\n isTypeOf<X extends Record<string, unknown>>(\n value: X,\n ): value is Exclude<\n X extends { $type?: T } ? X : X & { $type?: T },\n TypedObject\n > {\n return value.$type === undefined || value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): Simplify<Omit<X, '$type'> & { $type: T }> {\n return { ...input, $type: this.$type }\n }\n\n $isTypeOf<X extends Record<string, unknown>>(value: X) {\n return this.isTypeOf(value)\n }\n\n $build<X extends Omit<Infer<S>, '$type'>>(input: X) {\n return this.build<X>(input)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<TypedObjectSchemaOutput<T, S>> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'object')\n }\n\n if (\n '$type' in input &&\n input.$type !== undefined &&\n input.$type !== this.$type\n ) {\n return ctx.issueInvalidPropertyValue(input, '$type', [this.$type])\n }\n\n return ctx.validate(input, this.schema) as ValidationResult<\n TypedObjectSchemaOutput<T, S>\n >\n }\n}\n"]}
1
+ {"version":3,"file":"typed-object.js","sourceRoot":"","sources":["../../src/schema/typed-object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,wCASmB;AAQnB,MAAa,iBAGX,SAAQ,gBAAqC;IAElC;IACA;IAFX,YACW,KAAQ,EACR,MAAS;QAElB,KAAK,EAAE,CAAA;QAHE,UAAK,GAAL,KAAK,CAAG;QACR,WAAM,GAAN,MAAM,CAAG;IAGpB,CAAC;IAED,QAAQ,CACN,KAAQ;QAKR,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAA;IAChE,CAAC;IAED,KAAK,CACH,KAAQ;QAER,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YAC/B,CAAC,CAAE,KAAsB;YACzB,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACrC,CAAC;IAED,SAAS,CAAoC,KAAQ;QACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,CAAoC,KAAQ;QAChD,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAED,IACE,OAAO,IAAI,KAAK;YAChB,KAAK,CAAC,KAAK,KAAK,SAAS;YACzB,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAC1B,CAAC;YACD,OAAO,GAAG,CAAC,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAErC,CAAA;IACH,CAAC;CACF;AAxDD,8CAwDC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport {\n $Type,\n $Typed,\n $TypedMaybe,\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../core.js'\nimport { TypedObject } from './typed-union.js'\n\nexport type TypedObjectSchemaOutput<\n T extends $Type,\n S extends Validator<{ [k: string]: unknown }>,\n> = $TypedMaybe<Infer<S>, T>\n\nexport class TypedObjectSchema<\n const T extends $Type = any,\n const S extends Validator<{ [k: string]: unknown }> = any,\n> extends Schema<TypedObjectSchemaOutput<T, S>> {\n constructor(\n readonly $type: T,\n readonly schema: S,\n ) {\n super()\n }\n\n isTypeOf<X extends Record<string, unknown>>(\n value: X,\n ): value is Exclude<\n X extends { $type?: T } ? X : $TypedMaybe<X, T>,\n TypedObject\n > {\n return value.$type === undefined || value.$type === this.$type\n }\n\n build<X extends Omit<Infer<S>, '$type'>>(\n input: X,\n ): $Typed<Omit<X, '$type'>, T> {\n return input.$type === this.$type\n ? (input as $Typed<X, T>)\n : { ...input, $type: this.$type }\n }\n\n $isTypeOf<X extends Record<string, unknown>>(value: X) {\n return this.isTypeOf(value)\n }\n\n $build<X extends Omit<Infer<S>, '$type'>>(input: X) {\n return this.build<X>(input)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<TypedObjectSchemaOutput<T, S>> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'object')\n }\n\n if (\n '$type' in input &&\n input.$type !== undefined &&\n input.$type !== this.$type\n ) {\n return ctx.issueInvalidPropertyValue(input, '$type', [this.$type])\n }\n\n return ctx.validate(input, this.schema) as ValidationResult<\n TypedObjectSchemaOutput<T, S>\n >\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
1
+ import { Schema, ValidationResult, Validator, ValidatorContext } from '../core.js';
2
2
  export type TypedRefSchemaValidator<V extends {
3
3
  $type?: string;
4
4
  } = any> = V extends {
@@ -1 +1 @@
1
- {"version":3,"file":"typed-ref.d.ts","sourceRoot":"","sources":["../../src/schema/typed-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAGzB,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IACpE,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,GAC3C,KAAK,CAAA;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IAC3D,MAAM,uBAAuB,CAAC,CAAC,CAAC,CAAA;AAElC,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IACjE,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GAAG,CAAC,GAAG;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,KAAK,CAAA;AAEzE,qBAAa,cAAc,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAE,SAAQ,MAAM,CAC5E,oBAAoB,CAAC,CAAC,CAAC,CACxB;;gBAGa,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IASrC,IAAI,MAAM,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAgBvC;IAED,IAAI,KAAK,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAE5C;IAED,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;CAU7C"}
1
+ {"version":3,"file":"typed-ref.d.ts","sourceRoot":"","sources":["../../src/schema/typed-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAGnB,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IACpE,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GACxC;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,GAC3C,KAAK,CAAA;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IAC3D,MAAM,uBAAuB,CAAC,CAAC,CAAC,CAAA;AAElC,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,IACjE,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GAAG,CAAC,GAAG;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,KAAK,CAAA;AAEzE,qBAAa,cAAc,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAE,SAAQ,MAAM,CAC5E,oBAAoB,CAAC,CAAC,CAAC,CACxB;;gBAGa,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IASrC,IAAI,MAAM,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAgBvC;IAED,IAAI,KAAK,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAE5C;IAED,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;CAU7C"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TypedRefSchema = void 0;
4
- const validation_js_1 = require("../validation.js");
5
- class TypedRefSchema extends validation_js_1.Schema {
4
+ const core_js_1 = require("../core.js");
5
+ class TypedRefSchema extends core_js_1.Schema {
6
6
  #getter;
7
7
  constructor(getter) {
8
8
  // @NOTE In order to avoid circular dependency issues, we don't resolve
@@ -1 +1 @@
1
- {"version":3,"file":"typed-ref.js","sourceRoot":"","sources":["../../src/schema/typed-ref.ts"],"names":[],"mappings":";;;AAAA,oDAKyB;AAczB,MAAa,cAAmD,SAAQ,sBAEvE;IACC,OAAO,CAAmB;IAE1B,YAAY,MAAyB;QACnC,uEAAuE;QACvE,sEAAsE;QAEtE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,MAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErC,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAA;QAEjC,4CAA4C;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;YACpC,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;IAC1B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAA;QAElC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,yBAAyB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,MAAmD,CAAA;IAC5D,CAAC;CACF;AAjDD,wCAiDC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import {\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\n// Basically a RecordSchema or TypedObjectSchema\nexport type TypedRefSchemaValidator<V extends { $type?: string } = any> =\n V extends { $type?: infer T extends string }\n ? { $type: T } & Validator<V & { $type?: T }>\n : never\n\nexport type TypedRefGetter<V extends { $type?: string } = any> =\n () => TypedRefSchemaValidator<V>\n\nexport type TypedRefSchemaOutput<V extends { $type?: string } = any> =\n V extends { $type?: infer T extends string } ? V & { $type: T } : never\n\nexport class TypedRefSchema<V extends { $type?: string } = any> extends Schema<\n TypedRefSchemaOutput<V>\n> {\n #getter: TypedRefGetter<V>\n\n constructor(getter: TypedRefGetter<V>) {\n // @NOTE In order to avoid circular dependency issues, we don't resolve\n // the schema here. Instead, we resolve it lazily when first accessed.\n\n super()\n\n this.#getter = getter\n }\n\n get schema(): TypedRefSchemaValidator<V> {\n const value = this.#getter.call(null)\n\n // Prevents a getter from depending on itself recursively, also allows GC to\n // clean up the getter function.\n this.#getter = throwAlreadyCalled\n\n // Cache the resolved schema on the instance\n Object.defineProperty(this, 'schema', {\n value,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return value\n }\n\n get $type(): TypedRefSchemaOutput<V>['$type'] {\n return this.schema.$type\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<TypedRefSchemaOutput<V>> {\n const result = ctx.validate(input, this.schema)\n if (!result.success) return result\n\n if (result.value.$type !== this.$type) {\n return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type])\n }\n\n return result as ValidationResult<TypedRefSchemaOutput<V>>\n }\n}\n\nfunction throwAlreadyCalled(): never {\n throw new Error('TypedRefSchema getter called multiple times')\n}\n"]}
1
+ {"version":3,"file":"typed-ref.js","sourceRoot":"","sources":["../../src/schema/typed-ref.ts"],"names":[],"mappings":";;;AAAA,wCAKmB;AAcnB,MAAa,cAAmD,SAAQ,gBAEvE;IACC,OAAO,CAAmB;IAE1B,YAAY,MAAyB;QACnC,uEAAuE;QACvE,sEAAsE;QAEtE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,IAAI,MAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErC,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAA;QAEjC,4CAA4C;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;YACpC,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;IAC1B,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAA;QAElC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,yBAAyB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,MAAmD,CAAA;IAC5D,CAAC;CACF;AAjDD,wCAiDC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;AAChE,CAAC","sourcesContent":["import {\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../core.js'\n\n// Basically a RecordSchema or TypedObjectSchema\nexport type TypedRefSchemaValidator<V extends { $type?: string } = any> =\n V extends { $type?: infer T extends string }\n ? { $type: T } & Validator<V & { $type?: T }>\n : never\n\nexport type TypedRefGetter<V extends { $type?: string } = any> =\n () => TypedRefSchemaValidator<V>\n\nexport type TypedRefSchemaOutput<V extends { $type?: string } = any> =\n V extends { $type?: infer T extends string } ? V & { $type: T } : never\n\nexport class TypedRefSchema<V extends { $type?: string } = any> extends Schema<\n TypedRefSchemaOutput<V>\n> {\n #getter: TypedRefGetter<V>\n\n constructor(getter: TypedRefGetter<V>) {\n // @NOTE In order to avoid circular dependency issues, we don't resolve\n // the schema here. Instead, we resolve it lazily when first accessed.\n\n super()\n\n this.#getter = getter\n }\n\n get schema(): TypedRefSchemaValidator<V> {\n const value = this.#getter.call(null)\n\n // Prevents a getter from depending on itself recursively, also allows GC to\n // clean up the getter function.\n this.#getter = throwAlreadyCalled\n\n // Cache the resolved schema on the instance\n Object.defineProperty(this, 'schema', {\n value,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return value\n }\n\n get $type(): TypedRefSchemaOutput<V>['$type'] {\n return this.schema.$type\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<TypedRefSchemaOutput<V>> {\n const result = ctx.validate(input, this.schema)\n if (!result.success) return result\n\n if (result.value.$type !== this.$type) {\n return ctx.issueInvalidPropertyValue(result.value, '$type', [this.$type])\n }\n\n return result as ValidationResult<TypedRefSchemaOutput<V>>\n }\n}\n\nfunction throwAlreadyCalled(): never {\n throw new Error('TypedRefSchema getter called multiple times')\n}\n"]}