🚨 Active Supply Chain Attack:node-ipc Package Compromised.Learn More
Socket
Book a DemoSign in
Socket

@rain-cafe/validify

Package Overview
Dependencies
Maintainers
2
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@rain-cafe/validify - npm Package Compare versions

Comparing version
1.2.3
to
1.2.4
+1
-1
dist/index.js

@@ -1,2 +0,2 @@

var t=require("postal-codes-js");function n(t){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},n(t)}function r(t,n){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,n){return t.__proto__=n,t},r(t,n)}function e(t,n,o){return e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}()?Reflect.construct.bind():function(t,n,e){var o=[null];o.push.apply(o,n);var i=new(Function.bind.apply(t,o));return e&&r(i,e.prototype),i},e.apply(null,arguments)}function o(t){var i="function"==typeof Map?new Map:void 0;return o=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(n){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(t))return i.get(t);i.set(t,o)}function o(){return e(t,arguments,n(this).constructor)}return o.prototype=Object.create(t.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,t)},o(t)}function i(t,n){(null==n||n>t.length)&&(n=t.length);for(var r=0,e=new Array(n);r<n;r++)e[r]=t[r];return e}function u(t,n){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,n){if(t){if("string"==typeof t)return i(t,n);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,n):void 0}}(t))||n&&t&&"number"==typeof t.length){r&&(t=r);var e=0;return function(){return e>=t.length?{done:!0}:{done:!1,value:t[e++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(t){return[void 0,null].includes(t)}function f(t){return function(n){if(!c(n))return n<t?'is less than "'+t+'"':void 0}}function a(t){return function(n){var r;if(!c(n))return null!=(r=p(t)(n))?r:f(t)(n)}}function s(t){return function(n){if(!c(n))return n>t?'is greater than "'+t+'"':void 0}}function l(t){return function(n){var r;if(!c(n))return null!=(r=p(t)(n))?r:s(t)(n)}}function p(t){return function(n){if(!c(n))return n===t?'is equal to "'+t+'"':void 0}}var d=/*#__PURE__*/function(){function t(t){this.config=void 0,this.config=t}var n=t.prototype;return n.check=function(t){for(var n=[],r=[{item:t,config:this.config}];0!==r.length;){var e=r.shift(),o=e.parentKey,i=e.item,c=e.config;for(var f in c){var a=c[f],s=i?i[f]:null,l=o?o+"."+f:f;if(Array.isArray(a)){if(0===a.length)continue;for(var p,d=u(a);!(p=d()).done;){var h=p.value;if(Array.isArray(s))for(var v=0;v<s.length;v++){var y=h(s[v]);y&&n.push('"'+l+"["+v+']" '+y)}else{var g=h(i?i[f]:null);if(!g)continue;n.push('"'+l+'" '+g)}}}else if("object"==typeof a)if(Array.isArray(s))for(var x=0;x<s.length;x++)r.push({parentKey:l+"["+x+"]",item:s[x],config:a});else r.push({parentKey:l,item:s,config:a})}}return n},n.validate=function(t){var n=this.check(t);if(0!==n.length)throw new h(n)},n.isValid=function(t){return 0===this.check(t).length},n.isInvalid=function(t){return!this.isValid(t)},t}(),h=/*#__PURE__*/function(t){var n,e;function o(n){var r;return(r=t.call(this,n.join("\n"))||this).errors=void 0,r.errors=n,r}return e=t,(n=o).prototype=Object.create(e.prototype),n.prototype.constructor=n,r(n,e),o.prototype.toString=function(){return this.errors.join("\n")},o}(/*#__PURE__*/o(Error));exports.ValidationError=h,exports.Validator=d,exports.coerceNumber=function(t){return function(n){return t("string"==typeof n?Number(n):n)}},exports.isAlpha=function(t){if(!c(t))return/[A-z ]+/.test(t)?void 0:"includes non alpha characters"},exports.isAlphaNumeric=function(t){if(!c(t))return/[A-z \d]+/.test(t)?void 0:"includes non alpha-numeric characters"},exports.isAny=function(){var t=[].slice.call(arguments);return function(n){if(!c(n))return t.includes(n)?void 0:'is not equal to "'+t.join(", ")+'"'}},exports.isBetween=function(t,n){return function(r){var e;if(!c(r))return null!=(e=a(t)(r))?e:l(n)(r)}},exports.isBetweenInclusive=function(t,n){return function(r){var e;if(!c(r))return null!=(e=f(t)(r))?e:s(n)(r)}},exports.isDecimals=function(t){return function(n){if(!c(n))return n.toString().length>n.toFixed(t).length?'exceeds decimal count of "'+t+'"':void 0}},exports.isDefined=function(t){if(c(t))return"is not defined"},exports.isEqualTo=function(t){return function(n){if(!c(n))return n!==t?'is not equal to "'+t+'"':void 0}},exports.isGreaterThan=a,exports.isGreaterThanOrEqualTo=f,exports.isLength=function(t){return function(n){if(!c(n))return n.length!==t?'has length not equal to "'+t+'"':void 0}},exports.isLessThan=l,exports.isLessThanOrEqualTo=s,exports.isNotEqualTo=p,exports.isNotLength=function(t){return function(n){if(!c(n))return n.length===t?'has length equal to "'+t+'"':void 0}},exports.isNotNullOrUndefined=function(t){return!c(t)},exports.isNullOrUndefined=c,exports.isNumeric=function(t){if(!c(t))return/\d+/.test(t)?void 0:"includes non numeric characters"},exports.isPostalCode=function(n){return function(r){if(!c(r))return!0!==t.validate(n,r)?'is an invalid postal code for "'+n+'"':void 0}},exports.isWithinLength=function(t){return function(n){if(!c(n))return n.length>t?'exceeds max length of "'+t+'"':void 0}};
var t=require("postal-codes-js");function n(t){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},n(t)}function r(t,n){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,n){return t.__proto__=n,t},r(t,n)}function e(t,n,o){return e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}()?Reflect.construct.bind():function(t,n,e){var o=[null];o.push.apply(o,n);var i=new(Function.bind.apply(t,o));return e&&r(i,e.prototype),i},e.apply(null,arguments)}function o(t){var i="function"==typeof Map?new Map:void 0;return o=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(n){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(t))return i.get(t);i.set(t,o)}function o(){return e(t,arguments,n(this).constructor)}return o.prototype=Object.create(t.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,t)},o(t)}function i(t,n){(null==n||n>t.length)&&(n=t.length);for(var r=0,e=new Array(n);r<n;r++)e[r]=t[r];return e}function u(t,n){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,n){if(t){if("string"==typeof t)return i(t,n);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,n):void 0}}(t))||n&&t&&"number"==typeof t.length){r&&(t=r);var e=0;return function(){return e>=t.length?{done:!0}:{done:!1,value:t[e++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(t){return[void 0,null].includes(t)}function f(t){return function(n){if(!c(n))return n<t?'is less than "'+t+'"':void 0}}function a(t){return function(n){var r;if(!c(n))return null!=(r=p(t)(n))?r:f(t)(n)}}function s(t){return function(n){if(!c(n))return n>t?'is greater than "'+t+'"':void 0}}function l(t){return function(n){var r;if(!c(n))return null!=(r=p(t)(n))?r:s(t)(n)}}function p(t){return function(n){if(!c(n))return n===t?'is equal to "'+t+'"':void 0}}var d=/*#__PURE__*/function(){function t(t){this.config=void 0,this.config=t}var n=t.prototype;return n.check=function(t){for(var n=[],r=[{item:t,config:this.config}];0!==r.length;){var e=r.shift(),o=e.parentKey,i=e.item,c=e.config;for(var f in c){var a=c[f],s=i?i[f]:null,l=o?o+"."+f:f;if(Array.isArray(a)){if(0===a.length)continue;for(var p,d=u(a);!(p=d()).done;){var h=p.value;if(Array.isArray(s))for(var v=0;v<s.length;v++){var y=h(s[v]);y&&n.push('"'+l+"["+v+']" '+y)}else{var g=h(i?i[f]:null);if(!g)continue;n.push('"'+l+'" '+g)}}}else if("object"==typeof a)if(Array.isArray(s))for(var x=0;x<s.length;x++)r.push({parentKey:l+"["+x+"]",item:s[x],config:a});else s&&r.push({parentKey:l,item:s,config:a})}}return n},n.validate=function(t){var n=this.check(t);if(0!==n.length)throw new h(n)},n.isValid=function(t){return 0===this.check(t).length},n.isInvalid=function(t){return!this.isValid(t)},t}(),h=/*#__PURE__*/function(t){var n,e;function o(n){var r;return(r=t.call(this,n.join("\n"))||this).errors=void 0,r.errors=n,r}return e=t,(n=o).prototype=Object.create(e.prototype),n.prototype.constructor=n,r(n,e),o.prototype.toString=function(){return this.errors.join("\n")},o}(/*#__PURE__*/o(Error));exports.ValidationError=h,exports.Validator=d,exports.coerceNumber=function(t){return function(n){return t("string"==typeof n?Number(n):n)}},exports.isAlpha=function(t){if(!c(t))return/[A-z ]+/.test(t)?void 0:"includes non alpha characters"},exports.isAlphaNumeric=function(t){if(!c(t))return/[A-z \d]+/.test(t)?void 0:"includes non alpha-numeric characters"},exports.isAny=function(){var t=[].slice.call(arguments);return function(n){if(!c(n))return t.includes(n)?void 0:'is not equal to "'+t.join(", ")+'"'}},exports.isBetween=function(t,n){return function(r){var e;if(!c(r))return null!=(e=a(t)(r))?e:l(n)(r)}},exports.isBetweenInclusive=function(t,n){return function(r){var e;if(!c(r))return null!=(e=f(t)(r))?e:s(n)(r)}},exports.isDecimals=function(t){return function(n){if(!c(n))return n.toString().length>n.toFixed(t).length?'exceeds decimal count of "'+t+'"':void 0}},exports.isDefined=function(t){if(c(t))return"is not defined"},exports.isEqualTo=function(t){return function(n){if(!c(n))return n!==t?'is not equal to "'+t+'"':void 0}},exports.isGreaterThan=a,exports.isGreaterThanOrEqualTo=f,exports.isLength=function(t){return function(n){if(!c(n))return n.length!==t?'has length not equal to "'+t+'"':void 0}},exports.isLessThan=l,exports.isLessThanOrEqualTo=s,exports.isNotEqualTo=p,exports.isNotLength=function(t){return function(n){if(!c(n))return n.length===t?'has length equal to "'+t+'"':void 0}},exports.isNotNullOrUndefined=function(t){return!c(t)},exports.isNullOrUndefined=c,exports.isNumeric=function(t){if(!c(t))return/\d+/.test(t)?void 0:"includes non numeric characters"},exports.isPostalCode=function(n){return function(r){if(!c(r))return!0!==t.validate(n,r)?'is an invalid postal code for "'+n+'"':void 0}},exports.isWithinLength=function(t){return function(n){if(!c(n))return n.length>t?'exceeds max length of "'+t+'"':void 0}};
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/index.ts","../src/index.ts","../src/validators/string.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n"],"names":["isNullOrUndefined","value","undefined","includes","isGreaterThanOrEqualTo","min","isGreaterThan","_isNotEqualTo","isNotEqualTo","isLessThanOrEqualTo","max","isLessThan","_isNotEqualTo2","expectedValue","Validator","config","this","_proto","prototype","check","thing","errors","stack","item","length","_stack$shift","shift","parentKey","key","configItem","innerValue","innerKey","Array","isArray","_iterator","_step","_createForOfIteratorHelperLoose","done","validator","i","error","push","validate","ValidationError","isValid","isInvalid","_Error","_this","call","join","toString","_wrapNativeSuper","Error","Number","test","expectedValues","slice","arguments","_isGreaterThan","_isGreaterThanOrEqual","decimals","toFixed","countryCode"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/index.ts","../src/index.ts","../src/validators/string.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else if (innerValue) {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n"],"names":["isNullOrUndefined","value","undefined","includes","isGreaterThanOrEqualTo","min","isGreaterThan","_isNotEqualTo","isNotEqualTo","isLessThanOrEqualTo","max","isLessThan","_isNotEqualTo2","expectedValue","Validator","config","this","_proto","prototype","check","thing","errors","stack","item","length","_stack$shift","shift","parentKey","key","configItem","innerValue","innerKey","Array","isArray","_step","_iterator","_createForOfIteratorHelperLoose","done","validator","i","error","push","validate","ValidationError","isValid","isInvalid","_Error","_this","call","join","toString","_wrapNativeSuper","Error","Number","test","expectedValues","slice","arguments","_isGreaterThan","_isGreaterThanOrEqual","decimals","toFixed","countryCode"],"mappings":"6jEAAgB,SAAAA,EAAqBC,GACnC,MAAO,MAACC,EAAW,MAAMC,SAASF,EACpC,CCsDM,SAAUG,EAAuBC,GACrC,OAAO,SAACJ,GACN,IAAID,EAAkBC,GAEtB,OAAIA,EAAQI,EAA6BA,iBAAAA,WAAzC,CACF,CACF,CAOM,SAAUC,EAAcD,GAC5B,OAAO,SAACJ,OAAmDM,EACzD,IAAIP,EAAkBC,GAEtB,OAA+B,OAA/BM,EAAOC,EAAaH,EAAbG,CAAkBP,IAAMM,EAAIH,EAAuBC,EAAvBD,CAA4BH,EACjE,CACF,CAOM,SAAUQ,EAAoBC,GAClC,gBAAQT,GACN,IAAID,EAAkBC,GAEtB,OAAIA,EAAQS,EAAgCA,oBAAAA,WAA5C,CACF,CACF,CAOgB,SAAAC,EAAWD,GACzB,OAAO,SAACT,GAAmD,IAAAW,EACzD,IAAIZ,EAAkBC,GAEtB,OAA+B,OAA/BW,EAAOJ,EAAaE,EAAbF,CAAkBP,IAAMW,EAAIH,EAAoBC,EAApBD,CAAyBR,EAC9D,CACF,CChCgB,SAAAO,EAAgBK,GAC9B,OAAO,SAACZ,GACN,IAAID,EAAkBC,GAEtB,OAAIA,IAAUY,kBAAsCA,EAAa,SAAjE,CACF,CACF,CC3Ea,IAAAC,eAEX,WAAA,SAAAA,EAAYC,GAA2BC,KAD/BD,YAAM,EAEZC,KAAKD,OAASA,CAChB,CAAC,IAAAE,EAAAH,EAAAI,UA4EAJ,OA5EAG,EAEDE,MAAA,SAAMC,GASJ,IARA,IAAMC,EAAmB,GACnBC,EAA+B,CACnC,CACEC,KAAMH,EACNL,OAAQC,KAAKD,SAIO,IAAjBO,EAAME,QAAc,CACzB,IAAAC,EAAoCH,EAAMI,QAAlCC,EAASF,EAATE,UAAWJ,EAAIE,EAAJF,KAAMR,EAAMU,EAANV,OAEzB,IAAK,IAAMa,KAAOb,EAAQ,CACxB,IAAMc,EAAad,EAAOa,GACpBE,EAAaP,EAAOA,EAAKK,GAAO,KAChCG,EAAWJ,EAAeA,EAAS,IAAIC,EAAQA,EAErD,GAAII,MAAMC,QAAQJ,GAAa,CAC7B,GAA0B,IAAtBA,EAAWL,OAAc,SAE7B,IAAA,IAAkCU,EAAlCC,EAAAC,EAAwBP,KAAUK,EAAAC,KAAAE,MAAE,CAAzB,IAAAC,EAASJ,EAAAjC,MAClB,GAAI+B,MAAMC,QAAQH,GAChB,IAAK,IAAIS,EAAI,EAAGA,EAAIT,EAAWN,OAAQe,IAAK,CAC1C,IAAMC,EAAQF,EAAUR,EAAWS,IAE9BC,GAELnB,EAAOoB,KAAI,IAAKV,EAAQ,IAAIQ,EAAOC,MAAAA,EACpC,KACI,CACL,IAAMA,EAAQF,EAAUf,EAAOA,EAAKK,GAAO,MAE3C,IAAKY,EAAO,SAEZnB,EAAOoB,KAAI,IAAKV,EAAaS,KAAAA,EAC9B,CACF,CACF,MAAM,GAA0B,iBAAfX,EAChB,GAAIG,MAAMC,QAAQH,GAChB,IAAK,IAAIS,EAAI,EAAGA,EAAIT,EAAWN,OAAQe,IACrCjB,EAAMmB,KAAK,CACTd,UAAcI,EAAQ,IAAIQ,EAAC,IAC3BhB,KAAMO,EAAWS,GACjBxB,OAAQc,SAGHC,GACTR,EAAMmB,KAAK,CACTd,UAAWI,EACXR,KAAMO,EACNf,OAAQc,GAIf,CACF,CAED,OAAOR,CACT,EAACJ,EAEDyB,SAAA,SAAStB,GACP,IAAMC,EAASL,KAAKG,MAAMC,GAE1B,GAAsB,IAAlBC,EAAOG,OAEX,MAAM,IAAImB,EAAgBtB,EAC5B,EAACJ,EAED2B,QAAA,SAAQxB,GACN,OAAoC,IAAzBJ,KAACG,MAAMC,GAAOI,MAC3B,EAACP,EAED4B,UAAA,SAA4BzB,GAC1B,OAAQJ,KAAK4B,QAAQxB,EACvB,EAACN,CAAA,CA9ED,GAqGW6B,eAAgBG,SAAAA,WAG3B,SAAAH,EAAYtB,GAAgB0B,IAAAA,EAEL,OADrBA,EAAAD,EAAAE,KAAM3B,KAAAA,EAAO4B,KAAK,QAAOF,MAH3B1B,YAIE0B,EAAAA,EAAK1B,OAASA,EAAO0B,CACvB,CAICJ,SAV0BG,KAAAH,yEAM1BA,EAAAzB,UAEDgC,SAAA,WACE,OAAOlC,KAAKK,OAAO4B,KAAK,KAC1B,EAACN,CAAA,CAV0BG,cAU1BK,EAVkCC,oFF9FRd,GAC3B,OAAQrC,SAAAA,GACN,OAAOqC,EAA2B,iBAAVrC,EAAqBoD,OAAOpD,GAASA,EAC/D,CACF,kBGJM,SAAkBA,GACtB,IAAID,EAAkBC,GAEtB,MAAK,UAAUqD,KAAKrD,QAApB,EAAmC,+BACrC,yBAOgB,SAAeA,GAC7B,IAAID,EAAkBC,GAEtB,MAAK,YAAYqD,KAAKrD,QAAtB,EAAqC,uCACvC,gBF0DgB,WAA+B,IAAnBsD,KAAmBC,MAAAR,KAAAS,WAC7C,OAAO,SAACxD,GACN,IAAID,EAAkBC,GAEtB,OAAKsD,EAAepD,SAASF,QAA7B,EAAqC,oBAA2BsD,EAAeN,KAAK,MAAK,GAC3F,CACF,oBD7CgB,SAAU5C,EAAaK,GACrC,OAAO,SAACT,GAAmD,IAAAyD,EACzD,IAAI1D,EAAkBC,GAEtB,OAAgCyD,OAAhCA,EAAOpD,EAAcD,EAAdC,CAAmBL,IAAMyD,EAAI/C,EAAWD,EAAXC,CAAgBV,EACtD,CACF,6BApBgB,SAAmBI,EAAaK,GAC9C,OAAO,SAACT,GAAmD,IAAA0D,EACzD,IAAI3D,EAAkBC,GAEtB,OAAyC0D,OAAzCA,EAAOvD,EAAuBC,EAAvBD,CAA4BH,IAAM0D,EAAIlD,EAAoBC,EAApBD,CAAyBR,EACxE,CACF,qBApBM,SAAqB2D,GACzB,gBAAQ3D,GACN,IAAID,EAAkBC,GAEtB,OAAIA,EAAMiD,WAAW1B,OAASvB,EAAM4D,QAAQD,GAAUpC,OAA4CoC,6BAAAA,WAAlG,CACF,CACF,6BCb0BxC,GACxB,GAAIpB,EAAkBoB,GAAQ,MAAO,gBACvC,oBA8CM,SAAuBP,GAC3B,OAAQZ,SAAAA,GACN,IAAID,EAAkBC,GAEtB,OAAIA,IAAUY,EAAe,oBAA2BA,EAC1D,SADE,CACF,CACF,4EA7CM,SAAmBW,GACvB,OAAQvB,SAAAA,GACN,IAAID,EAAkBC,GAEtB,OAAIA,EAAMuB,SAAWA,EAA2CA,4BAAAA,EAClE,SADE,CACF,CACF,gGAOgB,SAAYA,GAC1B,OAAO,SAACvB,GACN,IAAID,EAAkBC,GAEtB,OAAIA,EAAMuB,SAAWA,EAAQ,wBAA+BA,EAAM,SAAlE,CACF,CACF,+BFhCgB,SAAwBvB,GACtC,OAAQD,EAAkBC,EAC5B,gDIyBM,SAAoBA,GACxB,IAAID,EAAkBC,GAEtB,MAAK,MAAMqD,KAAKrD,QAAhB,EAA+B,iCACjC,uBAEgB,SAAa6D,GAC3B,OAAQ7D,SAAAA,GACN,IAAID,EAAkBC,GAEtB,OAAqC,IAAjCyC,EAAAA,SAASoB,EAAa7D,GAAiB,kCAAyC6D,EAAW,SAA/F,CACF,CACF,yBFAgB,SAAetC,GAC7B,OAAO,SAACvB,GACN,IAAID,EAAkBC,GAEtB,OAAIA,EAAMuB,OAASA,EAAyCA,0BAAAA,WAA5D,CACF,CACF"}

@@ -1,2 +0,2 @@

import{validate as n}from"postal-codes-js";function t(n){return t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},t(n)}function r(n,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,t){return n.__proto__=t,n},r(n,t)}function e(n,t,o){return e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(n){return!1}}()?Reflect.construct.bind():function(n,t,e){var o=[null];o.push.apply(o,t);var i=new(Function.bind.apply(n,o));return e&&r(i,e.prototype),i},e.apply(null,arguments)}function o(n){var i="function"==typeof Map?new Map:void 0;return o=function(n){if(null===n||!function(n){try{return-1!==Function.toString.call(n).indexOf("[native code]")}catch(t){return"function"==typeof n}}(n))return n;if("function"!=typeof n)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(n))return i.get(n);i.set(n,o)}function o(){return e(n,arguments,t(this).constructor)}return o.prototype=Object.create(n.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,n)},o(n)}function i(n,t){(null==t||t>n.length)&&(t=n.length);for(var r=0,e=new Array(t);r<t;r++)e[r]=n[r];return e}function u(n,t){var r="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(r)return(r=r.call(n)).next.bind(r);if(Array.isArray(n)||(r=function(n,t){if(n){if("string"==typeof n)return i(n,t);var r=Object.prototype.toString.call(n).slice(8,-1);return"Object"===r&&n.constructor&&(r=n.constructor.name),"Map"===r||"Set"===r?Array.from(n):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(n,t):void 0}}(n))||t&&n&&"number"==typeof n.length){r&&(n=r);var e=0;return function(){return e>=n.length?{done:!0}:{done:!1,value:n[e++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(n){return[void 0,null].includes(n)}function f(n){return!c(n)}function a(n){return function(t){return n("string"==typeof t?Number(t):t)}}function l(n){return function(t){if(!c(t))return t.toString().length>t.toFixed(n).length?'exceeds decimal count of "'+n+'"':void 0}}function s(n,t){return function(r){var e;if(!c(r))return null!=(e=d(n)(r))?e:v(t)(r)}}function p(n,t){return function(r){var e;if(!c(r))return null!=(e=h(n)(r))?e:y(t)(r)}}function d(n){return function(t){if(!c(t))return t<n?'is less than "'+n+'"':void 0}}function h(n){return function(t){var r;if(!c(t))return null!=(r=_(n)(t))?r:d(n)(t)}}function v(n){return function(t){if(!c(t))return t>n?'is greater than "'+n+'"':void 0}}function y(n){return function(t){var r;if(!c(t))return null!=(r=_(n)(t))?r:v(n)(t)}}function g(n){if(!c(n))return/[A-z ]+/.test(n)?void 0:"includes non alpha characters"}function b(n){if(!c(n))return/[A-z \d]+/.test(n)?void 0:"includes non alpha-numeric characters"}function m(n){if(!c(n))return/\d+/.test(n)?void 0:"includes non numeric characters"}function O(t){return function(r){if(!c(r))return!0!==n(t,r)?'is an invalid postal code for "'+t+'"':void 0}}function j(n){if(c(n))return"is not defined"}function A(n){return function(t){if(!c(t))return t.length!==n?'has length not equal to "'+n+'"':void 0}}function w(n){return function(t){if(!c(t))return t.length===n?'has length equal to "'+n+'"':void 0}}function x(n){return function(t){if(!c(t))return t.length>n?'exceeds max length of "'+n+'"':void 0}}function S(n){return function(t){if(!c(t))return t!==n?'is not equal to "'+n+'"':void 0}}function _(n){return function(t){if(!c(t))return t===n?'is equal to "'+n+'"':void 0}}function P(){var n=[].slice.call(arguments);return function(t){if(!c(t))return n.includes(t)?void 0:'is not equal to "'+n.join(", ")+'"'}}var q=/*#__PURE__*/function(){function n(n){this.config=void 0,this.config=n}var t=n.prototype;return t.check=function(n){for(var t=[],r=[{item:n,config:this.config}];0!==r.length;){var e=r.shift(),o=e.parentKey,i=e.item,c=e.config;for(var f in c){var a=c[f],l=i?i[f]:null,s=o?o+"."+f:f;if(Array.isArray(a)){if(0===a.length)continue;for(var p,d=u(a);!(p=d()).done;){var h=p.value;if(Array.isArray(l))for(var v=0;v<l.length;v++){var y=h(l[v]);y&&t.push('"'+s+"["+v+']" '+y)}else{var g=h(i?i[f]:null);if(!g)continue;t.push('"'+s+'" '+g)}}}else if("object"==typeof a)if(Array.isArray(l))for(var b=0;b<l.length;b++)r.push({parentKey:s+"["+b+"]",item:l[b],config:a});else r.push({parentKey:s,item:l,config:a})}}return t},t.validate=function(n){var t=this.check(n);if(0!==t.length)throw new R(t)},t.isValid=function(n){return 0===this.check(n).length},t.isInvalid=function(n){return!this.isValid(n)},n}(),R=/*#__PURE__*/function(n){var t,e;function o(t){var r;return(r=n.call(this,t.join("\n"))||this).errors=void 0,r.errors=t,r}return e=n,(t=o).prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e),o.prototype.toString=function(){return this.errors.join("\n")},o}(/*#__PURE__*/o(Error));export{R as ValidationError,q as Validator,a as coerceNumber,g as isAlpha,b as isAlphaNumeric,P as isAny,p as isBetween,s as isBetweenInclusive,l as isDecimals,j as isDefined,S as isEqualTo,h as isGreaterThan,d as isGreaterThanOrEqualTo,A as isLength,y as isLessThan,v as isLessThanOrEqualTo,_ as isNotEqualTo,w as isNotLength,f as isNotNullOrUndefined,c as isNullOrUndefined,m as isNumeric,O as isPostalCode,x as isWithinLength};
import{validate as n}from"postal-codes-js";function t(n){return t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},t(n)}function r(n,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,t){return n.__proto__=t,n},r(n,t)}function e(n,t,o){return e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(n){return!1}}()?Reflect.construct.bind():function(n,t,e){var o=[null];o.push.apply(o,t);var i=new(Function.bind.apply(n,o));return e&&r(i,e.prototype),i},e.apply(null,arguments)}function o(n){var i="function"==typeof Map?new Map:void 0;return o=function(n){if(null===n||!function(n){try{return-1!==Function.toString.call(n).indexOf("[native code]")}catch(t){return"function"==typeof n}}(n))return n;if("function"!=typeof n)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(n))return i.get(n);i.set(n,o)}function o(){return e(n,arguments,t(this).constructor)}return o.prototype=Object.create(n.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,n)},o(n)}function i(n,t){(null==t||t>n.length)&&(t=n.length);for(var r=0,e=new Array(t);r<t;r++)e[r]=n[r];return e}function u(n,t){var r="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(r)return(r=r.call(n)).next.bind(r);if(Array.isArray(n)||(r=function(n,t){if(n){if("string"==typeof n)return i(n,t);var r=Object.prototype.toString.call(n).slice(8,-1);return"Object"===r&&n.constructor&&(r=n.constructor.name),"Map"===r||"Set"===r?Array.from(n):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(n,t):void 0}}(n))||t&&n&&"number"==typeof n.length){r&&(n=r);var e=0;return function(){return e>=n.length?{done:!0}:{done:!1,value:n[e++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(n){return[void 0,null].includes(n)}function f(n){return!c(n)}function a(n){return function(t){return n("string"==typeof t?Number(t):t)}}function l(n){return function(t){if(!c(t))return t.toString().length>t.toFixed(n).length?'exceeds decimal count of "'+n+'"':void 0}}function s(n,t){return function(r){var e;if(!c(r))return null!=(e=d(n)(r))?e:v(t)(r)}}function p(n,t){return function(r){var e;if(!c(r))return null!=(e=h(n)(r))?e:y(t)(r)}}function d(n){return function(t){if(!c(t))return t<n?'is less than "'+n+'"':void 0}}function h(n){return function(t){var r;if(!c(t))return null!=(r=_(n)(t))?r:d(n)(t)}}function v(n){return function(t){if(!c(t))return t>n?'is greater than "'+n+'"':void 0}}function y(n){return function(t){var r;if(!c(t))return null!=(r=_(n)(t))?r:v(n)(t)}}function g(n){if(!c(n))return/[A-z ]+/.test(n)?void 0:"includes non alpha characters"}function b(n){if(!c(n))return/[A-z \d]+/.test(n)?void 0:"includes non alpha-numeric characters"}function m(n){if(!c(n))return/\d+/.test(n)?void 0:"includes non numeric characters"}function O(t){return function(r){if(!c(r))return!0!==n(t,r)?'is an invalid postal code for "'+t+'"':void 0}}function j(n){if(c(n))return"is not defined"}function A(n){return function(t){if(!c(t))return t.length!==n?'has length not equal to "'+n+'"':void 0}}function w(n){return function(t){if(!c(t))return t.length===n?'has length equal to "'+n+'"':void 0}}function x(n){return function(t){if(!c(t))return t.length>n?'exceeds max length of "'+n+'"':void 0}}function S(n){return function(t){if(!c(t))return t!==n?'is not equal to "'+n+'"':void 0}}function _(n){return function(t){if(!c(t))return t===n?'is equal to "'+n+'"':void 0}}function P(){var n=[].slice.call(arguments);return function(t){if(!c(t))return n.includes(t)?void 0:'is not equal to "'+n.join(", ")+'"'}}var q=/*#__PURE__*/function(){function n(n){this.config=void 0,this.config=n}var t=n.prototype;return t.check=function(n){for(var t=[],r=[{item:n,config:this.config}];0!==r.length;){var e=r.shift(),o=e.parentKey,i=e.item,c=e.config;for(var f in c){var a=c[f],l=i?i[f]:null,s=o?o+"."+f:f;if(Array.isArray(a)){if(0===a.length)continue;for(var p,d=u(a);!(p=d()).done;){var h=p.value;if(Array.isArray(l))for(var v=0;v<l.length;v++){var y=h(l[v]);y&&t.push('"'+s+"["+v+']" '+y)}else{var g=h(i?i[f]:null);if(!g)continue;t.push('"'+s+'" '+g)}}}else if("object"==typeof a)if(Array.isArray(l))for(var b=0;b<l.length;b++)r.push({parentKey:s+"["+b+"]",item:l[b],config:a});else l&&r.push({parentKey:s,item:l,config:a})}}return t},t.validate=function(n){var t=this.check(n);if(0!==t.length)throw new R(t)},t.isValid=function(n){return 0===this.check(n).length},t.isInvalid=function(n){return!this.isValid(n)},n}(),R=/*#__PURE__*/function(n){var t,e;function o(t){var r;return(r=n.call(this,t.join("\n"))||this).errors=void 0,r.errors=t,r}return e=n,(t=o).prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e),o.prototype.toString=function(){return this.errors.join("\n")},o}(/*#__PURE__*/o(Error));export{R as ValidationError,q as Validator,a as coerceNumber,g as isAlpha,b as isAlphaNumeric,P as isAny,p as isBetween,s as isBetweenInclusive,l as isDecimals,j as isDefined,S as isEqualTo,h as isGreaterThan,d as isGreaterThanOrEqualTo,A as isLength,y as isLessThan,v as isLessThanOrEqualTo,_ as isNotEqualTo,w as isNotLength,f as isNotNullOrUndefined,c as isNullOrUndefined,m as isNumeric,O as isPostalCode,x as isWithinLength};
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.mjs","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/string.ts","../src/validators/index.ts","../src/index.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n"],"names":["isNullOrUndefined","value","undefined","includes","isNotNullOrUndefined","coerceNumber","validator","Number","isDecimals","decimals","toString","length","toFixed","isBetweenInclusive","min","max","_isGreaterThanOrEqual","isGreaterThanOrEqualTo","isLessThanOrEqualTo","isBetween","_isGreaterThan","isGreaterThan","isLessThan","_isNotEqualTo","isNotEqualTo","_isNotEqualTo2","isAlpha","test","isAlphaNumeric","isNumeric","isPostalCode","countryCode","validate","isDefined","thing","isLength","isNotLength","isWithinLength","isEqualTo","expectedValue","isAny","expectedValues","slice","call","arguments","join","Validator","config","this","_proto","prototype","check","errors","stack","item","_stack$shift","shift","parentKey","key","configItem","innerValue","innerKey","Array","isArray","_iterator","_step","_createForOfIteratorHelperLoose","done","i","error","push","ValidationError","isValid","isInvalid","_Error","_this","_wrapNativeSuper","Error"],"mappings":"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"}
{"version":3,"file":"index.mjs","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/string.ts","../src/validators/index.ts","../src/index.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else if (innerValue) {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n"],"names":["isNullOrUndefined","value","undefined","includes","isNotNullOrUndefined","coerceNumber","validator","Number","isDecimals","decimals","toString","length","toFixed","isBetweenInclusive","min","max","_isGreaterThanOrEqual","isGreaterThanOrEqualTo","isLessThanOrEqualTo","isBetween","_isGreaterThan","isGreaterThan","isLessThan","_isNotEqualTo","isNotEqualTo","_isNotEqualTo2","isAlpha","test","isAlphaNumeric","isNumeric","isPostalCode","countryCode","validate","isDefined","thing","isLength","isNotLength","isWithinLength","isEqualTo","expectedValue","isAny","expectedValues","slice","call","arguments","join","Validator","config","this","_proto","prototype","check","errors","stack","item","_stack$shift","shift","parentKey","key","configItem","innerValue","innerKey","Array","isArray","_step","_iterator","_createForOfIteratorHelperLoose","done","i","error","push","ValidationError","isValid","isInvalid","_Error","_this","_wrapNativeSuper","Error"],"mappings":"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"}

