@atproto/lex-schema 0.0.2 → 0.0.3

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 (289) hide show
  1. package/CHANGELOG.md +68 -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 +1 -0
  5. package/dist/core/$type.js.map +1 -1
  6. package/dist/core/record-key.d.ts +3 -3
  7. package/dist/core/record-key.d.ts.map +1 -1
  8. package/dist/core/record-key.js +12 -6
  9. package/dist/core/record-key.js.map +1 -1
  10. package/dist/core/result.d.ts.map +1 -1
  11. package/dist/core/result.js +6 -0
  12. package/dist/core/result.js.map +1 -1
  13. package/dist/core/string-format.d.ts +30 -27
  14. package/dist/core/string-format.d.ts.map +1 -1
  15. package/dist/core/string-format.js +56 -42
  16. package/dist/core/string-format.js.map +1 -1
  17. package/dist/core/types.d.ts +9 -1
  18. package/dist/core/types.d.ts.map +1 -1
  19. package/dist/core/types.js.map +1 -1
  20. package/dist/external.d.ts +31 -28
  21. package/dist/external.d.ts.map +1 -1
  22. package/dist/external.js +33 -17
  23. package/dist/external.js.map +1 -1
  24. package/dist/schema/_parameters.d.ts +2 -2
  25. package/dist/schema/_parameters.d.ts.map +1 -1
  26. package/dist/schema/array.d.ts +5 -6
  27. package/dist/schema/array.d.ts.map +1 -1
  28. package/dist/schema/array.js +5 -6
  29. package/dist/schema/array.js.map +1 -1
  30. package/dist/schema/blob.d.ts +2 -3
  31. package/dist/schema/blob.d.ts.map +1 -1
  32. package/dist/schema/blob.js +1 -2
  33. package/dist/schema/blob.js.map +1 -1
  34. package/dist/schema/boolean.d.ts +4 -5
  35. package/dist/schema/boolean.d.ts.map +1 -1
  36. package/dist/schema/boolean.js +2 -3
  37. package/dist/schema/boolean.js.map +1 -1
  38. package/dist/schema/bytes.d.ts +3 -4
  39. package/dist/schema/bytes.d.ts.map +1 -1
  40. package/dist/schema/bytes.js +2 -3
  41. package/dist/schema/bytes.js.map +1 -1
  42. package/dist/schema/cid.d.ts +13 -6
  43. package/dist/schema/cid.d.ts.map +1 -1
  44. package/dist/schema/cid.js +2 -4
  45. package/dist/schema/cid.js.map +1 -1
  46. package/dist/schema/custom.d.ts +3 -4
  47. package/dist/schema/custom.d.ts.map +1 -1
  48. package/dist/schema/custom.js +4 -3
  49. package/dist/schema/custom.js.map +1 -1
  50. package/dist/schema/dict.d.ts +3 -3
  51. package/dist/schema/dict.d.ts.map +1 -1
  52. package/dist/schema/dict.js +1 -1
  53. package/dist/schema/dict.js.map +1 -1
  54. package/dist/schema/discriminated-union.d.ts +15 -24
  55. package/dist/schema/discriminated-union.d.ts.map +1 -1
  56. package/dist/schema/discriminated-union.js +40 -64
  57. package/dist/schema/discriminated-union.js.map +1 -1
  58. package/dist/schema/enum.d.ts +8 -4
  59. package/dist/schema/enum.d.ts.map +1 -1
  60. package/dist/schema/enum.js +5 -3
  61. package/dist/schema/enum.js.map +1 -1
  62. package/dist/schema/integer.d.ts +3 -4
  63. package/dist/schema/integer.d.ts.map +1 -1
  64. package/dist/schema/integer.js +3 -4
  65. package/dist/schema/integer.js.map +1 -1
  66. package/dist/schema/intersection.d.ts +22 -14
  67. package/dist/schema/intersection.d.ts.map +1 -1
  68. package/dist/schema/intersection.js +12 -22
  69. package/dist/schema/intersection.js.map +1 -1
  70. package/dist/schema/literal.d.ts +7 -3
  71. package/dist/schema/literal.d.ts.map +1 -1
  72. package/dist/schema/literal.js +5 -3
  73. package/dist/schema/literal.js.map +1 -1
  74. package/dist/schema/never.d.ts +2 -2
  75. package/dist/schema/never.d.ts.map +1 -1
  76. package/dist/schema/never.js +1 -1
  77. package/dist/schema/never.js.map +1 -1
  78. package/dist/schema/null.d.ts +2 -3
  79. package/dist/schema/null.d.ts.map +1 -1
  80. package/dist/schema/null.js +1 -2
  81. package/dist/schema/null.js.map +1 -1
  82. package/dist/schema/nullable.d.ts +7 -0
  83. package/dist/schema/nullable.d.ts.map +1 -0
  84. package/dist/schema/nullable.js +19 -0
  85. package/dist/schema/nullable.js.map +1 -0
  86. package/dist/schema/object.d.ts +10 -44
  87. package/dist/schema/object.d.ts.map +1 -1
  88. package/dist/schema/object.js +10 -46
  89. package/dist/schema/object.js.map +1 -1
  90. package/dist/schema/optional.d.ts +7 -0
  91. package/dist/schema/optional.d.ts.map +1 -0
  92. package/dist/schema/optional.js +25 -0
  93. package/dist/schema/optional.js.map +1 -0
  94. package/dist/schema/params.d.ts +14 -19
  95. package/dist/schema/params.d.ts.map +1 -1
  96. package/dist/schema/params.js +10 -24
  97. package/dist/schema/params.js.map +1 -1
  98. package/dist/schema/payload.d.ts +4 -4
  99. package/dist/schema/payload.d.ts.map +1 -1
  100. package/dist/schema/payload.js.map +1 -1
  101. package/dist/schema/permission-set.d.ts +6 -6
  102. package/dist/schema/permission-set.d.ts.map +1 -1
  103. package/dist/schema/permission-set.js +1 -2
  104. package/dist/schema/permission-set.js.map +1 -1
  105. package/dist/schema/permission.d.ts +0 -1
  106. package/dist/schema/permission.d.ts.map +1 -1
  107. package/dist/schema/permission.js +0 -1
  108. package/dist/schema/permission.js.map +1 -1
  109. package/dist/schema/procedure.d.ts +8 -9
  110. package/dist/schema/procedure.d.ts.map +1 -1
  111. package/dist/schema/procedure.js +0 -1
  112. package/dist/schema/procedure.js.map +1 -1
  113. package/dist/schema/query.d.ts +7 -8
  114. package/dist/schema/query.d.ts.map +1 -1
  115. package/dist/schema/query.js +0 -1
  116. package/dist/schema/query.js.map +1 -1
  117. package/dist/schema/record.d.ts +34 -28
  118. package/dist/schema/record.d.ts.map +1 -1
  119. package/dist/schema/record.js +1 -2
  120. package/dist/schema/record.js.map +1 -1
  121. package/dist/schema/ref.d.ts +2 -3
  122. package/dist/schema/ref.d.ts.map +1 -1
  123. package/dist/schema/ref.js +1 -2
  124. package/dist/schema/ref.js.map +1 -1
  125. package/dist/schema/refine.d.ts +18 -0
  126. package/dist/schema/refine.d.ts.map +1 -0
  127. package/dist/schema/refine.js +33 -0
  128. package/dist/schema/refine.js.map +1 -0
  129. package/dist/schema/regexp.d.ts +7 -0
  130. package/dist/schema/regexp.d.ts.map +1 -0
  131. package/dist/schema/regexp.js +22 -0
  132. package/dist/schema/regexp.js.map +1 -0
  133. package/dist/schema/string.d.ts +4 -8
  134. package/dist/schema/string.d.ts.map +1 -1
  135. package/dist/schema/string.js +6 -3
  136. package/dist/schema/string.js.map +1 -1
  137. package/dist/schema/subscription.d.ts +7 -6
  138. package/dist/schema/subscription.d.ts.map +1 -1
  139. package/dist/schema/subscription.js.map +1 -1
  140. package/dist/schema/token.d.ts +2 -3
  141. package/dist/schema/token.d.ts.map +1 -1
  142. package/dist/schema/token.js +1 -2
  143. package/dist/schema/token.js.map +1 -1
  144. package/dist/schema/typed-object.d.ts +29 -27
  145. package/dist/schema/typed-object.d.ts.map +1 -1
  146. package/dist/schema/typed-object.js +1 -2
  147. package/dist/schema/typed-object.js.map +1 -1
  148. package/dist/schema/typed-ref.d.ts +2 -2
  149. package/dist/schema/typed-ref.d.ts.map +1 -1
  150. package/dist/schema/typed-ref.js +1 -1
  151. package/dist/schema/typed-ref.js.map +1 -1
  152. package/dist/schema/typed-union.d.ts +3 -4
  153. package/dist/schema/typed-union.d.ts.map +1 -1
  154. package/dist/schema/typed-union.js +3 -10
  155. package/dist/schema/typed-union.js.map +1 -1
  156. package/dist/schema/union.d.ts +2 -2
  157. package/dist/schema/union.d.ts.map +1 -1
  158. package/dist/schema/union.js +1 -1
  159. package/dist/schema/union.js.map +1 -1
  160. package/dist/schema/unknown-object.d.ts +2 -3
  161. package/dist/schema/unknown-object.d.ts.map +1 -1
  162. package/dist/schema/unknown-object.js +1 -2
  163. package/dist/schema/unknown-object.js.map +1 -1
  164. package/dist/schema/unknown.d.ts +2 -2
  165. package/dist/schema/unknown.d.ts.map +1 -1
  166. package/dist/schema/unknown.js +1 -1
  167. package/dist/schema/unknown.js.map +1 -1
  168. package/dist/schema.d.ts +4 -0
  169. package/dist/schema.d.ts.map +1 -1
  170. package/dist/schema.js +6 -1
  171. package/dist/schema.js.map +1 -1
  172. package/dist/util/array-agg.d.ts.map +1 -1
  173. package/dist/util/array-agg.js +1 -0
  174. package/dist/util/array-agg.js.map +1 -1
  175. package/dist/util/lazy-property.d.ts +2 -0
  176. package/dist/util/lazy-property.d.ts.map +1 -0
  177. package/dist/util/lazy-property.js +14 -0
  178. package/dist/util/lazy-property.js.map +1 -0
  179. package/dist/validation/schema.d.ts +24 -0
  180. package/dist/validation/schema.d.ts.map +1 -0
  181. package/dist/validation/schema.js +57 -0
  182. package/dist/validation/schema.js.map +1 -0
  183. package/dist/validation/validation-error.d.ts +3 -3
  184. package/dist/validation/validation-error.d.ts.map +1 -1
  185. package/dist/validation/validation-error.js +32 -4
  186. package/dist/validation/validation-error.js.map +1 -1
  187. package/dist/validation/validation-issue.d.ts +32 -24
  188. package/dist/validation/validation-issue.d.ts.map +1 -1
  189. package/dist/validation/validation-issue.js +136 -92
  190. package/dist/validation/validation-issue.js.map +1 -1
  191. package/dist/validation/validator.d.ts +20 -50
  192. package/dist/validation/validator.d.ts.map +1 -1
  193. package/dist/validation/validator.js +40 -134
  194. package/dist/validation/validator.js.map +1 -1
  195. package/dist/validation.d.ts +1 -0
  196. package/dist/validation.d.ts.map +1 -1
  197. package/dist/validation.js +1 -0
  198. package/dist/validation.js.map +1 -1
  199. package/package.json +8 -4
  200. package/src/core/$type.ts +7 -4
  201. package/src/core/record-key.ts +12 -5
  202. package/src/core/result.ts +6 -0
  203. package/src/core/string-format.ts +97 -61
  204. package/src/core/types.ts +12 -6
  205. package/src/external.ts +92 -70
  206. package/src/schema/_parameters.test.ts +416 -0
  207. package/src/schema/array.test.ts +237 -0
  208. package/src/schema/array.ts +17 -11
  209. package/src/schema/blob.test.ts +506 -0
  210. package/src/schema/blob.ts +3 -5
  211. package/src/schema/boolean.test.ts +116 -0
  212. package/src/schema/boolean.ts +5 -7
  213. package/src/schema/bytes.test.ts +226 -0
  214. package/src/schema/bytes.ts +4 -6
  215. package/src/schema/cid.test.ts +155 -0
  216. package/src/schema/cid.ts +14 -8
  217. package/src/schema/custom.test.ts +413 -0
  218. package/src/schema/custom.ts +10 -8
  219. package/src/schema/dict.test.ts +198 -0
  220. package/src/schema/dict.ts +6 -8
  221. package/src/schema/discriminated-union.test.ts +675 -0
  222. package/src/schema/discriminated-union.ts +68 -95
  223. package/src/schema/enum.test.ts +396 -0
  224. package/src/schema/enum.ts +12 -5
  225. package/src/schema/integer.test.ts +312 -0
  226. package/src/schema/integer.ts +5 -7
  227. package/src/schema/intersection.test.ts +32 -0
  228. package/src/schema/intersection.ts +37 -40
  229. package/src/schema/literal.test.ts +531 -0
  230. package/src/schema/literal.ts +12 -5
  231. package/src/schema/never.test.ts +174 -0
  232. package/src/schema/never.ts +3 -10
  233. package/src/schema/null.test.ts +79 -0
  234. package/src/schema/null.ts +3 -5
  235. package/src/schema/nullable.test.ts +480 -0
  236. package/src/schema/nullable.ts +23 -0
  237. package/src/schema/object.test.ts +47 -115
  238. package/src/schema/object.ts +19 -123
  239. package/src/schema/optional.test.ts +485 -0
  240. package/src/schema/optional.ts +31 -0
  241. package/src/schema/params.test.ts +582 -0
  242. package/src/schema/params.ts +37 -55
  243. package/src/schema/payload.test.ts +345 -0
  244. package/src/schema/payload.ts +5 -5
  245. package/src/schema/permission-set.test.ts +679 -0
  246. package/src/schema/permission-set.ts +6 -8
  247. package/src/schema/permission.test.ts +536 -0
  248. package/src/schema/permission.ts +0 -2
  249. package/src/schema/procedure.test.ts +443 -0
  250. package/src/schema/procedure.ts +11 -13
  251. package/src/schema/query.test.ts +408 -0
  252. package/src/schema/query.ts +9 -11
  253. package/src/schema/record.test.ts +694 -0
  254. package/src/schema/record.ts +38 -36
  255. package/src/schema/ref.test.ts +365 -0
  256. package/src/schema/ref.ts +8 -5
  257. package/src/schema/refine.test.ts +578 -0
  258. package/src/schema/refine.ts +85 -0
  259. package/src/schema/regexp.test.ts +580 -0
  260. package/src/schema/regexp.ts +22 -0
  261. package/src/schema/string.test.ts +612 -0
  262. package/src/schema/string.ts +11 -17
  263. package/src/schema/subscription.test.ts +689 -0
  264. package/src/schema/subscription.ts +13 -8
  265. package/src/schema/token.test.ts +428 -0
  266. package/src/schema/token.ts +3 -5
  267. package/src/schema/typed-object.test.ts +612 -0
  268. package/src/schema/typed-object.ts +23 -20
  269. package/src/schema/typed-ref.test.ts +823 -0
  270. package/src/schema/typed-ref.ts +10 -5
  271. package/src/schema/typed-union.test.ts +378 -0
  272. package/src/schema/typed-union.ts +6 -15
  273. package/src/schema/union.test.ts +200 -0
  274. package/src/schema/union.ts +5 -4
  275. package/src/schema/unknown-object.test.ts +592 -0
  276. package/src/schema/unknown-object.ts +3 -5
  277. package/src/schema/unknown.test.ts +312 -0
  278. package/src/schema/unknown.ts +3 -3
  279. package/src/schema.ts +7 -1
  280. package/src/util/array-agg.ts +1 -0
  281. package/src/util/lazy-property.ts +14 -0
  282. package/src/validation/schema.ts +92 -0
  283. package/src/validation/validation-error.ts +60 -9
  284. package/src/validation/validation-issue.ts +141 -144
  285. package/src/validation/validator.ts +67 -206
  286. package/src/validation.ts +1 -0
  287. package/tsconfig.build.json +12 -0
  288. package/tsconfig.json +7 -0
  289. package/tsconfig.tests.json +9 -0
