{"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;AACpH,QAAO,WACL;EACE,MAAM;EACN,aAAa,CAAC,WAAW;EACzB,WAAW;GACT,WAAW,OAAO,SAAkB,SAAS,MAAM,IAAI,WAAW,OAAO,MAAM,YAAY,GAAG;GAC9F,gBAAgB,cAAc,YAAY,SAAS;AACjD,QAAI,MAAM,YAAY,GACpB,QAAO,GAAG,WAAW,kDAAkD,KAAK,YAAY,GAAG;AAE7F,WAAO,GAAG,WAAW;MACpB,kBAAkB;GACtB;EACF,EACD,kBACD;;AAGH,SAAgB,6BACd,mBACmB;CACnB,MAAM,aAAa,QAAQ,kBAAkB,UAAU;CACvD,MAAM,kBAAkB,kBAAkB,mBAAmB;AAE7D,QAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,WAAW;AACpB,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,MAAM,QAAQ,OAAO,IAAI,OAAO,WAAW,EAAG,QAAO;AAEzD,WACE,QAAQ,OAAO,CAEZ,OAAO,UAAU,WAAW,MAAM,cAAc,WAAW,OAAO,UAAU,CAAC,CAAC;;GAGrF,gBAAgB,cACb,eACC,GAAG,WAAW,8EAA8E,WACzF,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,IACf,kBACD;GACF;EACF,EACD,kBACD;;AAGH,SAAgB,qCACd,mBACmB;CACnB,MAAM,aAAa,QAAQ,kBAAkB,UAAU;CACvD,MAAM,kBAAkB,kBAAkB,mBAAmB;AAE7D,QAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,WAAW;AACpB,QAAI,SAAS,OAAO,CAAE,QAAO;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,MAAM,QAAQ,OAAO,IAAI,OAAO,WAAW,EAAG,QAAO;AAEzD,WACE,QAAQ,OAAO,CAEZ,OAAO,UAAU,WAAW,MAAM,cAAc,WAAW,OAAO,UAAU,CAAC,CAAC;;GAGrF,gBAAgB,cACb,eACC,GAAG,WAAW,wFAAwF,WACnG,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,IACf,kBACD;GACF;EACF,EACD,kBACD;;AAQH,MAAa,eAAe;AAE5B,SAAgB,MAAM,OAAe;AACnC,QAAO,aAAa,KAAK,MAAM;;AAGjC,SAAgB,MAAM,mBAA0D;AAC9E,QAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,UAAmB,MAAM,MAAM;GAC1C,gBAAgB,cACb,eAAe,GAAG,WAAW,gDAAgD,aAAa,OAAO,IAClG,kBACD;GACF;EACF,EACD,kBACD;;AAGH,SAAgB,QAAQ,mBAA0D;AAChF,QAAO,WACL;EACE,MAAM;EACN,WAAW;GACT,WAAW,WAAW,OAAO,WAAW;GACxC,gBAAgB,cAAc,eAAe,GAAG,WAAW,0BAA0B,kBAAkB;GACxG;EACF,EACD,kBACD"}