@@ -1,2 +0,2 @@

import{validate as n}from"postal-codes-js";function t(n){return[void 0,null].includes(n)}function r(n){return!t(n)}function e(n){return t=>n("string"==typeof t?Number(t):t)}function i(n){return r=>{if(!t(r))return r.toString().length>r.toFixed(n).length?`exceeds decimal count of "${n}"`:void 0}}function o(n,r){return e=>{var i;if(!t(e))return null!=(i=s(n)(e))?i:f(r)(e)}}function u(n,r){return e=>{var i;if(!t(e))return null!=(i=c(n)(e))?i:l(r)(e)}}function s(n){return r=>{if(!t(r))return r<n?`is less than "${n}"`:void 0}}function c(n){return r=>{var e;if(!t(r))return null!=(e=A(n)(r))?e:s(n)(r)}}function f(n){return r=>{if(!t(r))return r>n?`is greater than "${n}"`:void 0}}function l(n){return r=>{var e;if(!t(r))return null!=(e=A(n)(r))?e:f(n)(r)}}function a(n){if(!t(n))return/[A-z ]+/.test(n)?void 0:"includes non alpha characters"}function h(n){if(!t(n))return/[A-z \d]+/.test(n)?void 0:"includes non alpha-numeric characters"}function d(n){if(!t(n))return/\d+/.test(n)?void 0:"includes non numeric characters"}function g(r){return e=>{if(!t(e))return!0!==n(r,e)?`is an invalid postal code for "${r}"`:void 0}}function v(n){if(t(n))return"is not defined"}function $(n){return r=>{if(!t(r))return r.length!==n?`has length not equal to "${n}"`:void 0}}function p(n){return r=>{if(!t(r))return r.length===n?`has length equal to "${n}"`:void 0}}function m(n){return r=>{if(!t(r))return r.length>n?`exceeds max length of "${n}"`:void 0}}function y(n){return r=>{if(!t(r))return r!==n?`is not equal to "${n}"`:void 0}}function A(n){return r=>{if(!t(r))return r===n?`is equal to "${n}"`:void 0}}function x(...n){return r=>{if(!t(r))return n.includes(r)?void 0:`is not equal to "${n.join(", ")}"`}}class j{constructor(n){this.config=void 0,this.config=n}check(n){const t=[],r=[{item:n,config:this.config}];for(;0!==r.length;){const{parentKey:n,item:e,config:i}=r.shift();for(const o in i){const u=i[o],s=e?e[o]:null,c=n?`${n}.${o}`:o;if(Array.isArray(u)){if(0===u.length)continue;for(const n of u)if(Array.isArray(s))for(let r=0;r<s.length;r++){const e=n(s[r]);e&&t.push(`"${c}[${r}]" ${e}`)}else{const r=n(e?e[o]:null);if(!r)continue;t.push(`"${c}" ${r}`)}}else if("object"==typeof u)if(Array.isArray(s))for(let n=0;n<s.length;n++)r.push({parentKey:`${c}[${n}]`,item:s[n],config:u});else r.push({parentKey:c,item:s,config:u})}}return t}validate(n){const t=this.check(n);if(0!==t.length)throw new q(t)}isValid(n){return 0===this.check(n).length}isInvalid(n){return!this.isValid(n)}}class q extends Error{constructor(n){super(n.join("\n")),this.errors=void 0,this.errors=n}toString(){return this.errors.join("\n")}}export{q as ValidationError,j as Validator,e as coerceNumber,a as isAlpha,h as isAlphaNumeric,x as isAny,u as isBetween,o as isBetweenInclusive,i as isDecimals,v as isDefined,y as isEqualTo,c as isGreaterThan,s as isGreaterThanOrEqualTo,$ as isLength,l as isLessThan,f as isLessThanOrEqualTo,A as isNotEqualTo,p as isNotLength,r as isNotNullOrUndefined,t as isNullOrUndefined,d as isNumeric,g as isPostalCode,m as isWithinLength};
import{validate as n}from"postal-codes-js";function t(n){return[void 0,null].includes(n)}function r(n){return!t(n)}function e(n){return t=>n("string"==typeof t?Number(t):t)}function i(n){return r=>{if(!t(r))return r.toString().length>r.toFixed(n).length?`exceeds decimal count of "${n}"`:void 0}}function o(n,r){return e=>{var i;if(!t(e))return null!=(i=s(n)(e))?i:f(r)(e)}}function u(n,r){return e=>{var i;if(!t(e))return null!=(i=c(n)(e))?i:l(r)(e)}}function s(n){return r=>{if(!t(r))return r<n?`is less than "${n}"`:void 0}}function c(n){return r=>{var e;if(!t(r))return null!=(e=A(n)(r))?e:s(n)(r)}}function f(n){return r=>{if(!t(r))return r>n?`is greater than "${n}"`:void 0}}function l(n){return r=>{var e;if(!t(r))return null!=(e=A(n)(r))?e:f(n)(r)}}function a(n){if(!t(n))return/[A-z ]+/.test(n)?void 0:"includes non alpha characters"}function h(n){if(!t(n))return/[A-z \d]+/.test(n)?void 0:"includes non alpha-numeric characters"}function d(n){if(!t(n))return/\d+/.test(n)?void 0:"includes non numeric characters"}function g(r){return e=>{if(!t(e))return!0!==n(r,e)?`is an invalid postal code for "${r}"`:void 0}}function v(n){if(t(n))return"is not defined"}function $(n){return r=>{if(!t(r))return r.length!==n?`has length not equal to "${n}"`:void 0}}function p(n){return r=>{if(!t(r))return r.length===n?`has length equal to "${n}"`:void 0}}function m(n){return r=>{if(!t(r))return r.length>n?`exceeds max length of "${n}"`:void 0}}function y(n){return r=>{if(!t(r))return r!==n?`is not equal to "${n}"`:void 0}}function A(n){return r=>{if(!t(r))return r===n?`is equal to "${n}"`:void 0}}function x(...n){return r=>{if(!t(r))return n.includes(r)?void 0:`is not equal to "${n.join(", ")}"`}}class j{constructor(n){this.config=void 0,this.config=n}check(n){const t=[],r=[{item:n,config:this.config}];for(;0!==r.length;){const{parentKey:n,item:e,config:i}=r.shift();for(const o in i){const u=i[o],s=e?e[o]:null,c=n?`${n}.${o}`:o;if(Array.isArray(u)){if(0===u.length)continue;for(const n of u)if(Array.isArray(s))for(let r=0;r<s.length;r++){const e=n(s[r]);e&&t.push(`"${c}[${r}]" ${e}`)}else{const r=n(e?e[o]:null);if(!r)continue;t.push(`"${c}" ${r}`)}}else if("object"==typeof u)if(Array.isArray(s))for(let n=0;n<s.length;n++)r.push({parentKey:`${c}[${n}]`,item:s[n],config:u});else s&&r.push({parentKey:c,item:s,config:u})}}return t}validate(n){const t=this.check(n);if(0!==t.length)throw new q(t)}isValid(n){return 0===this.check(n).length}isInvalid(n){return!this.isValid(n)}}class q extends Error{constructor(n){super(n.join("\n")),this.errors=void 0,this.errors=n}toString(){return this.errors.join("\n")}}export{q as ValidationError,j as Validator,e as coerceNumber,a as isAlpha,h as isAlphaNumeric,x as isAny,u as isBetween,o as isBetweenInclusive,i as isDecimals,v as isDefined,y as isEqualTo,c as isGreaterThan,s as isGreaterThanOrEqualTo,$ as isLength,l as isLessThan,f as isLessThanOrEqualTo,A as isNotEqualTo,p as isNotLength,r as isNotNullOrUndefined,t as isNullOrUndefined,d as isNumeric,g as isPostalCode,m as isWithinLength};
//# sourceMappingURL=index.modern.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.modern.mjs","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/string.ts","../src/validators/index.ts","../src/index.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n"],"names":["isNullOrUndefined","value","undefined","includes","isNotNullOrUndefined","coerceNumber","validator","Number","isDecimals","decimals","toString","length","toFixed","isBetweenInclusive","min","max","_isGreaterThanOrEqual","isGreaterThanOrEqualTo","isLessThanOrEqualTo","isBetween","_isGreaterThan","isGreaterThan","isLessThan","_isNotEqualTo","isNotEqualTo","_isNotEqualTo2","isAlpha","test","isAlphaNumeric","isNumeric","isPostalCode","countryCode","validate","isDefined","thing","isLength","isNotLength","isWithinLength","isEqualTo","expectedValue","isAny","expectedValues","join","Validator","constructor","config","this","check","errors","stack","item","parentKey","shift","key","configItem","innerValue","innerKey","Array","isArray","i","error","push","ValidationError","isValid","isInvalid","Error","super"],"mappings":"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"}
{"version":3,"file":"index.modern.mjs","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/string.ts","../src/validators/index.ts","../src/index.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else if (innerValue) {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n"],"names":["isNullOrUndefined","value","undefined","includes","isNotNullOrUndefined","coerceNumber","validator","Number","isDecimals","decimals","toString","length","toFixed","isBetweenInclusive","min","max","_isGreaterThanOrEqual","isGreaterThanOrEqualTo","isLessThanOrEqualTo","isBetween","_isGreaterThan","isGreaterThan","isLessThan","_isNotEqualTo","isNotEqualTo","_isNotEqualTo2","isAlpha","test","isAlphaNumeric","isNumeric","isPostalCode","countryCode","validate","isDefined","thing","isLength","isNotLength","isWithinLength","isEqualTo","expectedValue","isAny","expectedValues","join","Validator","constructor","config","this","check","errors","stack","item","parentKey","shift","key","configItem","innerValue","innerKey","Array","isArray","i","error","push","ValidationError","isValid","isInvalid","Error","super"],"mappings":"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"}

