validator-fns 3.0.0-next.2 → 3.0.0-next.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.
package/README.md CHANGED
@@ -103,7 +103,6 @@ const validate = object({
103
103
  ),
104
104
  ),
105
105
  favoriteCarMakers: array(
106
- { default: [] },
107
106
  string(
108
107
  { requiredMessage: 'Car brand is required.' },
109
108
  oneOf(
@@ -123,6 +122,7 @@ const validate = object({
123
122
  'Must be a known car brand.',
124
123
  ),
125
124
  ),
125
+ { default: [] },
126
126
  min(2, 'Must pick at least two.'),
127
127
  max(4, 'Must pick at most four.'),
128
128
  ),
@@ -184,7 +184,7 @@ Version 3 makes every type validator required by default. In 2.x, a validator wi
184
184
  // 3.x
185
185
  string({ requiredMessage: 'Enter a name.' }, min(2, 'Too short.'));
186
186
  number({ round: 'floor', requiredMessage: 'Enter your age.' });
187
- array({ requiredMessage: 'Pick some.' }, string());
187
+ array(string(), { requiredMessage: 'Pick some.' });
188
188
  ```
189
189
 
190
190
  2. **Wrap each validator that had no `required()` in `optional()`**, or it now rejects a missing value:
@@ -198,8 +198,18 @@ Version 3 makes every type validator required by default. In 2.x, a validator wi
198
198
  ```
199
199
 
200
200
  3. **Replace `required(message, true)`** (nullable): `optional()` accepts `null`, as well as the other missing values.
201
- 4. **Check `object()` calls with a second argument**: it's a config object or the first object-level test, as in `object(schema, { requiredMessage }, ...tests)`. A missing object now fails with its `requiredMessage` instead of reporting each field as missing; wrap it in `optional()` to accept one.
202
- 5. **Replace `standard()`**: remove it around built-in validators, which are Standard Schemas themselves, and change `standard(fn)` to `createValidator(fn)`:
201
+ 4. **Move `array()`'s config after the item validator**: `array(config, item, ...tests)` becomes `array(item, config, ...tests)`, as in `object(schema, config, ...tests)`. `array(config)` without an item validator stays. Passing the config first with an item validator throws a `TypeError`:
202
+
203
+ ```js
204
+ // 2.x
205
+ array({ default: [] }, string(), min(2, 'Pick two.'));
206
+
207
+ // 3.x
208
+ array(string(), { default: [] }, min(2, 'Pick two.'));
209
+ ```
210
+
211
+ 5. **Check `object()` calls with a second argument**: it's a config object or the first object-level test, as in `object(schema, { requiredMessage }, ...tests)`. A missing object now fails with its `requiredMessage` instead of reporting each field as missing; wrap it in `optional()` to accept one.
212
+ 6. **Replace `standard()`**: remove it around built-in validators, which are Standard Schemas themselves, and change `standard(fn)` to `createValidator(fn)`:
203
213
 
204
214
  ```js
205
215
  // 2.x
@@ -211,7 +221,7 @@ Version 3 makes every type validator required by default. In 2.x, a validator wi
211
221
  createValidator(async (value, field) => valid({ value, field }));
212
222
  ```
213
223
 
214
- 6. **In TypeScript**, a valid result's `value` no longer includes `null` or `undefined` unless the validator is wrapped in `optional()`, and `object()` makes only `optional()` keys optional. `valid()` takes a value of the validator's type, so a custom validator that returns `null` or `undefined` needs them in its type, such as `ValidatorTest<string | undefined>`.
224
+ 7. **In TypeScript**, a valid result's `value` no longer includes `null` or `undefined` unless the validator is wrapped in `optional()`, and `object()` makes only `optional()` keys optional. `valid()` takes a value of the validator's type, so a custom validator that returns `null` or `undefined` needs them in its type, such as `ValidatorTest<string | undefined>`. `object()` takes one type parameter, the schema, so explicit type arguments such as `object<Schema, Value, Errors>(…)` become `object<Schema>(…)`, or can be left out. `check()`'s `path` must name properties of the parsed object, and an empty path `[]` is a type error; leave the path out instead. Validation tests are typed `ValidationTest<T, E>` and take the validator's value type, so a custom test that takes another type, or a test called directly with `null`, is a type error. A message function passed to `invalid()` gets `value` as `unknown`, and one that reads extra parameters needs them in `extras`.
215
225
 
216
226
  ## API Reference
217
227
 
@@ -237,7 +247,9 @@ The `message` argument in the validation tests must be a static string, a templa
237
247
  | template string | `'Password must be at least {min} characters.'` |
238
248
  | function | `` ({ value, field, max }) => `${field} must be less than ${max} but was ${value}.` `` |
239
249
 
240
- The parsed `value` is always provided. If available, `field` is also provided. Depending on the validator, additional fields may be available.
250
+ The parsed `value` is always provided. If available, `field` is also provided. Depending on the validator, additional fields may be available, such as `min` for `min()`.
251
+
252
+ In TypeScript, a message function's parameters are typed: `ValidatorMessage<T, X>` gets the value and field, `X & ValidatorMessageParameters<T>`, where `X` holds the test's extra parameters. Each test's exported parameters type, such as `MinValidatorMessageParameters`, still describes everything a message gets, so a message annotated with it fits.
241
253
 
242
254
  ### Required and optional values
243
255
 
@@ -272,7 +284,7 @@ In TypeScript, a validator's value type is `T`, and `optional()` adds `null` and
272
284
 
273
285
  A **validation type** is expected to parse and prepare the value for the provided validation tests. For example, the `string` validation type ensures the provided value is a string, and rejects a missing value unless wrapped in [`optional()`](#optionalvalidator). It must be a function that takes a value of any type and returns a promise which resolves to a validation result (see above).
274
286
 
275
- - [array(config?, itemTest, ...tests)](#arrayconfig-itemtest-tests)
287
+ - [array(itemTest?, config?, ...tests)](#arrayitemtest-config-tests)
276
288
  - [boolean(config?, ...tests)](#booleanconfig-tests)
277
289
  - [date(config?, ...tests)](#dateconfig-tests)
278
290
  - [number(config?, ...tests)](#numberconfig-tests)
@@ -281,9 +293,9 @@ A **validation type** is expected to parse and prepare the value for the provide
281
293
 
282
294
  Every validation type, and every validator `optional()` returns, is also a [Standard Schema][standard-schema], so libraries that accept one can use it directly. See [createValidator(fn)](#createvalidatorfn) for how results map to issues. In TypeScript, their type is `TypeValidator<T, E>`: a `ValidatorTest<T, E>` with a `~standard` property.
283
295
 
284
- #### array(config?, itemTest, ...tests)
296
+ #### array(itemTest?, config?, ...tests)
285
297
 
286
- Casts value to an array, or keeps `null` or `undefined` if using the default array parser. `config` is optional. `itemTest` is the validation type or test to be applied on each value within the array value. All remaining `tests` are applied to the array as a whole.
298
+ Casts value to an array, or keeps `null` or `undefined` if using the default array parser. `itemTest` is the validation type or test to be applied on each value within the array value. `config` is optional and comes after `itemTest`, as `object()`'s does. All remaining `tests` are applied to the array as a whole. Without `itemTest`, `array(config?)` keeps the items as they are and takes no tests.
287
299
 
288
300
  A valid result's `value` holds each item as `itemTest` returned it, so `array(number())` turns `['1', '2.5']` into `[1, 2.5]`, and `array(string({ trim: true }))` trims each item.
289
301
 
@@ -416,7 +428,9 @@ Supported validation tests: `email`, `exact`, `matches`, `max`, `min`, `oneOf`,
416
428
 
417
429
  ### Validation tests
418
430
 
419
- A **validation test** is a simplified version of a validation type. It accepts a value of a specific type and returns a promise that resolves to a validation result. Validation types only run tests on present values; called directly, the built-in tests pass `null` and `undefined` through. You can use a validation test directly without the validation type, but it's not recommended as you lose the parsing step and you can't apply multiple tests to the same field as easily.
431
+ A **validation test** is a simplified version of a validation type. It accepts a value of a specific type and returns a promise that resolves to a validation result. Validation types only run tests on present values, so a built-in test fails `null` and `undefined` when it's called with them directly. An empty string is a string like any other: `min(1, …)` fails it and `max(1, …)` accepts it. You can use a validation test directly without the validation type, but it's not recommended as you lose the parsing step and you can't apply multiple tests to the same field as easily.
432
+
433
+ In TypeScript, a test's type is `ValidationTest<T, E>`, a function that takes a value of type `T`. A validation type takes tests on its value type: `string()` takes `min()`, which checks strings, numbers and arrays, but not a test on booleans. A custom test that takes `unknown` fits every validation type.
420
434
 
421
435
  - [check(path?, test, message)](#checkpath-test-message)
422
436
  - [email(message)](#emailmessage)
@@ -435,6 +449,8 @@ A **validation test** is a simplified version of a validation type. It accepts a
435
449
 
436
450
  An object-level test for `object`. It fails when `test` returns `false` for the parsed object. With a `path`, the message is the error at that property in the object's `errors`; a list of names reaches into nested objects, such as `['shipping', 'zip']`. Without a `path`, the message is the object's own `message`. The parsed object is provided to the message as `value`.
437
451
 
452
+ In TypeScript, `path` is checked against the parsed object's type, so a misspelled property is a type error, and the test's error type is the errors it produces, such as `{ shipping?: { zip?: string } }`. A path ends at an array, a date or a function.
453
+
438
454
  <details><summary>arguments</summary>
439
455
 
440
456
  | name | type | description |
@@ -678,6 +694,8 @@ Formats a successful validation result. `value` is the parsed value and `field`
678
694
 
679
695
  Formats a failed validation result. `message` is the same as the `formatMessage`'s template. `value` and `field` is the same as above, `errors` is additional error details used by `array` and `object` validators, and `extras` are optional extra parameters that can be used in the message.
680
696
 
697
+ In TypeScript, a message function gets `value` as `unknown`, since `invalid()` takes any value. A message that reads extra parameters needs `extras` with them; without `extras`, it's a type error.
698
+
681
699
  ## Supported environments
682
700
 
683
701
  Supports Node versions in active or maintenance LTS at release time. Dropping one waits for the next major release.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});async function e(e,t,n){for(let r of e){let e=await r(t,n);if(e.state===`invalid`)return e}}function t(e){return e.message||e.errors===void 0?e.message:e.errors}function n(e){return Object.prototype.toString.call(e)===`[object Object]`}function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function i(e){return!!Reflect.get(Object(e),Symbol.iterator)}const a=/{(\w+)}/g;function o(e,t){return typeof e==`string`?e.replaceAll(a,(e,n)=>String(Reflect.get(t,n))):e(t)}async function s(e){return c(e)}function c({value:e,field:t}){return{state:`valid`,value:e,field:t}}async function l(e){return u(e)}function u({errors:e,field:t,message:n,value:r,extras:i}){return{state:`invalid`,message:o(n,{...i,value:r,field:t}),value:r,field:t,errors:e}}const d=`Invalid value.`;function f(e,t,n){if(typeof e==`string`)n.push({message:e||d,path:t});else if(Array.isArray(e))for(let[r,i]of e.entries())i!==null&&f(i,[...t,r],n);else if(typeof e==`object`&&e)for(let r of Object.keys(e))f(Reflect.get(e,r),[...t,r],n);else n.push({message:d,path:t})}const p=/* @__PURE__ */ new WeakSet;function m(e){return p.has(e)}function h(e){let t=Object.assign(e,{"~standard":{version:1,vendor:`validator-fns`,validate:async t=>{let n=await e(t);if(n.state===`valid`)return{value:n.value};let r=n.message?[{message:n.message}]:[];return n.errors!==void 0&&f(n.errors,[],r),{issues:r.length>0?r:[{message:d}]}}}});return p.add(t),t}function ee(e){return m(e)?e:h((t,n)=>e(t,n))}const g=Symbol(`optional`);function _(e){return e===``||typeof e==`number`&&Number.isNaN(e)||e instanceof Date&&Number.isNaN(e.getTime())}function v(e,t){let n=e===void 0?`Required.`:e,r=(e,t)=>u({message:n,value:e,field:t}),i=(e,t)=>c({value:e,field:t}),a=(e,n)=>t(e,n,r),o=(e,n)=>t(e,n,i);return Object.assign(h(a),{[g]:h(o)})}function te(e){let t=e[g];return t===void 0?h(async(t,n)=>t==null?c({value:t,field:n}):e(t,n)):t}function y(e){return Array.isArray(e)||e==null?e:i(e)?[...e]:[]}function b(e,t){let n=e.parser(t);return e.default!==void 0&&(n==null||n.length===0)&&(n=e.default),n}async function x(e,n,r){let i=!0,a=[];if(!e)return{isValid:i,errors:a,values:n};let o=[];for(let[s,c]of n.entries()){let n=await e(c,`${r||``}[${s}]`);o.push(n.value),n.state===`invalid`?(i=!1,a.push(t(n))):a.push(null)}return{isValid:i,errors:a,values:o}}function S(t,...n){let r=typeof t==`function`?[t,...n]:n,i={parser:y,...typeof t==`function`?void 0:t};return v(i.requiredMessage,async(t,n,a)=>{let o=b(i,t);if(o==null)return a(o,n);let[c,...u]=r,d=await e(u,o,n),f=await x(c,o,n);return!d&&f.isValid?s({value:f.values,field:n}):l({message:d?d.message:``,value:t,field:n,errors:f.errors})})}const C=/* @__PURE__ */ new WeakMap;function w(e,t){return(n,...r)=>{let i=e,a=r;return n!==void 0&&(typeof n==`function`?a=[n,...r]:i={...e,...n}),v(i.requiredMessage,async(e,n,r)=>{try{let o=t(e,i);if(o==null||_(o))return r(o,n);for(let e of a){let t=C.get(e),r;if(r=t?t(o,n):await e(o,n),r.state===`invalid`)return r}return c({value:o,field:n})}catch(t){return u({message:t instanceof Error?t.message:String(t),value:e,field:n})}})}}function T(e,t,n){let r=(r,i)=>e(r,i)?c({value:r,field:i}):u({message:t,value:r,field:i,extras:n?n(r):void 0}),i=async(e,t)=>r(e,t);return C.set(i,r),i}function E(e){return e==null||typeof e==`boolean`?e:!!e}function D(e,t){let n=t.parser(e);return t.default!==void 0&&n==null&&(n=t.default),n}const O=w({parser:E},D),k=/* @__PURE__ */ new Date(``),A=/^(\d{4})(?:-([0-2]\d)(?:-([0-3]\d)(?:[ T]([0-2]\d):([0-5]\d)(?::([0-5]\d)(\.\d+)?(Z|[+-][0-2]\d:?[0-5]\d)?)?)?)?)?$/,j=/^([+-])([0-2]\d):?([0-5]\d)$/;function M(e){let t=j.exec(e);if(e===`Z`||!t)return 0;let[,n,r,i]=t;return(n===`-`?-1:1)*(Number(r)*60+Number(i))}const ne=[()=>0,e=>Number(e),(e=`1`)=>Number.parseInt(e,10)-1,(e=`1`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseFloat(e)*1e3],N=`Failed to parse value to date.`;function P(e){if(e==null||e instanceof Date)return e;if(typeof e==`number`)return new Date(e);if(typeof e!=`string`)throw TypeError(N);return e.trim()===``?k:re(e)}function re(e){let t=A.exec(e);if(t===null)throw TypeError(N);let[,n=0,r=0,i=0,a=0,o=0,s=0,c=0]=ne.map((e,n)=>e(t[n])),l=t[8];return l?new Date(Date.UTC(n,r,i,a,o+M(l),s,c)):new Date(n,r,i,a,o,s,c)}function F(e,t){let n=t.parser(e);return t.default!==void 0&&(n==null||Number.isNaN(n.getTime()))&&(n=t.default),n}function I(e,t,n){let r=P(e);return T(e=>r!=null&&(e==null||e instanceof Date&&(n?e>r:e>=r)),t,()=>({min:r,limit:r,exclusive:n}))}function L(e,t,n){let r=P(e);return T(e=>r!=null&&(e==null||e instanceof Date&&(n?e<r:e<=r)),t,()=>({max:r,limit:r,exclusive:n}))}const R=w({parser:P},F),z=[e=>String.prototype.valueOf.call(e),e=>Number.prototype.valueOf.call(e),e=>Boolean.prototype.valueOf.call(e)];function B(e){if(typeof e!=`object`||!e)return e;for(let t of z)try{return t(e)}catch{}return e}function V(e){let t=B(e);switch(typeof t){case`string`:case`number`:case`bigint`:case`boolean`:return String(t);default:return}}function H(e){if(e==null||typeof e==`number`)return e;if(e instanceof Date)return e.getTime();let t=V(e),n=t===void 0?NaN:Number.parseFloat(t);if(Number.isNaN(n)&&(t===void 0||t.trim()!==``))throw TypeError(`Failed to parse value to number.`);return n}function U(e,t){let n=t.parser(e);if(t.default!==void 0&&(n==null||Number.isNaN(n))&&(n=t.default),t.round&&typeof n==`number`)switch(t.round){case`nearest`:n=Math.round(n);break;case`ceil`:n=Math.ceil(n);break;case`floor`:n=Math.floor(n);break;default:throw Error(`Unknown round type: ${String(t.round)}`)}return n}function W(e){return T(e=>e==null||typeof e==`number`&&Number.isFinite(e)&&Math.floor(e)===e,e)}const G=w({parser:H},U);function K(...e){let[t,n,r]=e.length===2?[[],...e]:e,i=typeof t==`string`?[t]:t;return async(e,t)=>{let a=e;return n(a)?s({value:a,field:t}):i.length===0?l({message:r,value:a,field:t}):l({message:``,value:a,field:t,errors:i.reduceRight((e,t)=>({[t]:e}),o(r,{value:a,field:t}))})}}function q(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0})}function J(n,i,...a){if(typeof n!=`object`||!n)throw TypeError("`properties` must be a configuration object");let o=typeof i==`function`?[i,...a]:a;return v(typeof i==`object`?i.requiredMessage:void 0,async(i,a,c)=>{if(i==null)return c(i,a);let u=Object(i),d={},f={},p=!0;for(let e in n)if(r(n,e)){let i=n[e],a=r(u,e)?Reflect.get(u,e):void 0,o=await(typeof i==`function`?i(a,e):l({field:e,message:`No validator set`,value:a}));q(f,e,o.value),o.state===`invalid`&&(p=!1,q(d,e,t(o)))}if(!p)return l({message:``,value:i,field:a,errors:d});let m=await e(o,f,a);return m?l({message:m.message,value:i,field:a,errors:m.errors}):s({value:f,field:a})})}function Y(e,t){let n=e;return T(t=>t==null||n.includes(t)||t instanceof Date&&e.some(e=>e.valueOf()===t.valueOf()),t,()=>({values:e}))}function X(e){return typeof e==`string`||Array.isArray(e)?e.length:e}function ie(e,t,n){return T(t=>{let r=X(t);return r==null||t===``||(n?r<e:r<=e)},t,t=>({max:e,limit:e,amount:X(t),exclusive:n}))}function ae(e,t,n){return T(t=>{let r=X(t);return r==null||t===``||(n?r>e:r>=e)},t,t=>({min:e,limit:e,amount:X(t),exclusive:n}))}function oe(e,t){return T(t=>{let n=X(t);return n==null||t===``||n===e},t,t=>({amount:X(t),limit:e,exact:e}))}const se=/^[\w!#$%&'*+./=?^`{|}~-]+@[\dA-Za-z](?:[\dA-Za-z-]{0,61}[\dA-Za-z])?(?:\.[\dA-Za-z](?:[\dA-Za-z-]{0,61}[\dA-Za-z])?)*$/,ce=/^(?:[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}|0{8}-0{4}-0{4}-0{4}-0{12}|f{8}-f{4}-f{4}-f{4}-f{12})$/i;function Z(e){if(e==null||typeof e==`string`)return e;if(e instanceof Date)return e.toISOString();let t=V(e);if(t===void 0)throw TypeError(`Failed to parse value to string.`);return t}function Q(e,t){let n=t.parser(e);return t.default!==void 0&&(n==null||n===``)&&(n=t.default),t.trim&&typeof n==`string`&&(n=n.trim()),n}function $(e,t){let n=new RegExp(e);return T(e=>(n.lastIndex=0,e==null||e===``||typeof e==`string`&&n.test(e)),t,()=>({pattern:e}))}function le(e){return $(se,e)}function ue(e){return $(ce,e)}function de(e,t=[`http:`,`https:`]){return T(e=>{try{let n;if(e==null||e===``||typeof e==`string`&&(n=new URL(e)))return!n||t.includes(n.protocol)}catch{}return!1},e,()=>({protocols:t}))}const fe=w({parser:Z},Q);exports.applyArrayConfig=b,exports.applyBooleanConfig=D,exports.applyDateConfig=F,exports.applyNumberConfig=U,exports.applyStringConfig=Q,exports.array=S,exports.boolean=O,exports.check=K,exports.createTypeValidatorTest=w,exports.createValidator=ee,exports.createValidatorTest=T,exports.date=R,exports.email=le,exports.exact=oe,exports.formatMessage=o,exports.hasOwnProperty=r,exports.integer=W,exports.invalid=l,exports.invalidDate=k,exports.isObject=n,exports.matches=$,exports.max=ie,exports.maxDate=L,exports.min=ae,exports.minDate=I,exports.number=G,exports.object=J,exports.oneOf=Y,exports.optional=te,exports.parseArray=y,exports.parseBoolean=E,exports.parseDate=P,exports.parseNumber=H,exports.parseString=Z,exports.string=fe,exports.url=de,exports.uuid=ue,exports.valid=s;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});async function e(e,t,n){for(let r of e){let e=await r(t,n);if(e.state===`invalid`)return e}}function t(e){return e.message||e.errors===void 0?e.message:e.errors}async function n(e,n,r){let i=!0,a=[],o=[];for(let[s,c]of n.entries()){let n=await e(c,`${r||``}[${s}]`);n.state===`invalid`?(i=!1,a.push(t(n))):(o.push(n.value),a.push(null))}return{isValid:i,errors:a,values:o}}async function r(e){return{isValid:!0,errors:[],values:e}}function i(e){return Object.prototype.toString.call(e)===`[object Object]`}function a(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function o(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0})}function s(e,t){let n={};return o(n,e,t),n}function c(e,t){return e.reduceRight((e,t)=>({[t]:e}),t)}function l(e){return!!Reflect.get(Object(e),Symbol.iterator)}const u=/{(\w+)}/g;function d(e,t){return typeof e==`string`?e.replaceAll(u,(e,n)=>String(Reflect.get(t,n))):e(t)}async function f(e){return p(e)}function p({value:e,field:t}){return{state:`valid`,value:e,field:t}}function m({errors:e,field:t,message:n,value:r}){return{state:`invalid`,message:n,value:r,field:t,errors:e}}const h=`Invalid value.`;function g(e,t,n){if(typeof e==`string`)n.push({message:e||h,path:t});else if(Array.isArray(e))for(let[r,i]of e.entries())i!==null&&g(i,[...t,r],n);else if(typeof e==`object`&&e)for(let r of Object.keys(e))g(Reflect.get(e,r),[...t,r],n);else n.push({message:h,path:t})}const _=/* @__PURE__ */ new WeakSet;function ee(e){return _.has(e)}function v(e){let t=Object.assign(e,{"~standard":{version:1,vendor:`validator-fns`,validate:async t=>{let n=await e(t);if(n.state===`valid`)return{value:n.value};let r=n.message?[{message:n.message}]:[];return n.errors!==void 0&&g(n.errors,[],r),{issues:r.length>0?r:[{message:h}]}}}});return _.add(t),t}function te(e){return ee(e)?e:v((t,n)=>e(t,n))}const y=Symbol(`optional`);function ne(e){return e===``||typeof e==`number`&&Number.isNaN(e)||e instanceof Date&&Number.isNaN(e.getTime())}function b(e,t){let n=e===void 0?`Required.`:e,r=(e,t)=>m({message:d(n,{value:e,field:t}),value:e,field:t}),i=(e,t)=>p({value:e,field:t}),a=(e,n)=>t(e,n,r),o=(e,n)=>t(e,n,i);return Object.assign(v(a),{[y]:v(o)})}function re(e){let t=e[y];return t===void 0?v(async(t,n)=>t==null?p({value:t,field:n}):e(t,n)):t}function x(e){return Array.isArray(e)||e==null?e:l(e)?[...e]:[]}function S(e,t){let n=e.parser(t);return e.default!==void 0&&(n==null||n.length===0)&&(n=e.default),n}function C(t,n,r){let i=typeof n==`function`?[n,...r]:r,a={parser:x,...typeof n==`function`?void 0:n};return b(a.requiredMessage,async(n,r,o)=>{let s=S(a,n);if(s==null)return o(s,r);let c=await e(i,s,r),l=await t(s,r);return!c&&l.isValid?f({value:l.values,field:r}):m({message:c?c.message:``,value:n,field:r,errors:l.errors})})}function w(e,t,...i){if(typeof e==`function`)return C((t,r)=>n(e,t,r),t,i);if(t!==void 0)throw TypeError(`array() takes the item validator first: array(item, config?, ...tests)`);return C(r,e,[])}const T=Symbol(`sync`);function E(e,t){return(n,...r)=>{let i=e,a=r;return n!==void 0&&(typeof n==`function`?a=[n,...r]:i={...e,...n}),b(i.requiredMessage,async(e,n,r)=>{try{let o=t(e,i);if(o==null||ne(o))return r(o,n);for(let e of a){let t=e[T],r;if(r=t?t(o,n):await e(o,n),r.state===`invalid`)return r}return p({value:o,field:n})}catch(t){return m({message:t instanceof Error?t.message:String(t),value:e,field:n})}})}}function D(e,...t){let n=(e,n)=>t.length===1?d(t[0],{value:e,field:n}):d(t[0],{...t[1](e),value:e,field:n}),r=(t,r)=>t!=null&&e(t,r)?p({value:t,field:r}):m({message:n(t,r),value:t,field:r});return Object.assign(async(e,t)=>r(e,t),{[T]:r})}function O(e){return e==null||typeof e==`boolean`?e:!!e}function k(e,t){let n=t.parser(e);return t.default!==void 0&&n==null&&(n=t.default),n}const A=E({parser:O},k),j=/* @__PURE__ */ new Date(``),M=/^(\d{4})(?:-([0-2]\d)(?:-([0-3]\d)(?:[ T]([0-2]\d):([0-5]\d)(?::([0-5]\d)(\.\d+)?(Z|[+-][0-2]\d:?[0-5]\d)?)?)?)?)?$/,N=/^([+-])([0-2]\d):?([0-5]\d)$/;function ie(e){let t=N.exec(e);if(e===`Z`||!t)return 0;let[,n,r,i]=t;return(n===`-`?-1:1)*(Number(r)*60+Number(i))}const ae=[()=>0,e=>Number(e),(e=`1`)=>Number.parseInt(e,10)-1,(e=`1`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseInt(e,10),(e=`0`)=>Number.parseFloat(e)*1e3],P=`Failed to parse value to date.`;function F(e){if(e==null||e instanceof Date)return e;if(typeof e==`number`)return new Date(e);if(typeof e!=`string`)throw TypeError(P);return e.trim()===``?j:I(e)}function I(e){let t=M.exec(e);if(t===null)throw TypeError(P);let[,n=0,r=0,i=0,a=0,o=0,s=0,c=0]=ae.map((e,n)=>e(t[n])),l=t[8];return l?new Date(Date.UTC(n,r,i,a,o+ie(l),s,c)):new Date(n,r,i,a,o,s,c)}function L(e,t){let n=t.parser(e);return t.default!==void 0&&(n==null||Number.isNaN(n.getTime()))&&(n=t.default),n}function R(e,t,n){let r=F(e);return D(e=>r!=null&&(n?e>r:e>=r),t,()=>({min:r,limit:r,exclusive:n}))}function z(e,t,n){let r=F(e);return D(e=>r!=null&&(n?e<r:e<=r),t,()=>({max:r,limit:r,exclusive:n}))}const B=E({parser:F},L),V=[e=>String.prototype.valueOf.call(e),e=>Number.prototype.valueOf.call(e),e=>Boolean.prototype.valueOf.call(e)];function H(e){if(typeof e!=`object`||!e)return e;for(let t of V)try{return t(e)}catch{}return e}function U(e){let t=H(e);switch(typeof t){case`string`:case`number`:case`bigint`:case`boolean`:return String(t);default:return}}function W(e){if(e==null||typeof e==`number`)return e;if(e instanceof Date)return e.getTime();let t=U(e),n=t===void 0?NaN:Number.parseFloat(t);if(Number.isNaN(n)&&(t===void 0||t.trim()!==``))throw TypeError(`Failed to parse value to number.`);return n}function G(e,t){let n=t.parser(e);if(t.default!==void 0&&(n==null||Number.isNaN(n))&&(n=t.default),t.round&&typeof n==`number`)switch(t.round){case`nearest`:n=Math.round(n);break;case`ceil`:n=Math.ceil(n);break;case`floor`:n=Math.floor(n);break;default:throw Error(`Unknown round type: ${String(t.round)}`)}return n}function K(e){return D(e=>Number.isFinite(e)&&Math.floor(e)===e,e)}const q=E({parser:W},G);function J(e,t,n){return async(r,i)=>{if(e(r))return p({value:r,field:i});let a=d(t,{value:r,field:i});return m(n?{message:``,value:r,field:i,errors:n(a)}:{message:a,value:r,field:i})}}function oe(...e){if(e.length===2)return J(e[0],e[1]);let[t,n,r]=e;return typeof t==`string`?J(n,r,e=>s(t,e)):J(n,r,e=>c(t,e))}function se(e){return e}function ce(n,r,...i){if(typeof n!=`object`||!n)throw TypeError("`properties` must be a configuration object");let s=typeof r==`function`?[r,...i]:i;return b(typeof r==`object`?r.requiredMessage:void 0,async(r,i,c)=>{if(r==null)return c(r,i);let l=Object(r),u={},d={},p=!0;for(let e in n)if(a(n,e)){let r=n[e],i=a(l,e)?Reflect.get(l,e):void 0,s=await(typeof r==`function`?r(i,e):m({field:e,message:`No validator set`,value:i}));o(d,e,s.value),s.state===`invalid`&&(p=!1,o(u,e,t(s)))}if(!p)return m({message:``,value:r,field:i,errors:u});let h=se(d),g=await e(s,h,i);return g?m({message:g.message,value:r,field:i,errors:g.errors}):f({value:h,field:i})})}function le(e,t){return D(t=>e.includes(t)||t instanceof Date&&e.some(e=>e.valueOf()===t.valueOf()),t,()=>({values:e}))}function Y(e){return typeof e==`number`?e:e==null?NaN:e.length}function ue(e,t,n){return D(t=>{let r=Y(t);return n?r<e:r<=e},t,t=>({max:e,limit:e,amount:Y(t),exclusive:n}))}function X(e,t,n){return D(t=>{let r=Y(t);return n?r>e:r>=e},t,t=>({min:e,limit:e,amount:Y(t),exclusive:n}))}function de(e,t){return D(t=>Y(t)===e,t,t=>({amount:Y(t),limit:e,exact:e}))}async function fe(e){let{value:t,field:n,errors:r}=e;return m({message:`extras`in e?d(e.message,{...e.extras,value:t,field:n}):d(e.message,{value:t,field:n}),value:t,field:n,errors:r})}const pe=/^[\w!#$%&'*+./=?^`{|}~-]+@[\dA-Za-z](?:[\dA-Za-z-]{0,61}[\dA-Za-z])?(?:\.[\dA-Za-z](?:[\dA-Za-z-]{0,61}[\dA-Za-z])?)*$/,me=/^(?:[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}|0{8}-0{4}-0{4}-0{4}-0{12}|f{8}-f{4}-f{4}-f{4}-f{12})$/i;function Z(e){if(e==null||typeof e==`string`)return e;if(e instanceof Date)return e.toISOString();let t=U(e);if(t===void 0)throw TypeError(`Failed to parse value to string.`);return t}function Q(e,t){let n=t.parser(e);return t.default!==void 0&&(n==null||n===``)&&(n=t.default),t.trim&&typeof n==`string`&&(n=n.trim()),n}function $(e,t){let n=new RegExp(e);return D(e=>(n.lastIndex=0,n.test(e)),t,()=>({pattern:e}))}function he(e){return $(pe,e)}function ge(e){return $(me,e)}function _e(e,t=[`http:`,`https:`]){return D(e=>{try{return t.includes(new URL(e).protocol)}catch{return!1}},e,()=>({protocols:t}))}const ve=E({parser:Z},Q);exports.applyArrayConfig=S,exports.applyBooleanConfig=k,exports.applyDateConfig=L,exports.applyNumberConfig=G,exports.applyStringConfig=Q,exports.array=w,exports.boolean=A,exports.check=oe,exports.createTypeValidatorTest=E,exports.createValidator=te,exports.createValidatorTest=D,exports.date=B,exports.email=he,exports.exact=de,exports.formatMessage=d,exports.hasOwnProperty=a,exports.integer=K,exports.invalid=fe,exports.invalidDate=j,exports.isObject=i,exports.matches=$,exports.max=ue,exports.maxDate=z,exports.min=X,exports.minDate=R,exports.number=q,exports.object=ce,exports.oneOf=le,exports.optional=re,exports.parseArray=x,exports.parseBoolean=O,exports.parseDate=F,exports.parseNumber=W,exports.parseString=Z,exports.string=ve,exports.url=_e,exports.uuid=ge,exports.valid=f;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["items","findInvalidResult","validatorTest","tests","result","value","field","invalidDetail","isObject","hasOwnProperty","object","property","isIterable","formatPattern","formatMessage","template","parameters","key","valid","validResult","invalid","invalidResult","message","extras","fallbackMessage","collectIssues","errors","issues","index","item","path","carriers","isTypeValidator","validator","withStandard","typeValidator","createValidator","fn","optionalTwin","isBlank","requirable","requiredMessage","reject","parsed","accept","required","validate","twin","optional","parseArray","applyArrayConfig","parsedValue","config","validateItems","isValid","validateItem","arrayValue","values","array","allTests","finalConfig","onEmpty","arrayTests","arrayInvalidResult","items","syncTests","createTypeValidatorTest","defaultConfig","applyConfig","syncTest","error","createValidatorTest","test","getExtras","parseBoolean","applyBooleanConfig","boolean","invalidDate","isoDatePattern","timezonePattern","parseTimezone","parts","timezone","sign","hour","minute","dateParts","part","parseErrorMessage","parseDate","parseIsoDate","year","month","day","second","millisecond","parse","applyDateConfig","minDate","parsedDate","limit","exclusive","maxDate","date","primitiveValueOfs","unboxPrimitive","valueOf","primitiveToString","primitive","parseNumber","text","applyNumberConfig","integer","number","check","args","keys","inner","setOwn","target","properties","source","resolvedValues","objectInvalidResult","oneOf","allowed","x","getAmount","max","amount","min","exact","emailPattern","uuidPattern","parseString","applyStringConfig","matches","ownPattern","pattern","email","uuid","url","protocols","string"],"sources":["../src/invalid-detail.ts","../src/shared.ts","../src/standard.ts","../src/optional.ts","../src/arrays.ts","../src/factories.ts","../src/booleans.ts","../src/parse-date.ts","../src/dates.ts","../src/primitives.ts","../src/numbers.ts","../src/check.ts","../src/objects.ts","../src/common.ts","../src/limits.ts","../src/strings.ts"],"sourcesContent":["import type { InvalidResult, ValidatorTest } from './shared.js';\n\n/**\n * Runs tests on a value in order, stopping at the first failure, for the\n * collection-level tests of `array()` and `object()`.\n * @param tests Tests to run\n * @param value Value to test\n * @param field Field name\n * @internal\n */\nexport async function findInvalidResult<V, E>(\n tests: ValidatorTest<V, E>[],\n value: V,\n field: string | undefined,\n): Promise<InvalidResult<E> | undefined> {\n for (const validatorTest of tests) {\n const result = await validatorTest(value, field);\n if (result.state === 'invalid') {\n return result;\n }\n }\n\n return undefined;\n}\n\n/**\n * The error that `array()` and `object()` record for a failed item or field:\n * its message, or its `errors` when the message is empty. With neither, the\n * empty message, so the failure never reads as `undefined`.\n * @param result Failed result\n * @internal\n */\nexport function invalidDetail<E>(result: InvalidResult<E>): string | E {\n return result.message || result.errors === undefined\n ? result.message\n : result.errors;\n}\n","export type ValidResult<T> = {\n /** `valid` if the value passed every validation test. */\n state: 'valid';\n /**\n * The parsed value. Note that may be different than the original value.\n * Type validators only pass a missing value inside `optional()`.\n */\n value: T;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string | undefined;\n};\n\nexport type InvalidResult<E> = {\n /** `invalid` if the value failed a validation test. */\n state: 'invalid';\n /** The parsed value. Note that may be different than the original value. */\n value: unknown;\n /** Error message if `state` is invalid. */\n message: string;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string | undefined;\n /** Extra error details */\n errors?: E | undefined;\n};\n\n/**\n * The result of a validation.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorResult<T = unknown, E = unknown> =\n | ValidResult<T>\n | InvalidResult<E>;\n\n/**\n * Validation test function.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorTest<T = unknown, E = unknown> = (\n value?: unknown,\n field?: string,\n) => Promise<ValidatorResult<T, E>>;\n\n/**\n * Extracts the generic error type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractError<T extends ValidatorTest> =\n T extends ValidatorTest<unknown, infer E> ? E : unknown;\n\n/**\n * Extracts the generic value type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractValue<T extends ValidatorTest> =\n T extends ValidatorTest<infer V> ? V : unknown;\n\n/**\n * Make a deep partial type.\n * @typeParam T any object type\n * @category Types\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n/**\n * Validation factory function.\n * @typeParam C The configuration type\n * @category Types\n */\nexport type ValidatorFactory<C, T, E> = (\n config?: Partial<C> | ValidatorTest<unknown, E>,\n ...tests: ValidatorTest<unknown, E>[]\n) => ValidatorTest<T, E>;\n\n/**\n * Base configuration type.\n * @typeParam T The target type.\n * @category Types\n */\nexport interface ConfigBase<T> {\n /** Parser to convert value into the designated type. */\n parser: (value: unknown) => T | null | undefined;\n /** Provide a fallback value in case the original value is undefined. */\n default?: T;\n /**\n * Message for a missing value: `undefined`, `null`, an empty string, `NaN`\n * or an invalid date after parsing and `default`. Defaults to `'Required.'`.\n */\n requiredMessage?: ValidatorMessage<T>;\n}\n\nexport interface ValidatorMessageParameters<T> {\n value: T | null | undefined;\n field: string | undefined;\n}\n\n/**\n * Validation message. May be a plain string or a function that accepts arguments.\n * While using a string, values in squiggly brackets `{}` are replaced.\n * @category Types\n */\nexport type ValidatorMessage<\n T,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>,\n> = string | ((parameters: P) => string);\n\n/**\n * Simple check for objects.\n * @param value Value to test\n */\nexport function isObject(value: unknown): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Safe hasOwnProperty check\n * @param object Object to check\n * @param property Property to look for\n */\nexport function hasOwnProperty(\n object: unknown,\n property: string | number | symbol,\n): boolean {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\n/**\n * Checks for a truthy `Symbol.iterator` property, boxing primitives so strings\n * count as iterable.\n * @internal\n */\nexport function isIterable(value: unknown): value is Iterable<unknown> {\n return Boolean(Reflect.get(Object(value), Symbol.iterator));\n}\n\n/** @internal */\nconst formatPattern = /{(\\w+)}/g;\n\n/**\n * Formats a message using a squiggly bracket `{}` template.\n * @param template Message template as string or function\n * @param parameters Params to inject into template\n * @category Helpers\n */\nexport function formatMessage<T, P extends ValidatorMessageParameters<T>>(\n template: ValidatorMessage<T, P>,\n parameters: P,\n): string {\n if (typeof template === 'string') {\n return template.replaceAll(formatPattern, (_, key: string) =>\n String(Reflect.get(parameters, key)),\n );\n }\n\n return template(parameters);\n}\n\n/**\n * Creates a valid result\n * @param result Result fields\n * @param result.value Parsed value\n * @param result.field Field name\n * @category Helpers\n */\nexport async function valid<T, E = never>(result: {\n value: T;\n field: string | undefined;\n}): Promise<ValidatorResult<T, E>> {\n return validResult(result);\n}\n\n/**\n * Creates a valid result synchronously, for `valid` and the built-in tests'\n * synchronous twins.\n * @internal\n */\nexport function validResult<T, E = never>({\n value,\n field,\n}: {\n value: T;\n field: string | undefined;\n}): ValidatorResult<T, E> {\n return {\n state: 'valid',\n value,\n field,\n };\n}\n\n/**\n * Creates an invalid result.\n * @param result Result fields\n * @param result.message Error message, formatted with `formatMessage`\n * @param result.value Parsed value\n * @param result.field Field name\n * @param result.errors Extra error details, such as per-field errors from `object` and `array`\n * @param result.extras Extra message params\n * @category Helpers\n */\nexport async function invalid<\n T,\n E = never,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>,\n>(result: {\n message: ValidatorMessage<T, P>;\n value: unknown;\n field: string | undefined;\n errors?: E | undefined;\n extras?: Omit<P, 'field' | 'value'> | undefined;\n}): Promise<ValidatorResult<T, E>> {\n return invalidResult(result);\n}\n\n/**\n * Creates an invalid result synchronously, for `invalid` and the built-in\n * tests' synchronous twins.\n * @internal\n */\nexport function invalidResult<\n T,\n E,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>,\n>({\n errors,\n field,\n message,\n value,\n extras,\n}: {\n message: ValidatorMessage<T, P>;\n value: unknown;\n field: string | undefined;\n errors?: E | undefined;\n extras?: Omit<P, 'field' | 'value'> | undefined;\n}): ValidatorResult<T, E> {\n return {\n state: 'invalid',\n message: formatMessage(message, { ...extras, value, field } as P),\n value,\n field,\n errors,\n };\n}\n","import type { ValidatorTest } from './shared.js';\nimport type { StandardSchemaV1 } from './standard-schema.js';\n\n/** @internal */\nconst fallbackMessage = 'Invalid value.';\n\n/**\n * Turns the `errors` of an invalid result into issues: object keys and array\n * indexes become path segments, and each string becomes an issue. `null` marks\n * a valid array item. An empty string, which v3 records for a failure without\n * a message, and any other value get a fallback message.\n * @internal\n */\nfunction collectIssues(\n errors: unknown,\n path: PropertyKey[],\n issues: StandardSchemaV1.Issue[],\n) {\n if (typeof errors === 'string') {\n issues.push({ message: errors || fallbackMessage, path });\n } else if (Array.isArray(errors)) {\n for (const [index, item] of errors.entries()) {\n if (item !== null) {\n collectIssues(item, [...path, index], issues);\n }\n }\n } else if (typeof errors === 'object' && errors !== null) {\n // Object.keys rather than Object.entries, which would add an ES2017\n // built-in to the supported environments list.\n for (const key of Object.keys(errors)) {\n collectIssues(Reflect.get(errors, key), [...path, key], issues);\n }\n } else {\n issues.push({ message: fallbackMessage, path });\n }\n}\n\n/**\n * A validator that is also a Standard Schema (https://standardschema.dev),\n * as every type validator is.\n * @category Types\n */\nexport type TypeValidator<T, E> = ValidatorTest<T, E> &\n StandardSchemaV1<unknown, T>;\n\n/**\n * Validators that carry this library's `~standard`, so `createValidator()`\n * returns them as they are.\n * @internal\n */\nconst carriers = new WeakSet<object>();\n\n/**\n * Whether `withStandard` added `~standard` to validator, which it does with\n * validator's own value type.\n * @internal\n */\nfunction isTypeValidator<T, E>(\n validator: ValidatorTest<T, E>,\n): validator is TypeValidator<T, E> {\n return carriers.has(validator);\n}\n\n/**\n * Adds `~standard` to validator itself and returns it.\n * @internal\n */\nexport function withStandard<T, E>(\n validator: ValidatorTest<T, E>,\n): TypeValidator<T, E> {\n const validate = async (\n value: unknown,\n ): Promise<StandardSchemaV1.Result<T>> => {\n const result = await validator(value);\n if (result.state === 'valid') {\n return { value: result.value };\n }\n\n const issues: StandardSchemaV1.Issue[] = result.message\n ? [{ message: result.message }]\n : [];\n if (result.errors !== undefined) {\n collectIssues(result.errors, [], issues);\n }\n\n return {\n issues: issues.length > 0 ? issues : [{ message: fallbackMessage }],\n };\n };\n\n const typeValidator = Object.assign(validator, {\n '~standard': { version: 1, vendor: 'validator-fns', validate } as const,\n });\n carriers.add(typeValidator);\n return typeValidator;\n}\n\n/**\n * Makes a custom validator from an async function that takes a value and a\n * field name and returns a validation result. The validator is also a Standard\n * Schema (https://standardschema.dev), like the built-in ones, and `fn` itself\n * is unchanged. A validator that already has this library's `~standard`, such\n * as a type validator, is returned as it is.\n * @param fn Function that validates a value\n * @category Helpers\n */\nexport function createValidator<T, E>(\n fn: ValidatorTest<T, E>,\n): TypeValidator<T, E> {\n if (isTypeValidator(fn)) {\n return fn;\n }\n\n return withStandard((value?: unknown, field?: string) => fn(value, field));\n}\n","import {\n invalidResult,\n validResult,\n type ValidatorMessage,\n type ValidatorResult,\n type ValidatorTest,\n} from './shared.js';\nimport { type TypeValidator, withStandard } from './standard.js';\n\n/**\n * Message for a missing value when the validator's config sets none.\n * @internal\n */\nconst defaultRequiredMessage = 'Required.';\n\n/**\n * Key for the twin that `optional()` returns, set on every built-in type\n * validator. Module-private, so only validators made here carry it.\n * @internal\n */\nconst optionalTwin = Symbol('optional');\n\n/** @internal */\ntype OptionalTwin<T, E> = {\n readonly [optionalTwin]?: TypeValidator<T | null | undefined, E>;\n};\n\n/**\n * Whether a parsed value that isn't null or undefined still counts as missing:\n * an empty string, NaN or an invalid date.\n * @internal\n */\nexport function isBlank(value: unknown): boolean {\n return (\n value === '' ||\n (typeof value === 'number' && Number.isNaN(value)) ||\n (value instanceof Date && Number.isNaN(value.getTime()))\n );\n}\n\n/**\n * Makes a type validator that rejects a missing value with `requiredMessage`,\n * and the twin `optional()` returns, which accepts it. `validate` parses the\n * input and hands a missing parsed value to `onEmpty`; the two differ only in\n * what `onEmpty` returns. Both return `validate`'s promise as is, since another\n * async layer would cost a microtask per call.\n * @internal\n */\nexport function requirable<T, E>(\n requiredMessage: ValidatorMessage<T> | undefined,\n validate: <V>(\n value: unknown,\n field: string | undefined,\n onEmpty: (\n parsed: T | null | undefined,\n field: string | undefined,\n ) => ValidatorResult<V, E>,\n ) => Promise<ValidatorResult<T | V, E>>,\n): TypeValidator<T, E> {\n const message =\n requiredMessage === undefined ? defaultRequiredMessage : requiredMessage;\n const reject = (parsed: T | null | undefined, field: string | undefined) =>\n invalidResult<T, E>({ message, value: parsed, field });\n const accept = (parsed: T | null | undefined, field: string | undefined) =>\n validResult<T | null | undefined, E>({ value: parsed, field });\n const required: ValidatorTest<T, E> = (value, field) =>\n validate(value, field, reject);\n const twin: ValidatorTest<T | null | undefined, E> = (value, field) =>\n validate(value, field, accept);\n\n return Object.assign(withStandard(required), {\n [optionalTwin]: withStandard(twin),\n });\n}\n\n/**\n * Lets a type validator accept a missing value: `undefined`, `null`, an empty\n * string, `NaN` or an invalid date, judged after parsing and `default`. A\n * missing value skips the tests and is the result's value as parsed. Any other\n * validator, such as a custom one, gets `undefined` and `null` accepted as\n * they are, and every other value passed on.\n * @category Helpers\n */\nexport function optional<T, E>(\n validator: ValidatorTest<T, E> & OptionalTwin<T, E>,\n): TypeValidator<T | null | undefined, E> {\n const twin = validator[optionalTwin];\n if (twin !== undefined) {\n return twin;\n }\n\n return withStandard(async (value?: unknown, field?: string) =>\n value === null || value === undefined\n ? validResult<T | null | undefined, E>({ value, field })\n : validator(value, field),\n );\n}\n","import { findInvalidResult, invalidDetail } from './invalid-detail.js';\nimport { requirable } from './optional.js';\nimport type { TypeValidator } from './standard.js';\nimport {\n invalid,\n isIterable,\n valid,\n type ConfigBase,\n type ValidatorTest,\n} from './shared.js';\n\n/**\n * Invalid validation result for an item in the array\n * @category Types\n */\nexport type ArrayItemValidatorResult<E = unknown> = null | string | E;\n\n/**\n * Configuration for array validation.\n * @category Types\n */\nexport type ArrayConfig = ConfigBase<unknown[]>;\n\n/**\n * Parses a value into an array.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseArray(value: unknown): unknown[] | null | undefined {\n if (Array.isArray(value)) {\n const items: unknown[] = value;\n return items;\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n if (isIterable(value)) {\n return [...value];\n }\n\n return [];\n}\n\n/**\n * Applies a configuration to the array value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyArrayConfig(\n config: ArrayConfig,\n value: unknown,\n): unknown[] | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n parsedValue.length === 0)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Runs the item test on every item, collecting each item's parsed value, and\n * `null` for valid items and the message or errors for invalid ones. Without\n * an item test, there is nothing to check, and the values are the array as\n * given.\n * @param validateItem Item test\n * @param arrayValue Parsed array\n * @param field Field name\n * @internal\n */\nasync function validateItems(\n validateItem: ValidatorTest | undefined,\n arrayValue: unknown[],\n field: string | undefined,\n) {\n let isValid = true;\n const errors: ArrayItemValidatorResult[] = [];\n\n if (!validateItem) {\n return { isValid, errors, values: arrayValue };\n }\n\n const values: unknown[] = [];\n\n for (const [index, item] of arrayValue.entries()) {\n const result = await validateItem(item, `${field || ''}[${index}]`);\n values.push(result.value);\n\n if (result.state === 'invalid') {\n isValid = false;\n errors.push(invalidDetail(result));\n } else {\n errors.push(null);\n }\n }\n\n return { isValid, errors, values };\n}\n\n/**\n * Validates an array. The first passed validator is used to validate individual\n * items. The remaining validators target the array itself.\n * @category Type Validators\n */\nexport function array<T, E>(\n config?: Partial<ArrayConfig> | ValidatorTest<T, E>,\n ...tests: ValidatorTest[]\n): TypeValidator<T[], string | ArrayItemValidatorResult<E>[]> {\n const allTests = typeof config === 'function' ? [config, ...tests] : tests;\n const finalConfig: ArrayConfig = {\n parser: parseArray,\n ...(typeof config === 'function' ? undefined : config),\n };\n\n return requirable<T[], string | ArrayItemValidatorResult<E>[]>(\n finalConfig.requiredMessage,\n async (value, field, onEmpty) => {\n const arrayValue = applyArrayConfig(finalConfig, value);\n if (arrayValue === null || arrayValue === undefined) {\n return onEmpty(arrayValue, field);\n }\n\n const [validateItem, ...arrayTests] = allTests;\n\n const arrayInvalidResult = await findInvalidResult(\n arrayTests,\n arrayValue,\n field,\n );\n const items = await validateItems(validateItem, arrayValue, field);\n\n if (!arrayInvalidResult && items.isValid) {\n return valid({\n value: items.values as T[],\n field,\n });\n }\n\n return invalid<T[], ArrayItemValidatorResult<E>[]>({\n message: arrayInvalidResult ? arrayInvalidResult.message : '',\n value,\n field,\n errors: items.errors as ArrayItemValidatorResult<E>[],\n });\n },\n );\n}\n","import { isBlank, requirable } from './optional.js';\nimport type { TypeValidator } from './standard.js';\nimport {\n type ConfigBase,\n invalidResult,\n validResult,\n type ValidatorMessage,\n type ValidatorMessageParameters,\n type ValidatorResult,\n type ValidatorTest,\n} from './shared.js';\n\n/**\n * Synchronous twins of the tests `createValidatorTest` makes. A type validator\n * runs a test's twin when it has one, which skips the promise and await around\n * every built-in test (#523). The tests themselves stay async.\n * @internal\n */\nconst syncTests = new WeakMap<\n ValidatorTest,\n // The twins never set errors, so their error type is never.\n (value: unknown, field: string | undefined) => ValidatorResult<unknown, never>\n>();\n\n/**\n * Creates a type validator.\n * @typeParam T The basic type for the final value to be validated.\n * @typeParam C The configuration type.\n * @param defaultParser Parser to convert value into type.\n * @param applyConfig Function that applies configuration to value.\n * @category Helpers\n */\nexport function createTypeValidatorTest<T, C extends ConfigBase<T>>(\n // NoInfer makes TypeScript infer C from applyConfig's config parameter, so C\n // keeps the options that defaultConfig leaves out. Needs TypeScript 5.4.\n defaultConfig: NoInfer<C>,\n applyConfig: (value: unknown, config: C) => T | null | undefined,\n): (\n config?: Partial<C> | ValidatorTest<unknown, string>,\n ...tests: ValidatorTest<unknown, string>[]\n) => TypeValidator<T, string> {\n return (config, ...tests) => {\n let finalConfig = defaultConfig;\n let allTests = tests;\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...defaultConfig,\n ...config,\n };\n }\n }\n\n return requirable<T, string>(\n finalConfig.requiredMessage,\n async (value, field, onEmpty) => {\n try {\n const parsedValue = applyConfig(value, finalConfig);\n if (\n parsedValue === null ||\n parsedValue === undefined ||\n isBlank(parsedValue)\n ) {\n return onEmpty(parsedValue, field);\n }\n\n for (const validatorTest of allTests) {\n const syncTest = syncTests.get(validatorTest);\n // Not a ternary: @vitest/coverage-v8 5 gives the branch after an\n // await in a ternary arm a negative count.\n let result: ValidatorResult<unknown, string>;\n if (syncTest) {\n result = syncTest(parsedValue, field);\n } else {\n result = await validatorTest(parsedValue, field);\n }\n if (result.state === 'invalid') {\n return result;\n }\n }\n\n return validResult({ value: parsedValue, field });\n } catch (error) {\n return invalidResult<T, string>({\n message: error instanceof Error ? error.message : String(error),\n value,\n field,\n });\n }\n },\n );\n };\n}\n\n/**\n * Captures basic validator test pattern\n * @param test Test function\n * @param message Error message\n * @param getExtras Optional extra fields for error message\n */\nexport function createValidatorTest<\n T = unknown,\n E = never,\n P extends ValidatorMessageParameters<T> = ValidatorMessageParameters<T>,\n>(\n test: (value: unknown, field?: string) => boolean,\n message: ValidatorMessage<T, P>,\n getExtras?: (value: T | null | undefined) => Omit<P, 'value' | 'field'>,\n): ValidatorTest<T, E> {\n const syncTest = (\n value: unknown,\n field: string | undefined,\n ): ValidatorResult<T, never> => {\n if (test(value, field)) {\n return validResult({ value: value as T, field });\n }\n\n return invalidResult({\n message,\n value,\n field,\n extras: getExtras ? getExtras(value as T) : undefined,\n });\n };\n const validatorTest: ValidatorTest<T, E> = async (value, field) =>\n syncTest(value, field);\n syncTests.set(validatorTest, syncTest);\n\n return validatorTest;\n}\n","import { createTypeValidatorTest } from './factories.js';\nimport type { ConfigBase } from './shared.js';\n\n/**\n * Parses a value into a boolean.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseBoolean(value: unknown): boolean | null | undefined {\n if (value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n return Boolean(value);\n}\n\n/**\n * Applies a configuration to the boolean value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyBooleanConfig(\n value: unknown,\n config: BooleanConfig,\n): boolean | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Configuration for boolean validation.\n * @category Types\n */\nexport type BooleanConfig = ConfigBase<boolean>;\n\n/**\n * Validates a boolean value.\n * @category Type Validators\n */\nexport const boolean = createTypeValidatorTest(\n { parser: parseBoolean },\n applyBooleanConfig,\n);\n","/** Badly formatted date for internal use. */\nexport const invalidDate = new Date('');\n\n/** @internal */\nconst isoDatePattern =\n /^(\\d{4})(?:-([0-2]\\d)(?:-([0-3]\\d)(?:[ T]([0-2]\\d):([0-5]\\d)(?::([0-5]\\d)(\\.\\d+)?(Z|[+-][0-2]\\d:?[0-5]\\d)?)?)?)?)?$/;\n\n/** @internal */\nconst timezonePattern = /^([+-])([0-2]\\d):?([0-5]\\d)$/;\n\n/**\n * Parses a timezone string.\n * @param timezone Timezone to parse\n * @internal\n */\nfunction parseTimezone(timezone: string): number {\n const parts = timezonePattern.exec(timezone);\n\n if (timezone === 'Z' || !parts) {\n return 0;\n }\n\n // The pattern's groups aren't optional, so a match always has the sign,\n // hour, and minute.\n const [, sign, hour, minute] = parts;\n const multiplier = sign === '-' ? -1 : 1;\n const offset = Number(hour) * 60 + Number(minute);\n\n return multiplier * offset;\n}\n\nconst BASE = 10;\n\nconst dateParts = [\n // Skip\n () => 0,\n // Year, which the date pattern always captures\n (part?: string) => Number(part),\n // Month\n (part = '1') => Number.parseInt(part, BASE) - 1,\n // Day\n (part = '1') => Number.parseInt(part, BASE),\n // Hour\n (part = '0') => Number.parseInt(part, BASE),\n // Minute\n (part = '0') => Number.parseInt(part, BASE),\n // Second\n (part = '0') => Number.parseInt(part, BASE),\n // Millisecond\n (part = '0') => Number.parseFloat(part) * 1e3,\n];\n\n/** @internal */\nconst parseErrorMessage = 'Failed to parse value to date.';\n\n/**\n * Parses a value into a date. Throws a `TypeError` for a non-blank string that\n * isn't ISO 8601, and for input that isn't a date, number, or string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseDate(value: unknown): Date | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (typeof value === 'number') {\n return new Date(value);\n }\n\n if (typeof value !== 'string') {\n throw new TypeError(parseErrorMessage);\n }\n\n // A blank string stays empty, as an invalid date, for `default` and\n // `optional()` to handle.\n return value.trim() === '' ? invalidDate : parseIsoDate(value);\n}\n\n/**\n * Parses an ISO 8601 string into a date. Without a timezone, the date is local.\n * Throws for a string that isn't ISO 8601.\n * @param value String to parse\n * @internal\n */\nfunction parseIsoDate(value: string): Date {\n const parts = isoDatePattern.exec(value);\n\n if (parts === null) {\n throw new TypeError(parseErrorMessage);\n }\n\n const [\n ,\n year = 0,\n month = 0,\n day = 0,\n hour = 0,\n minute = 0,\n second = 0,\n millisecond = 0,\n ] = dateParts.map((parse, index) => parse(parts[index]));\n\n const timezone = parts[8];\n\n if (!timezone) {\n return new Date(year, month, day, hour, minute, second, millisecond);\n }\n\n return new Date(\n Date.UTC(\n year,\n month,\n day,\n hour,\n minute + parseTimezone(timezone),\n second,\n millisecond,\n ),\n );\n}\n","import { createTypeValidatorTest, createValidatorTest } from './factories.js';\nimport type {\n ConfigBase,\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared.js';\nimport { parseDate } from './parse-date.js';\n\n/**\n * Applies a configuration to the date value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyDateConfig(\n value: unknown,\n config: DateConfig,\n): Date | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue.getTime()))\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\nexport type SharedDateValueType = Date | string | number;\n\nexport interface MinDateValidatorMessageParameters extends ValidatorMessageParameters<Date> {\n min: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a date value is on or after a date.\n * @param limit Minimum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function minDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MinDateValidatorMessageParameters>,\n exclusive?: boolean,\n): ValidatorTest<Date, never> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value > parsedDate : value >= parsedDate))),\n message,\n () => ({\n min: parsedDate,\n limit: parsedDate,\n exclusive,\n }),\n );\n}\n\nexport interface MaxDateValidatorMessageParameters extends ValidatorMessageParameters<Date> {\n max: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a date value is on or before a date.\n * @param limit Maximum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function maxDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<Date, MaxDateValidatorMessageParameters>,\n exclusive?: boolean,\n): ValidatorTest<Date, never> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (value === null ||\n value === undefined ||\n (value instanceof Date &&\n (exclusive ? value < parsedDate : value <= parsedDate))),\n message,\n () => ({\n max: parsedDate,\n limit: parsedDate,\n exclusive,\n }),\n );\n}\n\n/**\n * Configuration for date validation.\n * @category Types\n */\nexport type DateConfig = ConfigBase<Date>;\n\n/**\n * Validates a date value.\n * @category Type Validators\n */\nexport const date = createTypeValidatorTest(\n { parser: parseDate },\n applyDateConfig,\n);\n","/** @internal */\nconst primitiveValueOfs = [\n (value: object) => String.prototype.valueOf.call(value),\n (value: object) => Number.prototype.valueOf.call(value),\n (value: object) => Boolean.prototype.valueOf.call(value),\n];\n\n/**\n * Returns the primitive inside a `String`, `Number`, or `Boolean` object, and\n * any other value as it is.\n * @param value Value to unbox\n */\nfunction unboxPrimitive(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n // Each valueOf throws unless `this` is its own wrapper type, from any realm,\n // which `instanceof` can't tell.\n for (const valueOf of primitiveValueOfs) {\n try {\n return valueOf(value);\n } catch {\n // Not this wrapper type.\n }\n }\n\n return value;\n}\n\n/**\n * Converts a string, number, bigint, or boolean, or an object wrapping one, to\n * a string.\n * @param value Value to convert\n * @returns The string, or `undefined` for any other value\n */\nexport function primitiveToString(value: unknown): string | undefined {\n const primitive = unboxPrimitive(value);\n switch (typeof primitive) {\n case 'string':\n case 'number':\n case 'bigint':\n case 'boolean': {\n return String(primitive);\n }\n default: {\n return undefined;\n }\n }\n}\n","import { createTypeValidatorTest, createValidatorTest } from './factories.js';\nimport { primitiveToString } from './primitives.js';\nimport type { ConfigBase, ValidatorMessage, ValidatorTest } from './shared.js';\n\n/**\n * Parses a value into a number.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseNumber(value: unknown): number | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n const text = primitiveToString(value);\n const parsed = text === undefined ? Number.NaN : Number.parseFloat(text);\n // Blank input stays empty, as NaN, for `required` and `default` to handle.\n if (Number.isNaN(parsed) && (text === undefined || text.trim() !== '')) {\n throw new TypeError('Failed to parse value to number.');\n }\n\n return parsed;\n}\n\n/**\n * Applies a configuration to the number value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyNumberConfig(\n value: unknown,\n config: NumberConfig,\n): number | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue))\n ) {\n parsedValue = config.default;\n }\n\n if (config.round && typeof parsedValue === 'number') {\n switch (config.round) {\n case 'nearest': {\n parsedValue = Math.round(parsedValue);\n break;\n }\n case 'ceil': {\n parsedValue = Math.ceil(parsedValue);\n break;\n }\n case 'floor': {\n parsedValue = Math.floor(parsedValue);\n break;\n }\n default: {\n throw new Error(`Unknown round type: ${String(config.round)}`);\n }\n }\n }\n\n return parsedValue;\n}\n\n/**\n * Ensures a number value is an integer.\n * @param message Error message\n * @category Validation Tests\n */\nexport function integer(\n message: ValidatorMessage<number>,\n): ValidatorTest<number, never> {\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n (typeof value === 'number' &&\n Number.isFinite(value) &&\n Math.floor(value) === value),\n message,\n );\n}\n\n/**\n * Configuration for number validation.\n * @category Types\n */\nexport interface NumberConfig extends ConfigBase<number> {\n /** Apply rounding mechanism before validation. */\n round?: 'nearest' | 'floor' | 'ceil';\n}\n\n/**\n * Validates a number value.\n * @category Type Validators\n */\nexport const number = createTypeValidatorTest(\n {\n parser: parseNumber,\n },\n applyNumberConfig,\n);\n","import {\n formatMessage,\n invalid,\n valid,\n type ValidatorMessage,\n type ValidatorTest,\n} from './shared.js';\n\n/**\n * An object-level test for `object()`. It fails when `test` returns false for\n * the parsed object. The message goes to the error at `path`, a property name\n * or a list of names into nested objects, or to the object's own message\n * without a path. The message gets the parsed object as `value` and the\n * object's `field`.\n * @category Validation Tests\n */\nexport function check<T, E = never>(\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n): ValidatorTest<T, E>;\nexport function check<T, E = never>(\n path: string | readonly string[],\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n): ValidatorTest<T, E>;\nexport function check<T, E = never>(\n ...args:\n | [test: (value: T) => boolean, message: ValidatorMessage<T>]\n | [\n path: string | readonly string[],\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n ]\n): ValidatorTest<T, E> {\n const [path, test, message] = args.length === 2 ? [[], ...args] : args;\n const keys = typeof path === 'string' ? [path] : path;\n\n return async (value, field) => {\n const parsed = value as T;\n if (test(parsed)) {\n return valid({ value: parsed, field });\n }\n\n if (keys.length === 0) {\n return invalid({ message, value: parsed, field });\n }\n\n // Computed keys define own properties, so a `__proto__` key stays one.\n const errors = keys.reduceRight<unknown>(\n (inner, key) => ({ [key]: inner }),\n formatMessage(message, { value: parsed, field }),\n );\n return invalid({ message: '', value: parsed, field, errors: errors as E });\n };\n}\n","import { findInvalidResult, invalidDetail } from './invalid-detail.js';\nimport { requirable } from './optional.js';\nimport type { TypeValidator } from './standard.js';\nimport {\n type ExtractError,\n type ExtractValue,\n hasOwnProperty,\n invalid,\n valid,\n type ValidatorMessage,\n type ValidatorTest,\n} from './shared.js';\n\nexport type ObjectParameter = Record<string, ValidatorTest>;\n\n/**\n * Flattens an intersection into one object type, keeping optional keys.\n * @internal\n */\ntype Flatten<T> = { [K in keyof T]: T[K] };\n\n/**\n * Keys whose validator's value type includes undefined, such as an\n * `optional()` validator's, may be left out. `object()` still sets every key\n * it validates, to `undefined` for a missing one.\n * @internal\n */\ntype ObjectValue<P extends ObjectParameter> = Flatten<\n {\n [\n K in keyof P as undefined extends ExtractValue<P[K]> ? never : K\n ]: ExtractValue<P[K]>;\n } & {\n [\n K in keyof P as undefined extends ExtractValue<P[K]> ? K : never\n ]?: ExtractValue<P[K]>;\n }\n>;\n\n/**\n * A failed field records its message, such as a nested object's\n * `'Required.'`, or its errors when the message is empty.\n * @internal\n */\ntype ObjectErrors<P extends ObjectParameter> = {\n [K in keyof P]?: string | ExtractError<P[K]>;\n};\n\n/**\n * Sets an own property. Plain assignment of `__proto__` calls the\n * `Object.prototype.__proto__` setter instead of creating the property.\n * @internal\n */\nfunction setOwn(target: object, key: string, value: unknown) {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n}\n\n/**\n * Configuration for object validation.\n * @category Types\n */\nexport interface ObjectConfig {\n /**\n * Message for a missing object, `undefined` or `null`. Defaults to\n * `'Required.'`.\n */\n requiredMessage?: ValidatorMessage<unknown>;\n}\n\n/**\n * Validates an object. The second argument is a configuration object, or the\n * first of the `tests`. The tests run on the parsed object, in order, once\n * every property is valid, and the first failure is the result.\n * @category Type Validators\n */\nexport function object<\n P extends ObjectParameter,\n V extends ObjectValue<P>,\n E extends ObjectErrors<P>,\n>(\n properties: P,\n // Typed from P rather than V and E, so the tests don't take part in\n // inferring V and E.\n config?: ObjectConfig | ValidatorTest<ObjectValue<P>, ObjectErrors<P>>,\n ...tests: ValidatorTest<ObjectValue<P>, ObjectErrors<P>>[]\n): TypeValidator<V, E> {\n if (typeof properties !== 'object' || properties === null) {\n throw new TypeError('`properties` must be a configuration object');\n }\n\n const allTests = typeof config === 'function' ? [config, ...tests] : tests;\n const requiredMessage =\n typeof config === 'object' ? config.requiredMessage : undefined;\n\n return requirable<V, E>(requiredMessage, async (values, field, onEmpty) => {\n if (values === null || values === undefined) {\n return onEmpty(values, field);\n }\n\n // Object() boxes primitives.\n const source: object = Object(values);\n const errors = {} as E;\n const resolvedValues = {} as V;\n let isValid = true;\n\n for (const key in properties) {\n if (hasOwnProperty(properties, key)) {\n const validator = properties[key];\n // Only own properties, so a missing key named like an inherited one,\n // such as `constructor`, reads as missing.\n const value: unknown = hasOwnProperty(source, key)\n ? Reflect.get(source, key)\n : undefined;\n const result = await (typeof validator === 'function'\n ? validator(value, key)\n : invalid({ field: key, message: 'No validator set', value }));\n\n setOwn(resolvedValues, key, result.value);\n\n if (result.state === 'invalid') {\n isValid = false;\n setOwn(errors, key, invalidDetail(result));\n }\n }\n }\n\n if (!isValid) {\n return invalid({ message: '', value: values, field, errors });\n }\n\n const objectInvalidResult = await findInvalidResult(\n allTests,\n resolvedValues,\n field,\n );\n if (objectInvalidResult) {\n return invalid({\n message: objectInvalidResult.message,\n value: values,\n field,\n errors: objectInvalidResult.errors as E,\n });\n }\n\n return valid({ value: resolvedValues, field });\n });\n}\n","import { createValidatorTest } from './factories.js';\nimport type {\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared.js';\n\nexport interface OneOfValidatorMessageParameters<\n T,\n> extends ValidatorMessageParameters<T> {\n values: readonly T[];\n}\n\n/**\n * Ensures a value is one in a predefined list.\n * @param values List of allowed values.\n * @param message Error message\n * @category Validation Tests\n */\nexport function oneOf<T extends string | number | boolean | Date>(\n values: readonly T[],\n message: ValidatorMessage<T, OneOfValidatorMessageParameters<T>>,\n): ValidatorTest<T, never> {\n const allowed: readonly unknown[] = values;\n return createValidatorTest(\n (value) =>\n value === undefined ||\n value === null ||\n allowed.includes(value) ||\n (value instanceof Date &&\n values.some((x) => x.valueOf() === value.valueOf())),\n message,\n () => ({ values }),\n );\n}\n","import { createValidatorTest } from './factories.js';\nimport type {\n ValidatorMessage,\n ValidatorMessageParameters,\n ValidatorTest,\n} from './shared.js';\n\nexport type SharedValueType = string | number | unknown[];\n\n/**\n * Extracts a numeric amount from value, i.e. string length, array length, or number.\n * @internal\n */\nfunction getAmount(value: SharedValueType | null | undefined) {\n return typeof value === 'string' || Array.isArray(value)\n ? value.length\n : value;\n}\n\nexport interface MaxValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {\n max: number;\n amount: number | null | undefined;\n limit: number;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function max(\n limit: number,\n message: ValidatorMessage<SharedValueType, MaxValidatorMessageParameters>,\n exclusive?: boolean,\n): ValidatorTest<SharedValueType, never> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount < limit : amount <= limit)\n );\n },\n message,\n (value) => ({\n max: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n }),\n );\n}\n\nexport interface MinValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {\n min: number;\n limit: number;\n amount: number | null | undefined;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function min(\n limit: number,\n message: ValidatorMessage<SharedValueType, MinValidatorMessageParameters>,\n exclusive?: boolean,\n): ValidatorTest<SharedValueType, never> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n (exclusive ? amount > limit : amount >= limit)\n );\n },\n message,\n (value) => ({\n min: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n }),\n );\n}\n\nexport interface ExactValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {\n limit: number;\n amount: number | null | undefined;\n exact: number;\n}\n\n/**\n * Ensures a string, number, or array value is exactly a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @category Validation Tests\n */\nexport function exact(\n limit: number,\n message: ValidatorMessage<SharedValueType, ExactValidatorMessageParameters>,\n): ValidatorTest<SharedValueType, never> {\n return createValidatorTest(\n (value) => {\n const amount = getAmount(value as SharedValueType);\n return (\n amount === undefined ||\n amount === null ||\n value === '' ||\n amount === limit\n );\n },\n message,\n (value) => ({\n amount: getAmount(value),\n limit,\n exact: limit,\n }),\n );\n}\n","import { createTypeValidatorTest, createValidatorTest } from './factories.js';\nimport { primitiveToString } from './primitives.js';\nimport {\n type ConfigBase,\n type ValidatorMessage,\n type ValidatorMessageParameters,\n type ValidatorTest,\n} from './shared.js';\n\n/** @internal */\nconst emailPattern =\n /^[\\w!#$%&'*+./=?^`{|}~-]+@[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?(?:\\.[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?)*$/;\n\n/**\n * RFC 9562 UUIDs: versions 1 to 8 with the RFC's variant (10xx), plus the nil\n * and max UUIDs.\n * @internal\n */\nconst uuidPattern =\n /^(?:[\\da-f]{8}-[\\da-f]{4}-[1-8][\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}|0{8}-0{4}-0{4}-0{4}-0{12}|f{8}-f{4}-f{4}-f{4}-f{12})$/i;\n\n/**\n * Configuration for string validation.\n * @category Types\n */\nexport interface StringConfig extends ConfigBase<string> {\n /** Apply trim to string before validation. */\n trim?: boolean;\n}\n\n/**\n * Parses a value into a string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseString(value: unknown): string | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n const parsed = primitiveToString(value);\n if (parsed === undefined) {\n throw new TypeError('Failed to parse value to string.');\n }\n\n return parsed;\n}\n\n/**\n * Applies a configuration to the string value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyStringConfig(\n value: unknown,\n config: StringConfig,\n): string | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null || parsedValue === '')\n ) {\n parsedValue = config.default;\n }\n\n if (config.trim && typeof parsedValue === 'string') {\n parsedValue = parsedValue.trim();\n }\n\n return parsedValue;\n}\n\nexport interface MatchesValidatorMessageParameters extends ValidatorMessageParameters<string> {\n pattern: RegExp;\n}\n\n/**\n * Ensures a string value matches a pattern\n * @param pattern Pattern to match\n * @param message Error message\n * @category Validation Tests\n */\nexport function matches(\n pattern: RegExp,\n message: ValidatorMessage<string, MatchesValidatorMessageParameters>,\n): ValidatorTest<string, never> {\n // A g or y pattern advances lastIndex on each test(), so a shared one would\n // fail matching values after a match. Test a private copy from index 0.\n const ownPattern = new RegExp(pattern);\n return createValidatorTest(\n (value) => {\n ownPattern.lastIndex = 0;\n return (\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && ownPattern.test(value))\n );\n },\n message,\n () => ({ pattern }),\n );\n}\n\n/**\n * Ensures a string value matches an email pattern\n * @param message Error message\n * @category Validation Tests\n */\nexport function email(\n message: ValidatorMessage<string>,\n): ValidatorTest<string, never> {\n return matches(emailPattern, message);\n}\n\n/**\n * Ensures a string value is an RFC 9562 UUID, any version from 1 to 8, or the\n * nil or max UUID. Case-insensitive, without braces or a `urn:uuid:` prefix.\n * @param message Error message\n * @category Validation Tests\n */\nexport function uuid(\n message: ValidatorMessage<string>,\n): ValidatorTest<string, never> {\n return matches(uuidPattern, message);\n}\n\n/**\n * Ensures a string value is a valid URL\n * @param message Error message\n * @param protocols Protocols to allow. Defaults to `['http:', 'https:']`; a list\n * replaces the default.\n * @category Validation Tests\n */\nexport function url(\n message: ValidatorMessage<string>,\n protocols: string[] = ['http:', 'https:'],\n): ValidatorTest<string, never> {\n return createValidatorTest(\n (value) => {\n try {\n let parsed: URL | undefined;\n if (\n value === undefined ||\n value === null ||\n value === '' ||\n (typeof value === 'string' && (parsed = new URL(value)))\n ) {\n return !parsed || protocols.includes(parsed.protocol);\n }\n } catch {\n // Do nothing\n }\n\n return false;\n },\n message,\n () => ({ protocols }),\n );\n}\n\n/**\n * Validates a string value.\n * @category Type Validators\n */\nexport const string = createTypeValidatorTest(\n {\n parser: parseString,\n },\n applyStringConfig,\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["items","findInvalidResult","validatorTest","tests","result","value","field","invalidDetail","validateItems","isValid","errors","values","index","item","arrayValue","validateItem","keepItems","isObject","hasOwnProperty","object","property","setOwn","target","key","errorAtKey","message","errorAt","path","inner","isIterable","formatPattern","formatMessage","template","parameters","valid","validResult","invalidResult","fallbackMessage","collectIssues","issues","carriers","isTypeValidator","validator","withStandard","typeValidator","createValidator","fn","optionalTwin","isBlank","requirable","requiredMessage","reject","parsed","accept","required","validate","twin","optional","parseArray","applyArrayConfig","parsedValue","config","arrayOf","arrayTests","finalConfig","onEmpty","arrayInvalidResult","items","checkItems","array","first","second","syncTwin","createTypeValidatorTest","defaultConfig","allTests","applyConfig","syncTest","error","createValidatorTest","format","formatFor","given","test","parseBoolean","applyBooleanConfig","boolean","invalidDate","isoDatePattern","timezonePattern","parseTimezone","parts","timezone","sign","hour","minute","dateParts","part","parseErrorMessage","parseDate","parseIsoDate","year","month","day","millisecond","parse","applyDateConfig","minDate","parsedDate","limit","exclusive","maxDate","date","primitiveValueOfs","unboxPrimitive","valueOf","primitiveToString","primitive","parseNumber","text","applyNumberConfig","integer","number","checkWith","formatted","toErrors","check","args","asObjectValue","properties","source","resolvedValues","objectInvalidResult","oneOf","x","getAmount","max","amount","min","exact","invalid","emailPattern","uuidPattern","parseString","applyStringConfig","matches","ownPattern","pattern","email","uuid","url","protocols","string"],"sources":["../src/invalid-detail.ts","../src/shared.ts","../src/standard.ts","../src/optional.ts","../src/arrays.ts","../src/factories.ts","../src/booleans.ts","../src/parse-date.ts","../src/dates.ts","../src/primitives.ts","../src/numbers.ts","../src/check.ts","../src/objects.ts","../src/common.ts","../src/limits.ts","../src/invalid.ts","../src/strings.ts"],"sourcesContent":["import type { InvalidResult, ValidationTest, ValidatorTest } from './shared.js';\n\n/**\n * Runs tests on a value in order, stopping at the first failure, for the\n * collection-level tests of `array()` and `object()`.\n * @param tests Tests to run\n * @param value Value to test\n * @param field Field name\n * @internal\n */\nexport async function findInvalidResult<V, E>(\n tests: ValidationTest<V, E>[],\n value: V,\n field: string | undefined,\n): Promise<InvalidResult<E> | undefined> {\n for (const validatorTest of tests) {\n const result = await validatorTest(value, field);\n if (result.state === 'invalid') {\n return result;\n }\n }\n\n return undefined;\n}\n\n/**\n * The error that `array()` and `object()` record for a failed item or field:\n * its message, or its `errors` when the message is empty. With neither, the\n * empty message, so the failure never reads as `undefined`.\n * @param result Failed result\n * @internal\n */\nexport function invalidDetail<E>(result: InvalidResult<E>): string | E {\n return result.message || result.errors === undefined\n ? result.message\n : result.errors;\n}\n\n/**\n * A test on an array itself, such as `max()`. It runs on the parsed array,\n * before the item validator, so the items are `unknown`.\n * @internal\n */\nexport type ArrayTest = ValidationTest<unknown[]>;\n\n/**\n * Each item as the item validator parsed it, and each item's error: `null` for\n * a valid item, and the message or errors for an invalid one.\n * @internal\n */\nexport type ValidatedItems<T, E> = {\n isValid: boolean;\n errors: (null | string | E)[];\n values: T[];\n};\n\n/**\n * Runs the item validator on every item.\n * @param validateItem Item validator\n * @param arrayValue Parsed array\n * @param field Field name\n * @internal\n */\nexport async function validateItems<T, E>(\n validateItem: ValidatorTest<T, E>,\n arrayValue: unknown[],\n field: string | undefined,\n): Promise<ValidatedItems<T, E>> {\n let isValid = true;\n const errors: (null | string | E)[] = [];\n // Only valid items' values, which are only used when every item is valid.\n const values: T[] = [];\n\n for (const [index, item] of arrayValue.entries()) {\n const result = await validateItem(item, `${field || ''}[${index}]`);\n\n if (result.state === 'invalid') {\n isValid = false;\n errors.push(invalidDetail(result));\n } else {\n values.push(result.value);\n errors.push(null);\n }\n }\n\n return { isValid, errors, values };\n}\n\n/**\n * Without an item validator, there is nothing to check, and the values are the\n * array as given.\n * @param arrayValue Parsed array\n * @internal\n */\nexport async function keepItems(\n arrayValue: unknown[],\n): Promise<ValidatedItems<unknown, unknown>> {\n return { isValid: true, errors: [], values: arrayValue };\n}\n","export type ValidResult<T> = {\n /** `valid` if the value passed every validation test. */\n state: 'valid';\n /**\n * The parsed value. Note that may be different than the original value.\n * Type validators only pass a missing value inside `optional()`.\n */\n value: T;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string | undefined;\n};\n\nexport type InvalidResult<E> = {\n /** `invalid` if the value failed a validation test. */\n state: 'invalid';\n /** The parsed value. Note that may be different than the original value. */\n value: unknown;\n /** Error message if `state` is invalid. */\n message: string;\n /** Field name if provided. Automatically provided if using object validation. */\n field?: string | undefined;\n /** Extra error details */\n errors?: E | undefined;\n};\n\n/**\n * The result of a validation.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorResult<T = unknown, E = unknown> =\n | ValidResult<T>\n | InvalidResult<E>;\n\n/**\n * Validation test function.\n * @typeParam T The value type\n * @category Types\n */\nexport type ValidatorTest<T = unknown, E = unknown> = (\n value?: unknown,\n field?: string,\n) => Promise<ValidatorResult<T, E>>;\n\n/**\n * Validation test function, such as `min()`: it checks a parsed value. Type\n * validators run their tests on the parsed value once it's present, so a test\n * takes the validator's value type. Its own result value is never read.\n * @typeParam T The value type the test checks\n * @typeParam E The error type\n * @category Types\n */\nexport type ValidationTest<T = unknown, E = unknown> = (\n value: T,\n field?: string,\n) => Promise<ValidatorResult<unknown, E>>;\n\n/**\n * Extracts the generic error type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractError<T extends ValidatorTest> =\n T extends ValidatorTest<unknown, infer E> ? E : unknown;\n\n/**\n * Extracts the generic value type from a ValidatorTest.\n * @typeParam T a ValidatorTest\n * @category Types\n */\nexport type ExtractValue<T extends ValidatorTest> =\n T extends ValidatorTest<infer V> ? V : unknown;\n\n/**\n * Make a deep partial type.\n * @typeParam T any object type\n * @category Types\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n\n/**\n * Validation factory function.\n * @typeParam C The configuration type\n * @category Types\n */\nexport type ValidatorFactory<C, T, E> = (\n config?: Partial<C> | ValidationTest<T, E>,\n ...tests: ValidationTest<T, E>[]\n) => ValidatorTest<T, E>;\n\n/**\n * Base configuration type.\n * @typeParam T The target type.\n * @category Types\n */\nexport interface ConfigBase<T> {\n /** Parser to convert value into the designated type. */\n parser: (value: unknown) => T | null | undefined;\n /** Provide a fallback value in case the original value is undefined. */\n default?: T;\n /**\n * Message for a missing value: `undefined`, `null`, an empty string, `NaN`\n * or an invalid date after parsing and `default`. Defaults to `'Required.'`.\n */\n requiredMessage?: ValidatorMessage<T>;\n}\n\nexport interface ValidatorMessageParameters<T> {\n value: T | null | undefined;\n field: string | undefined;\n}\n\n/**\n * The extra parameters of a message parameters type, without the value and\n * field every message gets.\n * @internal\n */\nexport type MessageExtras<P extends ValidatorMessageParameters<unknown>> = Omit<\n P,\n 'value' | 'field'\n>;\n\n/**\n * Validation message. May be a plain string or a function that accepts arguments.\n * While using a string, values in squiggly brackets `{}` are replaced.\n * A function gets the value and field, and any extra parameters `X` the test\n * adds, such as `min` for `min()`.\n * @typeParam T The value type\n * @typeParam X The extra parameters\n * @category Types\n */\nexport type ValidatorMessage<T, X extends object = object> =\n | string\n | ((parameters: X & ValidatorMessageParameters<T>) => string);\n\n/**\n * Paths into nested plain objects, as lists of property names, for `check()`.\n * Arrays, dates and functions end a path.\n * @internal\n */\nexport type KeyPath<T> = T extends\n | readonly unknown[]\n | Date\n | ((...args: never[]) => unknown)\n ? never\n : T extends object\n ? {\n [K in keyof T & string]:\n | readonly [K]\n | readonly [K, ...KeyPath<NonNullable<T[K]>>];\n }[keyof T & string]\n : never;\n\n/**\n * The errors with a message at `Path` that `check()` produces, such as\n * `{ shipping?: { zip?: string } }` for `['shipping', 'zip']`.\n * @internal\n */\nexport type AtPath<Path> = Path extends readonly [\n infer Head extends string,\n ...infer Rest,\n]\n ? { [P in Head]?: AtPath<Rest> }\n : string;\n\n/**\n * Simple check for objects.\n * @param value Value to test\n */\nexport function isObject(value: unknown): boolean {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Safe hasOwnProperty check\n * @param object Object to check\n * @param property Property to look for\n */\nexport function hasOwnProperty(\n object: unknown,\n property: string | number | symbol,\n): boolean {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\n/**\n * Sets an own property. Plain assignment of `__proto__` calls the\n * `Object.prototype.__proto__` setter instead of creating the property.\n * @internal\n */\nexport function setOwn(target: object, key: string, value: unknown) {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n}\n\n/**\n * The errors with `message` at `key`, for `check()`.\n * @internal\n */\nexport function errorAtKey<K extends string>(\n key: K,\n message: string,\n): { [P in K]?: string } {\n const errors: { [P in K]?: string } = {};\n setOwn(errors, key, message);\n return errors;\n}\n\n/**\n * The errors with `message` at `path`, for `check()`. The one type assertion\n * it needs: no loop can build the recursive type `AtPath<Path>`.\n * @internal\n */\nexport function errorAt<Path extends readonly string[]>(\n path: Path,\n message: string,\n): AtPath<Path> {\n // Computed keys define own properties, so a `__proto__` key stays one.\n const errors = path.reduceRight<unknown>(\n (inner, key) => ({ [key]: inner }),\n message,\n );\n // Permanent, approved in #657 (2.2a). Reconsider if TypeScript can check a\n // recursive type built in a loop.\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- no loop can build AtPath<Path>, see above\n return errors as AtPath<Path>;\n}\n\n/**\n * Checks for a truthy `Symbol.iterator` property, boxing primitives so strings\n * count as iterable.\n * @internal\n */\nexport function isIterable(value: unknown): value is Iterable<unknown> {\n return Boolean(Reflect.get(Object(value), Symbol.iterator));\n}\n\n/** @internal */\nconst formatPattern = /{(\\w+)}/g;\n\n/**\n * Formats a message using a squiggly bracket `{}` template.\n * @param template Message template as string or function\n * @param parameters Params to inject into template\n * @category Helpers\n */\nexport function formatMessage<T, X extends object = object>(\n template: ValidatorMessage<T, X>,\n parameters: X & ValidatorMessageParameters<T>,\n): string {\n if (typeof template === 'string') {\n return template.replaceAll(formatPattern, (_, key: string) =>\n String(Reflect.get(parameters, key)),\n );\n }\n\n return template(parameters);\n}\n\n/**\n * Creates a valid result\n * @param result Result fields\n * @param result.value Parsed value\n * @param result.field Field name\n * @category Helpers\n */\nexport async function valid<T, E = never>(result: {\n value: T;\n field: string | undefined;\n}): Promise<ValidatorResult<T, E>> {\n return validResult(result);\n}\n\n/**\n * Creates a valid result synchronously, for `valid` and the built-in tests'\n * synchronous twins.\n * @internal\n */\nexport function validResult<T, E = never>({\n value,\n field,\n}: {\n value: T;\n field: string | undefined;\n}): ValidatorResult<T, E> {\n return {\n state: 'valid',\n value,\n field,\n };\n}\n\n/**\n * Creates an invalid result synchronously from a formatted message, for\n * `invalid` and the built-in tests' synchronous twins.\n * @internal\n */\nexport function invalidResult<E = never>({\n errors,\n field,\n message,\n value,\n}: {\n message: string;\n value: unknown;\n field: string | undefined;\n errors?: E | undefined;\n}): InvalidResult<E> {\n return {\n state: 'invalid',\n message,\n value,\n field,\n errors,\n };\n}\n","import type { ValidatorTest } from './shared.js';\nimport type { StandardSchemaV1 } from './standard-schema.js';\n\n/** @internal */\nconst fallbackMessage = 'Invalid value.';\n\n/**\n * Turns the `errors` of an invalid result into issues: object keys and array\n * indexes become path segments, and each string becomes an issue. `null` marks\n * a valid array item. An empty string, which v3 records for a failure without\n * a message, and any other value get a fallback message.\n * @internal\n */\nfunction collectIssues(\n errors: unknown,\n path: PropertyKey[],\n issues: StandardSchemaV1.Issue[],\n) {\n if (typeof errors === 'string') {\n issues.push({ message: errors || fallbackMessage, path });\n } else if (Array.isArray(errors)) {\n for (const [index, item] of errors.entries()) {\n if (item !== null) {\n collectIssues(item, [...path, index], issues);\n }\n }\n } else if (typeof errors === 'object' && errors !== null) {\n // Object.keys rather than Object.entries, which would add an ES2017\n // built-in to the supported environments list.\n for (const key of Object.keys(errors)) {\n collectIssues(Reflect.get(errors, key), [...path, key], issues);\n }\n } else {\n issues.push({ message: fallbackMessage, path });\n }\n}\n\n/**\n * A validator that is also a Standard Schema (https://standardschema.dev),\n * as every type validator is.\n * @category Types\n */\nexport type TypeValidator<T, E> = ValidatorTest<T, E> &\n StandardSchemaV1<unknown, T>;\n\n/**\n * Validators that carry this library's `~standard`, so `createValidator()`\n * returns them as they are.\n * @internal\n */\nconst carriers = new WeakSet<object>();\n\n/**\n * Whether `withStandard` added `~standard` to validator, which it does with\n * validator's own value type.\n * @internal\n */\nfunction isTypeValidator<T, E>(\n validator: ValidatorTest<T, E>,\n): validator is TypeValidator<T, E> {\n return carriers.has(validator);\n}\n\n/**\n * Adds `~standard` to validator itself and returns it.\n * @internal\n */\nexport function withStandard<T, E>(\n validator: ValidatorTest<T, E>,\n): TypeValidator<T, E> {\n const validate = async (\n value: unknown,\n ): Promise<StandardSchemaV1.Result<T>> => {\n const result = await validator(value);\n if (result.state === 'valid') {\n return { value: result.value };\n }\n\n const issues: StandardSchemaV1.Issue[] = result.message\n ? [{ message: result.message }]\n : [];\n if (result.errors !== undefined) {\n collectIssues(result.errors, [], issues);\n }\n\n return {\n issues: issues.length > 0 ? issues : [{ message: fallbackMessage }],\n };\n };\n\n const typeValidator = Object.assign(validator, {\n '~standard': { version: 1, vendor: 'validator-fns', validate } as const,\n });\n carriers.add(typeValidator);\n return typeValidator;\n}\n\n/**\n * Makes a custom validator from an async function that takes a value and a\n * field name and returns a validation result. The validator is also a Standard\n * Schema (https://standardschema.dev), like the built-in ones, and `fn` itself\n * is unchanged. A validator that already has this library's `~standard`, such\n * as a type validator, is returned as it is.\n * @param fn Function that validates a value\n * @category Helpers\n */\nexport function createValidator<T, E>(\n fn: ValidatorTest<T, E>,\n): TypeValidator<T, E> {\n if (isTypeValidator(fn)) {\n return fn;\n }\n\n return withStandard((value?: unknown, field?: string) => fn(value, field));\n}\n","import {\n formatMessage,\n invalidResult,\n validResult,\n type ValidatorMessage,\n type ValidatorResult,\n type ValidatorTest,\n} from './shared.js';\nimport { type TypeValidator, withStandard } from './standard.js';\n\n/**\n * Message for a missing value when the validator's config sets none.\n * @internal\n */\nconst defaultRequiredMessage = 'Required.';\n\n/**\n * Key for the twin that `optional()` returns, set on every built-in type\n * validator. Module-private, so only validators made here carry it.\n * @internal\n */\nconst optionalTwin = Symbol('optional');\n\n/** @internal */\ntype OptionalTwin<T, E> = {\n readonly [optionalTwin]?: TypeValidator<T | null | undefined, E>;\n};\n\n/**\n * Whether a parsed value that isn't null or undefined still counts as missing:\n * an empty string, NaN or an invalid date.\n * @internal\n */\nexport function isBlank(value: unknown): boolean {\n return (\n value === '' ||\n (typeof value === 'number' && Number.isNaN(value)) ||\n (value instanceof Date && Number.isNaN(value.getTime()))\n );\n}\n\n/**\n * Makes a type validator that rejects a missing value with `requiredMessage`,\n * and the twin `optional()` returns, which accepts it. `validate` parses the\n * input and hands a missing parsed value to `onEmpty`; the two differ only in\n * what `onEmpty` returns. Both return `validate`'s promise as is, since another\n * async layer would cost a microtask per call.\n * @internal\n */\nexport function requirable<T, E>(\n requiredMessage: ValidatorMessage<T> | undefined,\n validate: <V>(\n value: unknown,\n field: string | undefined,\n onEmpty: (\n parsed: T | null | undefined,\n field: string | undefined,\n ) => ValidatorResult<V, E>,\n ) => Promise<ValidatorResult<T | V, E>>,\n): TypeValidator<T, E> {\n const message =\n requiredMessage === undefined ? defaultRequiredMessage : requiredMessage;\n const reject = (parsed: T | null | undefined, field: string | undefined) =>\n invalidResult<E>({\n message: formatMessage(message, { value: parsed, field }),\n value: parsed,\n field,\n });\n const accept = (parsed: T | null | undefined, field: string | undefined) =>\n validResult<T | null | undefined, E>({ value: parsed, field });\n const required: ValidatorTest<T, E> = (value, field) =>\n validate(value, field, reject);\n const twin: ValidatorTest<T | null | undefined, E> = (value, field) =>\n validate(value, field, accept);\n\n return Object.assign(withStandard(required), {\n [optionalTwin]: withStandard(twin),\n });\n}\n\n/**\n * Lets a type validator accept a missing value: `undefined`, `null`, an empty\n * string, `NaN` or an invalid date, judged after parsing and `default`. A\n * missing value skips the tests and is the result's value as parsed. Any other\n * validator, such as a custom one, gets `undefined` and `null` accepted as\n * they are, and every other value passed on.\n * @category Helpers\n */\nexport function optional<T, E>(\n validator: ValidatorTest<T, E> & OptionalTwin<T, E>,\n): TypeValidator<T | null | undefined, E> {\n const twin = validator[optionalTwin];\n if (twin !== undefined) {\n return twin;\n }\n\n return withStandard(async (value?: unknown, field?: string) =>\n value === null || value === undefined\n ? validResult<T | null | undefined, E>({ value, field })\n : validator(value, field),\n );\n}\n","import {\n type ArrayTest,\n findInvalidResult,\n keepItems,\n validateItems,\n type ValidatedItems,\n} from './invalid-detail.js';\nimport { requirable } from './optional.js';\nimport type { TypeValidator } from './standard.js';\nimport {\n invalidResult,\n isIterable,\n valid,\n type ConfigBase,\n type ValidatorTest,\n} from './shared.js';\n\n/**\n * Invalid validation result for an item in the array\n * @category Types\n */\nexport type ArrayItemValidatorResult<E = unknown> = null | string | E;\n\n/**\n * Configuration for array validation.\n * @category Types\n */\nexport type ArrayConfig = ConfigBase<unknown[]>;\n\n/**\n * Parses a value into an array.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseArray(value: unknown): unknown[] | null | undefined {\n if (Array.isArray(value)) {\n const items: unknown[] = value;\n return items;\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n if (isIterable(value)) {\n return [...value];\n }\n\n return [];\n}\n\n/**\n * Applies a configuration to the array value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyArrayConfig(\n config: ArrayConfig,\n value: unknown,\n): unknown[] | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n parsedValue.length === 0)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Builds the array validator around a function that checks the items.\n * @internal\n */\nfunction arrayOf<T, E>(\n checkItems: (\n arrayValue: unknown[],\n field: string | undefined,\n ) => Promise<ValidatedItems<T, E>>,\n config: Partial<ArrayConfig> | ArrayTest | undefined,\n tests: ArrayTest[],\n): TypeValidator<T[], string | ArrayItemValidatorResult<E>[]> {\n const arrayTests = typeof config === 'function' ? [config, ...tests] : tests;\n const finalConfig: ArrayConfig = {\n parser: parseArray,\n ...(typeof config === 'function' ? undefined : config),\n };\n\n return requirable<T[], string | ArrayItemValidatorResult<E>[]>(\n finalConfig.requiredMessage,\n async (value, field, onEmpty) => {\n const arrayValue = applyArrayConfig(finalConfig, value);\n if (arrayValue === null || arrayValue === undefined) {\n return onEmpty(arrayValue, field);\n }\n\n const arrayInvalidResult = await findInvalidResult(\n arrayTests,\n arrayValue,\n field,\n );\n const items = await checkItems(arrayValue, field);\n\n if (!arrayInvalidResult && items.isValid) {\n return valid({ value: items.values, field });\n }\n\n return invalidResult({\n message: arrayInvalidResult ? arrayInvalidResult.message : '',\n value,\n field,\n errors: items.errors,\n });\n },\n );\n}\n\n/**\n * Validates an array. The item validator, if any, comes first and runs on each\n * item. Then an optional configuration, and tests that target the array\n * itself.\n * @category Type Validators\n */\nexport function array<T, E>(\n item: ValidatorTest<T, E>,\n config?: Partial<ArrayConfig> | ArrayTest,\n ...tests: ArrayTest[]\n): TypeValidator<T[], string | ArrayItemValidatorResult<E>[]>;\nexport function array(\n config?: Partial<ArrayConfig>,\n): TypeValidator<unknown[], string | ArrayItemValidatorResult[]>;\nexport function array<T, E>(\n first?: ValidatorTest<T, E> | Partial<ArrayConfig>,\n second?: Partial<ArrayConfig> | ArrayTest,\n ...tests: ArrayTest[]\n):\n | TypeValidator<T[], string | ArrayItemValidatorResult<E>[]>\n | TypeValidator<unknown[], string | ArrayItemValidatorResult[]> {\n if (typeof first === 'function') {\n return arrayOf(\n (arrayValue, field) => validateItems(first, arrayValue, field),\n second,\n tests,\n );\n }\n\n // 2.x took the config first, so a JavaScript caller may still pass the item\n // validator second, where it would be ignored.\n if (second !== undefined) {\n throw new TypeError(\n 'array() takes the item validator first: array(item, config?, ...tests)',\n );\n }\n\n return arrayOf(keepItems, first, []);\n}\n","import { isBlank, requirable } from './optional.js';\nimport type { TypeValidator } from './standard.js';\nimport {\n type ConfigBase,\n formatMessage,\n invalidResult,\n type ValidationTest,\n validResult,\n type ValidatorMessage,\n type ValidatorResult,\n} from './shared.js';\n\n/**\n * Key for the synchronous twin of each test `createValidatorTest` makes. A\n * type validator runs a test's twin when it has one, which skips the promise\n * and await around every built-in test (#523). The tests themselves stay\n * async. Module-private, so only tests made here carry it.\n * @internal\n */\nconst syncTwin = Symbol('sync');\n\n/** @internal */\ntype SyncTwin<T> = {\n // The twins never set errors, so their error type is never.\n readonly [syncTwin]?: (\n value: T,\n field: string | undefined,\n ) => ValidatorResult<unknown, never>;\n};\n\n/**\n * Creates a type validator.\n * @typeParam T The basic type for the final value to be validated.\n * @typeParam C The configuration type.\n * @param defaultParser Parser to convert value into type.\n * @param applyConfig Function that applies configuration to value.\n * @category Helpers\n */\nexport function createTypeValidatorTest<T, C extends ConfigBase<T>>(\n // NoInfer makes TypeScript infer C from applyConfig's config parameter, so C\n // keeps the options that defaultConfig leaves out. Needs TypeScript 5.4.\n defaultConfig: NoInfer<C>,\n applyConfig: (value: unknown, config: C) => T | null | undefined,\n): (\n config?: Partial<C> | ValidationTest<T, string>,\n ...tests: ValidationTest<T, string>[]\n) => TypeValidator<T, string> {\n return (config, ...tests) => {\n let finalConfig = defaultConfig;\n // Typed with the twin, which only tests made here carry.\n let allTests: (ValidationTest<T, string> & SyncTwin<T>)[] = tests;\n\n if (config !== undefined) {\n if (typeof config === 'function') {\n allTests = [config, ...tests];\n } else {\n finalConfig = {\n ...defaultConfig,\n ...config,\n };\n }\n }\n\n return requirable<T, string>(\n finalConfig.requiredMessage,\n async (value, field, onEmpty) => {\n try {\n const parsedValue = applyConfig(value, finalConfig);\n if (\n parsedValue === null ||\n parsedValue === undefined ||\n isBlank(parsedValue)\n ) {\n return onEmpty(parsedValue, field);\n }\n\n for (const validatorTest of allTests) {\n const syncTest = validatorTest[syncTwin];\n // Not a ternary: @vitest/coverage-v8 5 gives the branch after an\n // await in a ternary arm a negative count.\n let result: ValidatorResult<unknown, string>;\n if (syncTest) {\n result = syncTest(parsedValue, field);\n } else {\n result = await validatorTest(parsedValue, field);\n }\n if (result.state === 'invalid') {\n return result;\n }\n }\n\n return validResult({ value: parsedValue, field });\n } catch (error) {\n return invalidResult<string>({\n message: error instanceof Error ? error.message : String(error),\n value,\n field,\n });\n }\n },\n );\n };\n}\n\n/**\n * Captures basic validator test pattern. The test gets the parsed value, and\n * fails a missing one, which type validators never pass (#660).\n * @param test Test function\n * @param message Error message\n * @param getExtras Extra parameters for the error message\n */\nexport function createValidatorTest<T, E = never>(\n test: (value: T, field?: string) => boolean,\n message: ValidatorMessage<T>,\n): ValidationTest<T, E>;\nexport function createValidatorTest<T, E, X extends object>(\n test: (value: T, field?: string) => boolean,\n message: ValidatorMessage<T, X>,\n getExtras: (value: T) => X,\n): ValidationTest<T, E>;\nexport function createValidatorTest<T, E, X extends object>(\n test: (value: T, field?: string) => boolean,\n ...format:\n | [message: ValidatorMessage<T>]\n | [message: ValidatorMessage<T, X>, getExtras: (value: T) => X]\n): ValidationTest<T, E> {\n const formatFor = (value: T, field: string | undefined) =>\n format.length === 1\n ? formatMessage<T>(format[0], { value, field })\n : formatMessage(format[0], { ...format[1](value), value, field });\n const twin = (\n value: T,\n field: string | undefined,\n ): ValidatorResult<unknown, never> => {\n // Wider than T, since JavaScript callers can pass a missing value.\n const given: unknown = value;\n if (given !== null && given !== undefined && test(value, field)) {\n return validResult({ value, field });\n }\n\n return invalidResult({ message: formatFor(value, field), value, field });\n };\n const validationTest: ValidationTest<T, E> = async (value, field) =>\n twin(value, field);\n\n return Object.assign(validationTest, { [syncTwin]: twin });\n}\n","import { createTypeValidatorTest } from './factories.js';\nimport type { ConfigBase } from './shared.js';\n\n/**\n * Parses a value into a boolean.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseBoolean(value: unknown): boolean | null | undefined {\n if (value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n return Boolean(value);\n}\n\n/**\n * Applies a configuration to the boolean value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyBooleanConfig(\n value: unknown,\n config: BooleanConfig,\n): boolean | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null)\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\n/**\n * Configuration for boolean validation.\n * @category Types\n */\nexport type BooleanConfig = ConfigBase<boolean>;\n\n/**\n * Validates a boolean value.\n * @category Type Validators\n */\nexport const boolean = createTypeValidatorTest(\n { parser: parseBoolean },\n applyBooleanConfig,\n);\n","/** Badly formatted date for internal use. */\nexport const invalidDate = new Date('');\n\n/** @internal */\nconst isoDatePattern =\n /^(\\d{4})(?:-([0-2]\\d)(?:-([0-3]\\d)(?:[ T]([0-2]\\d):([0-5]\\d)(?::([0-5]\\d)(\\.\\d+)?(Z|[+-][0-2]\\d:?[0-5]\\d)?)?)?)?)?$/;\n\n/** @internal */\nconst timezonePattern = /^([+-])([0-2]\\d):?([0-5]\\d)$/;\n\n/**\n * Parses a timezone string.\n * @param timezone Timezone to parse\n * @internal\n */\nfunction parseTimezone(timezone: string): number {\n const parts = timezonePattern.exec(timezone);\n\n if (timezone === 'Z' || !parts) {\n return 0;\n }\n\n // The pattern's groups aren't optional, so a match always has the sign,\n // hour, and minute.\n const [, sign, hour, minute] = parts;\n const multiplier = sign === '-' ? -1 : 1;\n const offset = Number(hour) * 60 + Number(minute);\n\n return multiplier * offset;\n}\n\nconst BASE = 10;\n\nconst dateParts = [\n // Skip\n () => 0,\n // Year, which the date pattern always captures\n (part?: string) => Number(part),\n // Month\n (part = '1') => Number.parseInt(part, BASE) - 1,\n // Day\n (part = '1') => Number.parseInt(part, BASE),\n // Hour\n (part = '0') => Number.parseInt(part, BASE),\n // Minute\n (part = '0') => Number.parseInt(part, BASE),\n // Second\n (part = '0') => Number.parseInt(part, BASE),\n // Millisecond\n (part = '0') => Number.parseFloat(part) * 1e3,\n];\n\n/** @internal */\nconst parseErrorMessage = 'Failed to parse value to date.';\n\n/**\n * Parses a value into a date. Throws a `TypeError` for a non-blank string that\n * isn't ISO 8601, and for input that isn't a date, number, or string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseDate(value: unknown): Date | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n if (typeof value === 'number') {\n return new Date(value);\n }\n\n if (typeof value !== 'string') {\n throw new TypeError(parseErrorMessage);\n }\n\n // A blank string stays empty, as an invalid date, for `default` and\n // `optional()` to handle.\n return value.trim() === '' ? invalidDate : parseIsoDate(value);\n}\n\n/**\n * Parses an ISO 8601 string into a date. Without a timezone, the date is local.\n * Throws for a string that isn't ISO 8601.\n * @param value String to parse\n * @internal\n */\nfunction parseIsoDate(value: string): Date {\n const parts = isoDatePattern.exec(value);\n\n if (parts === null) {\n throw new TypeError(parseErrorMessage);\n }\n\n const [\n ,\n year = 0,\n month = 0,\n day = 0,\n hour = 0,\n minute = 0,\n second = 0,\n millisecond = 0,\n ] = dateParts.map((parse, index) => parse(parts[index]));\n\n const timezone = parts[8];\n\n if (!timezone) {\n return new Date(year, month, day, hour, minute, second, millisecond);\n }\n\n return new Date(\n Date.UTC(\n year,\n month,\n day,\n hour,\n minute + parseTimezone(timezone),\n second,\n millisecond,\n ),\n );\n}\n","import { createTypeValidatorTest, createValidatorTest } from './factories.js';\nimport type {\n ConfigBase,\n MessageExtras,\n ValidatorMessage,\n ValidationTest,\n ValidatorMessageParameters,\n} from './shared.js';\nimport { parseDate } from './parse-date.js';\n\n/**\n * Applies a configuration to the date value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyDateConfig(\n value: unknown,\n config: DateConfig,\n): Date | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue.getTime()))\n ) {\n parsedValue = config.default;\n }\n\n return parsedValue;\n}\n\nexport type SharedDateValueType = Date | string | number;\n\nexport interface MinDateValidatorMessageParameters extends ValidatorMessageParameters<Date> {\n min: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a date value is on or after a date.\n * @param limit Minimum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function minDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<\n Date,\n MessageExtras<MinDateValidatorMessageParameters>\n >,\n exclusive?: boolean,\n): ValidationTest<Date, never> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value: Date) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (exclusive ? value > parsedDate : value >= parsedDate),\n message,\n () => ({\n min: parsedDate,\n limit: parsedDate,\n exclusive,\n }),\n );\n}\n\nexport interface MaxDateValidatorMessageParameters extends ValidatorMessageParameters<Date> {\n max: Date | null | undefined;\n limit: Date | null | undefined;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a date value is on or before a date.\n * @param limit Maximum date\n * @param message Error message\n * @param exclusive Makes comparison exclusive instead of inclusive\n * @category Validation Tests\n */\nexport function maxDate(\n limit: SharedDateValueType,\n message: ValidatorMessage<\n Date,\n MessageExtras<MaxDateValidatorMessageParameters>\n >,\n exclusive?: boolean,\n): ValidationTest<Date, never> {\n const parsedDate = parseDate(limit);\n return createValidatorTest(\n (value: Date) =>\n parsedDate !== null &&\n parsedDate !== undefined &&\n (exclusive ? value < parsedDate : value <= parsedDate),\n message,\n () => ({\n max: parsedDate,\n limit: parsedDate,\n exclusive,\n }),\n );\n}\n\n/**\n * Configuration for date validation.\n * @category Types\n */\nexport type DateConfig = ConfigBase<Date>;\n\n/**\n * Validates a date value.\n * @category Type Validators\n */\nexport const date = createTypeValidatorTest(\n { parser: parseDate },\n applyDateConfig,\n);\n","/** @internal */\nconst primitiveValueOfs = [\n (value: object) => String.prototype.valueOf.call(value),\n (value: object) => Number.prototype.valueOf.call(value),\n (value: object) => Boolean.prototype.valueOf.call(value),\n];\n\n/**\n * Returns the primitive inside a `String`, `Number`, or `Boolean` object, and\n * any other value as it is.\n * @param value Value to unbox\n */\nfunction unboxPrimitive(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n // Each valueOf throws unless `this` is its own wrapper type, from any realm,\n // which `instanceof` can't tell.\n for (const valueOf of primitiveValueOfs) {\n try {\n return valueOf(value);\n } catch {\n // Not this wrapper type.\n }\n }\n\n return value;\n}\n\n/**\n * Converts a string, number, bigint, or boolean, or an object wrapping one, to\n * a string.\n * @param value Value to convert\n * @returns The string, or `undefined` for any other value\n */\nexport function primitiveToString(value: unknown): string | undefined {\n const primitive = unboxPrimitive(value);\n switch (typeof primitive) {\n case 'string':\n case 'number':\n case 'bigint':\n case 'boolean': {\n return String(primitive);\n }\n default: {\n return undefined;\n }\n }\n}\n","import { createTypeValidatorTest, createValidatorTest } from './factories.js';\nimport { primitiveToString } from './primitives.js';\nimport type { ConfigBase, ValidationTest, ValidatorMessage } from './shared.js';\n\n/**\n * Parses a value into a number.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseNumber(value: unknown): number | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n const text = primitiveToString(value);\n const parsed = text === undefined ? Number.NaN : Number.parseFloat(text);\n // Blank input stays empty, as NaN, for `required` and `default` to handle.\n if (Number.isNaN(parsed) && (text === undefined || text.trim() !== '')) {\n throw new TypeError('Failed to parse value to number.');\n }\n\n return parsed;\n}\n\n/**\n * Applies a configuration to the number value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyNumberConfig(\n value: unknown,\n config: NumberConfig,\n): number | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined ||\n parsedValue === null ||\n Number.isNaN(parsedValue))\n ) {\n parsedValue = config.default;\n }\n\n if (config.round && typeof parsedValue === 'number') {\n switch (config.round) {\n case 'nearest': {\n parsedValue = Math.round(parsedValue);\n break;\n }\n case 'ceil': {\n parsedValue = Math.ceil(parsedValue);\n break;\n }\n case 'floor': {\n parsedValue = Math.floor(parsedValue);\n break;\n }\n default: {\n throw new Error(`Unknown round type: ${String(config.round)}`);\n }\n }\n }\n\n return parsedValue;\n}\n\n/**\n * Ensures a number value is an integer.\n * @param message Error message\n * @category Validation Tests\n */\nexport function integer(\n message: ValidatorMessage<number>,\n): ValidationTest<number, never> {\n return createValidatorTest(\n (value: number) => Number.isFinite(value) && Math.floor(value) === value,\n message,\n );\n}\n\n/**\n * Configuration for number validation.\n * @category Types\n */\nexport interface NumberConfig extends ConfigBase<number> {\n /** Apply rounding mechanism before validation. */\n round?: 'nearest' | 'floor' | 'ceil';\n}\n\n/**\n * Validates a number value.\n * @category Type Validators\n */\nexport const number = createTypeValidatorTest(\n {\n parser: parseNumber,\n },\n applyNumberConfig,\n);\n","import {\n type AtPath,\n errorAt,\n errorAtKey,\n formatMessage,\n invalidResult,\n type KeyPath,\n type ValidationTest,\n validResult,\n type ValidatorMessage,\n} from './shared.js';\n\n/**\n * Makes the test. `toErrors` turns a failure's formatted message into the\n * object's errors; without it, the message is the object's own.\n * @internal\n */\nfunction checkWith<T, E>(\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n toErrors?: (formatted: string) => E,\n): ValidationTest<T, E> {\n return async (value, field) => {\n if (test(value)) {\n return validResult({ value, field });\n }\n\n const formatted = formatMessage(message, { value, field });\n return toErrors\n ? invalidResult({\n message: '',\n value,\n field,\n errors: toErrors(formatted),\n })\n : invalidResult({ message: formatted, value, field });\n };\n}\n\n/**\n * An object-level test for `object()`. It fails when `test` returns false for\n * the parsed object. The message goes to the error at `path`, a property name\n * or a list of names into nested objects, or to the object's own message\n * without a path. The message gets the parsed object as `value` and the\n * object's `field`. The path is checked against the object's type, and so are\n * the errors it produces.\n * @category Validation Tests\n */\nexport function check<T>(\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n): ValidationTest<T, never>;\nexport function check<T, const K extends keyof T & string>(\n path: K,\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n): ValidationTest<T, { [P in K]?: string }>;\nexport function check<T, const Path extends KeyPath<T>>(\n path: Path,\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n): ValidationTest<T, AtPath<Path>>;\nexport function check<\n T,\n K extends keyof T & string,\n // Not KeyPath<T>, which TypeScript can't expand for a generic T here.\n Path extends readonly string[],\n>(\n ...args:\n | [test: (value: T) => boolean, message: ValidatorMessage<T>]\n | [\n path: K | Path,\n test: (value: T) => boolean,\n message: ValidatorMessage<T>,\n ]\n):\n | ValidationTest<T, never>\n | ValidationTest<T, { [P in K]?: string }>\n | ValidationTest<T, AtPath<Path>> {\n if (args.length === 2) {\n return checkWith<T, never>(args[0], args[1]);\n }\n\n const [path, test, message] = args;\n return typeof path === 'string'\n ? checkWith(test, message, (formatted) => errorAtKey(path, formatted))\n : checkWith(test, message, (formatted) => errorAt(path, formatted));\n}\n","import { findInvalidResult, invalidDetail } from './invalid-detail.js';\nimport { requirable } from './optional.js';\nimport type { TypeValidator } from './standard.js';\nimport {\n type ExtractError,\n type ExtractValue,\n hasOwnProperty,\n invalidResult,\n setOwn,\n valid,\n type ValidationTest,\n type ValidatorMessage,\n type ValidatorTest,\n} from './shared.js';\n\nexport type ObjectParameter = Record<string, ValidatorTest>;\n\n/**\n * Flattens an intersection into one object type, keeping optional keys.\n * @internal\n */\ntype Flatten<T> = { [K in keyof T]: T[K] };\n\n/**\n * Keys whose validator's value type includes undefined, such as an\n * `optional()` validator's, may be left out. `object()` still sets every key\n * it validates, to `undefined` for a missing one.\n * @internal\n */\ntype ObjectValue<P extends ObjectParameter> = Flatten<\n {\n [\n K in keyof P as undefined extends ExtractValue<P[K]> ? never : K\n ]: ExtractValue<P[K]>;\n } & {\n [\n K in keyof P as undefined extends ExtractValue<P[K]> ? K : never\n ]?: ExtractValue<P[K]>;\n }\n>;\n\n/**\n * A failed field records its message, such as a nested object's\n * `'Required.'`, or its errors when the message is empty.\n * @internal\n */\ntype ObjectErrors<P extends ObjectParameter> = {\n [K in keyof P]?: string | ExtractError<P[K]>;\n};\n\n/**\n * The parsed object, typed from the validators. The only type assertion in\n * `object()`: `values` holds each validator's result value for every key of\n * `properties`, but no loop can produce the mapped type `ObjectValue<P>`,\n * since inside it `P[key]` is a union over all the keys.\n * @internal\n */\nfunction asObjectValue<P extends ObjectParameter>(\n values: Partial<Record<keyof P, unknown>>,\n): ObjectValue<P> {\n // Permanent, approved in #657 (2.5a). Reconsider if TypeScript can check a\n // mapped type built key by key.\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- no loop can build ObjectValue<P>, see above\n return values as ObjectValue<P>;\n}\n\n/**\n * Configuration for object validation.\n * @category Types\n */\nexport interface ObjectConfig {\n /**\n * Message for a missing object, `undefined` or `null`. Defaults to\n * `'Required.'`.\n */\n requiredMessage?: ValidatorMessage<unknown>;\n}\n\n/**\n * Validates an object. The second argument is a configuration object, or the\n * first of the `tests`. The tests run on the parsed object, in order, once\n * every property is valid, and the first failure is the result.\n * @category Type Validators\n */\nexport function object<P extends ObjectParameter>(\n properties: P,\n config?: ObjectConfig | ValidationTest<ObjectValue<P>, ObjectErrors<P>>,\n ...tests: ValidationTest<ObjectValue<P>, ObjectErrors<P>>[]\n): TypeValidator<ObjectValue<P>, ObjectErrors<P>> {\n if (typeof properties !== 'object' || properties === null) {\n throw new TypeError('`properties` must be a configuration object');\n }\n\n const allTests = typeof config === 'function' ? [config, ...tests] : tests;\n const requiredMessage =\n typeof config === 'object' ? config.requiredMessage : undefined;\n\n return requirable<ObjectValue<P>, ObjectErrors<P>>(\n requiredMessage,\n async (values, field, onEmpty) => {\n if (values === null || values === undefined) {\n return onEmpty(values, field);\n }\n\n // Object() boxes primitives.\n const source: object = Object(values);\n const errors: ObjectErrors<P> = {};\n const resolvedValues: Partial<Record<keyof P, unknown>> = {};\n let isValid = true;\n\n for (const key in properties) {\n if (hasOwnProperty(properties, key)) {\n const validator = properties[key];\n // Only own properties, so a missing key named like an inherited one,\n // such as `constructor`, reads as missing.\n const value: unknown = hasOwnProperty(source, key)\n ? Reflect.get(source, key)\n : undefined;\n const result = await (typeof validator === 'function'\n ? validator(value, key)\n : invalidResult({\n field: key,\n message: 'No validator set',\n value,\n }));\n\n setOwn(resolvedValues, key, result.value);\n\n if (result.state === 'invalid') {\n isValid = false;\n setOwn(errors, key, invalidDetail(result));\n }\n }\n }\n\n if (!isValid) {\n return invalidResult({ message: '', value: values, field, errors });\n }\n\n const parsed = asObjectValue<P>(resolvedValues);\n const objectInvalidResult = await findInvalidResult(\n allTests,\n parsed,\n field,\n );\n if (objectInvalidResult) {\n return invalidResult({\n message: objectInvalidResult.message,\n value: values,\n field,\n errors: objectInvalidResult.errors,\n });\n }\n\n return valid({ value: parsed, field });\n },\n );\n}\n","import { createValidatorTest } from './factories.js';\nimport type {\n MessageExtras,\n ValidationTest,\n ValidatorMessage,\n ValidatorMessageParameters,\n} from './shared.js';\n\nexport interface OneOfValidatorMessageParameters<\n T,\n> extends ValidatorMessageParameters<T> {\n values: readonly T[];\n}\n\n/**\n * Ensures a value is one in a predefined list.\n * @param values List of allowed values.\n * @param message Error message\n * @category Validation Tests\n */\nexport function oneOf<T extends string | number | boolean | Date>(\n values: readonly T[],\n message: ValidatorMessage<\n T,\n MessageExtras<OneOfValidatorMessageParameters<T>>\n >,\n): ValidationTest<T, never> {\n return createValidatorTest(\n (value: T) =>\n values.includes(value) ||\n (value instanceof Date &&\n values.some((x) => x.valueOf() === value.valueOf())),\n message,\n () => ({ values }),\n );\n}\n","import { createValidatorTest } from './factories.js';\nimport type {\n MessageExtras,\n ValidationTest,\n ValidatorMessage,\n ValidatorMessageParameters,\n} from './shared.js';\n\nexport type SharedValueType = string | number | unknown[];\n\n/**\n * Extracts a numeric amount from value, i.e. string length, array length, or number.\n * @internal\n */\nfunction getAmount(value: SharedValueType): number {\n if (typeof value === 'number') {\n return value;\n }\n\n // Wider than the type, since JavaScript callers can pass a missing value,\n // which has no amount (#660).\n const given: unknown = value;\n return given === null || given === undefined ? Number.NaN : value.length;\n}\n\nexport interface MaxValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {\n max: number;\n amount: number | null | undefined;\n limit: number;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function max(\n limit: number,\n message: ValidatorMessage<\n SharedValueType,\n MessageExtras<MaxValidatorMessageParameters>\n >,\n exclusive?: boolean,\n): ValidationTest<SharedValueType, never> {\n return createValidatorTest(\n (value: SharedValueType) => {\n const amount = getAmount(value);\n return exclusive ? amount < limit : amount <= limit;\n },\n message,\n (value) => ({\n max: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n }),\n );\n}\n\nexport interface MinValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {\n min: number;\n limit: number;\n amount: number | null | undefined;\n exclusive?: boolean | undefined;\n}\n\n/**\n * Ensures a string, number, or array value is at most a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @param exclusive Use exclusive comparison instead of inclusive\n * @category Validation Tests\n */\nexport function min(\n limit: number,\n message: ValidatorMessage<\n SharedValueType,\n MessageExtras<MinValidatorMessageParameters>\n >,\n exclusive?: boolean,\n): ValidationTest<SharedValueType, never> {\n return createValidatorTest(\n (value: SharedValueType) => {\n const amount = getAmount(value);\n return exclusive ? amount > limit : amount >= limit;\n },\n message,\n (value) => ({\n min: limit,\n limit,\n amount: getAmount(value),\n exclusive,\n }),\n );\n}\n\nexport interface ExactValidatorMessageParameters extends ValidatorMessageParameters<SharedValueType> {\n limit: number;\n amount: number | null | undefined;\n exact: number;\n}\n\n/**\n * Ensures a string, number, or array value is exactly a certain amount.\n * @param limit Size or value limit\n * @param message Error message\n * @category Validation Tests\n */\nexport function exact(\n limit: number,\n message: ValidatorMessage<\n SharedValueType,\n MessageExtras<ExactValidatorMessageParameters>\n >,\n): ValidationTest<SharedValueType, never> {\n return createValidatorTest(\n (value: SharedValueType) => getAmount(value) === limit,\n message,\n (value) => ({\n amount: getAmount(value),\n limit,\n exact: limit,\n }),\n );\n}\n","import {\n formatMessage,\n invalidResult,\n type ValidatorMessage,\n type ValidatorResult,\n} from './shared.js';\n\n/** @internal */\ntype InvalidFields<E> = {\n value: unknown;\n field: string | undefined;\n errors?: E | undefined;\n};\n\n/**\n * Creates an invalid result. A message function gets the value as `unknown`,\n * and `extras` must hold the extra parameters it reads.\n * @param result Result fields\n * @param result.message Error message, formatted with `formatMessage`\n * @param result.value Parsed value\n * @param result.field Field name\n * @param result.errors Extra error details, such as per-field errors from `object` and `array`\n * @param result.extras Extra message params\n * @category Helpers\n */\nexport function invalid<T, E = never>(\n result: InvalidFields<E> & { message: ValidatorMessage<unknown> },\n): Promise<ValidatorResult<T, E>>;\nexport function invalid<T, E, X extends object>(\n result: InvalidFields<E> & {\n message: ValidatorMessage<unknown, X>;\n extras: X;\n },\n): Promise<ValidatorResult<T, E>>;\nexport async function invalid<T, E, X extends object>(\n result:\n | (InvalidFields<E> & { message: ValidatorMessage<unknown> })\n | (InvalidFields<E> & { message: ValidatorMessage<unknown, X>; extras: X }),\n): Promise<ValidatorResult<T, E>> {\n const { value, field, errors } = result;\n const message =\n 'extras' in result\n ? formatMessage(result.message, { ...result.extras, value, field })\n : formatMessage<unknown>(result.message, { value, field });\n return invalidResult({ message, value, field, errors });\n}\n","import { createTypeValidatorTest, createValidatorTest } from './factories.js';\nimport { primitiveToString } from './primitives.js';\nimport {\n type ConfigBase,\n type MessageExtras,\n type ValidatorMessage,\n type ValidatorMessageParameters,\n type ValidationTest,\n} from './shared.js';\n\n/** @internal */\nconst emailPattern =\n /^[\\w!#$%&'*+./=?^`{|}~-]+@[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?(?:\\.[\\dA-Za-z](?:[\\dA-Za-z-]{0,61}[\\dA-Za-z])?)*$/;\n\n/**\n * RFC 9562 UUIDs: versions 1 to 8 with the RFC's variant (10xx), plus the nil\n * and max UUIDs.\n * @internal\n */\nconst uuidPattern =\n /^(?:[\\da-f]{8}-[\\da-f]{4}-[1-8][\\da-f]{3}-[89ab][\\da-f]{3}-[\\da-f]{12}|0{8}-0{4}-0{4}-0{4}-0{12}|f{8}-f{4}-f{4}-f{4}-f{12})$/i;\n\n/**\n * Configuration for string validation.\n * @category Types\n */\nexport interface StringConfig extends ConfigBase<string> {\n /** Apply trim to string before validation. */\n trim?: boolean;\n}\n\n/**\n * Parses a value into a string.\n * @param value Value to parse\n * @category Parsers\n */\nexport function parseString(value: unknown): string | null | undefined {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n const parsed = primitiveToString(value);\n if (parsed === undefined) {\n throw new TypeError('Failed to parse value to string.');\n }\n\n return parsed;\n}\n\n/**\n * Applies a configuration to the string value.\n * @param value Value to modify\n * @param config Configuration to apply\n * @category Helpers\n */\nexport function applyStringConfig(\n value: unknown,\n config: StringConfig,\n): string | null | undefined {\n let parsedValue = config.parser(value);\n if (\n config.default !== undefined &&\n (parsedValue === undefined || parsedValue === null || parsedValue === '')\n ) {\n parsedValue = config.default;\n }\n\n if (config.trim && typeof parsedValue === 'string') {\n parsedValue = parsedValue.trim();\n }\n\n return parsedValue;\n}\n\nexport interface MatchesValidatorMessageParameters extends ValidatorMessageParameters<string> {\n pattern: RegExp;\n}\n\n/**\n * Ensures a string value matches a pattern\n * @param pattern Pattern to match\n * @param message Error message\n * @category Validation Tests\n */\nexport function matches(\n pattern: RegExp,\n message: ValidatorMessage<\n string,\n MessageExtras<MatchesValidatorMessageParameters>\n >,\n): ValidationTest<string, never> {\n // A g or y pattern advances lastIndex on each test(), so a shared one would\n // fail matching values after a match. Test a private copy from index 0.\n const ownPattern = new RegExp(pattern);\n return createValidatorTest(\n (value: string) => {\n ownPattern.lastIndex = 0;\n return ownPattern.test(value);\n },\n message,\n () => ({ pattern }),\n );\n}\n\n/**\n * Ensures a string value matches an email pattern\n * @param message Error message\n * @category Validation Tests\n */\nexport function email(\n message: ValidatorMessage<string>,\n): ValidationTest<string, never> {\n return matches(emailPattern, message);\n}\n\n/**\n * Ensures a string value is an RFC 9562 UUID, any version from 1 to 8, or the\n * nil or max UUID. Case-insensitive, without braces or a `urn:uuid:` prefix.\n * @param message Error message\n * @category Validation Tests\n */\nexport function uuid(\n message: ValidatorMessage<string>,\n): ValidationTest<string, never> {\n return matches(uuidPattern, message);\n}\n\n/**\n * Ensures a string value is a valid URL\n * @param message Error message\n * @param protocols Protocols to allow. Defaults to `['http:', 'https:']`; a list\n * replaces the default.\n * @category Validation Tests\n */\nexport function url(\n message: ValidatorMessage<string>,\n protocols: string[] = ['http:', 'https:'],\n): ValidationTest<string, never> {\n return createValidatorTest(\n (value: string) => {\n try {\n return protocols.includes(new URL(value).protocol);\n } catch {\n return false;\n }\n },\n message,\n () => ({ protocols }),\n );\n}\n\n/**\n * Validates a string value.\n * @category Type Validators\n */\nexport const string = createTypeValidatorTest(\n {\n parser: parseString,\n },\n applyStringConfig,\n);\n"],"mappings":"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"}