@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
@@ -2,31 +2,21 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IntersectionSchema = void 0;
4
4
  const validation_js_1 = require("../validation.js");
5
- class IntersectionSchema extends validation_js_1.Validator {
6
- validators;
7
- constructor(validators) {
5
+ class IntersectionSchema extends validation_js_1.Schema {
6
+ left;
7
+ right;
8
+ constructor(left, right) {
8
9
  super();
9
- this.validators = validators;
10
+ this.left = left;
11
+ this.right = right;
10
12
  }
11
13
  validateInContext(input, ctx) {
12
- for (let i = 0; i < this.validators.length; i++) {
13
- const result = ctx.validate(input, this.validators[i]);
14
- if (!result.success) {
15
- return result;
16
- }
17
- // @NOTE because transforming the value could make it invalid for previous
18
- // validators, we need to ensure the input remains unchanged only gets
19
- // transformed by the first validator.
20
- if (i !== 0 && input !== result.value) {
21
- // The alternative would be to allow transforms on a first pass
22
- // (ignoring errors) and then re-validate the final value against all
23
- // validators (without allowing further transforms). This would be way
24
- // less efficient (we could make this optional).
25
- return ctx.issueInvalidValue(input, [result.value]);
26
- }
27
- input = result.value;
28
- }
29
- return ctx.success(input);
14
+ const leftResult = ctx.validate(input, this.left);
15
+ if (!leftResult.success)
16
+ return leftResult;
17
+ return this.right.validateInContext(leftResult.value, ctx, {
18
+ ignoredKeys: this.left.validatorsMap,
19
+ });
30
20
  }
31
21
  }
32
22
  exports.IntersectionSchema = IntersectionSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"intersection.js","sourceRoot":"","sources":["../../src/schema/intersection.ts"],"names":[],"mappings":";;;AAAA,oDAKyB;AAiBzB,MAAa,kBAEX,SAAQ,yBAAsC;IACf;IAA/B,YAA+B,UAAa;QAC1C,KAAK,EAAE,CAAA;QADsB,eAAU,GAAV,UAAU,CAAG;IAE5C,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;YAEtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,MAAM,CAAA;YACf,CAAC;YAED,0EAA0E;YAC1E,sEAAsE;YACtE,sCAAsC;YACtC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtC,+DAA+D;gBAC/D,qEAAqE;gBACrE,sEAAsE;gBACtE,gDAAgD;gBAChD,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACrD,CAAC;YAED,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QACtB,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,KAAoC,CAAC,CAAA;IAC1D,CAAC;CACF;AAlCD,gDAkCC","sourcesContent":["import {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type IntersectionSchemaValidators = readonly [\n Validator,\n Validator,\n ...Validator[],\n]\nexport type IntersectionSchemaOutput<\n V extends readonly Validator[],\n Base = unknown,\n> = V extends readonly [\n infer First extends Validator,\n ...infer Rest extends Validator[],\n]\n ? IntersectionSchemaOutput<Rest, Base & Infer<First>>\n : Base\n\nexport class IntersectionSchema<\n V extends IntersectionSchemaValidators = any,\n> extends Validator<IntersectionSchemaOutput<V>> {\n constructor(protected readonly validators: V) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<IntersectionSchemaOutput<V>> {\n for (let i = 0; i < this.validators.length; i++) {\n const result = ctx.validate(input, this.validators[i])\n\n if (!result.success) {\n return result\n }\n\n // @NOTE because transforming the value could make it invalid for previous\n // validators, we need to ensure the input remains unchanged only gets\n // transformed by the first validator.\n if (i !== 0 && input !== result.value) {\n // The alternative would be to allow transforms on a first pass\n // (ignoring errors) and then re-validate the final value against all\n // validators (without allowing further transforms). This would be way\n // less efficient (we could make this optional).\n return ctx.issueInvalidValue(input, [result.value])\n }\n\n input = result.value\n }\n\n return ctx.success(input as IntersectionSchemaOutput<V>)\n }\n}\n"]}
1
+ {"version":3,"file":"intersection.js","sourceRoot":"","sources":["../../src/schema/intersection.ts"],"names":[],"mappings":";;;AACA,oDAKyB;AAyBzB,MAAa,kBAGX,SAAQ,sBAA6C;IAEhC;IACA;IAFrB,YACqB,IAAU,EACV,KAAY;QAE/B,KAAK,EAAE,CAAA;QAHY,SAAI,GAAJ,IAAI,CAAM;QACV,UAAK,GAAL,KAAK,CAAO;IAGjC,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,IAAI,CAAC,UAAU,CAAC,OAAO;YAAE,OAAO,UAAU,CAAA;QAE1C,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE;YACzD,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;SACrC,CAA4D,CAAA;IAC/D,CAAC;CACF;AAtBD,gDAsBC","sourcesContent":["import { Simplify } from '../core.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n ValidatorContext,\n} from '../validation.js'\nimport { DictSchema } from './dict.js'\nimport { ObjectSchema } from './object.js'\n\n/**\n * Allows to more accurately represent the intersection of two object types\n * where both types may share some keys, and one of them uses an index\n * signature.\n *\n * @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}\n */\nexport type Intersect<A, B> = B[keyof B] extends never\n ? A\n : keyof A & keyof B extends never\n ? // If A and B don't overlap, just return A & B\n A & B\n : // Otherwise, properly represent the fact that accessing using an\n // index signature could return a value from either A or B\n A & { [K in keyof B]: B[K] | A[keyof A & K] }\n\nexport type IntersectionSchemaOutput<\n Left extends ObjectSchema,\n Right extends DictSchema,\n> = Simplify<Intersect<Infer<Left>, Infer<Right>>>\n\nexport class IntersectionSchema<\n const Left extends ObjectSchema = any,\n const Right extends DictSchema = any,\n> extends Schema<IntersectionSchemaOutput<Left, Right>> {\n constructor(\n protected readonly left: Left,\n protected readonly right: Right,\n ) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<IntersectionSchemaOutput<Left, Right>> {\n const leftResult = ctx.validate(input, this.left)\n if (!leftResult.success) return leftResult\n\n return this.right.validateInContext(leftResult.value, ctx, {\n ignoredKeys: this.left.validatorsMap,\n }) as ValidationResult<IntersectionSchemaOutput<Left, Right>>\n }\n}\n"]}
@@ -1,7 +1,11 @@
1
- import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
- export declare class LiteralSchema<Output extends null | string | number | boolean = any> extends Validator<Output> {
1
+ import { Schema, ValidationResult, ValidatorContext } from '../validation.js';
2
+ export type LiteralSchemaOptions<T extends null | string | number | boolean> = {
3
+ default?: T;
4
+ };
5
+ export declare class LiteralSchema<Output extends null | string | number | boolean = any> extends Schema<Output> {
3
6
  readonly value: Output;
4
- constructor(value: Output);
7
+ readonly options?: LiteralSchemaOptions<Output> | undefined;
8
+ constructor(value: Output, options?: LiteralSchemaOptions<Output> | undefined);
5
9
  validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<Output>;
6
10
  }
7
11
  //# sourceMappingURL=literal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,qBAAa,aAAa,CACxB,MAAM,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CACrD,SAAQ,SAAS,CAAC,MAAM,CAAC;IACb,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;IAIzB,iBAAiB,CACxB,KAAK,EAAE,OAAO,YAAa,EAC3B,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAO5B"}
1
+ {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,IAAI;IAC7E,OAAO,CAAC,EAAE,CAAC,CAAA;CACZ,CAAA;AAED,qBAAa,aAAa,CACxB,MAAM,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CACrD,SAAQ,MAAM,CAAC,MAAM,CAAC;IAEpB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC;gBADtC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,YAAA;IAKjD,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.LiteralSchema = void 0;
4
4
  const validation_js_1 = require("../validation.js");
5
- class LiteralSchema extends validation_js_1.Validator {
5
+ class LiteralSchema extends validation_js_1.Schema {
6
6
  value;
7
- constructor(value) {
7
+ options;
8
+ constructor(value, options) {
8
9
  super();
9
10
  this.value = value;
11
+ this.options = options;
10
12
  }
11
- validateInContext(input = this.value, ctx) {
13
+ validateInContext(input = this.options?.default, ctx) {
12
14
  if (input !== this.value) {
13
15
  return ctx.issueInvalidValue(input, [this.value]);
14
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAEhF,MAAa,aAEX,SAAQ,yBAAiB;IACJ;IAArB,YAAqB,KAAa;QAChC,KAAK,EAAE,CAAA;QADY,UAAK,GAAL,KAAK,CAAQ;IAElC,CAAC;IAEQ,iBAAiB,CACxB,QAAiB,IAAI,CAAC,KAAK,EAC3B,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;CACF;AAjBD,sCAiBC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport class LiteralSchema<\n Output extends null | string | number | boolean = any,\n> extends Validator<Output> {\n constructor(readonly value: Output) {\n super()\n }\n\n override validateInContext(\n input: unknown = this.value,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (input !== this.value) {\n return ctx.issueInvalidValue(input, [this.value])\n }\n\n return ctx.success(this.value)\n }\n}\n"]}
1
+ {"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":";;;AAAA,oDAA6E;AAM7E,MAAa,aAEX,SAAQ,sBAAc;IAEX;IACA;IAFX,YACW,KAAa,EACb,OAAsC;QAE/C,KAAK,EAAE,CAAA;QAHE,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAA+B;IAGjD,CAAC;IAED,iBAAiB,CACf,QAAiB,IAAI,CAAC,OAAO,EAAE,OAAO,EACtC,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;CACF;AApBD,sCAoBC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../validation.js'\n\nexport type LiteralSchemaOptions<T extends null | string | number | boolean> = {\n default?: T\n}\n\nexport class LiteralSchema<\n Output extends null | string | number | boolean = any,\n> extends Schema<Output> {\n constructor(\n readonly value: Output,\n readonly options?: LiteralSchemaOptions<Output>,\n ) {\n super()\n }\n\n validateInContext(\n input: unknown = this.options?.default,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (input !== this.value) {\n return ctx.issueInvalidValue(input, [this.value])\n }\n\n return ctx.success(this.value)\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { ValidationFailure, Validator, ValidatorContext } from '../validation.js';
2
- export declare class NeverSchema extends Validator<never> {
1
+ import { Schema, ValidationFailure, ValidatorContext } from '../validation.js';
2
+ export declare class NeverSchema extends Schema<never> {
3
3
  validateInContext(input: unknown, ctx: ValidatorContext): ValidationFailure;
4
4
  }
5
5
  //# sourceMappingURL=never.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"never.d.ts","sourceRoot":"","sources":["../../src/schema/never.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,qBAAa,WAAY,SAAQ,SAAS,CAAC,KAAK,CAAC;IACtC,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,iBAAiB;CAGrB"}
1
+ {"version":3,"file":"never.d.ts","sourceRoot":"","sources":["../../src/schema/never.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE9E,qBAAa,WAAY,SAAQ,MAAM,CAAC,KAAK,CAAC;IAC5C,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,GAAG,iBAAiB;CAG5E"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NeverSchema = void 0;
4
4
  const validation_js_1 = require("../validation.js");
5
- class NeverSchema extends validation_js_1.Validator {
5
+ class NeverSchema extends validation_js_1.Schema {
6
6
  validateInContext(input, ctx) {
7
7
  return ctx.issueInvalidType(input, 'never');
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"never.js","sourceRoot":"","sources":["../../src/schema/never.ts"],"names":[],"mappings":";;;AAAA,oDAIyB;AAEzB,MAAa,WAAY,SAAQ,yBAAgB;IACtC,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;CACF;AAPD,kCAOC","sourcesContent":["import {\n ValidationFailure,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport class NeverSchema extends Validator<never> {\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationFailure {\n return ctx.issueInvalidType(input, 'never')\n }\n}\n"]}
1
+ {"version":3,"file":"never.js","sourceRoot":"","sources":["../../src/schema/never.ts"],"names":[],"mappings":";;;AAAA,oDAA8E;AAE9E,MAAa,WAAY,SAAQ,sBAAa;IAC5C,iBAAiB,CAAC,KAAc,EAAE,GAAqB;QACrD,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;CACF;AAJD,kCAIC","sourcesContent":["import { Schema, ValidationFailure, ValidatorContext } from '../validation.js'\n\nexport class NeverSchema extends Schema<never> {\n validateInContext(input: unknown, ctx: ValidatorContext): ValidationFailure {\n return ctx.issueInvalidType(input, 'never')\n }\n}\n"]}
@@ -1,6 +1,5 @@
1
- import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
- export declare class NullSchema extends Validator<null> {
3
- readonly lexiconType: "null";
1
+ import { Schema, ValidationResult, ValidatorContext } from '../validation.js';
2
+ export declare class NullSchema extends Schema<null> {
4
3
  constructor();
5
4
  validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<null>;
6
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../src/schema/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,qBAAa,UAAW,SAAQ,SAAS,CAAC,IAAI,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAG,MAAM,CAAS;;IAM7B,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,IAAI,CAAC;CAO1B"}
1
+ {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../src/schema/null.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE7E,qBAAa,UAAW,SAAQ,MAAM,CAAC,IAAI,CAAC;;IAK1C,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,IAAI,CAAC;CAO1B"}
@@ -2,8 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NullSchema = void 0;
4
4
  const validation_js_1 = require("../validation.js");
5
- class NullSchema extends validation_js_1.Validator {
6
- lexiconType = 'null';
5
+ class NullSchema extends validation_js_1.Schema {
7
6
  constructor() {
8
7
  super();
9
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"null.js","sourceRoot":"","sources":["../../src/schema/null.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAEhF,MAAa,UAAW,SAAQ,yBAAe;IACpC,WAAW,GAAG,MAAe,CAAA;IAEtC;QACE,KAAK,EAAE,CAAA;IACT,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;CACF;AAjBD,gCAiBC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport class NullSchema extends Validator<null> {\n readonly lexiconType = 'null' as const\n\n constructor() {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<null> {\n if (input !== null) {\n return ctx.issueInvalidType(input, 'null')\n }\n\n return ctx.success(null)\n }\n}\n"]}
1
+ {"version":3,"file":"null.js","sourceRoot":"","sources":["../../src/schema/null.ts"],"names":[],"mappings":";;;AAAA,oDAA6E;AAE7E,MAAa,UAAW,SAAQ,sBAAY;IAC1C;QACE,KAAK,EAAE,CAAA;IACT,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;CACF;AAfD,gCAeC","sourcesContent":["import { Schema, ValidationResult, ValidatorContext } from '../validation.js'\n\nexport class NullSchema extends Schema<null> {\n constructor() {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<null> {\n if (input !== null) {\n return ctx.issueInvalidType(input, 'null')\n }\n\n return ctx.success(null)\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
+ export declare class NullableSchema<V> extends Schema<V | null> {
3
+ readonly schema: Validator<V>;
4
+ constructor(schema: Validator<V>);
5
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<V | null>;
6
+ }
7
+ //# sourceMappingURL=nullable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nullable.d.ts","sourceRoot":"","sources":["../../src/schema/nullable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,qBAAa,cAAc,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;gBAApB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAIzC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC;CAO9B"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NullableSchema = void 0;
4
+ const validation_js_1 = require("../validation.js");
5
+ class NullableSchema extends validation_js_1.Schema {
6
+ schema;
7
+ constructor(schema) {
8
+ super();
9
+ this.schema = schema;
10
+ }
11
+ validateInContext(input, ctx) {
12
+ if (input === null) {
13
+ return ctx.success(null);
14
+ }
15
+ return ctx.validate(input, this.schema);
16
+ }
17
+ }
18
+ exports.NullableSchema = NullableSchema;
19
+ //# sourceMappingURL=nullable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nullable.js","sourceRoot":"","sources":["../../src/schema/nullable.ts"],"names":[],"mappings":";;;AAAA,oDAKyB;AAEzB,MAAa,cAAkB,SAAQ,sBAAgB;IAChC;IAArB,YAAqB,MAAoB;QACvC,KAAK,EAAE,CAAA;QADY,WAAM,GAAN,MAAM,CAAc;IAEzC,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC;QAED,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;CACF;AAfD,wCAeC","sourcesContent":["import {\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport class NullableSchema<V> extends Schema<V | null> {\n constructor(readonly schema: Validator<V>) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V | null> {\n if (input === null) {\n return ctx.success(null)\n }\n\n return ctx.validate(input, this.schema)\n }\n}\n"]}
@@ -1,47 +1,13 @@
1
- import { Simplify } from '../core.js';
2
- import { Infer, ValidationResult, Validator, ValidatorContext } from '../validation.js';
3
- import { DictSchema } from './dict.js';
4
- export type ObjectSchemaProperties = {
5
- [_ in string]: Validator<any>;
6
- };
7
- export type ObjectSchemaOptions = {
8
- required?: readonly string[];
9
- nullable?: readonly string[];
10
- unknownProperties?: 'strict' | DictSchema;
11
- };
12
- export type ObjectSchemaNullValue<O extends ObjectSchemaOptions, K extends string> = O extends {
13
- nullable: readonly (infer N extends string)[];
14
- } ? K extends N ? null : never : never;
15
- export type ObjectSchemaPropertiesOutput<P extends ObjectSchemaProperties, O extends ObjectSchemaOptions> = O extends {
16
- required: readonly (infer R extends string)[];
17
- } ? {
18
- -readonly [K in string & keyof P & R]-?: Infer<P[K]> | ObjectSchemaNullValue<O, K>;
19
- } & {
20
- -readonly [K in Exclude<string & keyof P, R>]?: Infer<P[K]> | ObjectSchemaNullValue<O, K>;
21
- } : {
22
- -readonly [K in string & keyof P]?: Infer<P[K]> | ObjectSchemaNullValue<O, K>;
23
- };
24
- /**
25
- * Allows to more accurately represent the intersection of two object types
26
- * where both types may share some keys, and one of them uses an index
27
- * signature.
28
- *
29
- * @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}
30
- */
31
- type Intersect<A extends Record<string, unknown>, B extends Record<string, unknown>> = B[keyof B] extends never ? A : keyof A & keyof B extends never ? // If A and B don't overlap, just return A & B
32
- A & B : // Otherwise, properly represent the fact that accessing using an
33
- A & {
34
- [K in keyof B]: B[K] | A[keyof A & K];
35
- };
36
- export type ObjectSchemaOutput<P extends ObjectSchemaProperties, O extends ObjectSchemaOptions> = O extends {
37
- unknownProperties: Validator<infer D extends Record<string, unknown>>;
38
- } ? Simplify<Intersect<ObjectSchemaPropertiesOutput<P, O>, D>> : Simplify<ObjectSchemaPropertiesOutput<P, O>>;
39
- export declare class ObjectSchema<const Validators extends ObjectSchemaProperties = any, const Options extends ObjectSchemaOptions = any, const Output extends ObjectSchemaOutput<Validators, Options> = ObjectSchemaOutput<Validators, Options>> extends Validator<Output> {
40
- readonly validators: Validators;
41
- readonly options: Options;
42
- constructor(validators: Validators, options: Options);
1
+ import { WithOptionalProperties } from '../core.js';
2
+ import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
3
+ export type ObjectSchemaShape = Record<string, Validator>;
4
+ export type ObjectSchemaOutput<Shape extends ObjectSchemaShape> = WithOptionalProperties<{
5
+ [K in keyof Shape]: Infer<Shape[K]>;
6
+ }>;
7
+ export declare class ObjectSchema<const Shape extends ObjectSchemaShape = any> extends Schema<ObjectSchemaOutput<Shape>> {
8
+ readonly shape: Shape;
9
+ constructor(shape: Shape);
43
10
  get validatorsMap(): Map<string, Validator>;
44
- validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<Output>;
11
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<ObjectSchemaOutput<Shape>>;
45
12
  }
46
- export {};
47
13
  //# sourceMappingURL=object.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAEzD,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,iBAAiB,IAC5D,sBAAsB,CAAC;KACpB,CAAC,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC,CAAA;AAEJ,qBAAa,YAAY,CACvB,KAAK,CAAC,KAAK,SAAS,iBAAiB,GAAG,GAAG,CAC3C,SAAQ,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK;gBAAZ,KAAK,EAAE,KAAK;IAIjC,IAAI,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAI1C;IAED,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;CAkC/C"}
@@ -2,57 +2,35 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ObjectSchema = void 0;
4
4
  const lex_data_1 = require("@atproto/lex-data");
5
+ const lazy_property_js_1 = require("../util/lazy-property.js");
5
6
  const validation_js_1 = require("../validation.js");
6
- class ObjectSchema extends validation_js_1.Validator {
7
- validators;
8
- options;
9
- constructor(validators, options) {
7
+ class ObjectSchema extends validation_js_1.Schema {
8
+ shape;
9
+ constructor(shape) {
10
10
  super();
11
- this.validators = validators;
12
- this.options = options;
11
+ this.shape = shape;
13
12
  }
14
13
  get validatorsMap() {
15
- const map = new Map(Object.entries(this.validators));
16
- // Cache the map on the instance (to avoid re-creating it)
17
- Object.defineProperty(this, 'validatorsMap', {
18
- value: map,
19
- writable: false,
20
- enumerable: false,
21
- configurable: true,
22
- });
23
- return map;
14
+ const map = new Map(Object.entries(this.shape));
15
+ return (0, lazy_property_js_1.lazyProperty)(this, 'validatorsMap', map);
24
16
  }
25
17
  validateInContext(input, ctx) {
26
18
  if (!(0, lex_data_1.isPlainObject)(input)) {
27
- return ctx.issueInvalidType(input, ['object']);
19
+ return ctx.issueInvalidType(input, 'object');
28
20
  }
29
21
  // Lazily copy value
30
22
  let copy;
31
23
  for (const [key, propDef] of this.validatorsMap) {
32
- if (input[key] === null && this.options.nullable?.includes(key)) {
33
- continue;
34
- }
35
24
  const result = ctx.validateChild(input, key, propDef);
36
25
  if (!result.success) {
37
- // Because default values are provided by child validators, we need to
38
- // run the validator to get the default value and, in case of failure,
39
- // ignore validation error that were caused by missing keys.
40
26
  if (!(key in input)) {
41
- if (this.options.required?.includes(key)) {
42
- // Transform into "required key" issue
43
- return ctx.issueRequiredKey(input, key);
44
- }
45
- // Ignore missing non-required key
46
- continue;
27
+ // Transform into "required key" issue
28
+ return ctx.issueRequiredKey(input, key);
47
29
  }
48
30
  return result;
49
31
  }
50
32
  // Skip copying if key is not present in input (and value is undefined)
51
33
  if (result.value === undefined && !(key in input)) {
52
- // Except if the key is required
53
- if (this.options.required?.includes(key)) {
54
- return ctx.issueRequiredKey(input, key);
55
- }
56
34
  continue;
57
35
  }
58
36
  if (result.value !== input[key]) {
@@ -60,20 +38,6 @@ class ObjectSchema extends validation_js_1.Validator {
60
38
  copy[key] = result.value;
61
39
  }
62
40
  }
63
- if (this.options.unknownProperties === 'strict') {
64
- for (const key of Object.keys(input)) {
65
- if (!this.validatorsMap.has(key)) {
66
- return ctx.issueInvalidPropertyType(input, key, 'undefined');
67
- }
68
- }
69
- }
70
- else if (this.options.unknownProperties) {
71
- const result = this.options.unknownProperties.validateInContext(copy ?? input, ctx, { ignoredKeys: this.validatorsMap });
72
- if (!result.success)
73
- return result;
74
- if (result.value !== input)
75
- copy = result.value;
76
- }
77
41
  const output = (copy ?? input);
78
42
  return ctx.success(output);
79
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { Simplify } from '../core.js'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { DictSchema } from './dict.js'\n\nexport type ObjectSchemaProperties = { [_ in string]: Validator<any> }\nexport type ObjectSchemaOptions = {\n required?: readonly string[]\n nullable?: readonly string[]\n unknownProperties?: 'strict' | DictSchema\n}\n\nexport type ObjectSchemaNullValue<\n O extends ObjectSchemaOptions,\n K extends string,\n> = O extends { nullable: readonly (infer N extends string)[] }\n ? K extends N\n ? null\n : never\n : never\n\nexport type ObjectSchemaPropertiesOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends { required: readonly (infer R extends string)[] }\n ? {\n -readonly [K in string & keyof P & R]-?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n } & {\n -readonly [K in Exclude<string & keyof P, R>]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n : {\n -readonly [K in string & keyof P]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n\n/**\n * Allows to more accurately represent the intersection of two object types\n * where both types may share some keys, and one of them uses an index\n * signature.\n *\n * @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}\n */\ntype Intersect<\n A extends Record<string, unknown>,\n B extends Record<string, unknown>,\n> = B[keyof B] extends never\n ? A\n : keyof A & keyof B extends never\n ? // If A and B don't overlap, just return A & B\n A & B\n : // Otherwise, properly represent the fact that accessing using an\n // index signature could return a value from either A or B\n A & { [K in keyof B]: B[K] | A[keyof A & K] }\n\nexport type ObjectSchemaOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends {\n unknownProperties: Validator<infer D extends Record<string, unknown>>\n}\n ? Simplify<Intersect<ObjectSchemaPropertiesOutput<P, O>, D>>\n : Simplify<ObjectSchemaPropertiesOutput<P, O>>\n\nexport class ObjectSchema<\n const Validators extends ObjectSchemaProperties = any,\n const Options extends ObjectSchemaOptions = any,\n const Output extends ObjectSchemaOutput<\n Validators,\n Options\n > = ObjectSchemaOutput<Validators, Options>,\n> extends Validator<Output> {\n constructor(\n readonly validators: Validators,\n readonly options: Options,\n ) {\n super()\n }\n\n get validatorsMap(): Map<string, Validator> {\n const map = new Map(Object.entries(this.validators))\n\n // Cache the map on the instance (to avoid re-creating it)\n Object.defineProperty(this, 'validatorsMap', {\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<Output> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, ['object'])\n }\n\n // Lazily copy value\n let copy: undefined | Record<string, unknown>\n\n for (const [key, propDef] of this.validatorsMap) {\n if (input[key] === null && this.options.nullable?.includes(key)) {\n continue\n }\n\n const result = ctx.validateChild(input, key, propDef)\n if (!result.success) {\n // Because default values are provided by child validators, we need to\n // run the validator to get the default value and, in case of failure,\n // ignore validation error that were caused by missing keys.\n if (!(key in input)) {\n if (this.options.required?.includes(key)) {\n // Transform into \"required key\" issue\n return ctx.issueRequiredKey(input, key)\n }\n\n // Ignore missing non-required key\n continue\n }\n\n return result\n }\n\n // Skip copying if key is not present in input (and value is undefined)\n if (result.value === undefined && !(key in input)) {\n // Except if the key is required\n if (this.options.required?.includes(key)) {\n return ctx.issueRequiredKey(input, key)\n }\n\n continue\n }\n\n if (result.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = result.value\n }\n }\n\n if (this.options.unknownProperties === 'strict') {\n for (const key of Object.keys(input)) {\n if (!this.validatorsMap.has(key)) {\n return ctx.issueInvalidPropertyType(input, key, 'undefined')\n }\n }\n } else if (this.options.unknownProperties) {\n const result = this.options.unknownProperties.validateInContext(\n copy ?? input,\n ctx,\n { ignoredKeys: this.validatorsMap },\n )\n if (!result.success) return result\n if (result.value !== input) copy = result.value\n }\n\n const output = (copy ?? input) as Output\n\n return ctx.success(output)\n }\n}\n"]}
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AAEjD,+DAAuD;AACvD,oDAMyB;AASzB,MAAa,YAEX,SAAQ,sBAAiC;IACpB;IAArB,YAAqB,KAAY;QAC/B,KAAK,EAAE,CAAA;QADY,UAAK,GAAL,KAAK,CAAO;IAEjC,CAAC;IAED,IAAI,aAAa;QACf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAE/C,OAAO,IAAA,+BAAY,EAAC,IAAI,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IACjD,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,oBAAoB;QACpB,IAAI,IAAyC,CAAA;QAE7C,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;oBACpB,sCAAsC;oBACtC,OAAO,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;gBACzC,CAAC;gBAED,OAAO,MAAM,CAAA;YACf,CAAC;YAED,uEAAuE;YACvE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;gBAClD,SAAQ;YACV,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE,CAAA;gBACrB,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAA;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,KAAK,CAA8B,CAAA;QAE3D,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;CACF;AAlDD,oCAkDC","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { WithOptionalProperties } from '../core.js'\nimport { lazyProperty } from '../util/lazy-property.js'\nimport {\n Infer,\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport type ObjectSchemaShape = Record<string, Validator>\n\nexport type ObjectSchemaOutput<Shape extends ObjectSchemaShape> =\n WithOptionalProperties<{\n [K in keyof Shape]: Infer<Shape[K]>\n }>\n\nexport class ObjectSchema<\n const Shape extends ObjectSchemaShape = any,\n> extends Schema<ObjectSchemaOutput<Shape>> {\n constructor(readonly shape: Shape) {\n super()\n }\n\n get validatorsMap(): Map<string, Validator> {\n const map = new Map(Object.entries(this.shape))\n\n return lazyProperty(this, 'validatorsMap', map)\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<ObjectSchemaOutput<Shape>> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, 'object')\n }\n\n // Lazily copy value\n let copy: undefined | Record<string, unknown>\n\n for (const [key, propDef] of this.validatorsMap) {\n const result = ctx.validateChild(input, key, propDef)\n if (!result.success) {\n if (!(key in input)) {\n // Transform into \"required key\" issue\n return ctx.issueRequiredKey(input, key)\n }\n\n return result\n }\n\n // Skip copying if key is not present in input (and value is undefined)\n if (result.value === undefined && !(key in input)) {\n continue\n }\n\n if (result.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = result.value\n }\n }\n\n const output = (copy ?? input) as ObjectSchemaOutput<Shape>\n\n return ctx.success(output)\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
+ export declare class OptionalSchema<V> extends Schema<V | undefined> {
3
+ readonly schema: Validator<V>;
4
+ constructor(schema: Validator<V>);
5
+ validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<V | undefined>;
6
+ }
7
+ //# sourceMappingURL=optional.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional.d.ts","sourceRoot":"","sources":["../../src/schema/optional.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,qBAAa,cAAc,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;gBAApB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAIzC,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,CAAC,GAAG,SAAS,CAAC;CAenC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OptionalSchema = void 0;
4
+ const validation_js_1 = require("../validation.js");
5
+ class OptionalSchema extends validation_js_1.Schema {
6
+ schema;
7
+ constructor(schema) {
8
+ super();
9
+ this.schema = schema;
10
+ }
11
+ validateInContext(input, ctx) {
12
+ // @NOTE The inner schema might apply a default value so we need to run it
13
+ // first, even if input is undefined.
14
+ const result = ctx.validate(input, this.schema);
15
+ if (result.success) {
16
+ return result;
17
+ }
18
+ if (input === undefined) {
19
+ return ctx.success(input);
20
+ }
21
+ return result;
22
+ }
23
+ }
24
+ exports.OptionalSchema = OptionalSchema;
25
+ //# sourceMappingURL=optional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional.js","sourceRoot":"","sources":["../../src/schema/optional.ts"],"names":[],"mappings":";;;AAAA,oDAKyB;AAEzB,MAAa,cAAkB,SAAQ,sBAAqB;IACrC;IAArB,YAAqB,MAAoB;QACvC,KAAK,EAAE,CAAA;QADY,WAAM,GAAN,MAAM,CAAc;IAEzC,CAAC;IAED,iBAAiB,CACf,KAAc,EACd,GAAqB;QAErB,0EAA0E;QAC1E,qCAAqC;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAE/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAvBD,wCAuBC","sourcesContent":["import {\n Schema,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\n\nexport class OptionalSchema<V> extends Schema<V | undefined> {\n constructor(readonly schema: Validator<V>) {\n super()\n }\n\n validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<V | undefined> {\n // @NOTE The inner schema might apply a default value so we need to run it\n // first, even if input is undefined.\n const result = ctx.validate(input, this.schema)\n\n if (result.success) {\n return result\n }\n\n if (input === undefined) {\n return ctx.success(input)\n }\n\n return result\n }\n}\n"]}
@@ -1,22 +1,17 @@
1
- import { ValidationResult, Validator, ValidatorContext } from '../validation.js';
1
+ import { WithOptionalProperties } from '../core.js';
2
+ import { Infer, Schema, ValidationResult, Validator, ValidatorContext } from '../validation.js';
2
3
  import { Param } from './_parameters.js';
3
- import { ObjectSchemaPropertiesOutput } from './object.js';
4
- export type ParamsSchemaProperties = {
5
- [_ in string]: Validator<Param>;
6
- };
7
- export type ParamsSchemaOptions = {
8
- required?: readonly string[];
9
- };
10
- export type ParamsSchemaOutput<P extends ParamsSchemaProperties, O extends ParamsSchemaOptions> = ObjectSchemaPropertiesOutput<P, O>;
11
- export type InferParamsSchema<T> = T extends ParamsSchema<infer P, infer O> ? NonNullable<unknown> extends ParamsSchemaOutput<P, O> ? ParamsSchemaOutput<P, O> | undefined : ParamsSchemaOutput<P, O> : never;
12
- export declare class ParamsSchema<const Validators extends ParamsSchemaProperties = ParamsSchemaProperties, const Options extends ParamsSchemaOptions = ParamsSchemaOptions, Output extends ParamsSchemaOutput<Validators, Options> = ParamsSchemaOutput<Validators, Options>> extends Validator<Output> {
13
- readonly validators: Validators;
14
- readonly options: Options;
15
- readonly lexiconType: "params";
16
- constructor(validators: Validators, options: Options);
17
- get validatorsMap(): Map<string, Validator<Param>>;
18
- validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<Output>;
19
- fromURLSearchParams(urlSearchParams: URLSearchParams): Output;
20
- toURLSearchParams(input: Output): URLSearchParams;
4
+ export type ParamsSchemaShape = Record<string, Validator<Param | undefined>>;
5
+ export type ParamsSchemaOutput<Shape extends ParamsSchemaShape> = WithOptionalProperties<{
6
+ [K in keyof Shape]: Infer<Shape[K]>;
7
+ }>;
8
+ export type InferParamsSchema<T> = T extends ParamsSchema<infer P> ? NonNullable<unknown> extends ParamsSchemaOutput<P> ? ParamsSchemaOutput<P> | undefined : ParamsSchemaOutput<P> : never;
9
+ export declare class ParamsSchema<const Shape extends ParamsSchemaShape = ParamsSchemaShape> extends Schema<ParamsSchemaOutput<Shape>> {
10
+ readonly validators: Shape;
11
+ constructor(validators: Shape);
12
+ get validatorsMap(): Map<string, Validator<Param | undefined>>;
13
+ validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<ParamsSchemaOutput<Shape>>;
14
+ fromURLSearchParams(urlSearchParams: URLSearchParams): ParamsSchemaOutput<Shape>;
15
+ toURLSearchParams(input: ParamsSchemaOutput<Shape>): URLSearchParams;
21
16
  }
22
17
  //# sourceMappingURL=params.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/schema/params.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,KAAK,EAA4B,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAG1D,MAAM,MAAM,sBAAsB,GAAG;KAClC,CAAC,IAAI,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;CAChC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,CAC5B,CAAC,SAAS,sBAAsB,EAChC,CAAC,SAAS,mBAAmB,IAC3B,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEtC,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC7B,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACpC,WAAW,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GACnD,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GACpC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC1B,KAAK,CAAA;AAEX,qBAAa,YAAY,CACvB,KAAK,CAAC,UAAU,SAAS,sBAAsB,GAAG,sBAAsB,EACxE,KAAK,CAAC,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,EAC/D,MAAM,SAAS,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,kBAAkB,CACzE,UAAU,EACV,OAAO,CACR,CACD,SAAQ,SAAS,CAAC,MAAM,CAAC;IAIvB,QAAQ,CAAC,UAAU,EAAE,UAAU;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO;IAJ3B,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAS;gBAG7B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAK3B,IAAI,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAYjD;IAEQ,iBAAiB,CACxB,KAAK,EAAE,OAAO,YAAK,EACnB,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;IAkD3B,mBAAmB,CAAC,eAAe,EAAE,eAAe,GAAG,MAAM;IA6B7D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;CAiBlD"}
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/schema/params.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,EACL,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,KAAK,EAA4B,MAAM,kBAAkB,CAAA;AAGlE,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAA;AAE5E,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,iBAAiB,IAC5D,sBAAsB,CAAC;KACpB,CAAC,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC,CAAA;AAEJ,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC7B,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,CAAC,GAC3B,WAAW,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC,GAChD,kBAAkB,CAAC,CAAC,CAAC,GAAG,SAAS,GACjC,kBAAkB,CAAC,CAAC,CAAC,GACvB,KAAK,CAAA;AAEX,qBAAa,YAAY,CACvB,KAAK,CAAC,KAAK,SAAS,iBAAiB,GAAG,iBAAiB,CACzD,SAAQ,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,KAAK;gBAAjB,UAAU,EAAE,KAAK;IAItC,IAAI,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAI7D;IAED,iBAAiB,CACf,KAAK,EAAE,OAAO,YAAK,EACnB,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IA+C9C,mBAAmB,CACjB,eAAe,EAAE,eAAe,GAC/B,kBAAkB,CAAC,KAAK,CAAC;IA6B5B,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,eAAe;CAiBrE"}
@@ -2,28 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ParamsSchema = void 0;
4
4
  const lex_data_1 = require("@atproto/lex-data");
5
+ const lazy_property_js_1 = require("../util/lazy-property.js");
5
6
  const validation_js_1 = require("../validation.js");
6
7
  const _parameters_js_1 = require("./_parameters.js");
7
8
  const string_js_1 = require("./string.js");
8
- class ParamsSchema extends validation_js_1.Validator {
9
+ class ParamsSchema extends validation_js_1.Schema {
9
10
  validators;
10
- options;
11
- lexiconType = 'params';
12
- constructor(validators, options) {
11
+ constructor(validators) {
13
12
  super();
14
13
  this.validators = validators;
15
- this.options = options;
16
14
  }
17
15
  get validatorsMap() {
18
16
  const map = new Map(Object.entries(this.validators));
19
- // Cache the map on the instance (to avoid re-creating it)
20
- Object.defineProperty(this, 'validatorsMap', {
21
- value: map,
22
- writable: false,
23
- enumerable: false,
24
- configurable: true,
25
- });
26
- return map;
17
+ return (0, lazy_property_js_1.lazyProperty)(this, 'validatorsMap', map);
27
18
  }
28
19
  validateInContext(input = {}, ctx) {
29
20
  if (!(0, lex_data_1.isPlainObject)(input)) {
@@ -46,21 +37,16 @@ class ParamsSchema extends validation_js_1.Validator {
46
37
  for (const [key, propDef] of this.validatorsMap) {
47
38
  const result = ctx.validateChild(input, key, propDef);
48
39
  if (!result.success) {
49
- // Because default values are provided by child validators, we need to
50
- // run the validator to get the default value and, in case of failure,
51
- // ignore validation error that were caused by missing keys.
52
40
  if (!(key in input)) {
53
- if (!this.options.required?.includes(key)) {
54
- // Ignore missing non-required key
55
- continue;
56
- }
57
- else {
58
- // Transform into "required key" issue
59
- return ctx.issueRequiredKey(input, key);
60
- }
41
+ // Transform into "required key" issue
42
+ return ctx.issueRequiredKey(input, key);
61
43
  }
62
44
  return result;
63
45
  }
46
+ // Skip copying if key is not present in input (and value is undefined)
47
+ if (result.value === undefined && !(key in input)) {
48
+ continue;
49
+ }
64
50
  if (result.value !== input[key]) {
65
51
  // Copy on write
66
52
  copy ??= { ...input };