@@ -1,2 +0,2 @@

!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("postal-codes-js")):"function"==typeof define&&define.amd?define(["exports","postal-codes-js"],t):t((n||self).validify={},n.postalCodesJs)}(this,function(n,t){function e(n){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},e(n)}function r(n,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,t){return n.__proto__=t,n},r(n,t)}function i(n,t,e){return i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(n){return!1}}()?Reflect.construct.bind():function(n,t,e){var i=[null];i.push.apply(i,t);var o=new(Function.bind.apply(n,i));return e&&r(o,e.prototype),o},i.apply(null,arguments)}function o(n){var t="function"==typeof Map?new Map:void 0;return o=function(n){if(null===n||!function(n){try{return-1!==Function.toString.call(n).indexOf("[native code]")}catch(t){return"function"==typeof n}}(n))return n;if("function"!=typeof n)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(n))return t.get(n);t.set(n,o)}function o(){return i(n,arguments,e(this).constructor)}return o.prototype=Object.create(n.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,n)},o(n)}function u(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,r=new Array(t);e<t;e++)r[e]=n[e];return r}function c(n,t){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(e)return(e=e.call(n)).next.bind(e);if(Array.isArray(n)||(e=function(n,t){if(n){if("string"==typeof n)return u(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?u(n,t):void 0}}(n))||t&&n&&"number"==typeof n.length){e&&(n=e);var r=0;return function(){return r>=n.length?{done:!0}:{done:!1,value:n[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(n){return[void 0,null].includes(n)}function a(n){return function(t){if(!f(t))return t<n?'is less than "'+n+'"':void 0}}function l(n){return function(t){var e;if(!f(t))return null!=(e=p(n)(t))?e:a(n)(t)}}function s(n){return function(t){if(!f(t))return t>n?'is greater than "'+n+'"':void 0}}function d(n){return function(t){var e;if(!f(t))return null!=(e=p(n)(t))?e:s(n)(t)}}function p(n){return function(t){if(!f(t))return t===n?'is equal to "'+n+'"':void 0}}var h=/*#__PURE__*/function(){function n(n){this.config=void 0,this.config=n}var t=n.prototype;return t.check=function(n){for(var t=[],e=[{item:n,config:this.config}];0!==e.length;){var r=e.shift(),i=r.parentKey,o=r.item,u=r.config;for(var f in u){var a=u[f],l=o?o[f]:null,s=i?i+"."+f:f;if(Array.isArray(a)){if(0===a.length)continue;for(var d,p=c(a);!(d=p()).done;){var h=d.value;if(Array.isArray(l))for(var v=0;v<l.length;v++){var y=h(l[v]);y&&t.push('"'+s+"["+v+']" '+y)}else{var g=h(o?o[f]:null);if(!g)continue;t.push('"'+s+'" '+g)}}}else if("object"==typeof a)if(Array.isArray(l))for(var b=0;b<l.length;b++)e.push({parentKey:s+"["+b+"]",item:l[b],config:a});else e.push({parentKey:s,item:l,config:a})}}return t},t.validate=function(n){var t=this.check(n);if(0!==t.length)throw new v(t)},t.isValid=function(n){return 0===this.check(n).length},t.isInvalid=function(n){return!this.isValid(n)},n}(),v=/*#__PURE__*/function(n){var t,e;function i(t){var e;return(e=n.call(this,t.join("\n"))||this).errors=void 0,e.errors=t,e}return e=n,(t=i).prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e),i.prototype.toString=function(){return this.errors.join("\n")},i}(/*#__PURE__*/o(Error));n.ValidationError=v,n.Validator=h,n.coerceNumber=function(n){return function(t){return n("string"==typeof t?Number(t):t)}},n.isAlpha=function(n){if(!f(n))return/[A-z ]+/.test(n)?void 0:"includes non alpha characters"},n.isAlphaNumeric=function(n){if(!f(n))return/[A-z \d]+/.test(n)?void 0:"includes non alpha-numeric characters"},n.isAny=function(){var n=[].slice.call(arguments);return function(t){if(!f(t))return n.includes(t)?void 0:'is not equal to "'+n.join(", ")+'"'}},n.isBetween=function(n,t){return function(e){var r;if(!f(e))return null!=(r=l(n)(e))?r:d(t)(e)}},n.isBetweenInclusive=function(n,t){return function(e){var r;if(!f(e))return null!=(r=a(n)(e))?r:s(t)(e)}},n.isDecimals=function(n){return function(t){if(!f(t))return t.toString().length>t.toFixed(n).length?'exceeds decimal count of "'+n+'"':void 0}},n.isDefined=function(n){if(f(n))return"is not defined"},n.isEqualTo=function(n){return function(t){if(!f(t))return t!==n?'is not equal to "'+n+'"':void 0}},n.isGreaterThan=l,n.isGreaterThanOrEqualTo=a,n.isLength=function(n){return function(t){if(!f(t))return t.length!==n?'has length not equal to "'+n+'"':void 0}},n.isLessThan=d,n.isLessThanOrEqualTo=s,n.isNotEqualTo=p,n.isNotLength=function(n){return function(t){if(!f(t))return t.length===n?'has length equal to "'+n+'"':void 0}},n.isNotNullOrUndefined=function(n){return!f(n)},n.isNullOrUndefined=f,n.isNumeric=function(n){if(!f(n))return/\d+/.test(n)?void 0:"includes non numeric characters"},n.isPostalCode=function(n){return function(e){if(!f(e))return!0!==t.validate(n,e)?'is an invalid postal code for "'+n+'"':void 0}},n.isWithinLength=function(n){return function(t){if(!f(t))return t.length>n?'exceeds max length of "'+n+'"':void 0}}});
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("postal-codes-js")):"function"==typeof define&&define.amd?define(["exports","postal-codes-js"],t):t((n||self).validify={},n.postalCodesJs)}(this,function(n,t){function e(n){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},e(n)}function r(n,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,t){return n.__proto__=t,n},r(n,t)}function i(n,t,e){return i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(n){return!1}}()?Reflect.construct.bind():function(n,t,e){var i=[null];i.push.apply(i,t);var o=new(Function.bind.apply(n,i));return e&&r(o,e.prototype),o},i.apply(null,arguments)}function o(n){var t="function"==typeof Map?new Map:void 0;return o=function(n){if(null===n||!function(n){try{return-1!==Function.toString.call(n).indexOf("[native code]")}catch(t){return"function"==typeof n}}(n))return n;if("function"!=typeof n)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(n))return t.get(n);t.set(n,o)}function o(){return i(n,arguments,e(this).constructor)}return o.prototype=Object.create(n.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,n)},o(n)}function u(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,r=new Array(t);e<t;e++)r[e]=n[e];return r}function c(n,t){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(e)return(e=e.call(n)).next.bind(e);if(Array.isArray(n)||(e=function(n,t){if(n){if("string"==typeof n)return u(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?u(n,t):void 0}}(n))||t&&n&&"number"==typeof n.length){e&&(n=e);var r=0;return function(){return r>=n.length?{done:!0}:{done:!1,value:n[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(n){return[void 0,null].includes(n)}function a(n){return function(t){if(!f(t))return t<n?'is less than "'+n+'"':void 0}}function l(n){return function(t){var e;if(!f(t))return null!=(e=p(n)(t))?e:a(n)(t)}}function s(n){return function(t){if(!f(t))return t>n?'is greater than "'+n+'"':void 0}}function d(n){return function(t){var e;if(!f(t))return null!=(e=p(n)(t))?e:s(n)(t)}}function p(n){return function(t){if(!f(t))return t===n?'is equal to "'+n+'"':void 0}}var h=/*#__PURE__*/function(){function n(n){this.config=void 0,this.config=n}var t=n.prototype;return t.check=function(n){for(var t=[],e=[{item:n,config:this.config}];0!==e.length;){var r=e.shift(),i=r.parentKey,o=r.item,u=r.config;for(var f in u){var a=u[f],l=o?o[f]:null,s=i?i+"."+f:f;if(Array.isArray(a)){if(0===a.length)continue;for(var d,p=c(a);!(d=p()).done;){var h=d.value;if(Array.isArray(l))for(var v=0;v<l.length;v++){var y=h(l[v]);y&&t.push('"'+s+"["+v+']" '+y)}else{var g=h(o?o[f]:null);if(!g)continue;t.push('"'+s+'" '+g)}}}else if("object"==typeof a)if(Array.isArray(l))for(var b=0;b<l.length;b++)e.push({parentKey:s+"["+b+"]",item:l[b],config:a});else l&&e.push({parentKey:s,item:l,config:a})}}return t},t.validate=function(n){var t=this.check(n);if(0!==t.length)throw new v(t)},t.isValid=function(n){return 0===this.check(n).length},t.isInvalid=function(n){return!this.isValid(n)},n}(),v=/*#__PURE__*/function(n){var t,e;function i(t){var e;return(e=n.call(this,t.join("\n"))||this).errors=void 0,e.errors=t,e}return e=n,(t=i).prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e),i.prototype.toString=function(){return this.errors.join("\n")},i}(/*#__PURE__*/o(Error));n.ValidationError=v,n.Validator=h,n.coerceNumber=function(n){return function(t){return n("string"==typeof t?Number(t):t)}},n.isAlpha=function(n){if(!f(n))return/[A-z ]+/.test(n)?void 0:"includes non alpha characters"},n.isAlphaNumeric=function(n){if(!f(n))return/[A-z \d]+/.test(n)?void 0:"includes non alpha-numeric characters"},n.isAny=function(){var n=[].slice.call(arguments);return function(t){if(!f(t))return n.includes(t)?void 0:'is not equal to "'+n.join(", ")+'"'}},n.isBetween=function(n,t){return function(e){var r;if(!f(e))return null!=(r=l(n)(e))?r:d(t)(e)}},n.isBetweenInclusive=function(n,t){return function(e){var r;if(!f(e))return null!=(r=a(n)(e))?r:s(t)(e)}},n.isDecimals=function(n){return function(t){if(!f(t))return t.toString().length>t.toFixed(n).length?'exceeds decimal count of "'+n+'"':void 0}},n.isDefined=function(n){if(f(n))return"is not defined"},n.isEqualTo=function(n){return function(t){if(!f(t))return t!==n?'is not equal to "'+n+'"':void 0}},n.isGreaterThan=l,n.isGreaterThanOrEqualTo=a,n.isLength=function(n){return function(t){if(!f(t))return t.length!==n?'has length not equal to "'+n+'"':void 0}},n.isLessThan=d,n.isLessThanOrEqualTo=s,n.isNotEqualTo=p,n.isNotLength=function(n){return function(t){if(!f(t))return t.length===n?'has length equal to "'+n+'"':void 0}},n.isNotNullOrUndefined=function(n){return!f(n)},n.isNullOrUndefined=f,n.isNumeric=function(n){if(!f(n))return/\d+/.test(n)?void 0:"includes non numeric characters"},n.isPostalCode=function(n){return function(e){if(!f(e))return!0!==t.validate(n,e)?'is an invalid postal code for "'+n+'"':void 0}},n.isWithinLength=function(n){return function(t){if(!f(t))return t.length>n?'exceeds max length of "'+n+'"':void 0}}});
//# sourceMappingURL=index.umd.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.umd.js","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/index.ts","../src/index.ts","../src/validators/string.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n"],"names":["isNullOrUndefined","value","undefined","includes","isGreaterThanOrEqualTo","min","isGreaterThan","_isNotEqualTo","isNotEqualTo","isLessThanOrEqualTo","max","isLessThan","_isNotEqualTo2","expectedValue","Validator","config","this","_proto","prototype","check","thing","errors","stack","item","length","_stack$shift","shift","parentKey","key","configItem","innerValue","innerKey","Array","isArray","_iterator","_step","_createForOfIteratorHelperLoose","done","validator","i","error","push","validate","ValidationError","isValid","isInvalid","_Error","_this","call","join","toString","_wrapNativeSuper","Error","Number","test","expectedValues","slice","arguments","_isGreaterThan","_isGreaterThanOrEqual","decimals","toFixed","countryCode"],"mappings":"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"}
{"version":3,"file":"index.umd.js","sources":["../src/utils/is-defined.ts","../src/validators/number.ts","../src/validators/index.ts","../src/index.ts","../src/validators/string.ts"],"sourcesContent":["export function isNullOrUndefined<T>(value: T): value is Extract<T, null | undefined> {\n return [undefined, null].includes(value);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is Exclude<T, null | undefined> {\n return !isNullOrUndefined(value);\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\nimport { isNotEqualTo } from './index';\n\n/**\n * A helper validator to coerce strings to numbers before running a subsequent validator\n * @param validator the number validator to execute\n * @returns the reason for the number validator failing\n */\nexport function coerceNumber(validator: Validator.Fn<number>): Validator.Fn<string | number | null | undefined> {\n return (value: string | number | null | undefined): string | void => {\n return validator(typeof value === 'string' ? Number(value) : value);\n };\n}\n\nexport function isDecimals(decimals: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.toString().length > value.toFixed(decimals).length) return `exceeds decimal count of \"${decimals}\"`;\n };\n}\n\n/**\n * Passes if the value is between or equal to the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetweenInclusive(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThanOrEqualTo(min)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n\n/**\n * Passes if the value is between the range values.\n * @param min The minimum range value\n * @param max The maximum range value\n * @returns a validator function matching the criteria\n */\nexport function isBetween(min: number, max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isGreaterThan(min)(value) ?? isLessThan(max)(value);\n };\n}\n\n/**\n * Passes if the value is greater than or equal to the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThanOrEqualTo(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value < min) return `is less than \"${min}\"`;\n };\n}\n\n/**\n * Passes if the value is greater than the minimum value.\n * @param min The minimum value\n * @returns a validator function matching the criteria\n */\nexport function isGreaterThan(min: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(min)(value) ?? isGreaterThanOrEqualTo(min)(value);\n };\n}\n\n/**\n * Passes if the value is less than or equal to the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThanOrEqualTo(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value > max) return `is greater than \"${max}\"`;\n };\n}\n\n/**\n * Passes if the value is less than the maximum value.\n * @param max The maximum value\n * @returns a validator function matching the criteria\n */\nexport function isLessThan(max: number): Validator.Fn<number | null | undefined> {\n return (value: number | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n return isNotEqualTo(max)(value) ?? isLessThanOrEqualTo(max)(value);\n };\n}\n","import { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if the value is defined.\n * @param thing the thing to validate\n * @returns why the validator failed\n */\nexport function isDefined(thing: any): string | void {\n if (isNullOrUndefined(thing)) return 'is not defined';\n}\n\n/**\n * Passes if the array or string is equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length !== length) return `has length not equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is not equal to the length.\n * @param length the length to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length === length) return `has length equal to \"${length}\"`;\n };\n}\n\n/**\n * Passes if the array or string is equal to or less than the maximum length.\n * @param length the maximum length (inclusive)\n * @returns a validator function matching the criteria\n */\nexport function isWithinLength(length: number): Validator.Fn<any[] | string | null | undefined> {\n return (value: any[] | string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value.length > length) return `exceeds max length of \"${length}\"`;\n };\n}\n\n/**\n * Passes if the value matches the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value !== expectedValue) return `is not equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value does not match the expected value.\n * @param expectedValue the value to compare to\n * @returns a validator function matching the criteria\n */\nexport function isNotEqualTo<T>(expectedValue: T): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (value === expectedValue) return `is equal to \"${expectedValue}\"`;\n };\n}\n\n/**\n * Passes if the value matches any of the expected values.\n * @param expectedValues the values to compare to\n * @returns a validator function matching the criteria\n */\nexport function isAny<T>(...expectedValues: T[]): Validator.Fn<T> {\n return (value: T | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (!expectedValues.includes(value)) return `is not equal to \"${expectedValues.join(', ')}\"`;\n };\n}\n\nexport * from './number';\nexport * from './string';\n","export class Validator<T extends object> {\n private config: Validator.Config<T>;\n constructor(config: Validator.Config<T>) {\n this.config = config;\n }\n\n check(thing: object): string[] {\n const errors: string[] = [];\n const stack: Validator.StackItem[] = [\n {\n item: thing,\n config: this.config,\n },\n ];\n\n while (stack.length !== 0) {\n const { parentKey, item, config } = stack.shift() as Validator.StackItem;\n\n for (const key in config) {\n const configItem = config[key];\n const innerValue = item ? item[key] : null;\n const innerKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (Array.isArray(configItem)) {\n if (configItem.length === 0) continue;\n\n for (const validator of configItem) {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n const error = validator(innerValue[i]);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}[${i}]\" ${error}`);\n }\n } else {\n const error = validator(item ? item[key] : null);\n\n if (!error) continue;\n\n errors.push(`\"${innerKey}\" ${error}`);\n }\n }\n } else if (typeof configItem === 'object') {\n if (Array.isArray(innerValue)) {\n for (let i = 0; i < innerValue.length; i++) {\n stack.push({\n parentKey: `${innerKey}[${i}]`,\n item: innerValue[i],\n config: configItem,\n });\n }\n } else if (innerValue) {\n stack.push({\n parentKey: innerKey,\n item: innerValue,\n config: configItem,\n });\n }\n }\n }\n }\n\n return errors;\n }\n\n validate(thing: object): asserts thing is T {\n const errors = this.check(thing);\n\n if (errors.length === 0) return;\n\n throw new ValidationError(errors);\n }\n\n isValid(thing: object): thing is T {\n return this.check(thing).length === 0;\n }\n\n isInvalid<V extends object>(thing: V): thing is Exclude<V, T> {\n return !this.isValid(thing);\n }\n}\n\nexport namespace Validator {\n export type Fn<T> = (value: T) => string | void;\n\n export type Config<T extends object> = {\n [key in keyof T]?: T[key] extends Array<object>\n ? Config<T[key][number]>\n : T[key] extends Array<any>\n ? Fn<T[key][number]>[]\n : T[key] extends object\n ? Config<T[key]>\n : Fn<T[key]>[];\n };\n\n export type StackItem = {\n parentKey?: string;\n item: object;\n config: Config<object>;\n };\n}\n\nexport class ValidationError extends Error {\n errors: string[];\n\n constructor(errors: string[]) {\n super(errors.join('\\n'));\n this.errors = errors;\n }\n\n toString() {\n return this.errors.join('\\n');\n }\n}\n\nexport * from './validators';\nexport * from './utils';\n","import { validate } from 'postal-codes-js';\nimport { Validator } from '..';\nimport { isNullOrUndefined } from '../utils/is-defined';\n\n/**\n * Passes if string only contains alphabetical characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlpha(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z ]+/.test(value)) return 'includes non alpha characters';\n}\n\n/**\n * Passes if string only contains alphanumeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isAlphaNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/[A-z \\d]+/.test(value)) return 'includes non alpha-numeric characters';\n}\n\n/**\n * Passes if string only contains numeric characters.\n * @param value the string to validate\n * @returns why the validator failed\n */\nexport function isNumeric(value: string | null | undefined): string | void {\n if (isNullOrUndefined(value)) return;\n\n if (!/\\d+/.test(value)) return 'includes non numeric characters';\n}\n\nexport function isPostalCode(countryCode: string): Validator.Fn<string | null | undefined> {\n return (value: string | null | undefined): string | void => {\n if (isNullOrUndefined(value)) return;\n\n if (validate(countryCode, value) !== true) return `is an invalid postal code for \"${countryCode}\"`;\n };\n}\n"],"names":["isNullOrUndefined","value","undefined","includes","isGreaterThanOrEqualTo","min","isGreaterThan","_isNotEqualTo","isNotEqualTo","isLessThanOrEqualTo","max","isLessThan","_isNotEqualTo2","expectedValue","Validator","config","this","_proto","prototype","check","thing","errors","stack","item","length","_stack$shift","shift","parentKey","key","configItem","innerValue","innerKey","Array","isArray","_step","_iterator","_createForOfIteratorHelperLoose","done","validator","i","error","push","validate","ValidationError","isValid","isInvalid","_Error","_this","call","join","toString","_wrapNativeSuper","Error","Number","test","expectedValues","slice","arguments","_isGreaterThan","_isGreaterThanOrEqual","decimals","toFixed","countryCode"],"mappings":"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"}
{
"name": "@rain-cafe/validify",
"description": "An incredibly simple object validation library",
"version": "1.2.3",
"version": "1.2.4",
"packageManager": "yarn@3.6.4",

@@ -6,0 +6,0 @@ "source": "src/index.ts",