@archi-code/validation 0.0.0-stage → 3.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +28 -0
- package/README.md +345 -2
- package/dist/cjs/canBe/array.d.ts +1 -0
- package/dist/cjs/canBe/array.js +7 -0
- package/dist/cjs/canBe/boolean.d.ts +1 -0
- package/dist/cjs/canBe/boolean.js +7 -0
- package/dist/cjs/canBe/date.d.ts +1 -0
- package/dist/cjs/canBe/date.js +7 -0
- package/dist/cjs/canBe/enum.d.ts +1 -0
- package/dist/cjs/canBe/enum.js +7 -0
- package/dist/cjs/canBe/float.d.ts +1 -0
- package/dist/cjs/canBe/float.js +7 -0
- package/dist/cjs/canBe/index.d.ts +8 -0
- package/dist/cjs/canBe/index.js +20 -0
- package/dist/cjs/canBe/integer.d.ts +1 -0
- package/dist/cjs/canBe/integer.js +7 -0
- package/dist/cjs/canBe/json.d.ts +2 -0
- package/dist/cjs/canBe/json.js +9 -0
- package/dist/cjs/canBe/string.d.ts +1 -0
- package/dist/cjs/canBe/string.js +7 -0
- package/dist/cjs/convert/any-to-string.d.ts +1 -0
- package/dist/cjs/convert/any-to-string.js +64 -0
- package/dist/cjs/convert/array.d.ts +2 -0
- package/dist/cjs/convert/array.js +25 -0
- package/dist/cjs/convert/boolean.d.ts +5 -0
- package/dist/cjs/convert/boolean.js +30 -0
- package/dist/cjs/convert/date.d.ts +11 -0
- package/dist/cjs/convert/date.js +162 -0
- package/dist/cjs/convert/enum.d.ts +2 -0
- package/dist/cjs/convert/enum.js +11 -0
- package/dist/cjs/convert/float.d.ts +6 -0
- package/dist/cjs/convert/float.js +46 -0
- package/dist/cjs/convert/index.d.ts +16 -0
- package/dist/cjs/convert/index.js +24 -0
- package/dist/cjs/convert/integer.d.ts +6 -0
- package/dist/cjs/convert/integer.js +41 -0
- package/dist/cjs/convert/json.d.ts +7 -0
- package/dist/cjs/convert/json.js +81 -0
- package/dist/cjs/convert/result.d.ts +26 -0
- package/dist/cjs/convert/result.js +23 -0
- package/dist/cjs/convert/string.d.ts +2 -0
- package/dist/cjs/convert/string.js +13 -0
- package/dist/cjs/decorator/validate.d.ts +23 -0
- package/dist/cjs/decorator/validate.js +62 -0
- package/dist/cjs/decorator/validations.d.ts +35 -0
- package/dist/cjs/decorator/validations.js +75 -0
- package/dist/cjs/helpers/algorithms.d.ts +1 -0
- package/dist/cjs/helpers/algorithms.js +10 -0
- package/dist/cjs/helpers/analyzePassword.d.ts +9 -0
- package/dist/cjs/helpers/analyzePassword.js +41 -0
- package/dist/cjs/helpers/assertString.d.ts +1 -0
- package/dist/cjs/helpers/assertString.js +9 -0
- package/dist/cjs/helpers/boundedCache.d.ts +9 -0
- package/dist/cjs/helpers/boundedCache.js +33 -0
- package/dist/cjs/helpers/checkHost.d.ts +2 -0
- package/dist/cjs/helpers/checkHost.js +36 -0
- package/dist/cjs/helpers/config.d.ts +10 -0
- package/dist/cjs/helpers/config.js +34 -0
- package/dist/cjs/helpers/errors.d.ts +3 -0
- package/dist/cjs/helpers/errors.js +10 -0
- package/dist/cjs/helpers/escapeRegExp.d.ts +1 -0
- package/dist/cjs/helpers/escapeRegExp.js +6 -0
- package/dist/cjs/helpers/hasOwn.d.ts +1 -0
- package/dist/cjs/helpers/hasOwn.js +6 -0
- package/dist/cjs/helpers/merge.d.ts +1 -0
- package/dist/cjs/helpers/merge.js +15 -0
- package/dist/cjs/helpers/scorePassword.d.ts +9 -0
- package/dist/cjs/helpers/scorePassword.js +37 -0
- package/dist/cjs/index.d.ts +103 -0
- package/dist/cjs/index.js +220 -0
- package/dist/cjs/sanitizer/blacklist.d.ts +1 -0
- package/dist/cjs/sanitizer/blacklist.js +11 -0
- package/dist/cjs/sanitizer/escape.d.ts +1 -0
- package/dist/cjs/sanitizer/escape.js +16 -0
- package/dist/cjs/sanitizer/index.d.ts +10 -0
- package/dist/cjs/sanitizer/index.js +21 -0
- package/dist/cjs/sanitizer/ltrim.d.ts +1 -0
- package/dist/cjs/sanitizer/ltrim.js +13 -0
- package/dist/cjs/sanitizer/normalizeEmail.d.ts +16 -0
- package/dist/cjs/sanitizer/normalizeEmail.js +194 -0
- package/dist/cjs/sanitizer/rtrim.d.ts +1 -0
- package/dist/cjs/sanitizer/rtrim.js +21 -0
- package/dist/cjs/sanitizer/stripLow.d.ts +1 -0
- package/dist/cjs/sanitizer/stripLow.js +10 -0
- package/dist/cjs/sanitizer/trim.d.ts +1 -0
- package/dist/cjs/sanitizer/trim.js +14 -0
- package/dist/cjs/sanitizer/unescape.d.ts +1 -0
- package/dist/cjs/sanitizer/unescape.js +16 -0
- package/dist/cjs/sanitizer/whitelist.d.ts +1 -0
- package/dist/cjs/sanitizer/whitelist.js +11 -0
- package/dist/cjs/validators/alpha.d.ts +105 -0
- package/dist/cjs/validators/alpha.js +202 -0
- package/dist/cjs/validators/contains.d.ts +6 -0
- package/dist/cjs/validators/contains.js +27 -0
- package/dist/cjs/validators/equals.d.ts +4 -0
- package/dist/cjs/validators/equals.js +14 -0
- package/dist/cjs/validators/index.d.ts +242 -0
- package/dist/cjs/validators/index.js +193 -0
- package/dist/cjs/validators/isAbaRouting.d.ts +1 -0
- package/dist/cjs/validators/isAbaRouting.js +24 -0
- package/dist/cjs/validators/isAfter.d.ts +4 -0
- package/dist/cjs/validators/isAfter.js +15 -0
- package/dist/cjs/validators/isAlpha.d.ts +8 -0
- package/dist/cjs/validators/isAlpha.js +35 -0
- package/dist/cjs/validators/isAlphanumeric.d.ts +8 -0
- package/dist/cjs/validators/isAlphanumeric.js +35 -0
- package/dist/cjs/validators/isAscii.d.ts +1 -0
- package/dist/cjs/validators/isAscii.js +13 -0
- package/dist/cjs/validators/isBIC.d.ts +1 -0
- package/dist/cjs/validators/isBIC.js +18 -0
- package/dist/cjs/validators/isBase32.d.ts +4 -0
- package/dist/cjs/validators/isBase32.js +21 -0
- package/dist/cjs/validators/isBase58.d.ts +1 -0
- package/dist/cjs/validators/isBase58.js +13 -0
- package/dist/cjs/validators/isBase64.d.ts +5 -0
- package/dist/cjs/validators/isBase64.js +28 -0
- package/dist/cjs/validators/isBefore.d.ts +4 -0
- package/dist/cjs/validators/isBefore.js +15 -0
- package/dist/cjs/validators/isBoolean.d.ts +4 -0
- package/dist/cjs/validators/isBoolean.js +7 -0
- package/dist/cjs/validators/isBtcAddress.d.ts +1 -0
- package/dist/cjs/validators/isBtcAddress.js +14 -0
- package/dist/cjs/validators/isByteLength.d.ts +5 -0
- package/dist/cjs/validators/isByteLength.js +36 -0
- package/dist/cjs/validators/isCreditCard.d.ts +15 -0
- package/dist/cjs/validators/isCreditCard.js +50 -0
- package/dist/cjs/validators/isCurrency.d.ts +18 -0
- package/dist/cjs/validators/isCurrency.js +114 -0
- package/dist/cjs/validators/isDataURI.d.ts +1 -0
- package/dist/cjs/validators/isDataURI.js +39 -0
- package/dist/cjs/validators/isDate.d.ts +7 -0
- package/dist/cjs/validators/isDate.js +8 -0
- package/dist/cjs/validators/isDecimal.d.ts +6 -0
- package/dist/cjs/validators/isDecimal.js +46 -0
- package/dist/cjs/validators/isDivisibleBy.d.ts +4 -0
- package/dist/cjs/validators/isDivisibleBy.js +15 -0
- package/dist/cjs/validators/isEAN.d.ts +1 -0
- package/dist/cjs/validators/isEAN.js +31 -0
- package/dist/cjs/validators/isEmail.d.ts +14 -0
- package/dist/cjs/validators/isEmail.js +153 -0
- package/dist/cjs/validators/isEmpty.d.ts +4 -0
- package/dist/cjs/validators/isEmpty.js +17 -0
- package/dist/cjs/validators/isEthereumAddress.d.ts +1 -0
- package/dist/cjs/validators/isEthereumAddress.js +13 -0
- package/dist/cjs/validators/isFQDN.d.ts +9 -0
- package/dist/cjs/validators/isFQDN.js +68 -0
- package/dist/cjs/validators/isFloat.d.ts +9 -0
- package/dist/cjs/validators/isFloat.js +30 -0
- package/dist/cjs/validators/isFullWidth.d.ts +2 -0
- package/dist/cjs/validators/isFullWidth.js +14 -0
- package/dist/cjs/validators/isHSL.d.ts +1 -0
- package/dist/cjs/validators/isHSL.js +18 -0
- package/dist/cjs/validators/isHalfWidth.d.ts +2 -0
- package/dist/cjs/validators/isHalfWidth.js +14 -0
- package/dist/cjs/validators/isHash.d.ts +21 -0
- package/dist/cjs/validators/isHash.js +34 -0
- package/dist/cjs/validators/isHexColor.d.ts +4 -0
- package/dist/cjs/validators/isHexColor.js +20 -0
- package/dist/cjs/validators/isHexadecimal.d.ts +1 -0
- package/dist/cjs/validators/isHexadecimal.js +13 -0
- package/dist/cjs/validators/isIBAN.d.ts +6 -0
- package/dist/cjs/validators/isIBAN.js +145 -0
- package/dist/cjs/validators/isIMEI.d.ts +4 -0
- package/dist/cjs/validators/isIMEI.js +45 -0
- package/dist/cjs/validators/isIP.d.ts +5 -0
- package/dist/cjs/validators/isIP.js +38 -0
- package/dist/cjs/validators/isIPRange.d.ts +5 -0
- package/dist/cjs/validators/isIPRange.js +43 -0
- package/dist/cjs/validators/isISBN.d.ts +5 -0
- package/dist/cjs/validators/isISBN.js +51 -0
- package/dist/cjs/validators/isISIN.d.ts +1 -0
- package/dist/cjs/validators/isISIN.js +55 -0
- package/dist/cjs/validators/isISO15924.d.ts +2 -0
- package/dist/cjs/validators/isISO15924.js +287 -0
- package/dist/cjs/validators/isISO31661Alpha2.d.ts +5 -0
- package/dist/cjs/validators/isISO31661Alpha2.js +277 -0
- package/dist/cjs/validators/isISO31661Alpha3.d.ts +4 -0
- package/dist/cjs/validators/isISO31661Alpha3.js +275 -0
- package/dist/cjs/validators/isISO31661Numeric.d.ts +1 -0
- package/dist/cjs/validators/isISO31661Numeric.js +263 -0
- package/dist/cjs/validators/isISO4217.d.ts +2 -0
- package/dist/cjs/validators/isISO4217.js +195 -0
- package/dist/cjs/validators/isISO6346.d.ts +2 -0
- package/dist/cjs/validators/isISO6346.js +43 -0
- package/dist/cjs/validators/isISO6391.d.ts +1 -0
- package/dist/cjs/validators/isISO6391.js +199 -0
- package/dist/cjs/validators/isISO8601.d.ts +5 -0
- package/dist/cjs/validators/isISO8601.js +42 -0
- package/dist/cjs/validators/isISRC.d.ts +1 -0
- package/dist/cjs/validators/isISRC.js +13 -0
- package/dist/cjs/validators/isISSN.d.ts +5 -0
- package/dist/cjs/validators/isISSN.js +27 -0
- package/dist/cjs/validators/isIdentityCard.d.ts +24 -0
- package/dist/cjs/validators/isIdentityCard.js +442 -0
- package/dist/cjs/validators/isIn.d.ts +4 -0
- package/dist/cjs/validators/isIn.js +36 -0
- package/dist/cjs/validators/isInt.d.ts +8 -0
- package/dist/cjs/validators/isInt.js +29 -0
- package/dist/cjs/validators/isJSON.d.ts +5 -0
- package/dist/cjs/validators/isJSON.js +10 -0
- package/dist/cjs/validators/isJWT.d.ts +1 -0
- package/dist/cjs/validators/isJWT.js +23 -0
- package/dist/cjs/validators/isLatLong.d.ts +4 -0
- package/dist/cjs/validators/isLatLong.js +29 -0
- package/dist/cjs/validators/isLength.d.ts +7 -0
- package/dist/cjs/validators/isLength.js +28 -0
- package/dist/cjs/validators/isLicensePlate.d.ts +21 -0
- package/dist/cjs/validators/isLicensePlate.js +43 -0
- package/dist/cjs/validators/isLocale.d.ts +1 -0
- package/dist/cjs/validators/isLocale.js +29 -0
- package/dist/cjs/validators/isLowercase.d.ts +1 -0
- package/dist/cjs/validators/isLowercase.js +12 -0
- package/dist/cjs/validators/isLuhnNumber.d.ts +1 -0
- package/dist/cjs/validators/isLuhnNumber.js +37 -0
- package/dist/cjs/validators/isMACAddress.d.ts +6 -0
- package/dist/cjs/validators/isMACAddress.js +34 -0
- package/dist/cjs/validators/isMD5.d.ts +1 -0
- package/dist/cjs/validators/isMD5.js +13 -0
- package/dist/cjs/validators/isMagnetURI.d.ts +1 -0
- package/dist/cjs/validators/isMagnetURI.js +16 -0
- package/dist/cjs/validators/isMailtoURI.d.ts +4 -0
- package/dist/cjs/validators/isMailtoURI.js +53 -0
- package/dist/cjs/validators/isMimeType.d.ts +1 -0
- package/dist/cjs/validators/isMimeType.js +15 -0
- package/dist/cjs/validators/isMobilePhone.d.ts +171 -0
- package/dist/cjs/validators/isMobilePhone.js +212 -0
- package/dist/cjs/validators/isMongoId.d.ts +1 -0
- package/dist/cjs/validators/isMongoId.js +11 -0
- package/dist/cjs/validators/isMultibyte.d.ts +1 -0
- package/dist/cjs/validators/isMultibyte.js +13 -0
- package/dist/cjs/validators/isNotEmpty.d.ts +1 -0
- package/dist/cjs/validators/isNotEmpty.js +10 -0
- package/dist/cjs/validators/isNumeric.d.ts +5 -0
- package/dist/cjs/validators/isNumeric.js +34 -0
- package/dist/cjs/validators/isOctal.d.ts +1 -0
- package/dist/cjs/validators/isOctal.js +13 -0
- package/dist/cjs/validators/isPassportNumber.d.ts +69 -0
- package/dist/cjs/validators/isPassportNumber.js +84 -0
- package/dist/cjs/validators/isPort.d.ts +1 -0
- package/dist/cjs/validators/isPort.js +7 -0
- package/dist/cjs/validators/isPostalCode.d.ts +79 -0
- package/dist/cjs/validators/isPostalCode.js +108 -0
- package/dist/cjs/validators/isRFC3339.d.ts +1 -0
- package/dist/cjs/validators/isRFC3339.js +28 -0
- package/dist/cjs/validators/isRequired.d.ts +1 -0
- package/dist/cjs/validators/isRequired.js +6 -0
- package/dist/cjs/validators/isRgbColor.d.ts +5 -0
- package/dist/cjs/validators/isRgbColor.js +38 -0
- package/dist/cjs/validators/isSemVer.d.ts +1 -0
- package/dist/cjs/validators/isSemVer.js +15 -0
- package/dist/cjs/validators/isSlug.d.ts +1 -0
- package/dist/cjs/validators/isSlug.js +13 -0
- package/dist/cjs/validators/isStrongPassword.d.ts +8 -0
- package/dist/cjs/validators/isStrongPassword.js +25 -0
- package/dist/cjs/validators/isSurrogatePair.d.ts +1 -0
- package/dist/cjs/validators/isSurrogatePair.js +13 -0
- package/dist/cjs/validators/isTime.d.ts +5 -0
- package/dist/cjs/validators/isTime.js +37 -0
- package/dist/cjs/validators/isULID.d.ts +1 -0
- package/dist/cjs/validators/isULID.js +12 -0
- package/dist/cjs/validators/isURL.d.ts +22 -0
- package/dist/cjs/validators/isURL.js +215 -0
- package/dist/cjs/validators/isUUID.d.ts +5 -0
- package/dist/cjs/validators/isUUID.js +31 -0
- package/dist/cjs/validators/isUppercase.d.ts +1 -0
- package/dist/cjs/validators/isUppercase.js +12 -0
- package/dist/cjs/validators/isVAT.d.ts +75 -0
- package/dist/cjs/validators/isVAT.js +134 -0
- package/dist/cjs/validators/isVariableWidth.d.ts +1 -0
- package/dist/cjs/validators/isVariableWidth.js +14 -0
- package/dist/cjs/validators/isWhitelisted.d.ts +4 -0
- package/dist/cjs/validators/isWhitelisted.js +23 -0
- package/dist/cjs/validators/matches.d.ts +5 -0
- package/dist/cjs/validators/matches.js +29 -0
- package/dist/esm/canBe/array.d.ts +1 -0
- package/dist/esm/canBe/array.js +4 -0
- package/dist/esm/canBe/boolean.d.ts +1 -0
- package/dist/esm/canBe/boolean.js +4 -0
- package/dist/esm/canBe/date.d.ts +1 -0
- package/dist/esm/canBe/date.js +4 -0
- package/dist/esm/canBe/enum.d.ts +1 -0
- package/dist/esm/canBe/enum.js +4 -0
- package/dist/esm/canBe/float.d.ts +1 -0
- package/dist/esm/canBe/float.js +4 -0
- package/dist/esm/canBe/index.d.ts +8 -0
- package/dist/esm/canBe/index.js +8 -0
- package/dist/esm/canBe/integer.d.ts +1 -0
- package/dist/esm/canBe/integer.js +4 -0
- package/dist/esm/canBe/json.d.ts +2 -0
- package/dist/esm/canBe/json.js +5 -0
- package/dist/esm/canBe/string.d.ts +1 -0
- package/dist/esm/canBe/string.js +4 -0
- package/dist/esm/convert/any-to-string.d.ts +1 -0
- package/dist/esm/convert/any-to-string.js +61 -0
- package/dist/esm/convert/array.d.ts +2 -0
- package/dist/esm/convert/array.js +22 -0
- package/dist/esm/convert/boolean.d.ts +5 -0
- package/dist/esm/convert/boolean.js +27 -0
- package/dist/esm/convert/date.d.ts +11 -0
- package/dist/esm/convert/date.js +158 -0
- package/dist/esm/convert/enum.d.ts +2 -0
- package/dist/esm/convert/enum.js +8 -0
- package/dist/esm/convert/float.d.ts +6 -0
- package/dist/esm/convert/float.js +43 -0
- package/dist/esm/convert/index.d.ts +16 -0
- package/dist/esm/convert/index.js +10 -0
- package/dist/esm/convert/integer.d.ts +6 -0
- package/dist/esm/convert/integer.js +38 -0
- package/dist/esm/convert/json.d.ts +7 -0
- package/dist/esm/convert/json.js +77 -0
- package/dist/esm/convert/result.d.ts +26 -0
- package/dist/esm/convert/result.js +18 -0
- package/dist/esm/convert/string.d.ts +2 -0
- package/dist/esm/convert/string.js +10 -0
- package/dist/esm/decorator/validate.d.ts +23 -0
- package/dist/esm/decorator/validate.js +59 -0
- package/dist/esm/decorator/validations.d.ts +35 -0
- package/dist/esm/decorator/validations.js +68 -0
- package/dist/esm/helpers/algorithms.d.ts +1 -0
- package/dist/esm/helpers/algorithms.js +7 -0
- package/dist/esm/helpers/analyzePassword.d.ts +9 -0
- package/dist/esm/helpers/analyzePassword.js +38 -0
- package/dist/esm/helpers/assertString.d.ts +1 -0
- package/dist/esm/helpers/assertString.js +6 -0
- package/dist/esm/helpers/boundedCache.d.ts +9 -0
- package/dist/esm/helpers/boundedCache.js +29 -0
- package/dist/esm/helpers/checkHost.d.ts +2 -0
- package/dist/esm/helpers/checkHost.js +32 -0
- package/dist/esm/helpers/config.d.ts +10 -0
- package/dist/esm/helpers/config.js +29 -0
- package/dist/esm/helpers/errors.d.ts +3 -0
- package/dist/esm/helpers/errors.js +6 -0
- package/dist/esm/helpers/escapeRegExp.d.ts +1 -0
- package/dist/esm/helpers/escapeRegExp.js +3 -0
- package/dist/esm/helpers/hasOwn.d.ts +1 -0
- package/dist/esm/helpers/hasOwn.js +3 -0
- package/dist/esm/helpers/merge.d.ts +1 -0
- package/dist/esm/helpers/merge.js +12 -0
- package/dist/esm/helpers/scorePassword.d.ts +9 -0
- package/dist/esm/helpers/scorePassword.js +34 -0
- package/dist/esm/index.d.ts +103 -0
- package/dist/esm/index.js +98 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/sanitizer/blacklist.d.ts +1 -0
- package/dist/esm/sanitizer/blacklist.js +8 -0
- package/dist/esm/sanitizer/escape.d.ts +1 -0
- package/dist/esm/sanitizer/escape.js +13 -0
- package/dist/esm/sanitizer/index.d.ts +10 -0
- package/dist/esm/sanitizer/index.js +9 -0
- package/dist/esm/sanitizer/ltrim.d.ts +1 -0
- package/dist/esm/sanitizer/ltrim.js +10 -0
- package/dist/esm/sanitizer/normalizeEmail.d.ts +16 -0
- package/dist/esm/sanitizer/normalizeEmail.js +191 -0
- package/dist/esm/sanitizer/rtrim.d.ts +1 -0
- package/dist/esm/sanitizer/rtrim.js +18 -0
- package/dist/esm/sanitizer/stripLow.d.ts +1 -0
- package/dist/esm/sanitizer/stripLow.js +7 -0
- package/dist/esm/sanitizer/trim.d.ts +1 -0
- package/dist/esm/sanitizer/trim.js +11 -0
- package/dist/esm/sanitizer/unescape.d.ts +1 -0
- package/dist/esm/sanitizer/unescape.js +13 -0
- package/dist/esm/sanitizer/whitelist.d.ts +1 -0
- package/dist/esm/sanitizer/whitelist.js +8 -0
- package/dist/esm/validators/alpha.d.ts +105 -0
- package/dist/esm/validators/alpha.js +199 -0
- package/dist/esm/validators/contains.d.ts +6 -0
- package/dist/esm/validators/contains.js +24 -0
- package/dist/esm/validators/equals.d.ts +4 -0
- package/dist/esm/validators/equals.js +11 -0
- package/dist/esm/validators/index.d.ts +242 -0
- package/dist/esm/validators/index.js +190 -0
- package/dist/esm/validators/isAbaRouting.d.ts +1 -0
- package/dist/esm/validators/isAbaRouting.js +21 -0
- package/dist/esm/validators/isAfter.d.ts +4 -0
- package/dist/esm/validators/isAfter.js +12 -0
- package/dist/esm/validators/isAlpha.d.ts +8 -0
- package/dist/esm/validators/isAlpha.js +31 -0
- package/dist/esm/validators/isAlphanumeric.d.ts +8 -0
- package/dist/esm/validators/isAlphanumeric.js +31 -0
- package/dist/esm/validators/isAscii.d.ts +1 -0
- package/dist/esm/validators/isAscii.js +10 -0
- package/dist/esm/validators/isBIC.d.ts +1 -0
- package/dist/esm/validators/isBIC.js +15 -0
- package/dist/esm/validators/isBase32.d.ts +4 -0
- package/dist/esm/validators/isBase32.js +18 -0
- package/dist/esm/validators/isBase58.d.ts +1 -0
- package/dist/esm/validators/isBase58.js +10 -0
- package/dist/esm/validators/isBase64.d.ts +5 -0
- package/dist/esm/validators/isBase64.js +25 -0
- package/dist/esm/validators/isBefore.d.ts +4 -0
- package/dist/esm/validators/isBefore.js +12 -0
- package/dist/esm/validators/isBoolean.d.ts +4 -0
- package/dist/esm/validators/isBoolean.js +4 -0
- package/dist/esm/validators/isBtcAddress.d.ts +1 -0
- package/dist/esm/validators/isBtcAddress.js +11 -0
- package/dist/esm/validators/isByteLength.d.ts +5 -0
- package/dist/esm/validators/isByteLength.js +33 -0
- package/dist/esm/validators/isCreditCard.d.ts +15 -0
- package/dist/esm/validators/isCreditCard.js +47 -0
- package/dist/esm/validators/isCurrency.d.ts +18 -0
- package/dist/esm/validators/isCurrency.js +111 -0
- package/dist/esm/validators/isDataURI.d.ts +1 -0
- package/dist/esm/validators/isDataURI.js +36 -0
- package/dist/esm/validators/isDate.d.ts +7 -0
- package/dist/esm/validators/isDate.js +5 -0
- package/dist/esm/validators/isDecimal.d.ts +6 -0
- package/dist/esm/validators/isDecimal.js +43 -0
- package/dist/esm/validators/isDivisibleBy.d.ts +4 -0
- package/dist/esm/validators/isDivisibleBy.js +12 -0
- package/dist/esm/validators/isEAN.d.ts +1 -0
- package/dist/esm/validators/isEAN.js +28 -0
- package/dist/esm/validators/isEmail.d.ts +14 -0
- package/dist/esm/validators/isEmail.js +150 -0
- package/dist/esm/validators/isEmpty.d.ts +4 -0
- package/dist/esm/validators/isEmpty.js +14 -0
- package/dist/esm/validators/isEthereumAddress.d.ts +1 -0
- package/dist/esm/validators/isEthereumAddress.js +10 -0
- package/dist/esm/validators/isFQDN.d.ts +9 -0
- package/dist/esm/validators/isFQDN.js +65 -0
- package/dist/esm/validators/isFloat.d.ts +9 -0
- package/dist/esm/validators/isFloat.js +26 -0
- package/dist/esm/validators/isFullWidth.d.ts +2 -0
- package/dist/esm/validators/isFullWidth.js +10 -0
- package/dist/esm/validators/isHSL.d.ts +1 -0
- package/dist/esm/validators/isHSL.js +15 -0
- package/dist/esm/validators/isHalfWidth.d.ts +2 -0
- package/dist/esm/validators/isHalfWidth.js +10 -0
- package/dist/esm/validators/isHash.d.ts +21 -0
- package/dist/esm/validators/isHash.js +31 -0
- package/dist/esm/validators/isHexColor.d.ts +4 -0
- package/dist/esm/validators/isHexColor.js +17 -0
- package/dist/esm/validators/isHexadecimal.d.ts +1 -0
- package/dist/esm/validators/isHexadecimal.js +10 -0
- package/dist/esm/validators/isIBAN.d.ts +6 -0
- package/dist/esm/validators/isIBAN.js +141 -0
- package/dist/esm/validators/isIMEI.d.ts +4 -0
- package/dist/esm/validators/isIMEI.js +42 -0
- package/dist/esm/validators/isIP.d.ts +5 -0
- package/dist/esm/validators/isIP.js +35 -0
- package/dist/esm/validators/isIPRange.d.ts +5 -0
- package/dist/esm/validators/isIPRange.js +40 -0
- package/dist/esm/validators/isISBN.d.ts +5 -0
- package/dist/esm/validators/isISBN.js +48 -0
- package/dist/esm/validators/isISIN.d.ts +1 -0
- package/dist/esm/validators/isISIN.js +52 -0
- package/dist/esm/validators/isISO15924.d.ts +2 -0
- package/dist/esm/validators/isISO15924.js +283 -0
- package/dist/esm/validators/isISO31661Alpha2.d.ts +5 -0
- package/dist/esm/validators/isISO31661Alpha2.js +273 -0
- package/dist/esm/validators/isISO31661Alpha3.d.ts +4 -0
- package/dist/esm/validators/isISO31661Alpha3.js +272 -0
- package/dist/esm/validators/isISO31661Numeric.d.ts +1 -0
- package/dist/esm/validators/isISO31661Numeric.js +260 -0
- package/dist/esm/validators/isISO4217.d.ts +2 -0
- package/dist/esm/validators/isISO4217.js +191 -0
- package/dist/esm/validators/isISO6346.d.ts +2 -0
- package/dist/esm/validators/isISO6346.js +39 -0
- package/dist/esm/validators/isISO6391.d.ts +1 -0
- package/dist/esm/validators/isISO6391.js +196 -0
- package/dist/esm/validators/isISO8601.d.ts +5 -0
- package/dist/esm/validators/isISO8601.js +39 -0
- package/dist/esm/validators/isISRC.d.ts +1 -0
- package/dist/esm/validators/isISRC.js +10 -0
- package/dist/esm/validators/isISSN.d.ts +5 -0
- package/dist/esm/validators/isISSN.js +24 -0
- package/dist/esm/validators/isIdentityCard.d.ts +24 -0
- package/dist/esm/validators/isIdentityCard.js +439 -0
- package/dist/esm/validators/isIn.d.ts +4 -0
- package/dist/esm/validators/isIn.js +33 -0
- package/dist/esm/validators/isInt.d.ts +8 -0
- package/dist/esm/validators/isInt.js +26 -0
- package/dist/esm/validators/isJSON.d.ts +5 -0
- package/dist/esm/validators/isJSON.js +7 -0
- package/dist/esm/validators/isJWT.d.ts +1 -0
- package/dist/esm/validators/isJWT.js +20 -0
- package/dist/esm/validators/isLatLong.d.ts +4 -0
- package/dist/esm/validators/isLatLong.js +26 -0
- package/dist/esm/validators/isLength.d.ts +7 -0
- package/dist/esm/validators/isLength.js +25 -0
- package/dist/esm/validators/isLicensePlate.d.ts +21 -0
- package/dist/esm/validators/isLicensePlate.js +40 -0
- package/dist/esm/validators/isLocale.d.ts +1 -0
- package/dist/esm/validators/isLocale.js +26 -0
- package/dist/esm/validators/isLowercase.d.ts +1 -0
- package/dist/esm/validators/isLowercase.js +9 -0
- package/dist/esm/validators/isLuhnNumber.d.ts +1 -0
- package/dist/esm/validators/isLuhnNumber.js +34 -0
- package/dist/esm/validators/isMACAddress.d.ts +6 -0
- package/dist/esm/validators/isMACAddress.js +31 -0
- package/dist/esm/validators/isMD5.d.ts +1 -0
- package/dist/esm/validators/isMD5.js +10 -0
- package/dist/esm/validators/isMagnetURI.d.ts +1 -0
- package/dist/esm/validators/isMagnetURI.js +13 -0
- package/dist/esm/validators/isMailtoURI.d.ts +4 -0
- package/dist/esm/validators/isMailtoURI.js +50 -0
- package/dist/esm/validators/isMimeType.d.ts +1 -0
- package/dist/esm/validators/isMimeType.js +12 -0
- package/dist/esm/validators/isMobilePhone.d.ts +171 -0
- package/dist/esm/validators/isMobilePhone.js +208 -0
- package/dist/esm/validators/isMongoId.d.ts +1 -0
- package/dist/esm/validators/isMongoId.js +8 -0
- package/dist/esm/validators/isMultibyte.d.ts +1 -0
- package/dist/esm/validators/isMultibyte.js +10 -0
- package/dist/esm/validators/isNotEmpty.d.ts +1 -0
- package/dist/esm/validators/isNotEmpty.js +7 -0
- package/dist/esm/validators/isNumeric.d.ts +5 -0
- package/dist/esm/validators/isNumeric.js +31 -0
- package/dist/esm/validators/isOctal.d.ts +1 -0
- package/dist/esm/validators/isOctal.js +10 -0
- package/dist/esm/validators/isPassportNumber.d.ts +69 -0
- package/dist/esm/validators/isPassportNumber.js +80 -0
- package/dist/esm/validators/isPort.d.ts +1 -0
- package/dist/esm/validators/isPort.js +4 -0
- package/dist/esm/validators/isPostalCode.d.ts +79 -0
- package/dist/esm/validators/isPostalCode.js +104 -0
- package/dist/esm/validators/isRFC3339.d.ts +1 -0
- package/dist/esm/validators/isRFC3339.js +25 -0
- package/dist/esm/validators/isRequired.d.ts +1 -0
- package/dist/esm/validators/isRequired.js +3 -0
- package/dist/esm/validators/isRgbColor.d.ts +5 -0
- package/dist/esm/validators/isRgbColor.js +35 -0
- package/dist/esm/validators/isSemVer.d.ts +1 -0
- package/dist/esm/validators/isSemVer.js +12 -0
- package/dist/esm/validators/isSlug.d.ts +1 -0
- package/dist/esm/validators/isSlug.js +10 -0
- package/dist/esm/validators/isStrongPassword.d.ts +8 -0
- package/dist/esm/validators/isStrongPassword.js +22 -0
- package/dist/esm/validators/isSurrogatePair.d.ts +1 -0
- package/dist/esm/validators/isSurrogatePair.js +10 -0
- package/dist/esm/validators/isTime.d.ts +5 -0
- package/dist/esm/validators/isTime.js +34 -0
- package/dist/esm/validators/isULID.d.ts +1 -0
- package/dist/esm/validators/isULID.js +9 -0
- package/dist/esm/validators/isURL.d.ts +22 -0
- package/dist/esm/validators/isURL.js +212 -0
- package/dist/esm/validators/isUUID.d.ts +5 -0
- package/dist/esm/validators/isUUID.js +28 -0
- package/dist/esm/validators/isUppercase.d.ts +1 -0
- package/dist/esm/validators/isUppercase.js +9 -0
- package/dist/esm/validators/isVAT.d.ts +75 -0
- package/dist/esm/validators/isVAT.js +130 -0
- package/dist/esm/validators/isVariableWidth.d.ts +1 -0
- package/dist/esm/validators/isVariableWidth.js +11 -0
- package/dist/esm/validators/isWhitelisted.d.ts +4 -0
- package/dist/esm/validators/isWhitelisted.js +20 -0
- package/dist/esm/validators/matches.d.ts +5 -0
- package/dist/esm/validators/matches.js +26 -0
- package/package.json +110 -4
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { toString } from './string.js';
|
|
2
|
+
import { ConvertMessages, failure, success } from './result.js';
|
|
3
|
+
const PLAIN_DECIMAL_FORMAT = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
4
|
+
const validatorFloatRegex = new Map();
|
|
5
|
+
const MAX_CACHED_SEPARATORS = 64;
|
|
6
|
+
function getValidatorFloatRegex(separator) {
|
|
7
|
+
let re = validatorFloatRegex.get(separator);
|
|
8
|
+
if (re === undefined) {
|
|
9
|
+
const escapedSeparator = separator.replace(/[.*+?^${}()|[\]\\-]/g, '\\$&');
|
|
10
|
+
re = new RegExp(`^(?:[-+])?(?:[0-9]+)?(?:${escapedSeparator}[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$`);
|
|
11
|
+
if (validatorFloatRegex.size < MAX_CACHED_SEPARATORS)
|
|
12
|
+
validatorFloatRegex.set(separator, re);
|
|
13
|
+
}
|
|
14
|
+
return re;
|
|
15
|
+
}
|
|
16
|
+
const VALIDATOR_REJECTED = ['', '.', ',', '-', '+'];
|
|
17
|
+
export function toFloat(v, options) {
|
|
18
|
+
if (options?.syntax === 'validator')
|
|
19
|
+
return toFloatValidatorSyntax(v, options.decimalSeparator ?? '.');
|
|
20
|
+
if (typeof v === 'number')
|
|
21
|
+
return Number.isFinite(v) ? success(v) : failure(ConvertMessages.FLOAT);
|
|
22
|
+
if (typeof v === 'string') {
|
|
23
|
+
const s = v.trim();
|
|
24
|
+
if (!PLAIN_DECIMAL_FORMAT.test(s))
|
|
25
|
+
return failure(ConvertMessages.FLOAT);
|
|
26
|
+
const n = Number(s);
|
|
27
|
+
return Number.isFinite(n) ? success(n) : failure(ConvertMessages.FLOAT);
|
|
28
|
+
}
|
|
29
|
+
return failure(ConvertMessages.FLOAT);
|
|
30
|
+
}
|
|
31
|
+
function toFloatValidatorSyntax(v, separator) {
|
|
32
|
+
if (typeof v === 'number')
|
|
33
|
+
return isFinite(v) ? success(v) : failure(ConvertMessages.FLOAT);
|
|
34
|
+
const str = toString(v);
|
|
35
|
+
if (!str.ok)
|
|
36
|
+
return failure(ConvertMessages.FLOAT);
|
|
37
|
+
const s = str.value;
|
|
38
|
+
if (VALIDATOR_REJECTED.includes(s) || !getValidatorFloatRegex(separator).test(s)) {
|
|
39
|
+
return failure(ConvertMessages.FLOAT);
|
|
40
|
+
}
|
|
41
|
+
const n = parseFloat(separator === '' ? s : s.replace(separator, '.'));
|
|
42
|
+
return Number.isFinite(n) ? success(n) : failure(ConvertMessages.FLOAT);
|
|
43
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type { Converted, ConvertMessage, Success, Failure } from './result.js';
|
|
2
|
+
export { ConvertMessages } from './result.js';
|
|
3
|
+
export { toString } from './string.js';
|
|
4
|
+
export { anyToString } from './any-to-string.js';
|
|
5
|
+
export { toBoolean } from './boolean.js';
|
|
6
|
+
export type { BooleanConvertOptions } from './boolean.js';
|
|
7
|
+
export { toInteger } from './integer.js';
|
|
8
|
+
export type { IntegerConvertOptions } from './integer.js';
|
|
9
|
+
export { toFloat } from './float.js';
|
|
10
|
+
export type { FloatConvertOptions } from './float.js';
|
|
11
|
+
export { toDate } from './date.js';
|
|
12
|
+
export type { DateConvertOptions } from './date.js';
|
|
13
|
+
export { toJson, toJsonValue } from './json.js';
|
|
14
|
+
export type { JsonValueConvertOptions } from './json.js';
|
|
15
|
+
export { toArray } from './array.js';
|
|
16
|
+
export { toEnum } from './enum.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { ConvertMessages } from './result.js';
|
|
2
|
+
export { toString } from './string.js';
|
|
3
|
+
export { anyToString } from './any-to-string.js';
|
|
4
|
+
export { toBoolean } from './boolean.js';
|
|
5
|
+
export { toInteger } from './integer.js';
|
|
6
|
+
export { toFloat } from './float.js';
|
|
7
|
+
export { toDate } from './date.js';
|
|
8
|
+
export { toJson, toJsonValue } from './json.js';
|
|
9
|
+
export { toArray } from './array.js';
|
|
10
|
+
export { toEnum } from './enum.js';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { toString } from './string.js';
|
|
2
|
+
import { ConvertMessages, failure, success } from './result.js';
|
|
3
|
+
const INTEGER_FORMAT = /^-?\d+$/;
|
|
4
|
+
const VALIDATOR_INT = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
|
|
5
|
+
const VALIDATOR_INT_LEADING_ZEROES = /^[-+]?[0-9]+$/;
|
|
6
|
+
export function toInteger(v, options) {
|
|
7
|
+
if (options?.syntax === 'validator')
|
|
8
|
+
return toIntegerValidatorSyntax(v, options);
|
|
9
|
+
if (typeof v === 'number') {
|
|
10
|
+
if (!Number.isInteger(v))
|
|
11
|
+
return failure(ConvertMessages.INTEGER);
|
|
12
|
+
if (!Number.isSafeInteger(v))
|
|
13
|
+
return failure(ConvertMessages.INTEGER_OVERFLOW);
|
|
14
|
+
return success(v);
|
|
15
|
+
}
|
|
16
|
+
if (typeof v === 'string') {
|
|
17
|
+
const s = v.trim();
|
|
18
|
+
if (!INTEGER_FORMAT.test(s))
|
|
19
|
+
return failure(ConvertMessages.INTEGER);
|
|
20
|
+
const n = Number(s);
|
|
21
|
+
if (!Number.isSafeInteger(n))
|
|
22
|
+
return failure(ConvertMessages.INTEGER_OVERFLOW);
|
|
23
|
+
return success(n);
|
|
24
|
+
}
|
|
25
|
+
return failure(ConvertMessages.INTEGER);
|
|
26
|
+
}
|
|
27
|
+
function toIntegerValidatorSyntax(v, options) {
|
|
28
|
+
if (typeof v === 'number')
|
|
29
|
+
return Number.isInteger(v) ? success(v) : failure(ConvertMessages.INTEGER);
|
|
30
|
+
const str = toString(v);
|
|
31
|
+
if (!str.ok)
|
|
32
|
+
return failure(ConvertMessages.INTEGER);
|
|
33
|
+
const regex = options.allowLeadingZeroes === false ? VALIDATOR_INT : VALIDATOR_INT_LEADING_ZEROES;
|
|
34
|
+
if (!regex.test(str.value))
|
|
35
|
+
return failure(ConvertMessages.INTEGER);
|
|
36
|
+
const n = Number(str.value);
|
|
37
|
+
return Number.isFinite(n) ? success(n) : failure(ConvertMessages.INTEGER_OVERFLOW);
|
|
38
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Converted } from './result.js';
|
|
2
|
+
export declare function toJson(v: unknown): Converted<Record<string, unknown>>;
|
|
3
|
+
export interface JsonValueConvertOptions {
|
|
4
|
+
allowPrimitives?: boolean;
|
|
5
|
+
allowAnyValue?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function toJsonValue(v: unknown, options?: JsonValueConvertOptions): Converted<unknown>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { toString } from './string.js';
|
|
2
|
+
import { ConvertMessages, failure, success } from './result.js';
|
|
3
|
+
function isNonEmptyPlainRecord(v) {
|
|
4
|
+
return (v !== null && typeof v === 'object' && !Array.isArray(v) && Object.keys(v).length > 0);
|
|
5
|
+
}
|
|
6
|
+
function isPlainObject(v) {
|
|
7
|
+
const proto = Object.getPrototypeOf(v);
|
|
8
|
+
return proto === Object.prototype || proto === null;
|
|
9
|
+
}
|
|
10
|
+
function isJsonSafe(root) {
|
|
11
|
+
const ancestors = new Set();
|
|
12
|
+
const stack = [{ node: root, exit: false }];
|
|
13
|
+
while (stack.length > 0) {
|
|
14
|
+
const { node, exit } = stack.pop();
|
|
15
|
+
if (exit) {
|
|
16
|
+
ancestors.delete(node);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (ancestors.has(node))
|
|
20
|
+
return false;
|
|
21
|
+
if (!Array.isArray(node) && !isPlainObject(node))
|
|
22
|
+
return false;
|
|
23
|
+
ancestors.add(node);
|
|
24
|
+
stack.push({ node, exit: true });
|
|
25
|
+
for (const child of Object.values(node)) {
|
|
26
|
+
if (child === null || typeof child === 'string' || typeof child === 'boolean')
|
|
27
|
+
continue;
|
|
28
|
+
if (typeof child === 'number') {
|
|
29
|
+
if (!Number.isFinite(child))
|
|
30
|
+
return false;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (typeof child !== 'object')
|
|
34
|
+
return false;
|
|
35
|
+
stack.push({ node: child, exit: false });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
export function toJson(v) {
|
|
41
|
+
if (typeof v === 'string') {
|
|
42
|
+
let parsed;
|
|
43
|
+
try {
|
|
44
|
+
parsed = JSON.parse(v);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return failure(ConvertMessages.JSON);
|
|
48
|
+
}
|
|
49
|
+
return isNonEmptyPlainRecord(parsed) ? success(parsed) : failure(ConvertMessages.JSON);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
return isNonEmptyPlainRecord(v) && isJsonSafe(v) ? success(v) : failure(ConvertMessages.JSON);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return failure(ConvertMessages.JSON);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function toJsonValue(v, options) {
|
|
59
|
+
const str = toString(v);
|
|
60
|
+
if (!str.ok)
|
|
61
|
+
return failure(ConvertMessages.JSON_VALUE);
|
|
62
|
+
let parsed;
|
|
63
|
+
try {
|
|
64
|
+
parsed = JSON.parse(str.value);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return failure(ConvertMessages.JSON_VALUE);
|
|
68
|
+
}
|
|
69
|
+
if (options?.allowAnyValue)
|
|
70
|
+
return success(parsed);
|
|
71
|
+
if (options?.allowPrimitives && (parsed === null || parsed === true || parsed === false)) {
|
|
72
|
+
return success(parsed);
|
|
73
|
+
}
|
|
74
|
+
return parsed !== null && typeof parsed === 'object'
|
|
75
|
+
? success(parsed)
|
|
76
|
+
: failure(ConvertMessages.JSON_VALUE);
|
|
77
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const ConvertMessages: Readonly<{
|
|
2
|
+
readonly STRING: "Value cannot be converted to string";
|
|
3
|
+
readonly BOOLEAN: "Value cannot be converted to boolean";
|
|
4
|
+
readonly INTEGER: "Value is not an integer";
|
|
5
|
+
readonly INTEGER_OVERFLOW: "Integer exceeds the safe integer limits (-9007199254740991 to 9007199254740991)";
|
|
6
|
+
readonly FLOAT: "Value is not a finite decimal number";
|
|
7
|
+
readonly DATE: "Value is not a valid date";
|
|
8
|
+
readonly JSON: "Value is not a non-empty JSON object";
|
|
9
|
+
readonly JSON_VALUE: "Value is not an accepted JSON value";
|
|
10
|
+
readonly ARRAY: "Value is not an array";
|
|
11
|
+
readonly ENUM: "Value is not one of the enum options";
|
|
12
|
+
}>;
|
|
13
|
+
export type ConvertMessage = (typeof ConvertMessages)[keyof typeof ConvertMessages];
|
|
14
|
+
export type Converted<T> = Success<T> | Failure;
|
|
15
|
+
export interface Success<T> {
|
|
16
|
+
readonly ok: true;
|
|
17
|
+
readonly value: T;
|
|
18
|
+
readonly error: null;
|
|
19
|
+
}
|
|
20
|
+
export interface Failure {
|
|
21
|
+
readonly ok: false;
|
|
22
|
+
readonly value: null;
|
|
23
|
+
readonly error: ConvertMessage;
|
|
24
|
+
}
|
|
25
|
+
export declare function failure(error: ConvertMessage): Failure;
|
|
26
|
+
export declare function success<T>(value: T): Success<T>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const ConvertMessages = Object.freeze({
|
|
2
|
+
STRING: 'Value cannot be converted to string',
|
|
3
|
+
BOOLEAN: 'Value cannot be converted to boolean',
|
|
4
|
+
INTEGER: 'Value is not an integer',
|
|
5
|
+
INTEGER_OVERFLOW: 'Integer exceeds the safe integer limits (-9007199254740991 to 9007199254740991)',
|
|
6
|
+
FLOAT: 'Value is not a finite decimal number',
|
|
7
|
+
DATE: 'Value is not a valid date',
|
|
8
|
+
JSON: 'Value is not a non-empty JSON object',
|
|
9
|
+
JSON_VALUE: 'Value is not an accepted JSON value',
|
|
10
|
+
ARRAY: 'Value is not an array',
|
|
11
|
+
ENUM: 'Value is not one of the enum options',
|
|
12
|
+
});
|
|
13
|
+
export function failure(error) {
|
|
14
|
+
return { ok: false, value: null, error };
|
|
15
|
+
}
|
|
16
|
+
export function success(value) {
|
|
17
|
+
return { ok: true, value, error: null };
|
|
18
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ConvertMessages, failure, success } from './result.js';
|
|
2
|
+
export function toString(v) {
|
|
3
|
+
if (typeof v === 'string')
|
|
4
|
+
return success(v);
|
|
5
|
+
if (typeof v === 'boolean')
|
|
6
|
+
return success(v ? 'true' : 'false');
|
|
7
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
8
|
+
return success(String(v));
|
|
9
|
+
return failure(ConvertMessages.STRING);
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ValidatedClass } from './validations.js';
|
|
2
|
+
export type ValidationError = {
|
|
3
|
+
validator: string;
|
|
4
|
+
message: string;
|
|
5
|
+
} | {
|
|
6
|
+
custom: string;
|
|
7
|
+
message: string;
|
|
8
|
+
};
|
|
9
|
+
export interface ValidationSuccess<T> {
|
|
10
|
+
readonly ok: true;
|
|
11
|
+
readonly value: T;
|
|
12
|
+
readonly errors: readonly [];
|
|
13
|
+
}
|
|
14
|
+
export interface ValidationFailure<T> {
|
|
15
|
+
readonly ok: false;
|
|
16
|
+
readonly value: T;
|
|
17
|
+
readonly errors: readonly ValidationError[];
|
|
18
|
+
}
|
|
19
|
+
export type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure<T>;
|
|
20
|
+
export interface Validatable<T> {
|
|
21
|
+
validate(): ValidationResult<T>;
|
|
22
|
+
}
|
|
23
|
+
export declare function runValidations<T>(target: ValidatedClass, value: T): ValidationResult<T>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { validator } from '../validators/index.js';
|
|
2
|
+
import { isRequired as hasValue } from '../validators/isRequired.js';
|
|
3
|
+
import { ValidationConfigError } from '../helpers/errors.js';
|
|
4
|
+
import { isCustom, isValidatorName, keyOf, ownValidations } from './validations.js';
|
|
5
|
+
const IS_REQUIRED = keyOf({ validator: 'isRequired' });
|
|
6
|
+
function validationsOf(target) {
|
|
7
|
+
const rootFirstChain = [];
|
|
8
|
+
for (let current = target; current !== Function.prototype && current !== null; current = Object.getPrototypeOf(current)) {
|
|
9
|
+
rootFirstChain.unshift(current);
|
|
10
|
+
}
|
|
11
|
+
const byKey = new Map();
|
|
12
|
+
for (const cls of rootFirstChain) {
|
|
13
|
+
for (const validation of ownValidations.get(cls) ?? []) {
|
|
14
|
+
byKey.set(keyOf(validation), validation);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return [...byKey.values()];
|
|
18
|
+
}
|
|
19
|
+
function errorOf(validation, value) {
|
|
20
|
+
if (isCustom(validation)) {
|
|
21
|
+
if (validation.fn(value))
|
|
22
|
+
return null;
|
|
23
|
+
return {
|
|
24
|
+
custom: validation.custom,
|
|
25
|
+
message: validation.message ?? `Value does not satisfy ${validation.custom}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const name = validation.validator;
|
|
29
|
+
if (!isValidatorName(name)) {
|
|
30
|
+
throw new ValidationConfigError(`Unknown validator "${name}"`);
|
|
31
|
+
}
|
|
32
|
+
const run = validator[name];
|
|
33
|
+
if (run(value, validation.properties))
|
|
34
|
+
return null;
|
|
35
|
+
return { validator: name, message: validation.message ?? `Value does not satisfy ${name}` };
|
|
36
|
+
}
|
|
37
|
+
export function runValidations(target, value) {
|
|
38
|
+
if (typeof target !== 'function')
|
|
39
|
+
throw new ValidationConfigError('runValidations expects a class, not an instance or a value');
|
|
40
|
+
const declared = validationsOf(target);
|
|
41
|
+
const isRequired = declared.filter((validation) => keyOf(validation) === IS_REQUIRED);
|
|
42
|
+
const isOptional = isRequired.length === 0;
|
|
43
|
+
let toRun;
|
|
44
|
+
if (hasValue(value))
|
|
45
|
+
toRun = declared;
|
|
46
|
+
else if (isOptional)
|
|
47
|
+
toRun = [];
|
|
48
|
+
else
|
|
49
|
+
toRun = isRequired;
|
|
50
|
+
const errors = [];
|
|
51
|
+
for (const validation of toRun) {
|
|
52
|
+
const error = errorOf(validation, value);
|
|
53
|
+
if (error !== null)
|
|
54
|
+
errors.push(error);
|
|
55
|
+
}
|
|
56
|
+
return Object.freeze(errors.length === 0
|
|
57
|
+
? { ok: true, value, errors: Object.freeze([]) }
|
|
58
|
+
: { ok: false, value, errors: Object.freeze(errors.map((error) => Object.freeze(error))) });
|
|
59
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ValidatorRegistry } from '../validators/index.js';
|
|
2
|
+
export type ValidatorName = {
|
|
3
|
+
[K in keyof ValidatorRegistry]: ValidatorRegistry[K] extends (...args: any[]) => boolean ? K : never;
|
|
4
|
+
}[keyof ValidatorRegistry];
|
|
5
|
+
type Params<K extends ValidatorName> = ValidatorRegistry[K] extends (value: any, ...rest: infer R) => boolean ? R : never;
|
|
6
|
+
export type ValidationProperties<K extends ValidatorName> = Params<K> extends [] ? never : NonNullable<Params<K>[0]>;
|
|
7
|
+
type PropertiesField<P> = [P] extends [never] ? {
|
|
8
|
+
properties?: undefined;
|
|
9
|
+
} : Record<never, never> extends P ? {
|
|
10
|
+
properties?: P;
|
|
11
|
+
} : {
|
|
12
|
+
properties: P;
|
|
13
|
+
};
|
|
14
|
+
export type BuiltInValidation = {
|
|
15
|
+
[K in ValidatorName]: {
|
|
16
|
+
validator: K;
|
|
17
|
+
message?: string;
|
|
18
|
+
custom?: undefined;
|
|
19
|
+
fn?: undefined;
|
|
20
|
+
} & PropertiesField<ValidationProperties<K>>;
|
|
21
|
+
}[ValidatorName];
|
|
22
|
+
export interface CustomValidation {
|
|
23
|
+
custom: string;
|
|
24
|
+
fn: (value: unknown) => boolean;
|
|
25
|
+
message?: string;
|
|
26
|
+
validator?: undefined;
|
|
27
|
+
}
|
|
28
|
+
export type Validation = BuiltInValidation | CustomValidation;
|
|
29
|
+
export type ValidatedClass = abstract new (...args: any[]) => unknown;
|
|
30
|
+
export declare const ownValidations: WeakMap<ValidatedClass, Validation[]>;
|
|
31
|
+
export declare function isCustom(validation: Validation): validation is CustomValidation;
|
|
32
|
+
export declare function isValidatorName(name: unknown): name is ValidatorName;
|
|
33
|
+
export declare function keyOf(validation: Validation): string;
|
|
34
|
+
export declare function Validations(validations: Validation[]): (target: ValidatedClass) => void;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { validator } from '../validators/index.js';
|
|
3
|
+
import { ValidationConfigError } from '../helpers/errors.js';
|
|
4
|
+
import { hasOwn } from '../helpers/hasOwn.js';
|
|
5
|
+
const REGISTRY = Symbol.for('@archi-code/validation/decorator.v1');
|
|
6
|
+
export const ownValidations = ((_a = globalThis)[REGISTRY] ?? (_a[REGISTRY] = new WeakMap()));
|
|
7
|
+
export function isCustom(validation) {
|
|
8
|
+
return validation.custom !== undefined;
|
|
9
|
+
}
|
|
10
|
+
export function isValidatorName(name) {
|
|
11
|
+
return hasOwn(validator, name) && typeof validator[name] === 'function';
|
|
12
|
+
}
|
|
13
|
+
function assertShape(validation) {
|
|
14
|
+
if (validation === null || typeof validation !== 'object')
|
|
15
|
+
throw new ValidationConfigError('A validation must be an object');
|
|
16
|
+
const { validator: name, custom, fn } = validation;
|
|
17
|
+
if (name !== undefined && custom !== undefined)
|
|
18
|
+
throw new ValidationConfigError('A validation cannot have both "validator" and "custom"');
|
|
19
|
+
if (custom !== undefined) {
|
|
20
|
+
if (typeof custom !== 'string' || custom === '')
|
|
21
|
+
throw new ValidationConfigError('"custom" must be a non-empty string');
|
|
22
|
+
if (typeof fn !== 'function')
|
|
23
|
+
throw new ValidationConfigError(`Custom "${custom}" needs a "fn" function`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (name === undefined)
|
|
27
|
+
throw new ValidationConfigError('A validation needs "validator" or "custom"');
|
|
28
|
+
if (!isValidatorName(name))
|
|
29
|
+
throw new ValidationConfigError(`Unknown validator "${String(name)}"`);
|
|
30
|
+
}
|
|
31
|
+
export function keyOf(validation) {
|
|
32
|
+
return isCustom(validation) ? `custom:${validation.custom}` : `validator:${validation.validator}`;
|
|
33
|
+
}
|
|
34
|
+
function snapshot(value) {
|
|
35
|
+
if (Array.isArray(value))
|
|
36
|
+
return Object.freeze(value.map(snapshot));
|
|
37
|
+
if (value !== null &&
|
|
38
|
+
typeof value === 'object' &&
|
|
39
|
+
Object.getPrototypeOf(value) === Object.prototype) {
|
|
40
|
+
const copy = {};
|
|
41
|
+
for (const [key, item] of Object.entries(value))
|
|
42
|
+
copy[key] = snapshot(item);
|
|
43
|
+
return Object.freeze(copy);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
export function Validations(validations) {
|
|
48
|
+
return (target) => {
|
|
49
|
+
if (typeof target !== 'function')
|
|
50
|
+
throw new ValidationConfigError('@Validations can only decorate a class');
|
|
51
|
+
if (!Array.isArray(validations))
|
|
52
|
+
throw new ValidationConfigError('@Validations expects an array of validations');
|
|
53
|
+
const declared = new Set();
|
|
54
|
+
for (const validation of validations) {
|
|
55
|
+
assertShape(validation);
|
|
56
|
+
const key = keyOf(validation);
|
|
57
|
+
if (declared.has(key))
|
|
58
|
+
throw new ValidationConfigError(isCustom(validation)
|
|
59
|
+
? `Custom "${validation.custom}" is declared more than once`
|
|
60
|
+
: `Validator "${validation.validator}" is declared more than once`);
|
|
61
|
+
declared.add(key);
|
|
62
|
+
}
|
|
63
|
+
const own = new Map((ownValidations.get(target) ?? []).map((v) => [keyOf(v), v]));
|
|
64
|
+
for (const validation of validations)
|
|
65
|
+
own.set(keyOf(validation), snapshot(validation));
|
|
66
|
+
ownValidations.set(target, [...own.values()]);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function reverseMultiplyAndSum(digits: number[], base: number): number;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const upperCaseRegex = /^\p{Lu}$/u;
|
|
2
|
+
const lowerCaseRegex = /^\p{Ll}$/u;
|
|
3
|
+
const numberRegex = /^\p{Nd}$/u;
|
|
4
|
+
const symbolRegex = /^[\p{P}\p{S}\p{Zs}]$/u;
|
|
5
|
+
function countCodePoints(codePoints) {
|
|
6
|
+
const result = new Map();
|
|
7
|
+
for (const char of codePoints) {
|
|
8
|
+
result.set(char, (result.get(char) ?? 0) + 1);
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
export function analyzePassword(password) {
|
|
13
|
+
const codePoints = Array.from(password);
|
|
14
|
+
const charMap = countCodePoints(codePoints);
|
|
15
|
+
const analysis = {
|
|
16
|
+
length: codePoints.length,
|
|
17
|
+
uniqueChars: charMap.size,
|
|
18
|
+
uppercaseCount: 0,
|
|
19
|
+
lowercaseCount: 0,
|
|
20
|
+
numberCount: 0,
|
|
21
|
+
symbolCount: 0,
|
|
22
|
+
};
|
|
23
|
+
charMap.forEach((count, char) => {
|
|
24
|
+
if (upperCaseRegex.test(char)) {
|
|
25
|
+
analysis.uppercaseCount += count;
|
|
26
|
+
}
|
|
27
|
+
else if (lowerCaseRegex.test(char)) {
|
|
28
|
+
analysis.lowercaseCount += count;
|
|
29
|
+
}
|
|
30
|
+
else if (numberRegex.test(char)) {
|
|
31
|
+
analysis.numberCount += count;
|
|
32
|
+
}
|
|
33
|
+
else if (symbolRegex.test(char)) {
|
|
34
|
+
analysis.symbolCount += count;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return analysis;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function assertString(input?: unknown): asserts input is string;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function assertString(input = undefined) {
|
|
2
|
+
if (input === undefined || input === null)
|
|
3
|
+
throw new TypeError(`Expected a string but received a ${input}`);
|
|
4
|
+
if (typeof input !== 'string')
|
|
5
|
+
throw new TypeError(`Expected a string but received a ${typeof input}`);
|
|
6
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class BoundedCache {
|
|
2
|
+
constructor(maxSize = 256) {
|
|
3
|
+
this.maxSize = maxSize;
|
|
4
|
+
this.map = new Map();
|
|
5
|
+
}
|
|
6
|
+
get size() {
|
|
7
|
+
return this.map.size;
|
|
8
|
+
}
|
|
9
|
+
getOrCreate(key, create) {
|
|
10
|
+
const hit = this.map.get(key);
|
|
11
|
+
if (hit !== undefined) {
|
|
12
|
+
this.markMostRecentlyUsed(key, hit);
|
|
13
|
+
return hit;
|
|
14
|
+
}
|
|
15
|
+
const value = create();
|
|
16
|
+
if (this.map.size >= this.maxSize) {
|
|
17
|
+
this.evictLeastRecentlyUsed();
|
|
18
|
+
}
|
|
19
|
+
this.map.set(key, value);
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
markMostRecentlyUsed(key, value) {
|
|
23
|
+
this.map.delete(key);
|
|
24
|
+
this.map.set(key, value);
|
|
25
|
+
}
|
|
26
|
+
evictLeastRecentlyUsed() {
|
|
27
|
+
this.map.delete(this.map.keys().next().value);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { configText } from './config.js';
|
|
2
|
+
import { ValidationConfigError } from './errors.js';
|
|
3
|
+
function normalizeHost(host) {
|
|
4
|
+
const lower = host.toLowerCase();
|
|
5
|
+
return lower.endsWith('.') ? lower.slice(0, -1) : lower;
|
|
6
|
+
}
|
|
7
|
+
export function checkHost(host, matches) {
|
|
8
|
+
const normalized = normalizeHost(host);
|
|
9
|
+
for (const match of matches) {
|
|
10
|
+
if (typeof match === 'string') {
|
|
11
|
+
if (normalized === normalizeHost(match))
|
|
12
|
+
return true;
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (testFromStart(match, normalized)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
function testFromStart(regex, text) {
|
|
22
|
+
regex.lastIndex = 0;
|
|
23
|
+
return regex.test(text);
|
|
24
|
+
}
|
|
25
|
+
export function hostList(list, name) {
|
|
26
|
+
if (list === undefined || list === null)
|
|
27
|
+
return [];
|
|
28
|
+
if (!Array.isArray(list) || !list.every((m) => typeof m === 'string' || m instanceof RegExp)) {
|
|
29
|
+
throw new ValidationConfigError(`${name} must be an array of strings or RegExps, got ${configText(list)}`);
|
|
30
|
+
}
|
|
31
|
+
return list;
|
|
32
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function optionsOf<T extends object>(options: T | null | undefined, name?: string): Partial<T>;
|
|
2
|
+
export declare function configText(value: unknown): string;
|
|
3
|
+
export declare function boundsOf<T extends {
|
|
4
|
+
min?: number;
|
|
5
|
+
max?: number;
|
|
6
|
+
}>(options: T | null | undefined): {
|
|
7
|
+
options: Partial<T>;
|
|
8
|
+
min: number;
|
|
9
|
+
max: number | undefined;
|
|
10
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { anyToString } from '../convert/any-to-string.js';
|
|
2
|
+
import { ValidationConfigError } from './errors.js';
|
|
3
|
+
export function optionsOf(options, name = 'options') {
|
|
4
|
+
if (options === undefined || options === null)
|
|
5
|
+
return {};
|
|
6
|
+
if (typeof options !== 'object') {
|
|
7
|
+
throw new ValidationConfigError(`${name} must be an object, got ${configText(options)}`);
|
|
8
|
+
}
|
|
9
|
+
return options;
|
|
10
|
+
}
|
|
11
|
+
export function configText(value) {
|
|
12
|
+
return anyToString(value);
|
|
13
|
+
}
|
|
14
|
+
export function boundsOf(options) {
|
|
15
|
+
const opts = optionsOf(options);
|
|
16
|
+
return {
|
|
17
|
+
options: opts,
|
|
18
|
+
min: bound(opts.min, 'min') || 0,
|
|
19
|
+
max: bound(opts.max, 'max'),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function bound(value, name) {
|
|
23
|
+
if (value === undefined || value === null)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (typeof value === 'symbol' || typeof value === 'function' || typeof value === 'object') {
|
|
26
|
+
throw new ValidationConfigError(`${name} must be a number, got ${configText(value)}`);
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|