import { isValid } from "date-fns/fp" ; import { validate as uuidValidate , version as uuidVersion } from "uuid" ; import Ajv , { FormatDefinition } from "ajv" ; import path from "path" ; import { CloudStorage } from "../constants/Process" ; const unixTimestamp = { type : "number" , validate : date => { if ( String ( date ) . length !== 13 ) { return false ; } return isValid ( date ) ; } , } ; const uuidV4 = { validate : uuid => { return uuidValidate ( uuid ) && uuidVersion ( uuid ) === 4 ; } , } ; const fileSuffix = { validate : fileName => { const suffix = path . extname ( fileName ) . substr ( 1 ) ; return CloudStorage . ALLOW_FILE_SUFFIX . includes ( suffix ) ; } , } ; const urlFileSuffix = { validate : fileName => { const suffix = path . extname ( fileName ) . substr ( 1 ) ; return CloudStorage . ALLOW_URL_FILE_SUFFIX . includes ( suffix ) ; } , } ; const urlRegex = /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu ; const url = { validate : urlStr => { return urlRegex . test ( urlStr ) ; } , } ; export const ajvSelfPlugin = ( ajv ) : void => { ajv . addFormat ( "unix-timestamp" , unixTimestamp ) ; ajv . addFormat ( "uuid-v4" , uuidV4 ) ; ajv . addFormat ( "file-suffix" , fileSuffix ) ; ajv . addFormat ( "url-file-suffix" , urlFileSuffix ) ; ajv . addFormat ( "url" , url ) ; } ;