{"version":3,"file":"main.mjs","sources":["../../../../src/_common/js/upload/main.ts"],"sourcesContent":["import isFunction from 'lodash/isFunction';\nimport isNumber from 'lodash/isNumber';\n/* eslint-disable no-param-reassign */\nimport { getCurrentDate, isOverSizeLimit } from './utils';\nimport xhr from './xhr';\nimport log from '../log/log';\nimport {\n  UploadFile,\n  SizeLimitObj,\n  FileChangeParams,\n  FileChangeReturn,\n  RequestMethodResponse,\n  HandleUploadParams,\n  SuccessContext,\n  handleSuccessParams,\n  UploadTriggerUploadText,\n  ErrorContext,\n} from './types';\n\nexport interface BeforeUploadExtra {\n  /** 图片文件大小限制 */\n  sizeLimit?: number | SizeLimitObj;\n  /** 上传文件之前的钩子，参数为上传的文件，返回值决定是否上传 */\n  beforeUpload?: (file: UploadFile) => boolean | Promise<boolean>;\n}\n\nexport type BeforeUploadPromiseList = [Promise<SizeLimitObj>, undefined | Promise<boolean>]\n\nexport function handleBeforeUpload(\n  file: UploadFile, params: BeforeUploadExtra,\n): Promise<[SizeLimitObj, boolean]> {\n  const { sizeLimit, beforeUpload } = params;\n  // 文件大小校验\n  const sizePromise = new Promise<SizeLimitObj>((resolve) => {\n    let result: SizeLimitObj = null;\n    if (sizeLimit) {\n      const sizeLimitObj: SizeLimitObj = isNumber(sizeLimit)\n        ? { size: sizeLimit, unit: 'KB' }\n        : sizeLimit;\n      const limit = isOverSizeLimit(file.size, sizeLimitObj.size, sizeLimitObj.unit);\n      if (limit) {\n        result = sizeLimitObj;\n      }\n    }\n    resolve(result);\n  });\n\n  // 自定义校验\n  const promiseList: BeforeUploadPromiseList = [sizePromise, undefined];\n  if (isFunction(beforeUpload)) {\n    const r = beforeUpload(file);\n    const p = r instanceof Promise ? r : (new Promise<boolean>((resolve) => resolve(r)));\n    promiseList[1] = p;\n  }\n\n  // 同时进行文件大小校验和自定义校验函数\n  return new Promise((resolve) => {\n    Promise.all(promiseList).then((r) => {\n      resolve(r);\n    });\n  });\n}\n\nexport interface OnErrorParams extends ErrorContext {\n  formatResponse?: HandleUploadParams['formatResponse'];\n}\n\nexport function handleError(options: OnErrorParams) {\n  const { event, files, response, XMLHttpRequest, formatResponse } = options;\n  files.forEach((file) => {\n    file.status = 'fail';\n  });\n  let res = response;\n  if (isFunction(formatResponse)) {\n    res = formatResponse(response, { file: files[0], currentFiles: files });\n  }\n  return { response: res, event, files, XMLHttpRequest };\n}\n\nexport function handleSuccess(params: handleSuccessParams) {\n  const { event, files, response, XMLHttpRequest } = params;\n  if (files?.length <= 0) {\n    log.error('Upload', 'Empty File in Success Callback');\n  }\n  files.forEach((file) => {\n    file.percent = 100;\n    file.status = 'success';\n    delete file.response?.error;\n  });\n  const res = response;\n  files[0].url = res.url || files[0].url;\n  return { response: res, event, files, XMLHttpRequest };\n}\n\nexport type UploadRequestReturn = {\n  status?: 'fail' | 'success';\n  /** 上传失败的文件，需等待继续上传 */\n  failedFiles?: UploadFile[];\n  data?: SuccessContext;\n  /** 批量文件上传，一个文件一个请求的场景下，响应结果的列表 */\n  list?: UploadRequestReturn[];\n}\n\nexport function handleRequestMethodResponse(res: RequestMethodResponse) {\n  if (!res) {\n    log.error('Upload', '`requestMethodResponse` is required.');\n    return false;\n  }\n  if (!res.status) {\n    log.error('Upload', '`requestMethodResponse.status` is missing, which value only can be `success` or `fail`');\n    return false;\n  }\n  if (!['success', 'fail'].includes(res.status)) {\n    log.error('Upload', '`requestMethodResponse.status` must be `success` or `fail`, examples `{ status: \\'success\\', response: { url: \\'\\' } }`');\n    return false;\n  }\n  if (res.status === 'success' && (!res.response || (!res.response.url && !res.response.files))) {\n    log.warn('Upload', '`requestMethodResponse.response.url` or `requestMethodResponse.response.files` is required if `status` is `success`');\n  }\n  return true;\n}\n\n/**\n * 一次上传请求的返回结果\n */\nexport function uploadOneRequest(params: HandleUploadParams): Promise<UploadRequestReturn> {\n  const { action, toUploadFiles, requestMethod } = params;\n  return new Promise<UploadRequestReturn>((resolve) => {\n    if (!action && !requestMethod) {\n      log.error('Upload', 'one of action and requestMethod must be exist.');\n      resolve({});\n      return;\n    }\n    if (!toUploadFiles || !toUploadFiles.length) {\n      log.warn('Upload', 'No files need to be uploaded');\n      resolve({});\n      return;\n    }\n    toUploadFiles.forEach((file) => {\n      file.status = 'progress';\n    });\n    // 自定义上传方法\n    if (requestMethod) {\n      requestMethod(params.multiple ? toUploadFiles : toUploadFiles[0]).then((res) => {\n        if (!handleRequestMethodResponse(res)) {\n          resolve({});\n          return;\n        }\n        const { response = {} } = res;\n        if (res.status === 'fail') {\n          response.error = res.error || response.error;\n        }\n        let resultFiles: UploadFile[] = [];\n        if (res.status === 'success' && response.files) {\n          // 一个请求上传并返回多个文件\n          resultFiles = response.files.map((file: UploadFile) => {\n            const fileInfo = toUploadFiles.find((toFile) => (\n              (file.name && toFile.name === file.name) || (file.raw && toFile.raw === file.raw)\n            ));\n            return {\n              ...fileInfo,\n              ...file,\n              status: res.status,\n              response,\n            };\n          });\n        } else {\n          // 一个请求上传并返回一个文件\n          toUploadFiles.forEach((file) => {\n            file.status = res.status;\n            file.response = response;\n            file.url = response.url;\n            file.percent = res.status === 'success' ? 100 : 0;\n            // 如果上传请求返回结果没有上传日期，则使用电脑当前日期显示\n            file.uploadTime = response?.uploadTime || getCurrentDate();\n          });\n          resultFiles = toUploadFiles;\n        }\n        const result = {\n          response,\n          file: resultFiles[0],\n          files: resultFiles,\n        };\n        if (res.status === 'success') {\n          params.onResponseSuccess?.(result);\n        } else if (res.status === 'fail') {\n          params.onResponseError?.(result);\n        }\n        resolve({\n          status: res.status,\n          data: result,\n        });\n      });\n    } else {\n      const xhrReq = xhr({\n        action: params.action,\n        files: params.toUploadFiles,\n        useMockProgress: params.useMockProgress,\n        mockProgressDuration: params.mockProgressDuration,\n        onError: (p: ErrorContext) => {\n          const r = handleError({ ...p, formatResponse: params.formatResponse });\n          params.onResponseError?.(r);\n          resolve({ status: 'fail', data: r });\n        },\n        onProgress: params.onResponseProgress,\n        onSuccess: (p: SuccessContext) => {\n          const { formatResponse } = params;\n          let res = p.response;\n          if (isFunction(formatResponse)) {\n            res = formatResponse(p.response, {\n              file: p.file,\n              currentFiles: p.files,\n            });\n          }\n          if (res.error) {\n            const r = handleError({ ...p, response: res });\n            params.onResponseError?.(r);\n            resolve({ status: 'fail', data: r });\n          } else {\n            p.file.response = res;\n            p.files[0].response = res;\n            const r = handleSuccess({ ...p, response: res });\n            params.onResponseSuccess?.(r);\n            resolve({ status: 'success', data: r });\n          }\n        },\n        formatRequest: params.formatRequest,\n        data: params.data,\n        name: params.name,\n        headers: params.headers,\n        withCredentials: params.withCredentials,\n        method: params.method,\n      });\n      params.setXhrObject?.({\n        files: params.toUploadFiles,\n        xhrReq,\n      });\n    }\n  });\n}\n\nfunction updateUploadedFiles(uploadFiles: UploadFile[], resultFiles: UploadFile[]) {\n  const existFiles = uploadFiles.filter((t) => t.url);\n  const newFiles = existFiles;\n  for (let i = 0, len = resultFiles.length; i < len; i++) {\n    const file = resultFiles[i];\n    const index = uploadFiles.findIndex((item) => (\n      (item.raw && item.raw === file.raw) || (item.name && item.name === file.name)\n    ));\n    const tmpFile = index >= 0 ? { ...uploadFiles[index], ...file } : file;\n    newFiles.push(tmpFile);\n  }\n  return newFiles;\n}\n\n/**\n * 可能单个文件上传，也可能批量文件一次性上传\n * 返回上传成功或上传失败的文件列表\n */\nexport function upload(params: HandleUploadParams):\nPromise<UploadRequestReturn> {\n  const { uploadAllFilesInOneRequest, toUploadFiles, uploadedFiles, isBatchUpload } = params;\n  // 一批文件上传，部分文件失败，重新上传失败的文件\n  const thisUploadFiles = toUploadFiles.filter((t) => (\n    !t.response || (t.response && !t.response.error)\n  ));\n  return new Promise((resolve) => {\n    // 所有文件一次性上传\n    if (uploadAllFilesInOneRequest || !params.multiple) {\n      uploadOneRequest(params).then((r) => {\n        if (r.status === 'success') {\n          r.data.files = isBatchUpload || !params.multiple\n            ? r.data.files\n            : updateUploadedFiles(uploadedFiles, r.data.files);\n        }\n        const failedFiles = r.status === 'fail' ? r.data.files : [];\n        resolve({ ...r, failedFiles });\n      });\n      return;\n    }\n    // 一个文件一个文件上传\n    const list = thisUploadFiles.map((file) => (\n      uploadOneRequest({ ...params, toUploadFiles: [file] })\n    ));\n    Promise.all(list).then((arr) => {\n      const files: UploadFile[] = [];\n      const failedFiles: UploadFile[] = [];\n      arr.forEach((one) => {\n        if (one.status === 'success') {\n          files.push(one.data.files[0]);\n        } else if (one.status === 'fail') {\n          failedFiles.push(one.data.files[0]);\n        }\n      });\n      const tFiles = params.autoUpload\n        ? uploadedFiles.concat(files)\n        : uploadedFiles;\n      const newFiles = isBatchUpload || !params.multiple ? files : tFiles;\n      resolve({\n        status: files.length ? 'success' : 'fail',\n        data: {\n          files: newFiles,\n        },\n        // 上传失败的文件，需等待继续上传\n        failedFiles,\n        list: arr,\n      });\n    });\n  });\n}\n\nexport function formatToUploadFile(\n  files: File[],\n  format: FileChangeParams['format'],\n  status: UploadFile['status'] = undefined,\n  percent = 0,\n) {\n  return files.map((fileRaw: File) => {\n    let file: UploadFile = fileRaw;\n    if (isFunction(format)) {\n      file = format(fileRaw);\n    }\n    const uploadFile: UploadFile = {\n      raw: fileRaw,\n      lastModified: fileRaw.lastModified,\n      name: fileRaw.name,\n      size: fileRaw.size,\n      type: fileRaw.type,\n      percent,\n      status,\n      ...file,\n    };\n    return uploadFile;\n  });\n}\n\nexport function validateFile(\n  params: FileChangeParams\n): Promise<FileChangeReturn> {\n  const { files, uploadValue, max, allowUploadDuplicateFile } = params;\n  return new Promise((resolve) => {\n    // 是否允许相同的文件名存在\n    let tmpFiles = files.filter((file) => {\n      const sameNameFile = uploadValue.find((t) => t.name === file.name);\n      return allowUploadDuplicateFile || !sameNameFile;\n    });\n\n    let hasSameNameFile = false;\n    if (tmpFiles.length < files.length) {\n      hasSameNameFile = true;\n    }\n    if (!tmpFiles.length) {\n      const tFiles = formatToUploadFile(files, params.format, params.autoUpload ? 'progress' : 'waiting');\n      resolve({ hasSameNameFile, file: tFiles?.[0], files: tFiles, validateResult: { type: 'FILTER_FILE_SAME_NAME' } });\n      return;\n    }\n    // 上传文件数量限制\n    let lengthOverLimit = false;\n    if (max && tmpFiles.length && !params.isBatchUpload) {\n      tmpFiles = tmpFiles.slice(0, max - uploadValue.length);\n      if (tmpFiles.length !== files.length) {\n        lengthOverLimit = true;\n      }\n    }\n\n    // 格式化文件对象\n    const formattedFiles = formatToUploadFile(tmpFiles, params.format, params.autoUpload ? 'progress' : 'waiting');\n\n    // 全量文件，一波校验，整体上传 或 终止上传\n    let allFileValidatePromise;\n    if (params.beforeAllFilesUpload) {\n      const r = params.beforeAllFilesUpload?.(formattedFiles);\n      allFileValidatePromise = r instanceof Promise ? r : new Promise((resolve) => resolve(r));\n    }\n\n    // 单文件合法性校验，一个文件校验不通过其他文件可继续上传\n    const promiseList = formattedFiles.map((file: UploadFile) => new Promise((resolve) => {\n      handleBeforeUpload(\n        file,\n        { beforeUpload: params.beforeUpload, sizeLimit: params.sizeLimit },\n      ).then(([sizeResult, customResult]) => {\n        if (sizeResult) {\n          resolve({ file, validateResult: { type: 'FILE_OVER_SIZE_LIMIT', extra: sizeResult } });\n        } else if (customResult === false) {\n          resolve({ file, validateResult: { type: 'CUSTOM_BEFORE_UPLOAD' } });\n        }\n        resolve({ file });\n      });\n    }));\n    Promise.all([allFileValidatePromise].concat(promiseList)).then((results) => {\n      const [allFilesResult, ...others] = results;\n      // 如果 beforeAllFilesUpload 校验未通过\n      if (allFilesResult === false) {\n        resolve({\n          lengthOverLimit,\n          hasSameNameFile,\n          validateResult: { type: 'BEFORE_ALL_FILES_UPLOAD' },\n          files: formattedFiles,\n        });\n      } else {\n        resolve({\n          lengthOverLimit,\n          hasSameNameFile,\n          fileValidateList: others,\n          files: formattedFiles,\n        });\n      }\n    });\n  });\n}\n\nexport function getFilesAndErrors(fileValidateList: FileChangeReturn[], getError: (p: {[key: string]: any }) => string) {\n  const sizeLimitErrors: FileChangeReturn[] = [];\n  const beforeUploadErrorFiles: UploadFile[] = [];\n  const toFiles: UploadFile[] = [];\n  fileValidateList.forEach((oneFile) => {\n    if (oneFile.validateResult?.type === 'CUSTOM_BEFORE_UPLOAD') {\n      beforeUploadErrorFiles.push(oneFile.file);\n      return;\n    }\n    if (oneFile.validateResult?.type === 'FILE_OVER_SIZE_LIMIT') {\n      if (!oneFile.file.response) {\n        oneFile.file.response = {};\n      }\n      oneFile.file.response.error = oneFile.file.response.error\n      || getError(oneFile.validateResult.extra);\n      sizeLimitErrors.push(oneFile);\n      return;\n    }\n    toFiles.push(oneFile.file);\n  });\n\n  return { sizeLimitErrors, beforeUploadErrorFiles, toFiles };\n}\n\n/**\n * 获取文件上传触发元素文本 在全局配置中的字段\n */\nexport function getTriggerTextField(p: {\n  status: 'success' | 'fail' | 'progress' | 'waiting',\n  multiple: boolean,\n  autoUpload: boolean;\n  isBatchUpload: boolean;\n}): keyof UploadTriggerUploadText {\n  if (p.isBatchUpload && p.status) return 'reupload';\n  if (p.status === 'fail') return 'reupload';\n  if (p.status === 'progress') return 'uploading';\n  if (p.status === 'success' || (!p.autoUpload && p.status === 'waiting')) {\n    return p.multiple ? 'continueUpload' : 'reupload';\n  }\n  return 'fileInput';\n}\n\nexport interface GetDisplayFilesParams {\n  multiple: boolean;\n  autoUpload: boolean;\n  isBatchUpload: boolean;\n  uploadValue: UploadFile[];\n  toUploadFiles: UploadFile[];\n}\n\n/**\n * 获取文件列表显示\n */\nexport function getDisplayFiles(params: GetDisplayFilesParams) {\n  const { multiple, uploadValue, toUploadFiles, autoUpload } = params;\n  const waitingUploadFiles = autoUpload\n    ? toUploadFiles\n    : toUploadFiles.filter((file) => file.status !== 'success');\n  if (multiple && !params.isBatchUpload) {\n    if (!autoUpload) return uploadValue;\n    return (waitingUploadFiles.length ? uploadValue.concat(waitingUploadFiles) : uploadValue) || [];\n  }\n  return (waitingUploadFiles.length ? waitingUploadFiles : uploadValue) || [];\n}\n"],"names":["isNumber","size","unit","result","isFunction","promiseList","files","res","file","currentFiles","response","event","XMLHttpRequest","log","toUploadFiles","requestMethod","resultFiles","resolve","data","onError","status","onSuccess","p","xhrReq","newFiles","failedFiles","arr","list","raw","percent","hasSameNameFile","validateResult","type","tmpFiles","lengthOverLimit","sizeResult","customResult","extra","Promise","allFilesResult","fileValidateList","beforeUploadErrorFiles","oneFile","sizeLimitErrors","toFiles"],"mappings":"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"}