UNPKG

mealcomes

Version:

MealComes 用于学习前端的组件库

1 lines 42.3 kB
{"version":3,"file":"upload-DFGEOadx.mjs","sources":["../../../../packages/components/upload/src/upload.ts","../../../../packages/components/upload/src/upload-content.ts","../../../../packages/components/upload/src/upload-dragger.ts","../../../../packages/components/upload/src/attr-accept.ts","../../../../packages/components/upload/src/utils.ts","../../../../packages/components/upload/src/upload-dragger.vue","../../../../packages/components/upload/src/ajax.ts","../../../../packages/components/upload/src/upload-content.vue","../../../../packages/components/upload/src/upload.vue","../../../../packages/components/upload/index.ts"],"sourcesContent":["import type { ExtractPropTypes, PropType } from 'vue';\nimport { UploadAjaxError } from './ajax';\nimport Upload from './upload.vue';\n\nexport const uploadListTypes = ['text', 'picture', 'picture-card'] as const;\n\n// 文件 uid 生成\nlet fileId = 1;\nexport const genFileId = () => Date.now() + fileId++;\n\n/**\n * 上传状态\n */\nexport type UploadStatus = 'ready' | 'uploading' | 'success' | 'fail';\n\n/**\n * 上传进度事件\n */\nexport type UploadProgressEvent = ProgressEvent & { percent: number };\n\n/**\n * 上传请求 option\n */\nexport interface UploadRequestOptions {\n action: string;\n method: string;\n data: Record<string, string | Blob | [Blob, string]>;\n filename: string;\n file: UploadRawFile;\n headers: Headers | Record<string, string | number | null | undefined>;\n onError: (evt: UploadAjaxError) => void;\n onProgress: (evt: UploadProgressEvent) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSuccess: (response: any) => void;\n}\n\n/**\n * 封装上传的文件\n */\nexport interface UploadFile {\n uid?: number;\n name: string;\n url?: string;\n percentage?: number;\n raw?: UploadRawFile;\n size?: number;\n status: UploadStatus;\n response?: unknown;\n}\n\nexport type UploadFiles = UploadFile[];\n\n/**\n * upload 组件基本 props\n */\nexport const uploadBaseProps = {\n /**\n * 文件列表\n */\n fileList: {\n type: Array as PropType<UploadFiles>,\n default: () => [] as const\n },\n /**\n * 上传目标地址\n */\n action: {\n type: String,\n default: ''\n },\n /**\n * 是否可以多上传\n */\n multiple: {\n type: Boolean,\n default: false\n },\n /**\n * 上传的文件字段名\n */\n name: {\n type: String,\n default: 'file'\n },\n /**\n * 可接受的文件类型\n */\n accept: {\n type: String,\n default: ''\n },\n /**\n * 请求方法\n */\n method: {\n type: String,\n default: 'post'\n },\n /**\n * 请求头\n */\n headers: {\n type: Object,\n default: () => ({})\n },\n /**\n * \t上传时附带的额外参数\n */\n data: {\n type: Object,\n default: () => ({})\n },\n /**\n * 是否自动上传文件\n */\n autoUpload: {\n type: Boolean,\n default: true\n },\n /**\n * 文件列表的类型\n */\n listType: {\n type: String,\n values: uploadListTypes,\n default: 'text'\n },\n /**\n * \t允许上传文件的最大数量\n */\n limit: {\n type: Number\n },\n /**\n * 是否启用拖拽上传\n */\n drag: {\n type: Boolean,\n default: false\n },\n /**\n * 是否支持上传文件夹\n */\n directory: {\n type: Boolean,\n default: false\n },\n /**\n * 是否禁用\n */\n disabled: {\n type: Boolean,\n default: false\n }\n} as const;\n\n/**\n * 原始文件类型\n */\nexport type UploadRawFile = File & {\n uid: number;\n // isDirectory?: boolean;\n // entry: FileSystemDirectoryEntry;\n};\n\n/**\n * upload 组件 props\n */\nexport const uploadProps = {\n ...uploadBaseProps,\n /**\n * 上传文件之前的钩子\n */\n beforeUpload: {\n type: Function as PropType<\n (file: UploadRawFile) => Promise<boolean> | boolean\n >,\n default: () => {}\n },\n /**\n * 点击文件列表中已上传的文件时的钩子\n */\n onPreview: {\n type: Function as PropType<(file: UploadFile) => void>,\n default: () => {}\n },\n /**\n * 文件状态改变钩子, 添加文件、上传成功和上传失败时都会被调用\n */\n onChange: {\n type: Function as PropType<\n (file: UploadFile, uploadFiles: UploadFiles) => void\n >,\n default: () => {}\n },\n /**\n * 删除文件之前的钩子\n */\n beforeRemove: {\n type: Function as PropType<\n (\n file: UploadFile,\n uploadFiles: UploadFiles\n ) => Promise<boolean> | boolean\n >,\n default: () => {}\n },\n /**\n * 文件上传时的钩子\n */\n onProgress: {\n type: Function as PropType<\n (\n evt: UploadProgressEvent,\n uploadFile: UploadFile,\n uploadFiles: UploadFiles\n ) => void\n >,\n default: () => {}\n },\n /**\n * 文件列表移除文件时的钩子\n */\n onRemove: {\n type: Function as PropType<\n (file: UploadFile, uploadFiles: UploadFiles) => void\n >,\n default: () => {}\n },\n /**\n * 文件上传成功时的钩子\n */\n onSuccess: {\n type: Function as PropType<\n (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response: any,\n uploadFile: UploadFile,\n uploadFiles: UploadFiles\n ) => void\n >,\n default: () => {}\n },\n /**\n * 文件上传失败时的钩子\n */\n onError: {\n type: Function as PropType<\n (\n error: Error,\n uploadFile: UploadFile,\n uploadFiles: UploadFiles\n ) => void\n >,\n default: () => {}\n },\n /**\n * 当超出限制时,执行的钩子函数\n */\n onExceed: {\n type: Function as PropType<\n (files: File[], uploadFiles: UploadFile[]) => void\n >,\n default: () => {}\n }\n} as const;\n\nexport type UploadProps = ExtractPropTypes<typeof uploadProps>;\n\n/**\n * upload 组件实例\n */\nexport type UploadInstance = InstanceType<typeof Upload> & unknown;\n","import type { ExtractPropTypes, PropType } from 'vue';\nimport { uploadBaseProps, uploadProps } from './upload';\nimport type { UploadFile, UploadProgressEvent, UploadRawFile } from './upload';\nimport UploadContent from './upload-content.vue';\n\n/**\n * upload-content 组件 props\n */\nexport const uploadContentProps = {\n ...uploadBaseProps,\n beforeUpload: uploadProps['beforeUpload'],\n onStart: {\n type: Function as PropType<(rawFile: UploadRawFile) => void>,\n default: () => {}\n },\n onProgress: {\n type: Function as PropType<\n (e: UploadProgressEvent, rawFile: UploadRawFile) => void\n >,\n default: () => {}\n },\n onRemove: {\n type: Function as PropType<(rawFile: UploadRawFile) => void>,\n default: () => {}\n },\n onSuccess: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type: Function as PropType<(res: any, rawFile: UploadRawFile) => void>,\n default: () => {}\n },\n onError: {\n type: Function as PropType<\n (err: Error, rawFile: UploadRawFile) => void\n >,\n default: () => {}\n },\n onExceed: {\n type: Function as PropType<\n (files: File[], uploadFiles: UploadFile[]) => void\n >,\n default: () => {}\n }\n} as const;\n\n/**\n * upload-content 组件 props 类型\n */\nexport type UploadContentProps = ExtractPropTypes<typeof uploadContentProps>;\n\n/**\n * upload-contents 组件实例类型\n */\nexport type UploadContentInstance = InstanceType<typeof UploadContent> &\n unknown;\n","import type { ExtractPropTypes } from 'vue';\nimport type UploadDragger from './upload-dragger.vue';\n\n/**\n * upload-dragger 组件 props\n */\nexport const uploadDraggerProps = {\n directory: {\n type: Boolean,\n default: false\n },\n accept: {\n type: String,\n default: ''\n },\n disabled: {\n type: Boolean,\n default: false\n }\n};\n\n/**\n * upload-dragger 组件 props 类型\n */\nexport type UploadDraggerProps = ExtractPropTypes<typeof uploadDraggerProps>;\n\n/**\n * upload-dragger 组件 emits\n */\nexport const uploadDraggerEmits = {\n /**\n * 拖拽上传文件事件\n */\n file: (file: File[]) => Array.isArray(file)\n};\n\n/**\n * upload-dragger 组件 emits 类型\n */\nexport type UploadDraggerEmits = typeof uploadDraggerEmits;\n\n/**\n * upload-dragger 组件实例类型\n */\nexport type UploadDraggerInstance = InstanceType<typeof UploadDragger> &\n unknown;\n","import type { UploadRawFile } from './upload';\n\nexport default (file: UploadRawFile, acceptedFiles: string | string[]) => {\n if (file && acceptedFiles) {\n const acceptedFilesArray = Array.isArray(acceptedFiles)\n ? acceptedFiles\n : acceptedFiles.split(',');\n const fileName = file.name || '';\n const mimeType = file.type || '';\n const baseMimeType = mimeType.replace(/\\/.*$/, '');\n\n return acceptedFilesArray.some(type => {\n const validType = type.trim();\n // This is something like */*,* allow all files\n if (/^\\*(\\/\\*)?$/.test(type)) {\n return true;\n }\n\n // like .jpg, .png\n if (validType.charAt(0) === '.') {\n const lowerFileName = fileName.toLowerCase();\n const lowerType = validType.toLowerCase();\n\n let affixList = [lowerType];\n if (lowerType === '.jpg' || lowerType === '.jpeg') {\n affixList = ['.jpg', '.jpeg'];\n }\n\n return affixList.some(affix => lowerFileName.endsWith(affix));\n }\n\n // This is something like a image/* mime type\n if (/\\/\\*$/.test(validType)) {\n return baseMimeType === validType.replace(/\\/.*$/, '');\n }\n\n // Full match\n if (mimeType === validType) {\n return true;\n }\n\n // Invalidate type should skip\n if (/^\\w+$/.test(validType)) {\n console.warn(\n `Upload takes an invalidate 'accept' type '${validType}'.Skip for check.`\n );\n return true;\n }\n\n return false;\n });\n }\n return true;\n};\n","export function readDirectory(\n entry: FileSystemDirectoryEntry\n): Promise<File[]> {\n if (!entry) return Promise.reject();\n const reader = entry.createReader();\n const allFiles: File[] = [];\n\n const isHiddenOrIgnored = (file: File) => {\n const ignoredNames = ['.DS_Store', '.git', 'desktop.ini'];\n return file.name.startsWith('.') || ignoredNames.includes(file.name);\n };\n\n return new Promise(resolve => {\n const readEntries = () => {\n reader.readEntries(async entries => {\n if (entries.length === 0) {\n resolve(allFiles);\n return;\n }\n for (const subEntry of entries) {\n if (subEntry.isFile) {\n await new Promise<void>(resolveFile => {\n (subEntry as FileSystemFileEntry).file(file => {\n if (!isHiddenOrIgnored(file)) {\n allFiles.push(file);\n }\n resolveFile();\n });\n });\n } else if (subEntry.isDirectory) {\n const subFiles = await readDirectory(\n subEntry as FileSystemDirectoryEntry\n );\n allFiles.push(...subFiles);\n }\n }\n\n readEntries();\n });\n };\n\n readEntries();\n });\n}\n","<template>\n <div\n :class=\"[bem.b('dragger'), bem.is('dragover', dragover)]\"\n @drop.prevent=\"onDrop\"\n @dragover.prevent=\"onDragover\"\n @dragleave.prevent=\"onDragleave\"\n >\n <slot></slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { createNamespace } from '@mealcomes/utils';\nimport { ref } from 'vue';\nimport type { UploadRawFile } from './upload';\nimport { uploadDraggerEmits, uploadDraggerProps } from './upload-dragger';\nimport attrAccept from './attr-accept';\nimport { readDirectory } from './utils';\n\ndefineOptions({\n name: 'mc-upload-dragger'\n});\nconst emits = defineEmits(uploadDraggerEmits);\nconst props = defineProps(uploadDraggerProps);\nconst bem = createNamespace('upload');\nconst dragover = ref(false);\n\nconst traverseFileTree = (entry: FileSystemDirectoryEntry): Promise<File[]> => {\n return new Promise(resolve => {\n readDirectory(entry)\n .then(files => {\n resolve(files);\n })\n .catch((e: Error) => {\n console.warn('read directory error: ', e.message);\n });\n });\n};\n\nconst onDrop = async (e: DragEvent) => {\n if (props.disabled) return;\n\n dragover.value = false;\n e.stopPropagation();\n\n const files = Array.from(e.dataTransfer!.files) as UploadRawFile[];\n const handledFiles: UploadRawFile[] = [];\n\n // 允许拖拽文件夹的时候才进行文件夹处理\n // 否则直接进行后续的 accept 过滤\n if (props.directory) {\n const items = e.dataTransfer!.items || [];\n for (let i = 0; i < files.length; i++) {\n const item = items[i];\n const entry = item?.webkitGetAsEntry?.();\n if (entry) {\n const subFiles = await traverseFileTree(\n entry as FileSystemDirectoryEntry\n );\n handledFiles.push(...(subFiles as UploadRawFile[]));\n } else {\n console.warn(\n 'API webkitGetAsEntry is unsupported in you Browser'\n );\n alert('当前浏览器不支持拖拽读取文件夹!');\n }\n }\n } else {\n handledFiles.push(...files);\n }\n\n // 对文件进行过滤(当不允许文件夹上传时文件夹会被过滤)\n const acceptedFiles = handledFiles.filter((file: File) =>\n attrAccept(file as UploadRawFile, props.accept)\n );\n\n emits('file', acceptedFiles);\n};\n\nconst onDragover = () => {\n if (!props.disabled) dragover.value = true;\n};\n\nconst onDragleave = (e: DragEvent) => {\n if (!(e.currentTarget as Element).contains(e.relatedTarget as Element)) {\n dragover.value = false;\n }\n};\n</script>\n","import type { UploadProgressEvent, UploadRequestOptions } from './upload';\n\nexport class UploadAjaxError extends Error {\n name = 'UploadAjaxError';\n status: number;\n method: string;\n url: string;\n\n constructor(message: string, status: number, method: string, url: string) {\n super(message);\n this.status = status;\n this.method = method;\n this.url = url;\n }\n}\n\nfunction getError(\n action: string,\n option: UploadRequestOptions,\n xhr: XMLHttpRequest\n) {\n let msg: string;\n if (xhr.response) {\n msg = `${xhr.response.error || xhr.response}`;\n } else if (xhr.responseText) {\n msg = `${xhr.responseText}`;\n } else {\n msg = `fail to ${option.method} ${action} ${xhr.status}`;\n }\n\n return new UploadAjaxError(msg, xhr.status, option.method, action);\n}\n\nfunction getBody(xhr: XMLHttpRequest): XMLHttpRequestResponseType {\n const text = xhr.responseText || xhr.response;\n if (!text) {\n return text;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function httpRequest(options: UploadRequestOptions) {\n if (typeof XMLHttpRequest === 'undefined')\n throw new Error('XMLHttpRequest is undefined');\n\n const xhr = new XMLHttpRequest();\n const action = options.action;\n\n if (xhr.upload) {\n xhr.upload.addEventListener('progress', e => {\n const processEvent = e as UploadProgressEvent;\n processEvent.percent = e.total > 0 ? (e.loaded / e.total) * 100 : 0;\n\n options.onProgress(processEvent);\n });\n }\n\n const formData = new FormData();\n if (options.data) {\n for (const [key, value] of Object.entries(options.data)) {\n if (Array.isArray(value) && value.length)\n formData.append(key, ...value);\n else formData.append(key, value);\n }\n }\n formData.append(options.filename, options.file, options.file.name);\n\n xhr.onerror = () => {\n options.onError(getError(action, options, xhr));\n };\n\n xhr.onload = () => {\n if (xhr.status < 200 || xhr.status >= 300) {\n return options.onError(getError(action, options, xhr));\n }\n options.onSuccess(getBody(xhr));\n };\n\n xhr.open(options.method, action, true);\n\n const headers = options.headers || {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => xhr.setRequestHeader(key, value));\n } else {\n for (const [key, value] of Object.entries(headers)) {\n xhr.setRequestHeader(key, String(value));\n }\n }\n xhr.send(formData);\n return xhr;\n}\n","<template>\n <div\n :class=\"[bem.b(), bem.is('drag', drag), bem.is('disabled', disabled)]\"\n @click=\"handleClick\"\n @keydown.self.enter.space=\"handleKeydown\"\n >\n <template v-if=\"drag\">\n <upload-dragger\n @file=\"uploadFiles\"\n :disabled=\"disabled\"\n :accept=\"accept\"\n :directory=\"directory\"\n >\n <slot />\n </upload-dragger>\n </template>\n <template v-else>\n <slot />\n </template>\n <input\n ref=\"inputRef\"\n type=\"file\"\n :class=\"bem.e('input')\"\n :name=\"name\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n v-bind=\"dirProps\"\n @change=\"handleChange\"\n />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport { createNamespace } from '@mealcomes/utils';\nimport type { UploadFile, UploadRawFile, UploadRequestOptions } from './upload';\nimport { genFileId } from './upload';\nimport { computed, ref, shallowRef } from 'vue';\nimport type { UploadContentProps } from './upload-content';\nimport { uploadContentProps } from './upload-content';\nimport UploadDragger from './upload-dragger.vue';\nimport { httpRequest } from './ajax';\nimport attrAccept from './attr-accept';\n\ndefineOptions({\n name: 'mc-upload-content',\n inheritAttrs: false\n});\nconst bem = createNamespace('upload');\nconst props = defineProps(uploadContentProps);\nconst inputRef = ref<HTMLInputElement>();\nconst requests = shallowRef<Record<string, XMLHttpRequest | Promise<unknown>>>(\n {}\n);\nconst dirProps = computed(() =>\n props.directory\n ? { directory: 'directory', webkitdirectory: 'webkitdirectory' }\n : {}\n);\n\n/**\n * 文件上传\n */\nconst uploadFiles = (files: File[]) => {\n if (files.length === 0) return;\n\n const { autoUpload, limit, fileList, multiple, onStart, onExceed } = props;\n\n if (limit && fileList.length + files.length > limit) {\n onExceed(files, fileList);\n return;\n }\n\n if (!multiple) {\n files = files.slice(0, 1);\n }\n\n for (const file of files) {\n const rawFile = file as UploadRawFile;\n rawFile.uid = genFileId();\n // 在 upload 组件中对原始文件进行封装并存入 uploadFiles 列表中\n onStart(rawFile);\n if (autoUpload) upload(rawFile);\n }\n};\n\nconst upload = async (rawFile: UploadRawFile): Promise<void> => {\n inputRef.value!.value = '';\n\n if (!props.beforeUpload) {\n return doUpload(rawFile);\n }\n\n let hookResult: Exclude<\n ReturnType<UploadContentProps['beforeUpload']>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Promise<any>\n >;\n try {\n hookResult = await props.beforeUpload(rawFile);\n } catch {\n hookResult = false;\n }\n if (hookResult === false) {\n // 取消上传的时候需要从 upload 组件的 uploadFile 列表中移除该文件信息\n props.onRemove(rawFile);\n return;\n }\n\n doUpload(rawFile);\n};\n\nconst doUpload = async (rawFile: UploadRawFile) => {\n const {\n headers,\n data,\n method,\n name: filename,\n action,\n onProgress,\n onSuccess,\n onError\n } = props;\n\n const { uid } = rawFile;\n const options: UploadRequestOptions = {\n headers: headers || {},\n file: rawFile,\n data,\n method,\n filename,\n action,\n onProgress: evt => {\n onProgress(evt, rawFile);\n },\n onSuccess: res => {\n onSuccess(res, rawFile);\n delete requests.value[uid];\n },\n onError: err => {\n onError(err, rawFile);\n delete requests.value[uid];\n }\n };\n const request = httpRequest(options);\n requests.value[uid] = request;\n if (request instanceof Promise) {\n request.then(options.onSuccess, options.onError);\n }\n};\n\nconst handleChange = (e: Event) => {\n const files = (e.target as HTMLInputElement).files;\n if (!files) return;\n // 针对上传的目录进行 accept 过滤\n const acceptedFiles = Array.from(files).filter(\n (file: File) =>\n !props.directory || attrAccept(file as UploadRawFile, props.accept)\n );\n uploadFiles(Array.from(acceptedFiles));\n};\n\nconst handleClick = () => {\n if (!props.disabled) {\n inputRef.value!.value = '';\n inputRef.value!.click();\n }\n};\n\nconst handleKeydown = () => {\n handleClick();\n};\n\n/**\n * 请求取消函数\n */\nconst abort = (file?: UploadFile) => {\n const _reqs = Object.entries(requests.value).filter(\n file ? ([uid]) => String(file.uid) === uid : () => true\n );\n _reqs.forEach(([uid, req]) => {\n if (req instanceof XMLHttpRequest) req.abort();\n delete requests.value[uid];\n });\n};\n\ndefineExpose({\n abort,\n upload\n});\n</script>\n","<template>\n <div>\n <mc-upload-content ref=\"uploadRef\" v-bind=\"uploadContentProps\">\n <slot></slot>\n </mc-upload-content>\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { UploadFile, UploadFiles, UploadRawFile } from './upload';\nimport { uploadProps } from './upload';\nimport { computed, ref, watch } from 'vue';\nimport type {\n UploadContentInstance,\n UploadContentProps\n} from './upload-content';\nimport McUploadContent from './upload-content.vue';\n\ndefineOptions({\n name: 'mc-upload'\n});\nconst props = defineProps(uploadProps);\nconst emits = defineEmits({\n 'update:file-list': (files: UploadFiles) => files instanceof Array\n});\nconst uploadRef = ref<UploadContentInstance>();\n\n/**\n * 文件列表,在 onStart 钩子中加入待上传的文件\n */\nconst uploadFiles = ref<UploadFiles>(props.fileList);\nwatch(uploadFiles, newVal => {\n emits('update:file-list', newVal);\n});\n\nconst getFile = (rawFile: UploadRawFile) => {\n return uploadFiles.value.find(file => file.uid === rawFile.uid);\n};\n\n/**\n * 终止文件上传\n */\nfunction abort(file: UploadFile) {\n uploadRef.value?.abort(file);\n}\n\n/**\n * 上传文件\n */\nfunction submit() {\n uploadFiles.value\n .filter(({ status }) => status === 'ready')\n .forEach(({ raw }) => raw && uploadRef.value?.upload(raw));\n}\n\nconst uploadContentProps = computed<UploadContentProps>(() => ({\n ...props,\n /**\n * 正式开始往后端传文件之前会将包装后的文件信息存入 uploadFiles 列表中\n */\n onStart: rawFile => {\n const uploadFile: UploadFile = {\n uid: rawFile.uid,\n name: rawFile.name,\n percentage: 0,\n raw: rawFile,\n size: rawFile.size,\n status: 'ready'\n };\n if (props.listType === 'picture-card' || props.listType === 'picture') {\n try {\n uploadFile.url = URL.createObjectURL(rawFile);\n } catch (err: unknown) {\n console.warn((err as Error).message);\n props.onError(err as Error, uploadFile, uploadFiles.value);\n }\n }\n uploadFiles.value = [...uploadFiles.value, uploadFile];\n props.onChange(uploadFile, uploadFiles.value);\n },\n onProgress: (event, rawFile) => {\n const file = getFile(rawFile);\n if (!file) return;\n\n props.onProgress(event, file, uploadFiles.value);\n file.status = 'uploading';\n file.percentage = Math.round(event.percent);\n },\n onSuccess: (res, rawFile) => {\n const file = getFile(rawFile);\n if (!file) return;\n\n file.status = 'success';\n file.response = res;\n props.onSuccess(res, file, uploadFiles.value);\n props.onChange(file, uploadFiles.value);\n },\n onError: (err, rawFile) => {\n const file = getFile(rawFile);\n if (!file) return;\n\n console.error(err);\n file.status = 'fail';\n uploadFiles.value = uploadFiles.value.filter(\n uploadFile => uploadFile.uid !== file.uid\n );\n props.onError(err, file, uploadFiles.value);\n props.onChange(file, uploadFiles.value);\n },\n onRemove: async rawFile => {\n const uploadFile = getFile(rawFile);\n if (!uploadFile) throw new Error('file to be removed not found');\n\n const doRemove = (file: UploadFile) => {\n abort(file);\n uploadFiles.value = uploadFiles.value.filter(\n uploadFile => uploadFile.uid !== file.uid\n );\n props.onRemove(file, uploadFiles.value);\n };\n\n if (props.beforeRemove) {\n const before = await props.beforeRemove(\n uploadFile,\n uploadFiles.value\n );\n if (before !== false) doRemove(uploadFile);\n } else {\n doRemove(uploadFile);\n }\n }\n}));\n\ndefineExpose({\n /** 取消上传请求 */\n abort,\n /** 上传文件列表 */\n submit\n});\n</script>\n","import { withInstall } from '@mealcomes/utils';\nimport _Upload from './src/upload.vue';\n\nexport const McUpload = withInstall(_Upload);\n\nexport default McUpload;\n\nexport type * from './src/upload';\nexport * from './src/upload';\n\ndeclare module 'vue' {\n export interface GlobalComponents {\n McUpload: typeof McUpload;\n }\n}\n"],"names":["uploadListTypes","fileId","genFileId","uploadBaseProps","uploadProps","uploadContentProps","uploadDraggerProps","uploadDraggerEmits","file","attrAccept","acceptedFiles","acceptedFilesArray","fileName","mimeType","baseMimeType","type","validType","lowerFileName","lowerType","affixList","affix","readDirectory","entry","reader","allFiles","isHiddenOrIgnored","ignoredNames","resolve","readEntries","entries","subEntry","resolveFile","subFiles","emits","__emit","props","__props","bem","createNamespace","dragover","ref","traverseFileTree","files","e","onDrop","handledFiles","items","i","item","_a","onDragover","onDragleave","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","UploadAjaxError","message","status","method","url","getError","action","option","xhr","msg","getBody","text","httpRequest","options","processEvent","formData","key","value","headers","inputRef","requests","shallowRef","dirProps","computed","uploadFiles","autoUpload","limit","fileList","multiple","onStart","onExceed","rawFile","upload","doUpload","hookResult","data","filename","onProgress","onSuccess","onError","uid","evt","res","err","request","handleChange","handleClick","handleKeydown","__expose","req","drag","disabled","_createBlock","UploadDragger","accept","directory","_createElementVNode","_mergeProps","name","_hoisted_2","uploadRef","watch","newVal","getFile","abort","submit","raw","uploadFile","event","doRemove","_createVNode","McUploadContent","McUpload","withInstall","_Upload"],"mappings":"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"}