{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import type { IFilesUploaderItem, TMaxSizeTypes } from \"../config/types\";\r\n\r\nconst ONE_KB = 1024;\r\n\r\n/**\r\n * Возвращает расширение файла\r\n * @param name\r\n * @returns\r\n */\r\nconst getFileExtension = (name: string): string => {\r\n  return (name.substring(name.lastIndexOf(\".\") + 1, name.length) || name).toLowerCase();\r\n};\r\n\r\n/**\r\n * Возвращает ковертацию полного типа файла в сокращенный\r\n * @param type - тип файла\r\n * @returns\r\n * */\r\nconst getShortFileType = (type: string): string => {\r\n  return type.indexOf(\"/\") > -1 ? type.split(\"/\")[1] : type;\r\n};\r\n\r\n/**\r\n * Преобразует объект или массив в формат, принимаемый компонентом\r\n * @returns\r\n */\r\nconst getFilesWithPropsArr = (data: IFilesUploaderItem | IFilesUploaderItem[]): (Required<IFilesUploaderItem> | File)[] => {\r\n  const getProps = ({\r\n    name = \"\", size = 0, href = null, data = null,\r\n  }: IFilesUploaderItem): Required<IFilesUploaderItem> => {\r\n    return {\r\n      name: typeof name === \"string\" ? name : \"\",\r\n      size: typeof size === \"number\" ? size : 0,\r\n      href,\r\n      data,\r\n    };\r\n  };\r\n\r\n  switch (true) {\r\n    case Array.isArray(data):\r\n      return data.map((item) => item instanceof File ? item : getProps(item));\r\n    case !!data && typeof data === \"object\":\r\n      return [ getProps(data) ];\r\n    default:\r\n      return [];\r\n  }\r\n};\r\n\r\n/**\r\n * Возвращает конкатенацию элементов массива форматов для инпута\r\n * @param fileTypes - разрешенные типы файлов\r\n * @returns\r\n * */\r\nconst getConvertedFileTypes = (fileTypes: string[]): string => {\r\n  return !fileTypes.length\r\n    ? \"*\"\r\n    : fileTypes.map((type) => `.${type}`).join(\",\");\r\n};\r\n\r\n/**\r\n * Сброс дефолтных действий браузера при работе с DnD\r\n * @param e - разрешенные форматы\r\n * */\r\nconst disableEvent = (e: Event): void => {\r\n  e.preventDefault();\r\n  e.stopPropagation();\r\n};\r\n\r\n/**\r\n * Возвращает конвертацию байтов в мегабайты\r\n * @param size - размер файла в байтох\r\n * @returns\r\n * */\r\nconst getFileSizeInMb = (size: number = 0): number => size / Math.pow(ONE_KB, 2);\r\n\r\n/**\r\n * Возвращает результат проверки файлов на соответствие критериям\r\n * @returns {Boolean}\r\n * */\r\nconst getIfFilesValid = (\r\n  files: (Required<IFilesUploaderItem> | File)[] = [],\r\n  maxSize: number = Infinity,\r\n  fileTypes: string[] = [],\r\n  maxSizeType: TMaxSizeTypes = \"all\"\r\n): boolean => {\r\n  if (!files.length) {\r\n    return true;\r\n  }\r\n\r\n  const isTypeValid = files.every((file) => fileTypes.includes(getFileExtension(file?.name)));\r\n\r\n  if (!isTypeValid) {\r\n    return false;\r\n  }\r\n\r\n  switch (maxSizeType) {\r\n    case \"every\":\r\n      return files.every((file) => maxSize === 0 || getFileSizeInMb(file.size) <= maxSize);\r\n    case \"all\":\r\n    default:\r\n      return isFilesSizeValid(files, maxSize);\r\n  }\r\n};\r\n\r\n/**\r\n * Возвращает конвертацию массива файлов в коллекцию Map, где ключ - имя файла, а значение - сам файл\r\n * @param files - массив файлов\r\n * @returns\r\n * */\r\nconst getConvertedFilesArrayToMap = (files: IFilesUploaderItem[] = []): Map<string, Required<IFilesUploaderItem> | File> => {\r\n  return new Map(getFilesWithPropsArr(files).map((file) => [ file.name, file ]));\r\n};\r\n\r\n/**\r\n * Возвращает результат проверки файлов на максимальный размер в инпуте\r\n * @param files - массив файлов\r\n * @param maxSize - максимальное разрешение одного файла\r\n * @returns\r\n * */\r\nconst isFilesSizeValid = (files: (Required<IFilesUploaderItem> | File)[] = [], maxSize: number = Infinity): boolean => {\r\n  if (!files.length) {\r\n    return true;\r\n  }\r\n\r\n  let sizeFiles = 0;\r\n\r\n  files.forEach((file) => {\r\n    sizeFiles += file.size;\r\n  });\r\n\r\n  return maxSize === 0 || getFileSizeInMb(sizeFiles) <= maxSize;\r\n};\r\n\r\n/**\r\n * Присваивание загруженных файлов инпуту\r\n * @param files - массив файлов\r\n * @param input - инпут\r\n * @returns\r\n * */\r\nconst setEachFileIntoInput = async (files: Array<IFilesUploaderItem | File>, input: HTMLInputElement | null) => {\r\n\r\n  if (!input) {\r\n    return Promise.reject();\r\n  }\r\n\r\n  const dt = new DataTransfer();\r\n  const filesArr = Array.from(files);\r\n\r\n  return await Promise.allSettled(filesArr.map(async (file) => {\r\n    if (file instanceof File) {\r\n      dt.items.add(file);\r\n      return Promise.resolve();\r\n    } else {\r\n      return Promise.reject({ fileName: file.name, size: file.size });\r\n    }\r\n  }))\r\n    .then((res = []) => {\r\n      // Only assign to input.files in non-test environments\r\n      if (process.env.NODE_ENV !== \"test\") {\r\n        input.files = dt.files;\r\n      }\r\n\r\n      const unresolvedFiles = res\r\n        .filter((result): result is PromiseRejectedResult => result.status === \"rejected\" && !!result.reason)\r\n        .map(({ reason = {} }) => ({ fileName: reason.fileName, size: reason.size })).flat();\r\n\r\n      return { unresolvedFiles };\r\n    });\r\n};\r\n\r\nexport {\r\n  disableEvent,\r\n  getConvertedFilesArrayToMap,\r\n  getConvertedFileTypes,\r\n  getFileExtension,\r\n  getFileSizeInMb,\r\n  getFilesWithPropsArr,\r\n  getIfFilesValid,\r\n  getShortFileType,\r\n  isFilesSizeValid,\r\n  setEachFileIntoInput,\r\n};\r\n"],"names":["ONE_KB","getFileExtension","name","substring","lastIndexOf","length","toLowerCase","getFilesWithPropsArr","data","getProps","size","href","Array","isArray","map","item","File","getConvertedFileTypes","fileTypes","type","join","disableEvent","e","preventDefault","stopPropagation","getFileSizeInMb","Math","pow","getIfFilesValid","files","maxSize","Infinity","maxSizeType","isTypeValid","every","file","includes","isFilesSizeValid","getConvertedFilesArrayToMap","Map","sizeFiles","forEach","setEachFileIntoInput","async","input","Promise","reject","dt","DataTransfer","filesArr","from","allSettled","items","add","resolve","fileName","then","res","process","env","NODE_ENV","unresolvedFiles","filter","result","status","reason","flat"],"mappings":"AAEA,MAAMA,OAAS;;;;;GAOf,MAAMC,iBAAoBC,OAChBA,KAAKC,UAAUD,KAAKE,YAAY,KAAO,EAAGF,KAAKG,SAAWH,MAAMI;;;;GAgB1E,MAAMC,qBAAwBC,OAC5B,MAAMC,SAAW,EACfP,UAAO,GAAIQ,UAAO,EAAGC,UAAO,KAAMH,UAAO,SAElC,CACLN,YAAaA,OAAS,SAAWA,KAAO,GACxCQ,YAAaA,OAAS,SAAWA,KAAO,EACxCC,UACAH,YAIJ,OAAQ,MACN,KAAKI,MAAMC,QAAQL,MACjB,OAAOA,KAAKM,IAAKC,MAASA,gBAAgBC,KAAOD,KAAON,SAASM,OACnE,MAAOP,aAAeA,OAAS,SAC7B,MAAO,CAAEC,SAASD,OACpB,QACE,MAAO;;;;;KASb,MAAMS,sBAAyBC,YACrBA,UAAUb,OACd,IACAa,UAAUJ,IAAKK,MAAS,IAAIA,QAAQC,KAAK;;;;KAO/C,MAAMC,aAAgBC,IACpBA,EAAEC,iBACFD,EAAEE;;;;;KAQJ,MAAMC,gBAAkB,CAACf,KAAe,IAAcA,KAAOgB,KAAKC,IAAI3B,OAAQ;;;;KAM9E,MAAM4B,gBAAkB,CACtBC,MAAiD,GACjDC,QAAkBC,SAClBb,UAAsB,GACtBc,YAA6B,SAE7B,IAAKH,MAAMxB,OACT,OAAO,KAGT,MAAM4B,YAAcJ,MAAMK,MAAOC,MAASjB,UAAUkB,SAASnC,iBAAiBkC,MAAMjC,QAEpF,IAAK+B,YACH,OAAO,MAGT,OAAQD,aACN,IAAK,QACH,OAAOH,MAAMK,MAAOC,MAASL,UAAY,GAAKL,gBAAgBU,KAAKzB,OAASoB,SAC9E,IAAK,MACL,QACE,OAAOO,iBAAiBR,MAAOC;;;;;KASrC,MAAMQ,4BAA8B,CAACT,MAA8B,KAC1D,IAAIU,IAAIhC,qBAAqBsB,OAAOf,IAAKqB,MAAS,CAAEA,KAAKjC,KAAMiC;;;;;;KASxE,MAAME,iBAAmB,CAACR,MAAiD,GAAIC,QAAkBC,YAC/F,IAAKF,MAAMxB,OACT,OAAO,KAGT,IAAImC,UAAY,EAEhBX,MAAMY,QAASN,OACbK,WAAaL,KAAKzB,OAGpB,OAAOoB,UAAY,GAAKL,gBAAgBe,YAAcV;;;;;;KASxD,MAAMY,qBAAuBC,MAAOd,MAAyCe,SAE3E,IAAKA,MACH,OAAOC,QAAQC,SAGjB,MAAMC,GAAK,IAAIC,aACf,MAAMC,SAAWrC,MAAMsC,KAAKrB,OAE5B,aAAagB,QAAQM,WAAWF,SAASnC,IAAI6B,aAC3C,GAAIR,gBAAgBnB,KAAM,CACxB+B,GAAGK,MAAMC,IAAIlB,MACb,OAAOU,QAAQS,SACjB,MACE,OAAOT,QAAQC,OAAO,CAAES,SAAUpB,KAAKjC,KAAMQ,KAAMyB,KAAKzB,UAGzD8C,KAAK,CAACC,IAAM;;AAEX,GAAIC,QAAQC,IAAIC,WAAa,OAC3BhB,MAAMf,MAAQkB,GAAGlB,MAGnB,MAAMgC,gBAAkBJ,IACrBK,OAAQC,QAA4CA,OAAOC,SAAW,cAAgBD,OAAOE,QAC7FnD,IAAI,EAAGmD,cAAS,CAAA,MAAI,CAAQV,SAAUU,OAAOV,SAAU7C,KAAMuD,OAAOvD,QAASwD,OAEhF,MAAO,CAAEL"}