@@ -1 +1 @@
1
- {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/schema/bytes.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAChD,oDAAgF;AAOhF,MAAa,WAAY,SAAQ,yBAAqB;IAG/B;IAFZ,WAAW,GAAG,OAAgB,CAAA;IAEvC,YAAqB,OAA2B;QAC9C,KAAK,EAAE,CAAA;QADY,YAAO,GAAP,OAAO,CAAoB;IAEhD,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,kDAAkD;QAClD,MAAM,KAAK,GAAG,IAAA,uBAAY,EAAC,KAAK,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAClC,IAAI,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAClD,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QACnE,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAClC,IAAI,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAClD,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QACjE,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF;AA7BD,kCA6BC","sourcesContent":["import { asUint8Array } from '@atproto/lex-data'\nimport { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport type BytesSchemaOptions = {\n minLength?: number\n maxLength?: number\n}\n\nexport class BytesSchema extends Validator<Uint8Array> {\n readonly lexiconType = 'bytes' as const\n\n constructor(readonly options: BytesSchemaOptions) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Uint8Array> {\n // Coerce different binary formats into Uint8Array\n const bytes = asUint8Array(input)\n if (!bytes) {\n return ctx.issueInvalidType(input, 'bytes')\n }\n\n const { minLength } = this.options\n if (minLength != null && bytes.length < minLength) {\n return ctx.issueTooSmall(bytes, 'bytes', minLength, bytes.length)\n }\n\n const { maxLength } = this.options\n if (maxLength != null && bytes.length > maxLength) {\n return ctx.issueTooBig(bytes, 'bytes', maxLength, bytes.length)\n }\n\n return ctx.success(bytes)\n }\n}\n"]}
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/schema/bytes.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAChD,oDAA6E;AAO7E,MAAa,WAAY,SAAQ,sBAAkB;IAC5B;IAArB,YAAqB,UAA8B,EAAE;QACnD,KAAK,EAAE,CAAA;QADY,YAAO,GAAP,OAAO,CAAyB;IAErD,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,kDAAkD;QAClD,MAAM,KAAK,GAAG,IAAA,uBAAY,EAAC,KAAK,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAClC,IAAI,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAClD,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QACnE,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAClC,IAAI,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAClD,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QACjE,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF;AA3BD,kCA2BC","sourcesContent":["import { asUint8Array } from '@atproto/lex-data'\nimport { Schema, ValidationResult, ValidatorContext } from '../validation.js'\n\nexport type BytesSchemaOptions = {\n minLength?: number\n maxLength?: number\n}\n\nexport class BytesSchema extends Schema<Uint8Array> {\n constructor(readonly options: BytesSchemaOptions = {}) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Uint8Array> {\n // Coerce different binary formats into Uint8Array\n const bytes = asUint8Array(input)\n if (!bytes) {\n return ctx.issueInvalidType(input, 'bytes')\n }\n\n const { minLength } = this.options\n if (minLength != null && bytes.length < minLength) {\n return ctx.issueTooSmall(bytes, 'bytes', minLength, bytes.length)\n }\n\n const { maxLength } = this.options\n if (maxLength != null && bytes.length > maxLength) {\n return ctx.issueTooBig(bytes, 'bytes', maxLength, bytes.length)\n }\n\n return ctx.success(bytes)\n }\n}\n"]}
@@ -1,13 +1,20 @@
1
- import { CID } from '@atproto/lex-data';
2
- import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
3
- export { CID };
1
+ import { Cid } from '@atproto/lex-data';
2
+ import { Schema, ValidationResult, ValidatorContext } from '../validation.js';
3
+ export type { Cid };
4
4
  export type CidSchemaOptions = {
5
+ /**
6
+ * In strict mode, only CID with the following properties are accepted:
7
+ * - version: 1
8
+ * - codec: raw binary (0x55) or DAG-CBOR (0x71)
9
+ * - hash function: SHA-256 (0x12)
10
+ *
11
+ * @default false
12
+ */
5
13
  strict?: boolean;
6
14
  };
7
- export declare class CidSchema extends Validator<CID> {
15
+ export declare class CidSchema extends Schema<Cid> {
8
16
  readonly options: CidSchemaOptions;
9
- readonly lexiconType: "cid-link";
10
17
  constructor(options?: CidSchemaOptions);
11
- validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<CID>;
18
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<Cid>;
12
19
  }
13
20
  //# sourceMappingURL=cid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cid.d.ts","sourceRoot":"","sources":["../../src/schema/cid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAS,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,OAAO,EAAE,GAAG,EAAE,CAAA;AAEd,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,qBAAa,SAAU,SAAQ,SAAS,CAAC,GAAG,CAAC;IAG/B,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAF9C,QAAQ,CAAC,WAAW,EAAG,UAAU,CAAS;gBAErB,OAAO,GAAE,gBAAqB;IAI1C,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,GAAG,CAAC;CAOzB"}
1
+ {"version":3,"file":"cid.d.ts","sourceRoot":"","sources":["../../src/schema/cid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAS,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,YAAY,EAAE,GAAG,EAAE,CAAA;AAEnB,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,qBAAa,SAAU,SAAQ,MAAM,CAAC,GAAG,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,gBAAgB;gBAAzB,OAAO,GAAE,gBAAqB;IAInD,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,GAAG,CAAC;CAOzB"}
@@ -1,12 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CidSchema = exports.CID = void 0;
3
+ exports.CidSchema = void 0;
4
4
  const lex_data_1 = require("@atproto/lex-data");
5
- Object.defineProperty(exports, "CID", { enumerable: true, get: function () { return lex_data_1.CID; } });
6
5
  const validation_js_1 = require("../validation.js");
7
- class CidSchema extends validation_js_1.Validator {
6
+ class CidSchema extends validation_js_1.Schema {
8
7
  options;
9
- lexiconType = 'cid-link';
10
8
  constructor(options = {}) {
11
9
  super();
12
10
  this.options = options;
@@ -1 +1 @@
1
- {"version":3,"file":"cid.js","sourceRoot":"","sources":["../../src/schema/cid.ts"],"names":[],"mappings":";;;AAAA,gDAA8C;AAGrC,oFAHA,cAAG,OAGA;AAFZ,oDAAgF;AAQhF,MAAa,SAAU,SAAQ,yBAAc;IAGtB;IAFZ,WAAW,GAAG,UAAmB,CAAA;IAE1C,YAAqB,UAA4B,EAAE;QACjD,KAAK,EAAE,CAAA;QADY,YAAO,GAAP,OAAO,CAAuB;IAEnD,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,CAAC,IAAA,gBAAK,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC3C,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF;AAjBD,8BAiBC","sourcesContent":["import { CID, isCid } from '@atproto/lex-data'\nimport { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport { CID }\n\nexport type CidSchemaOptions = {\n strict?: boolean\n}\n\nexport class CidSchema extends Validator<CID> {\n readonly lexiconType = 'cid-link' as const\n\n constructor(readonly options: CidSchemaOptions = {}) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<CID> {\n if (!isCid(input, this.options)) {\n return ctx.issueInvalidType(input, 'cid')\n }\n\n return ctx.success(input)\n }\n}\n"]}
1
+ {"version":3,"file":"cid.js","sourceRoot":"","sources":["../../src/schema/cid.ts"],"names":[],"mappings":";;;AAAA,gDAA8C;AAC9C,oDAA6E;AAgB7E,MAAa,SAAU,SAAQ,sBAAW;IACnB;IAArB,YAAqB,UAA4B,EAAE;QACjD,KAAK,EAAE,CAAA;QADY,YAAO,GAAP,OAAO,CAAuB;IAEnD,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,CAAC,IAAA,gBAAK,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC3C,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF;AAfD,8BAeC","sourcesContent":["import { Cid, isCid } from '@atproto/lex-data'\nimport { Schema, ValidationResult, ValidatorContext } from '../validation.js'\n\nexport type { Cid }\n\nexport type CidSchemaOptions = {\n /**\n * In strict mode, only CID with the following properties are accepted:\n * - version: 1\n * - codec: raw binary (0x55) or DAG-CBOR (0x71)\n * - hash function: SHA-256 (0x12)\n *\n * @default false\n */\n strict?: boolean\n}\n\nexport class CidSchema extends Schema<Cid> {\n constructor(readonly options: CidSchemaOptions = {}) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Cid> {\n if (!isCid(input, this.options)) {\n return ctx.issueInvalidType(input, 'cid')\n }\n\n return ctx.success(input)\n }\n}\n"]}
@@ -1,11 +1,10 @@
1
- import { PropertyKey } from '../validation/property-key.js';
2
- import { ContextualIssue, ValidationResult, Validator, ValidatorContext } from '../validation/validator.js';
1
+ import { Issue, PropertyKey, Schema, ValidationResult, ValidatorContext } from '../validation.js';
3
2
  export type CustomAssertionContext = {
4
3
  path: PropertyKey[];
5
- addIssue(issue: ContextualIssue): void;
4
+ addIssue(issue: Issue): void;
6
5
  };
7
6
  export type CustomAssertion<T = any> = (this: null, input: unknown, ctx: CustomAssertionContext) => input is T;
8
- export declare class CustomSchema<T = unknown> extends Validator<T> {
7
+ export declare class CustomSchema<T = unknown> extends Schema<T> {
9
8
  private readonly assertion;
10
9
  private readonly message;
11
10
  private readonly path?;
@@ -1 +1 @@
1
- {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/schema/custom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,4BAA4B,CAAA;AAEnC,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,WAAW,EAAE,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,GAAG,IAAI,CACrC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,sBAAsB,KACxB,KAAK,IAAI,CAAC,CAAA;AAEf,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAFL,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,GAAE,WAAW,GAAG,SAAS,WAAW,EAAE,aAAA;IAKrD,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;CAIvB"}
1
+ {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/schema/custom.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAEL,WAAW,EACX,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,WAAW,EAAE,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,GAAG,IAAI,CACrC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,sBAAsB,KACxB,KAAK,IAAI,CAAC,CAAA;AAEf,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAEpD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAFL,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,GAAE,WAAW,GAAG,SAAS,WAAW,EAAE,aAAA;IAK9D,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,CAAC;CAKvB"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CustomSchema = void 0;
4
- const validator_js_1 = require("../validation/validator.js");
5
- class CustomSchema extends validator_js_1.Validator {
4
+ const validation_js_1 = require("../validation.js");
5
+ class CustomSchema extends validation_js_1.Schema {
6
6
  assertion;
7
7
  message;
8
8
  path;
@@ -15,7 +15,8 @@ class CustomSchema extends validator_js_1.Validator {
15
15
  validateInContext(input, ctx) {
16
16
  if (this.assertion.call(null, input, ctx))
17
17
  return ctx.success(input);
18
- return ctx.custom(input, this.message, this.path);
18
+ const path = ctx.concatPath(this.path);
19
+ return ctx.failure(new validation_js_1.IssueCustom(path, input, this.message));
19
20
  }
20
21
  }
21
22
  exports.CustomSchema = CustomSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/schema/custom.ts"],"names":[],"mappings":";;;AACA,6DAKmC;AAanC,MAAa,YAA0B,SAAQ,wBAAY;IAEtC;IACA;IACA;IAHnB,YACmB,SAA6B,EAC7B,OAAe,EACf,IAA2C;QAE5D,KAAK,EAAE,CAAA;QAJU,cAAS,GAAT,SAAS,CAAoB;QAC7B,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAuC;IAG9D,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAU,CAAC,CAAA;QACzE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IACnD,CAAC;CACF;AAhBD,oCAgBC","sourcesContent":["import { PropertyKey } from '../validation/property-key.js'\nimport {\n ContextualIssue,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation/validator.js'\n\nexport type CustomAssertionContext = {\n path: PropertyKey[]\n addIssue(issue: ContextualIssue): void\n}\n\nexport type CustomAssertion<T = any> = (\n this: null,\n input: unknown,\n ctx: CustomAssertionContext,\n) => input is T\n\nexport class CustomSchema<T = unknown> extends Validator<T> {\n constructor(\n private readonly assertion: CustomAssertion<T>,\n private readonly message: string,\n private readonly path?: PropertyKey | readonly PropertyKey[],\n ) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<T> {\n if (this.assertion.call(null, input, ctx)) return ctx.success(input as T)\n return ctx.custom(input, this.message, this.path)\n }\n}\n"]}
1
+ {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/schema/custom.ts"],"names":[],"mappings":";;;AAAA,oDAOyB;AAazB,MAAa,YAA0B,SAAQ,sBAAS;IAEnC;IACA;IACA;IAHnB,YACmB,SAA6B,EAC7B,OAAe,EACf,IAA2C;QAE5D,KAAK,EAAE,CAAA;QAJU,cAAS,GAAT,SAAS,CAAoB;QAC7B,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAuC;IAG9D,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAU,CAAC,CAAA;QACzE,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,2BAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAjBD,oCAiBC","sourcesContent":["import {\n Issue,\n IssueCustom,\n PropertyKey,\n Schema,\n ValidationResult,\n ValidatorContext,\n} from '../validation.js'\n\nexport type CustomAssertionContext = {\n path: PropertyKey[]\n addIssue(issue: Issue): void\n}\n\nexport type CustomAssertion<T = any> = (\n this: null,\n input: unknown,\n ctx: CustomAssertionContext,\n) => input is T\n\nexport class CustomSchema<T = unknown> extends Schema<T> {\n constructor(\n private readonly assertion: CustomAssertion<T>,\n private readonly message: string,\n private readonly path?: PropertyKey | readonly PropertyKey[],\n ) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<T> {\n if (this.assertion.call(null, input, ctx)) return ctx.success(input as T)\n const path = ctx.concatPath(this.path)\n return ctx.failure(new IssueCustom(path, input, this.message))\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
- import { Infer, ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
- export type DictSchemaOutput<KeySchema extends Validator, ValueSchema extends Validator> = Infer<KeySchema> extends never ? Record<string, never> : Record<Infer<KeySchema> & string, Infer<ValueSchema>>;
1
+ import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
+ export type DictSchemaOutput<KeySchema extends Validator<string>, ValueSchema extends Validator> = Record<Infer<KeySchema>, Infer<ValueSchema>>;
3
3
  /**
4
4
  * @note There is no dictionary in Lexicon schemas. This is a custom extension
5
5
  * to allow map-like objects when using the lex library programmatically (i.e.
6
6
  * not code generated from a lexicon schema).
7
7
  */
8
- export declare class DictSchema<const KeySchema extends Validator = any, const ValueSchema extends Validator = any> extends Validator<DictSchemaOutput<KeySchema, ValueSchema>> {
8
+ export declare class DictSchema<const KeySchema extends Validator<string> = any, const ValueSchema extends Validator = any> extends Schema<DictSchemaOutput<KeySchema, ValueSchema>> {
9
9
  readonly keySchema: KeySchema;
10
10
  readonly valueSchema: ValueSchema;
11
11
  constructor(keySchema: KeySchema, valueSchema: ValueSchema);
@@ -1 +1 @@
1
- {"version":3,"file":"dict.d.ts","sourceRoot":"","sources":["../../src/schema/dict.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,gBAAgB,CAC1B,SAAS,SAAS,SAAS,EAC3B,WAAW,SAAS,SAAS,IAE7B,KAAK,CAAC,SAAS,CAAC,SAAS,KAAK,GAC1B,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GACrB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;AAE3D;;;;GAIG;AACH,qBAAa,UAAU,CACrB,KAAK,CAAC,SAAS,SAAS,SAAS,GAAG,GAAG,EACvC,KAAK,CAAC,WAAW,SAAS,SAAS,GAAG,GAAG,CACzC,SAAQ,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEzD,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW;gBADxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW;IAK1B,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,EACrB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAA;KAAE,GACtD,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;CAgC9D"}
1
+ {"version":3,"file":"dict.d.ts","sourceRoot":"","sources":["../../src/schema/dict.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,gBAAgB,CAC1B,SAAS,SAAS,SAAS,CAAC,MAAM,CAAC,EACnC,WAAW,SAAS,SAAS,IAC3B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;AAEhD;;;;GAIG;AACH,qBAAa,UAAU,CACrB,KAAK,CAAC,SAAS,SAAS,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,EAC/C,KAAK,CAAC,WAAW,SAAS,SAAS,GAAG,GAAG,CACzC,SAAQ,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEtD,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW;gBADxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW;IAKnC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,EACrB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAA;KAAE,GACtD,gBAAgB,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;CAgC9D"}
@@ -8,7 +8,7 @@ const validation_js_1 = require("../validation.js");
8
8
  * to allow map-like objects when using the lex library programmatically (i.e.
9
9
  * not code generated from a lexicon schema).
10
10
  */
11
- class DictSchema extends validation_js_1.Validator {
11
+ class DictSchema extends validation_js_1.Schema {
12
12
  keySchema;
13
13
  valueSchema;
14
14
  constructor(keySchema, valueSchema) {
@@ -1 +1 @@
1
- {"version":3,"file":"dict.js","sourceRoot":"","sources":["../../src/schema/dict.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,oDAKyB;AAUzB;;;;GAIG;AACH,MAAa,UAGX,SAAQ,yBAAmD;IAEhD;IACA;IAFX,YACW,SAAoB,EACpB,WAAwB;QAEjC,KAAK,EAAE,CAAA;QAHE,cAAS,GAAT,SAAS,CAAW;QACpB,gBAAW,GAAX,WAAW,CAAa;IAGnC,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB,EACrB,OAAuD;QAEvD,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,IAAyC,CAAA;QAE7C,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAQ;YAE5C,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACnD,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAA;YACxC,IAAI,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBAC5B,mEAAmE;gBACnE,uEAAuE;gBACvE,6DAA6D;gBAC7D,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACzC,CAAC;YAED,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;YACnE,IAAI,CAAC,WAAW,CAAC,OAAO;gBAAE,OAAO,WAAW,CAAA;YAE5C,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;gBACrB,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAChB,CAAC,IAAI,IAAI,KAAK,CAA6C,CAC5D,CAAA;IACH,CAAC;CACF;AA/CD,gCA+CC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type DictSchemaOutput<\n KeySchema extends Validator,\n ValueSchema extends Validator,\n> =\n Infer<KeySchema> extends never\n ? Record<string, never>\n : Record<Infer<KeySchema> & string, Infer<ValueSchema>>\n\n/**\n * @note There is no dictionary in Lexicon schemas. This is a custom extension\n * to allow map-like objects when using the lex library programmatically (i.e.\n * not code generated from a lexicon schema).\n */\nexport class DictSchema<\n const KeySchema extends Validator = any,\n const ValueSchema extends Validator = any,\n> extends Validator<DictSchemaOutput<KeySchema, ValueSchema>> {\n constructor(\n readonly keySchema: KeySchema,\n readonly valueSchema: ValueSchema,\n ) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n options?: { ignoredKeys?: { has(k: string): boolean } },\n ): ValidationResult<DictSchemaOutput<KeySchema, ValueSchema>> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'dict')\n }\n\n let copy: undefined | Record<string, unknown>\n\n for (const key in input) {\n if (options?.ignoredKeys?.has(key)) continue\n\n const keyResult = ctx.validate(key, this.keySchema)\n if (!keyResult.success) return keyResult\n if (keyResult.value !== key) {\n // We can't safely \"move\" the key to a different name in the output\n // object (because there may already be something there), so we issue a\n // \"required key\" error if the key validation changes the key\n return ctx.issueRequiredKey(input, key)\n }\n\n const valueResult = ctx.validateChild(input, key, this.valueSchema)\n if (!valueResult.success) return valueResult\n\n if (valueResult.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = valueResult.value\n }\n }\n\n return ctx.success(\n (copy ?? input) as DictSchemaOutput<KeySchema, ValueSchema>,\n )\n }\n}\n"]}
1
+ {"version":3,"file":"dict.js","sourceRoot":"","sources":["../../src/schema/dict.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,oDAMyB;AAOzB;;;;GAIG;AACH,MAAa,UAGX,SAAQ,sBAAgD;IAE7C;IACA;IAFX,YACW,SAAoB,EACpB,WAAwB;QAEjC,KAAK,EAAE,CAAA;QAHE,cAAS,GAAT,SAAS,CAAW;QACpB,gBAAW,GAAX,WAAW,CAAa;IAGnC,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB,EACrB,OAAuD;QAEvD,IAAI,CAAC,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,IAAyC,CAAA;QAE7C,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAQ;YAE5C,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACnD,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAA;YACxC,IAAI,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBAC5B,mEAAmE;gBACnE,uEAAuE;gBACvE,6DAA6D;gBAC7D,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACzC,CAAC;YAED,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;YACnE,IAAI,CAAC,WAAW,CAAC,OAAO;gBAAE,OAAO,WAAW,CAAA;YAE5C,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;gBACrB,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAA;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAChB,CAAC,IAAI,IAAI,KAAK,CAA6C,CAC5D,CAAA;IACH,CAAC;CACF;AA/CD,gCA+CC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type DictSchemaOutput<\n KeySchema extends Validator<string>,\n ValueSchema extends Validator,\n> = Record<Infer<KeySchema>, Infer<ValueSchema>>\n\n/**\n * @note There is no dictionary in Lexicon schemas. This is a custom extension\n * to allow map-like objects when using the lex library programmatically (i.e.\n * not code generated from a lexicon schema).\n */\nexport class DictSchema<\n const KeySchema extends Validator<string> = any,\n const ValueSchema extends Validator = any,\n> extends Schema<DictSchemaOutput<KeySchema, ValueSchema>> {\n constructor(\n readonly keySchema: KeySchema,\n readonly valueSchema: ValueSchema,\n ) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n options?: { ignoredKeys?: { has(k: string): boolean } },\n ): ValidationResult<DictSchemaOutput<KeySchema, ValueSchema>> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'dict')\n }\n\n let copy: undefined | Record<string, unknown>\n\n for (const key in input) {\n if (options?.ignoredKeys?.has(key)) continue\n\n const keyResult = ctx.validate(key, this.keySchema)\n if (!keyResult.success) return keyResult\n if (keyResult.value !== key) {\n // We can't safely \"move\" the key to a different name in the output\n // object (because there may already be something there), so we issue a\n // \"required key\" error if the key validation changes the key\n return ctx.issueRequiredKey(input, key)\n }\n\n const valueResult = ctx.validateChild(input, key, this.valueSchema)\n if (!valueResult.success) return valueResult\n\n if (valueResult.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = valueResult.value\n }\n }\n\n return ctx.success(\n (copy ?? input) as DictSchemaOutput<KeySchema, ValueSchema>,\n )\n }\n}\n"]}
@@ -1,34 +1,25 @@
1
- import { ArrayContaining } from '../core.js';
2
- import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
1
+ import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
+ import { EnumSchema } from './enum.js';
3
+ import { LiteralSchema } from './literal.js';
3
4
  import { ObjectSchema } from './object.js';
4
- export type DiscriminatedUnionSchemaVariant<Discriminator extends string> = ObjectSchema<{
5
- [_ in Discriminator]: Validator;
6
- }, {
7
- required: ArrayContaining<Discriminator, string>;
8
- }>;
9
- export type DiscriminatedUnionSchemaVariants<Discriminator extends string> = readonly [
10
- DiscriminatedUnionSchemaVariant<Discriminator>,
11
- ...DiscriminatedUnionSchemaVariant<Discriminator>[]
5
+ export type DiscriminatedUnionVariant<Discriminator extends string> = ObjectSchema<Record<Discriminator, EnumSchema | LiteralSchema>>;
6
+ export type DiscriminatedUnionVariants<Discriminator extends string> = readonly [
7
+ DiscriminatedUnionVariant<Discriminator>,
8
+ ...DiscriminatedUnionVariant<Discriminator>[]
12
9
  ];
13
- export type DiscriminatedUnionSchemaOutput<Options extends readonly Validator[]> = Options extends readonly [Validator<infer V>] ? V : Options extends readonly [
14
- Validator<infer V>,
15
- ...infer Rest extends Validator[]
16
- ] ? V | DiscriminatedUnionSchemaOutput<Rest> : never;
10
+ export type DiscriminatedUnionSchemaOutput<Variants extends readonly Validator[]> = Variants extends readonly [
11
+ infer V extends Validator,
12
+ ...infer Rest extends readonly Validator[]
13
+ ] ? Infer<V> | DiscriminatedUnionSchemaOutput<Rest> : never;
17
14
  /**
18
15
  * @note There is no discriminated union in Lexicon schemas. This is a custom
19
16
  * extension to allow optimized validation of union of objects when using the
20
17
  * lex library programmatically (i.e. not code generated from a lexicon schema).
21
18
  */
22
- export declare class DiscriminatedUnionSchema<const Discriminator extends string = any, const Options extends DiscriminatedUnionSchemaVariants<Discriminator> = any> extends Validator<DiscriminatedUnionSchemaOutput<Options>> {
19
+ export declare class DiscriminatedUnionSchema<const Discriminator extends string = any, const Variants extends DiscriminatedUnionVariants<Discriminator> = any> extends Schema<DiscriminatedUnionSchemaOutput<Variants>> {
23
20
  readonly discriminator: Discriminator;
24
- readonly variants: Options;
25
- constructor(discriminator: Discriminator, variants: Options);
26
- /**
27
- * If all variants have a literal or enum for the discriminator property,
28
- * and there are no overlapping values, returns a map of discriminator values
29
- * to variants. Otherwise, returns null.
30
- */
31
- protected get variantsMap(): Map<unknown, DiscriminatedUnionSchemaVariant<Discriminator>> | null;
32
- validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<DiscriminatedUnionSchemaOutput<Options>>;
21
+ readonly variantsMap: Map<unknown, DiscriminatedUnionVariant<Discriminator>>;
22
+ constructor(discriminator: Discriminator, variants: Variants);
23
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<DiscriminatedUnionSchemaOutput<Variants>>;
33
24
  }
34
25
  //# sourceMappingURL=discriminated-union.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discriminated-union.d.ts","sourceRoot":"","sources":["../../src/schema/discriminated-union.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAGL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,+BAA+B,CAAC,aAAa,SAAS,MAAM,IACtE,YAAY,CACV;KAAG,CAAC,IAAI,aAAa,GAAG,SAAS;CAAE,EACnC;IAAE,QAAQ,EAAE,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;CAAE,CACrD,CAAA;AAEH,MAAM,MAAM,gCAAgC,CAAC,aAAa,SAAS,MAAM,IACvE,SAAS;IACP,+BAA+B,CAAC,aAAa,CAAC;IAC9C,GAAG,+BAA+B,CAAC,aAAa,CAAC,EAAE;CACpD,CAAA;AAEH,MAAM,MAAM,8BAA8B,CACxC,OAAO,SAAS,SAAS,SAAS,EAAE,IAClC,OAAO,SAAS,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAC7C,CAAC,GACD,OAAO,SAAS,SAAS;IACrB,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,GAAG,MAAM,IAAI,SAAS,SAAS,EAAE;CAClC,GACD,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,GACxC,KAAK,CAAA;AAEX;;;;GAIG;AACH,qBAAa,wBAAwB,CACnC,KAAK,CAAC,aAAa,SAAS,MAAM,GAAG,GAAG,EACxC,KAAK,CAAC,OAAO,SAAS,gCAAgC,CAAC,aAAa,CAAC,GAAG,GAAG,CAC3E,SAAQ,SAAS,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC;IAExD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO;gBADjB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,OAAO;IAK5B;;;;OAIG;IACH,SAAS,KAAK,WAAW,wEA6BxB;IAEQ,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC;CAoD7D"}
1
+ {"version":3,"file":"discriminated-union.d.ts","sourceRoot":"","sources":["../../src/schema/discriminated-union.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,yBAAyB,CAAC,aAAa,SAAS,MAAM,IAChE,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,GAAG,aAAa,CAAC,CAAC,CAAA;AAEjE,MAAM,MAAM,0BAA0B,CAAC,aAAa,SAAS,MAAM,IACjE,SAAS;IACP,yBAAyB,CAAC,aAAa,CAAC;IACxC,GAAG,yBAAyB,CAAC,aAAa,CAAC,EAAE;CAC9C,CAAA;AAEH,MAAM,MAAM,8BAA8B,CACxC,QAAQ,SAAS,SAAS,SAAS,EAAE,IACnC,QAAQ,SAAS,SAAS;IAC5B,MAAM,CAAC,SAAS,SAAS;IACzB,GAAG,MAAM,IAAI,SAAS,SAAS,SAAS,EAAE;CAC3C,GACG,KAAK,CAAC,CAAC,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAC/C,KAAK,CAAA;AAET;;;;GAIG;AACH,qBAAa,wBAAwB,CACnC,KAAK,CAAC,aAAa,SAAS,MAAM,GAAG,GAAG,EACxC,KAAK,CAAC,QAAQ,SAAS,0BAA0B,CAAC,aAAa,CAAC,GAAG,GAAG,CACtE,SAAQ,MAAM,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IAItD,QAAQ,CAAC,aAAa,EAAE,aAAa;IAHvC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,yBAAyB,CAAC,aAAa,CAAC,CAAC,CAAA;gBAGjE,aAAa,EAAE,aAAa,EACrC,QAAQ,EAAE,QAAQ;IAUpB,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;CAwB9D"}
@@ -10,84 +10,60 @@ const literal_js_1 = require("./literal.js");
10
10
  * extension to allow optimized validation of union of objects when using the
11
11
  * lex library programmatically (i.e. not code generated from a lexicon schema).
12
12
  */
13
- class DiscriminatedUnionSchema extends validation_js_1.Validator {
13
+ class DiscriminatedUnionSchema extends validation_js_1.Schema {
14
14
  discriminator;
15
- variants;
15
+ variantsMap;
16
16
  constructor(discriminator, variants) {
17
17
  super();
18
18
  this.discriminator = discriminator;
19
- this.variants = variants;
20
- }
21
- /**
22
- * If all variants have a literal or enum for the discriminator property,
23
- * and there are no overlapping values, returns a map of discriminator values
24
- * to variants. Otherwise, returns null.
25
- */
26
- get variantsMap() {
27
- const map = new Map();
28
- for (const variant of this.variants) {
29
- const schema = variant.validators[this.discriminator];
30
- if (schema instanceof literal_js_1.LiteralSchema) {
31
- if (map.has(schema.value))
32
- return null; // overlapping value
33
- map.set(schema.value, variant);
34
- }
35
- else if (schema instanceof enum_js_1.EnumSchema) {
36
- for (const val of schema.values) {
37
- if (map.has(val))
38
- return null; // overlapping value
39
- map.set(val, variant);
40
- }
41
- }
42
- else {
43
- return null; // not a literal or enum
44
- }
45
- }
46
- // Cache the map on the instance (to avoid re-computing)
47
- Object.defineProperty(this, 'variantsMap', {
48
- value: map,
49
- writable: false,
50
- enumerable: false,
51
- configurable: true,
52
- });
53
- return map;
19
+ // Although we usually try to avoid initialization work in constructors,
20
+ // here it is necessary to ensure that invalid discriminated throw from the
21
+ // place of construction, rather than later during validation.
22
+ this.variantsMap = buildVariantsMap(discriminator, variants);
54
23
  }
55
24
  validateInContext(input, ctx) {
56
25
  if (!(0, lex_data_1.isPlainObject)(input)) {
57
26
  return ctx.issueInvalidType(input, 'object');
58
27
  }
59
- if (!Object.hasOwn(input, this.discriminator)) {
60
- return ctx.issueRequiredKey(input, this.discriminator);
28
+ const { discriminator } = this;
29
+ if (!Object.hasOwn(input, discriminator)) {
30
+ return ctx.issueRequiredKey(input, discriminator);
61
31
  }
62
- // Fast path: if we have a mapping of discriminator values to variants,
63
- // we can directly select the correct variant to validate against. This also
64
- // outputs a better error (with a single failure issue) when the discriminator.
65
- if (this.variantsMap) {
66
- const variant = this.variantsMap.get(input[this.discriminator]);
67
- if (!variant) {
68
- return ctx.issueInvalidPropertyValue(input, this.discriminator, [
69
- ...this.variantsMap.keys(),
70
- ]);
71
- }
32
+ const discriminatorValue = input[discriminator];
33
+ const variant = this.variantsMap.get(discriminatorValue);
34
+ if (variant) {
72
35
  return ctx.validate(input, variant);
73
36
  }
74
- // Slow path: try validating against each variant and return the first
75
- // successful one (or aggregate all failures if none match).
76
- const failures = [];
77
- for (const variant of this.variants) {
78
- const discSchema = variant.validators[this.discriminator];
79
- const discResult = ctx.validateChild(input, this.discriminator, discSchema);
80
- if (!discResult.success) {
81
- failures.push(discResult);
82
- continue;
37
+ return ctx.issueInvalidPropertyValue(input, discriminator, [
38
+ ...this.variantsMap.keys(),
39
+ ]);
40
+ }
41
+ }
42
+ exports.DiscriminatedUnionSchema = DiscriminatedUnionSchema;
43
+ function buildVariantsMap(discriminator, variants) {
44
+ const variantsMap = new Map();
45
+ for (const variant of variants) {
46
+ const schema = variant.shape[discriminator];
47
+ if (schema instanceof literal_js_1.LiteralSchema) {
48
+ if (variantsMap.has(schema.value)) {
49
+ throw new TypeError(`Overlapping discriminator value: ${schema.value}`);
50
+ }
51
+ variantsMap.set(schema.value, variant);
52
+ }
53
+ else if (schema instanceof enum_js_1.EnumSchema) {
54
+ for (const val of schema.values) {
55
+ if (variantsMap.has(val)) {
56
+ throw new TypeError(`Overlapping discriminator value: ${val}`);
57
+ }
58
+ variantsMap.set(val, variant);
83
59
  }
84
- return ctx.validate(input, variant);
85
60
  }
86
- return {
87
- success: false,
88
- error: validation_js_1.ValidationError.fromFailures(failures),
89
- };
61
+ else {
62
+ // Only enumerable discriminator schemas are supported
63
+ // Should never happen if types are used correctly
64
+ throw new TypeError(`Discriminator schema must be a LiteralSchema or EnumSchema`);
65
+ }
90
66
  }
67
+ return variantsMap;
91
68
  }
92
- exports.DiscriminatedUnionSchema = DiscriminatedUnionSchema;
93
69
  //# sourceMappingURL=discriminated-union.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discriminated-union.js","sourceRoot":"","sources":["../../src/schema/discriminated-union.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AAEjD,oDAMyB;AACzB,uCAAsC;AACtC,6CAA4C;AA0B5C;;;;GAIG;AACH,MAAa,wBAGX,SAAQ,yBAAkD;IAE/C;IACA;IAFX,YACW,aAA4B,EAC5B,QAAiB;QAE1B,KAAK,EAAE,CAAA;QAHE,kBAAa,GAAb,aAAa,CAAe;QAC5B,aAAQ,GAAR,QAAQ,CAAS;IAG5B,CAAC;IAED;;;;OAIG;IACH,IAAc,WAAW;QACvB,MAAM,GAAG,GAAG,IAAI,GAAG,EAGhB,CAAA;QACH,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACrD,IAAI,MAAM,YAAY,0BAAa,EAAE,CAAC;gBACpC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAA,CAAC,oBAAoB;gBAC3D,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAChC,CAAC;iBAAM,IAAI,MAAM,YAAY,oBAAU,EAAE,CAAC;gBACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAChC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,OAAO,IAAI,CAAA,CAAC,oBAAoB;oBAClD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAA,CAAC,wBAAwB;YACtC,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE;YACzC,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAA;IACZ,CAAC;IAEQ,iBAAiB,CACxB,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,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9C,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACxD,CAAC;QAED,uEAAuE;QACvE,4EAA4E;QAC5E,+EAA+E;QAC/E,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;YAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,CAAC,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;oBAC9D,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;iBAC3B,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAEjC,CAAA;QACH,CAAC;QAED,sEAAsE;QACtE,4DAA4D;QAC5D,MAAM,QAAQ,GAAwB,EAAE,CAAA;QAExC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACzD,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAClC,KAAK,EACL,IAAI,CAAC,aAAa,EAClB,UAAU,CACX,CAAA;YAED,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACzB,SAAQ;YACV,CAAC;YAED,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAEjC,CAAA;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAAe,CAAC,YAAY,CAAC,QAAQ,CAAC;SAC9C,CAAA;IACH,CAAC;CACF;AAtGD,4DAsGC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { ArrayContaining } from '../core.js'\nimport {\n ValidationError,\n ValidationFailure,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { EnumSchema } from './enum.js'\nimport { LiteralSchema } from './literal.js'\nimport { ObjectSchema } from './object.js'\n\nexport type DiscriminatedUnionSchemaVariant<Discriminator extends string> =\n ObjectSchema<\n { [_ in Discriminator]: Validator },\n { required: ArrayContaining<Discriminator, string> }\n >\n\nexport type DiscriminatedUnionSchemaVariants<Discriminator extends string> =\n readonly [\n DiscriminatedUnionSchemaVariant<Discriminator>,\n ...DiscriminatedUnionSchemaVariant<Discriminator>[],\n ]\n\nexport type DiscriminatedUnionSchemaOutput<\n Options extends readonly Validator[],\n> = Options extends readonly [Validator<infer V>]\n ? V\n : Options extends readonly [\n Validator<infer V>,\n ...infer Rest extends Validator[],\n ]\n ? V | DiscriminatedUnionSchemaOutput<Rest>\n : never\n\n/**\n * @note There is no discriminated union in Lexicon schemas. This is a custom\n * extension to allow optimized validation of union of objects when using the\n * lex library programmatically (i.e. not code generated from a lexicon schema).\n */\nexport class DiscriminatedUnionSchema<\n const Discriminator extends string = any,\n const Options extends DiscriminatedUnionSchemaVariants<Discriminator> = any,\n> extends Validator<DiscriminatedUnionSchemaOutput<Options>> {\n constructor(\n readonly discriminator: Discriminator,\n readonly variants: Options,\n ) {\n super()\n }\n\n /**\n * If all variants have a literal or enum for the discriminator property,\n * and there are no overlapping values, returns a map of discriminator values\n * to variants. Otherwise, returns null.\n */\n protected get variantsMap() {\n const map = new Map<\n unknown,\n DiscriminatedUnionSchemaVariant<Discriminator>\n >()\n for (const variant of this.variants) {\n const schema = variant.validators[this.discriminator]\n if (schema instanceof LiteralSchema) {\n if (map.has(schema.value)) return null // overlapping value\n map.set(schema.value, variant)\n } else if (schema instanceof EnumSchema) {\n for (const val of schema.values) {\n if (map.has(val)) return null // overlapping value\n map.set(val, variant)\n }\n } else {\n return null // not a literal or enum\n }\n }\n\n // Cache the map on the instance (to avoid re-computing)\n Object.defineProperty(this, 'variantsMap', {\n value: map,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return map\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<DiscriminatedUnionSchemaOutput<Options>> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'object')\n }\n\n if (!Object.hasOwn(input, this.discriminator)) {\n return ctx.issueRequiredKey(input, this.discriminator)\n }\n\n // Fast path: if we have a mapping of discriminator values to variants,\n // we can directly select the correct variant to validate against. This also\n // outputs a better error (with a single failure issue) when the discriminator.\n if (this.variantsMap) {\n const variant = this.variantsMap.get(input[this.discriminator])\n if (!variant) {\n return ctx.issueInvalidPropertyValue(input, this.discriminator, [\n ...this.variantsMap.keys(),\n ])\n }\n\n return ctx.validate(input, variant) as ValidationResult<\n DiscriminatedUnionSchemaOutput<Options>\n >\n }\n\n // Slow path: try validating against each variant and return the first\n // successful one (or aggregate all failures if none match).\n const failures: ValidationFailure[] = []\n\n for (const variant of this.variants) {\n const discSchema = variant.validators[this.discriminator]\n const discResult = ctx.validateChild(\n input,\n this.discriminator,\n discSchema,\n )\n\n if (!discResult.success) {\n failures.push(discResult)\n continue\n }\n\n return ctx.validate(input, variant) as ValidationResult<\n DiscriminatedUnionSchemaOutput<Options>\n >\n }\n\n return {\n success: false,\n error: ValidationError.fromFailures(failures),\n }\n }\n}\n"]}
1
+ {"version":3,"file":"discriminated-union.js","sourceRoot":"","sources":["../../src/schema/discriminated-union.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,oDAMyB;AACzB,uCAAsC;AACtC,6CAA4C;AAqB5C;;;;GAIG;AACH,MAAa,wBAGX,SAAQ,sBAAgD;IAI7C;IAHF,WAAW,CAAwD;IAE5E,YACW,aAA4B,EACrC,QAAkB;QAElB,KAAK,EAAE,CAAA;QAHE,kBAAa,GAAb,aAAa,CAAe;QAKrC,wEAAwE;QACxE,2EAA2E;QAC3E,8DAA8D;QAC9D,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;IAC9D,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,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAA;QAE9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;QACnD,CAAC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,aAAa,CAAC,CAAA;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAEjC,CAAA;QACH,CAAC;QAED,OAAO,GAAG,CAAC,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE;YACzD,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;SAC3B,CAAC,CAAA;IACJ,CAAC;CACF;AA7CD,4DA6CC;AAED,SAAS,gBAAgB,CACvB,aAA4B,EAC5B,QAAmD;IAEnD,MAAM,WAAW,GAAG,IAAI,GAAG,EAGxB,CAAA;IAEH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC3C,IAAI,MAAM,YAAY,0BAAa,EAAE,CAAC;YACpC,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,SAAS,CAAC,oCAAoC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YACzE,CAAC;YACD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACxC,CAAC;aAAM,IAAI,MAAM,YAAY,oBAAU,EAAE,CAAC;YACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,SAAS,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAA;gBAChE,CAAC;gBACD,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sDAAsD;YAEtD,kDAAkD;YAClD,MAAM,IAAI,SAAS,CACjB,4DAA4D,CAC7D,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { EnumSchema } from './enum.js'\nimport { LiteralSchema } from './literal.js'\nimport { ObjectSchema } from './object.js'\n\nexport type DiscriminatedUnionVariant<Discriminator extends string> =\n ObjectSchema<Record<Discriminator, EnumSchema | LiteralSchema>>\n\nexport type DiscriminatedUnionVariants<Discriminator extends string> =\n readonly [\n DiscriminatedUnionVariant<Discriminator>,\n ...DiscriminatedUnionVariant<Discriminator>[],\n ]\n\nexport type DiscriminatedUnionSchemaOutput<\n Variants extends readonly Validator[],\n> = Variants extends readonly [\n infer V extends Validator,\n ...infer Rest extends readonly Validator[],\n]\n ? Infer<V> | DiscriminatedUnionSchemaOutput<Rest>\n : never\n\n/**\n * @note There is no discriminated union in Lexicon schemas. This is a custom\n * extension to allow optimized validation of union of objects when using the\n * lex library programmatically (i.e. not code generated from a lexicon schema).\n */\nexport class DiscriminatedUnionSchema<\n const Discriminator extends string = any,\n const Variants extends DiscriminatedUnionVariants<Discriminator> = any,\n> extends Schema<DiscriminatedUnionSchemaOutput<Variants>> {\n readonly variantsMap: Map<unknown, DiscriminatedUnionVariant<Discriminator>>\n\n constructor(\n readonly discriminator: Discriminator,\n variants: Variants,\n ) {\n super()\n\n // Although we usually try to avoid initialization work in constructors,\n // here it is necessary to ensure that invalid discriminated throw from the\n // place of construction, rather than later during validation.\n this.variantsMap = buildVariantsMap(discriminator, variants)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<DiscriminatedUnionSchemaOutput<Variants>> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'object')\n }\n\n const { discriminator } = this\n\n if (!Object.hasOwn(input, discriminator)) {\n return ctx.issueRequiredKey(input, discriminator)\n }\n\n const discriminatorValue = input[discriminator]\n\n const variant = this.variantsMap.get(discriminatorValue)\n if (variant) {\n return ctx.validate(input, variant) as ValidationResult<\n DiscriminatedUnionSchemaOutput<Variants>\n >\n }\n\n return ctx.issueInvalidPropertyValue(input, discriminator, [\n ...this.variantsMap.keys(),\n ])\n }\n}\n\nfunction buildVariantsMap<Discriminator extends string>(\n discriminator: Discriminator,\n variants: DiscriminatedUnionVariants<Discriminator>,\n) {\n const variantsMap = new Map<\n unknown,\n DiscriminatedUnionVariant<Discriminator>\n >()\n\n for (const variant of variants) {\n const schema = variant.shape[discriminator]\n if (schema instanceof LiteralSchema) {\n if (variantsMap.has(schema.value)) {\n throw new TypeError(`Overlapping discriminator value: ${schema.value}`)\n }\n variantsMap.set(schema.value, variant)\n } else if (schema instanceof EnumSchema) {\n for (const val of schema.values) {\n if (variantsMap.has(val)) {\n throw new TypeError(`Overlapping discriminator value: ${val}`)\n }\n variantsMap.set(val, variant)\n }\n } else {\n // Only enumerable discriminator schemas are supported\n\n // Should never happen if types are used correctly\n throw new TypeError(\n `Discriminator schema must be a LiteralSchema or EnumSchema`,\n )\n }\n }\n\n return variantsMap\n}\n"]}
@@ -1,7 +1,11 @@
1
- import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
- export declare class EnumSchema<Output extends null | string | number | boolean = any> extends Validator<Output> {
1
+ import { Schema, ValidationResult, ValidatorContext } from '../validation.js';
2
+ export type EnumSchemaOptions<T extends null | string | number | boolean> = {
3
+ default?: T;
4
+ };
5
+ export declare class EnumSchema<Output extends null | string | number | boolean = any> extends Schema<Output> {
3
6
  readonly values: readonly Output[];
4
- constructor(values: readonly Output[]);
5
- validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<Output>;
7
+ readonly options?: EnumSchemaOptions<Output> | undefined;
8
+ constructor(values: readonly Output[], options?: EnumSchemaOptions<Output> | undefined);
9
+ validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<Output>;
6
10
  }
7
11
  //# sourceMappingURL=enum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/schema/enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,qBAAa,UAAU,CACrB,MAAM,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CACrD,SAAQ,SAAS,CAAC,MAAM,CAAC;IACb,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE;gBAAzB,MAAM,EAAE,SAAS,MAAM,EAAE;IAIrC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAO5B"}
1
+ {"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/schema/enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,IAAI;IAC1E,OAAO,CAAC,EAAE,CAAC,CAAA;CACZ,CAAA;AAED,qBAAa,UAAU,CACrB,MAAM,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CACrD,SAAQ,MAAM,CAAC,MAAM,CAAC;IAEpB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC;gBADnC,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,YAAA;IAK9C,iBAAiB,CACf,KAAK,EAAE,OAAO,YAAwB,EACtC,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAO5B"}
@@ -2,13 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EnumSchema = void 0;
4
4
  const validation_js_1 = require("../validation.js");
5
- class EnumSchema extends validation_js_1.Validator {
5
+ class EnumSchema extends validation_js_1.Schema {
6
6
  values;
7
- constructor(values) {
7
+ options;
8
+ constructor(values, options) {
8
9
  super();
9
10
  this.values = values;
11
+ this.options = options;
10
12
  }
11
- validateInContext(input, ctx) {
13
+ validateInContext(input = this.options?.default, ctx) {
12
14
  if (!this.values.includes(input)) {
13
15
  return ctx.issueInvalidValue(input, this.values);
14
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/schema/enum.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAEhF,MAAa,UAEX,SAAQ,yBAAiB;IACJ;IAArB,YAAqB,MAAyB;QAC5C,KAAK,EAAE,CAAA;QADY,WAAM,GAAN,MAAM,CAAmB;IAE9C,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,CAAE,IAAI,CAAC,MAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAClD,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAe,CAAC,CAAA;IACrC,CAAC;CACF;AAjBD,gCAiBC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport class EnumSchema<\n Output extends null | string | number | boolean = any,\n> extends Validator<Output> {\n constructor(readonly values: readonly Output[]) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (!(this.values as readonly unknown[]).includes(input)) {\n return ctx.issueInvalidValue(input, this.values)\n }\n\n return ctx.success(input as Output)\n }\n}\n"]}
1
+ {"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/schema/enum.ts"],"names":[],"mappings":";;;AAAA,oDAA6E;AAM7E,MAAa,UAEX,SAAQ,sBAAc;IAEX;IACA;IAFX,YACW,MAAyB,EACzB,OAAmC;QAE5C,KAAK,EAAE,CAAA;QAHE,WAAM,GAAN,MAAM,CAAmB;QACzB,YAAO,GAAP,OAAO,CAA4B;IAG9C,CAAC;IAED,iBAAiB,CACf,QAAiB,IAAI,CAAC,OAAO,EAAE,OAAO,EACtC,GAAqB;QAErB,IAAI,CAAE,IAAI,CAAC,MAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAClD,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAe,CAAC,CAAA;IACrC,CAAC;CACF;AApBD,gCAoBC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../validation.js'\n\nexport type EnumSchemaOptions<T extends null | string | number | boolean> = {\n default?: T\n}\n\nexport class EnumSchema<\n Output extends null | string | number | boolean = any,\n> extends Schema<Output> {\n constructor(\n readonly values: readonly Output[],\n readonly options?: EnumSchemaOptions<Output>,\n ) {\n super()\n }\n\n validateInContext(\n input: unknown = this.options?.default,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (!(this.values as readonly unknown[]).includes(input)) {\n return ctx.issueInvalidValue(input, this.values)\n }\n\n return ctx.success(input as Output)\n }\n}\n"]}
@@ -1,13 +1,12 @@
1
- import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
1
+ import { Schema, ValidationResult, ValidatorContext } from '../validation.js';
2
2
  export type IntegerSchemaOptions = {
3
3
  default?: number;
4
4
  minimum?: number;
5
5
  maximum?: number;
6
6
  };
7
- export declare class IntegerSchema extends Validator<number> {
7
+ export declare class IntegerSchema extends Schema<number> {
8
8
  readonly options: IntegerSchemaOptions;
9
- readonly lexiconType: "integer";
10
- constructor(options: IntegerSchemaOptions);
9
+ constructor(options?: IntegerSchemaOptions);
11
10
  validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<number>;
12
11
  }
13
12
  //# sourceMappingURL=integer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"integer.d.ts","sourceRoot":"","sources":["../../src/schema/integer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,qBAAa,aAAc,SAAQ,SAAS,CAAC,MAAM,CAAC;IAGtC,QAAQ,CAAC,OAAO,EAAE,oBAAoB;IAFlD,QAAQ,CAAC,WAAW,EAAG,SAAS,CAAS;gBAEpB,OAAO,EAAE,oBAAoB;IAIzC,iBAAiB,CACxB,KAAK,EAAE,OAAO,YAAuB,EACrC,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAe5B"}
1
+ {"version":3,"file":"integer.d.ts","sourceRoot":"","sources":["../../src/schema/integer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,qBAAa,aAAc,SAAQ,MAAM,CAAC,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,oBAAoB;gBAA7B,OAAO,GAAE,oBAAyB;IAIvD,iBAAiB,CACf,KAAK,EAAE,OAAO,YAAwB,EACtC,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAe5B"}
@@ -2,14 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IntegerSchema = void 0;
4
4
  const validation_js_1 = require("../validation.js");
5
- class IntegerSchema extends validation_js_1.Validator {
5
+ class IntegerSchema extends validation_js_1.Schema {
6
6
  options;
7
- lexiconType = 'integer';
8
- constructor(options) {
7
+ constructor(options = {}) {
9
8
  super();
10
9
  this.options = options;
11
10
  }
12
- validateInContext(input = this.options.default, ctx) {
11
+ validateInContext(input = this.options?.default, ctx) {
13
12
  if (!isInteger(input)) {
14
13
  return ctx.issueInvalidType(input, 'integer');
15
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"integer.js","sourceRoot":"","sources":["../../src/schema/integer.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAQhF,MAAa,aAAc,SAAQ,yBAAiB;IAG7B;IAFZ,WAAW,GAAG,SAAkB,CAAA;IAEzC,YAAqB,OAA6B;QAChD,KAAK,EAAE,CAAA;QADY,YAAO,GAAP,OAAO,CAAsB;IAElD,CAAC;IAEQ,iBAAiB,CACxB,QAAiB,IAAI,CAAC,OAAO,CAAC,OAAO,EACrC,GAAqB;QAErB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvE,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACzE,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvE,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACvE,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF;AAzBD,sCAyBC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport type IntegerSchemaOptions = {\n default?: number\n minimum?: number\n maximum?: number\n}\n\nexport class IntegerSchema extends Validator<number> {\n readonly lexiconType = 'integer' as const\n\n constructor(readonly options: IntegerSchemaOptions) {\n super()\n }\n\n override validateInContext(\n input: unknown = this.options.default,\n ctx: ValidatorContext,\n ): ValidationResult<number> {\n if (!isInteger(input)) {\n return ctx.issueInvalidType(input, 'integer')\n }\n\n if (this.options.minimum !== undefined && input < this.options.minimum) {\n return ctx.issueTooSmall(input, 'integer', this.options.minimum, input)\n }\n\n if (this.options.maximum !== undefined && input > this.options.maximum) {\n return ctx.issueTooBig(input, 'integer', this.options.maximum, input)\n }\n\n return ctx.success(input)\n }\n}\n\n/**\n * Simple wrapper around {@link Number.isInteger} that acts as a type guard.\n */\nfunction isInteger(input: unknown): input is number {\n return Number.isInteger(input)\n}\n"]}
1
+ {"version":3,"file":"integer.js","sourceRoot":"","sources":["../../src/schema/integer.ts"],"names":[],"mappings":";;;AAAA,oDAA6E;AAQ7E,MAAa,aAAc,SAAQ,sBAAc;IAC1B;IAArB,YAAqB,UAAgC,EAAE;QACrD,KAAK,EAAE,CAAA;QADY,YAAO,GAAP,OAAO,CAA2B;IAEvD,CAAC;IAED,iBAAiB,CACf,QAAiB,IAAI,CAAC,OAAO,EAAE,OAAO,EACtC,GAAqB;QAErB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvE,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACzE,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvE,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACvE,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF;AAvBD,sCAuBC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../validation.js'\n\nexport type IntegerSchemaOptions = {\n default?: number\n minimum?: number\n maximum?: number\n}\n\nexport class IntegerSchema extends Schema<number> {\n constructor(readonly options: IntegerSchemaOptions = {}) {\n super()\n }\n\n validateInContext(\n input: unknown = this.options?.default,\n ctx: ValidatorContext,\n ): ValidationResult<number> {\n if (!isInteger(input)) {\n return ctx.issueInvalidType(input, 'integer')\n }\n\n if (this.options.minimum !== undefined && input < this.options.minimum) {\n return ctx.issueTooSmall(input, 'integer', this.options.minimum, input)\n }\n\n if (this.options.maximum !== undefined && input > this.options.maximum) {\n return ctx.issueTooBig(input, 'integer', this.options.maximum, input)\n }\n\n return ctx.success(input)\n }\n}\n\n/**\n * Simple wrapper around {@link Number.isInteger} that acts as a type guard.\n */\nfunction isInteger(input: unknown): input is number {\n return Number.isInteger(input)\n}\n"]}
@@ -1,16 +1,24 @@
1
- import { Infer, ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
- export type IntersectionSchemaValidators = readonly [
3
- Validator,
4
- Validator,
5
- ...Validator[]
6
- ];
7
- export type IntersectionSchemaOutput<V extends readonly Validator[], Base = unknown> = V extends readonly [
8
- infer First extends Validator,
9
- ...infer Rest extends Validator[]
10
- ] ? IntersectionSchemaOutput<Rest, Base & Infer<First>> : Base;
11
- export declare class IntersectionSchema<V extends IntersectionSchemaValidators = any> extends Validator<IntersectionSchemaOutput<V>> {
12
- protected readonly validators: V;
13
- constructor(validators: V);
14
- validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<IntersectionSchemaOutput<V>>;
1
+ import { Simplify } from '../core.js';
2
+ import { Infer, Schema, ValidationResult, ValidatorContext } from '../validation.js';
3
+ import { DictSchema } from './dict.js';
4
+ import { ObjectSchema } from './object.js';
5
+ /**
6
+ * Allows to more accurately represent the intersection of two object types
7
+ * where both types may share some keys, and one of them uses an index
8
+ * signature.
9
+ *
10
+ * @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}
11
+ */
12
+ export type Intersect<A, B> = B[keyof B] extends never ? A : keyof A & keyof B extends never ? // If A and B don't overlap, just return A & B
13
+ A & B : // Otherwise, properly represent the fact that accessing using an
14
+ A & {
15
+ [K in keyof B]: B[K] | A[keyof A & K];
16
+ };
17
+ export type IntersectionSchemaOutput<Left extends ObjectSchema, Right extends DictSchema> = Simplify<Intersect<Infer<Left>, Infer<Right>>>;
18
+ export declare class IntersectionSchema<const Left extends ObjectSchema = any, const Right extends DictSchema = any> extends Schema<IntersectionSchemaOutput<Left, Right>> {
19
+ protected readonly left: Left;
20
+ protected readonly right: Right;
21
+ constructor(left: Left, right: Right);
22
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<IntersectionSchemaOutput<Left, Right>>;
15
23
  }
16
24
  //# sourceMappingURL=intersection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"intersection.d.ts","sourceRoot":"","sources":["../../src/schema/intersection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,4BAA4B,GAAG,SAAS;IAClD,SAAS;IACT,SAAS;IACT,GAAG,SAAS,EAAE;CACf,CAAA;AACD,MAAM,MAAM,wBAAwB,CAClC,CAAC,SAAS,SAAS,SAAS,EAAE,EAC9B,IAAI,GAAG,OAAO,IACZ,CAAC,SAAS,SAAS;IACrB,MAAM,KAAK,SAAS,SAAS;IAC7B,GAAG,MAAM,IAAI,SAAS,SAAS,EAAE;CAClC,GACG,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GACnD,IAAI,CAAA;AAER,qBAAa,kBAAkB,CAC7B,CAAC,SAAS,4BAA4B,GAAG,GAAG,CAC5C,SAAQ,SAAS,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAAb,UAAU,EAAE,CAAC;IAInC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;CAwBjD"}
1
+ {"version":3,"file":"intersection.d.ts","sourceRoot":"","sources":["../../src/schema/intersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,GAClD,CAAC,GACD,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,KAAK,GAE7B,AADA,8CAA8C;AAC9C,CAAC,GAAG,CAAC,GAGL,AAFA,iEAAiE;AAEjE,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;CAAE,CAAA;AAEnD,MAAM,MAAM,wBAAwB,CAClC,IAAI,SAAS,YAAY,EACzB,KAAK,SAAS,UAAU,IACtB,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAElD,qBAAa,kBAAkB,CAC7B,KAAK,CAAC,IAAI,SAAS,YAAY,GAAG,GAAG,EACrC,KAAK,CAAC,KAAK,SAAS,UAAU,GAAG,GAAG,CACpC,SAAQ,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEnD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI;IAC7B,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK;gBADZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK;IAKjC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAQ3D"}