UNPKG

@credo-ts/core

Version:

<p align="center"> <br /> <img alt="Credo Logo" src="https://github.com/openwallet-foundation/credo-ts/blob/c7886cb8377ceb8ee4efe8d264211e561a75072d/images/credo-logo.png" height="250px" /> </p> <h1 align="center"><b>Credo - Core</b></h1

1 lines • 6.63 kB
{"version":3,"file":"validators.mjs","names":[],"sources":["../../src/utils/validators.ts"],"sourcesContent":["import type { ValidationOptions } from 'class-validator'\nimport { buildMessage, isInstance, isString, ValidateBy } from 'class-validator'\nimport type { SingleOrArray } from '../types'\nimport { asArray } from './array'\nimport type { Constructor } from './mixins'\n\nexport interface IsInstanceOrArrayOfInstancesValidationOptions extends ValidationOptions {\n // biome-ignore lint/suspicious/noExplicitAny: no explanation\n classType: SingleOrArray<new (...args: any[]) => any>\n\n /**\n * Whether to allow empty arrays to pass validation\n * @default false\n */\n allowEmptyArray?: boolean\n}\n\n/**\n * Checks if the value is a string or the specified instance\n */\nexport function IsStringOrInstance(targetType: Constructor, validationOptions?: ValidationOptions): PropertyDecorator {\n return ValidateBy(\n {\n name: 'IsStringOrInstance',\n constraints: [targetType],\n validator: {\n validate: (value, args): boolean => isString(value) || isInstance(value, args?.constraints[0]),\n defaultMessage: buildMessage((eachPrefix, args) => {\n if (args?.constraints[0]) {\n return `${eachPrefix}$property must be of type string or instance of ${args.constraints[0].name as string}`\n }\n return `${eachPrefix}IsStringOrInstance decorator expects an object as value, but got falsy value.`\n }, validationOptions),\n },\n },\n validationOptions\n )\n}\n\nexport function IsInstanceOrArrayOfInstances(\n validationOptions: IsInstanceOrArrayOfInstancesValidationOptions\n): PropertyDecorator {\n const classTypes = asArray(validationOptions.classType)\n const allowEmptyArray = validationOptions.allowEmptyArray ?? false\n\n return ValidateBy(\n {\n name: 'isInstanceOrArrayOfInstances',\n validator: {\n validate: (values) => {\n if (!values) return false\n if (Array.isArray(values) && values.length === 0) return allowEmptyArray\n\n return (\n asArray(values)\n // all values MUST be instance of one of the class types\n .every((value) => classTypes.some((classType) => isInstance(value, classType)))\n )\n },\n defaultMessage: buildMessage(\n (eachPrefix) =>\n `${eachPrefix}$property value must be an instance of, or an array of instances containing ${classTypes\n .map((c) => c.name)\n .join(', ')}`,\n validationOptions\n ),\n },\n },\n validationOptions\n )\n}\n\nexport function IsStringOrInstanceOrArrayOfInstances(\n validationOptions: IsInstanceOrArrayOfInstancesValidationOptions\n): PropertyDecorator {\n const classTypes = asArray(validationOptions.classType)\n const allowEmptyArray = validationOptions.allowEmptyArray ?? false\n\n return ValidateBy(\n {\n name: 'IsStringOrInstanceOrArrayOfInstances',\n validator: {\n validate: (values) => {\n if (isString(values)) return true\n if (!values) return false\n if (Array.isArray(values) && values.length === 0) return allowEmptyArray\n\n return (\n asArray(values)\n // all values MUST be instance of one of the class types\n .every((value) => classTypes.some((classType) => isInstance(value, classType)))\n )\n },\n defaultMessage: buildMessage(\n (eachPrefix) =>\n `${eachPrefix}$property value must be a string, an instance of, or an array of instances containing ${classTypes\n .map((c) => c.name)\n .join(', ')}`,\n validationOptions\n ),\n },\n },\n validationOptions\n )\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: no explanation\nexport function isStringArray(value: any): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string')\n}\n\nexport const UriValidator = /\\w+:(\\/?\\/?)[^\\s]+/\n\nexport function isUri(value: string) {\n return UriValidator.test(value)\n}\n\nexport function IsUri(validationOptions?: ValidationOptions): PropertyDecorator {\n return ValidateBy(\n {\n name: 'isUri',\n validator: {\n validate: (value): boolean => isUri(value),\n defaultMessage: buildMessage(\n (eachPrefix) => `${eachPrefix}$property must be an URI (that matches regex: ${UriValidator.source})`,\n validationOptions\n ),\n },\n },\n validationOptions\n )\n}\n\nexport function IsNever(validationOptions?: ValidationOptions): PropertyDecorator {\n return ValidateBy(\n {\n name: 'IsNever',\n validator: {\n validate: (values) => typeof values === 'undefined',\n defaultMessage: buildMessage((eachPrefix) => `${eachPrefix}$property is forbidden.`, validationOptions),\n },\n },\n validationOptions\n )\n}\n"],"mappings":";;;;;;AAoBA,SAAgB,mBAAmB,YAAyB,mBAA0D;CACpH,OAAO,WACL;EACE,MAAM;EACN,aAAa,CAAC,UAAU;EACxB,WAAW;GACT,WAAW,OAAO,SAAkB,SAAS,KAAK,KAAK,WAAW,OAAO,MAAM,YAAY,EAAE;GAC7F,gBAAgB,cAAc,YAAY,SAAS;IACjD,IAAI,MAAM,YAAY,IACpB,OAAO,GAAG,WAAW,kDAAkD,KAAK,YAAY,EAAE,CAAC;IAE7F,OAAO,GAAG,WAAW;GACvB,GAAG,iBAAiB;EACtB;CACF,GACA,iBACF;AACF;AAEA,SAAgB,6BACd,mBACmB;CACnB,MAAM,aAAa,QAAQ,kBAAkB,SAAS;CACtD,MAAM,kBAAkB,kBAAkB,mBAAmB;CAE7D,OAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,WAAW;IACpB,IAAI,CAAC,QAAQ,OAAO;IACpB,IAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG,OAAO;IAEzD,OACE,QAAQ,MAAM,CAAC,CAEZ,OAAO,UAAU,WAAW,MAAM,cAAc,WAAW,OAAO,SAAS,CAAC,CAAC;GAEpF;GACA,gBAAgB,cACb,eACC,GAAG,WAAW,8EAA8E,WACzF,KAAK,MAAM,EAAE,IAAI,CAAC,CAClB,KAAK,IAAI,KACd,iBACF;EACF;CACF,GACA,iBACF;AACF;AAEA,SAAgB,qCACd,mBACmB;CACnB,MAAM,aAAa,QAAQ,kBAAkB,SAAS;CACtD,MAAM,kBAAkB,kBAAkB,mBAAmB;CAE7D,OAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,WAAW;IACpB,IAAI,SAAS,MAAM,GAAG,OAAO;IAC7B,IAAI,CAAC,QAAQ,OAAO;IACpB,IAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG,OAAO;IAEzD,OACE,QAAQ,MAAM,CAAC,CAEZ,OAAO,UAAU,WAAW,MAAM,cAAc,WAAW,OAAO,SAAS,CAAC,CAAC;GAEpF;GACA,gBAAgB,cACb,eACC,GAAG,WAAW,wFAAwF,WACnG,KAAK,MAAM,EAAE,IAAI,CAAC,CAClB,KAAK,IAAI,KACd,iBACF;EACF;CACF,GACA,iBACF;AACF;AAOA,MAAa,eAAe;AAE5B,SAAgB,MAAM,OAAe;CACnC,OAAO,aAAa,KAAK,KAAK;AAChC;AAEA,SAAgB,MAAM,mBAA0D;CAC9E,OAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,UAAmB,MAAM,KAAK;GACzC,gBAAgB,cACb,eAAe,GAAG,WAAW,gDAAgD,aAAa,OAAO,IAClG,iBACF;EACF;CACF,GACA,iBACF;AACF;AAEA,SAAgB,QAAQ,mBAA0D;CAChF,OAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,WAAW,OAAO,WAAW;GACxC,gBAAgB,cAAc,eAAe,GAAG,WAAW,0BAA0B,iBAAiB;EACxG;CACF,GACA,iBACF;AACF"}