naive-ui
Version:
A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast
162 lines (161 loc) • 6.74 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.environmentSupportFile = exports.isImageFile = void 0;
exports.isImageFileType = isImageFileType;
exports.createImageDataUrl = createImageDataUrl;
exports.isFileSystemDirectoryEntry = isFileSystemDirectoryEntry;
exports.isFileSystemFileEntry = isFileSystemFileEntry;
exports.getFilesFromEntries = getFilesFromEntries;
exports.createSettledFileInfo = createSettledFileInfo;
exports.matchType = matchType;
const _utils_1 = require("../../_utils");
const warn_1 = require("../../_utils/naive/warn");
function isImageFileType(type) {
return type.includes('image/');
}
function getExtname(url = '') {
const temp = url.split('/');
const filename = temp[temp.length - 1];
const filenameWithoutSuffix = filename.split(/#|\?/)[0];
return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [''])[0];
}
const imageExtensionRegex = /(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg|ico)$/i;
// Do not need File object
const isImageFile = (file) => {
if (file.type) {
return isImageFileType(file.type);
}
const fileNameExtension = getExtname(file.name || '');
if (imageExtensionRegex.test(fileNameExtension)) {
return true;
}
const url = file.thumbnailUrl || file.url || '';
const urlExtension = getExtname(url);
if (/^data:image\//.test(url) || imageExtensionRegex.test(urlExtension)) {
return true;
}
return false;
};
exports.isImageFile = isImageFile;
function createImageDataUrl(file) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve) => {
if (!file.type || !isImageFileType(file.type)) {
resolve('');
return;
}
resolve(window.URL.createObjectURL(file));
});
});
}
exports.environmentSupportFile = _utils_1.isBrowser && window.FileReader && window.File;
function isFileSystemDirectoryEntry(item) {
return item.isDirectory;
}
function isFileSystemFileEntry(item) {
return item.isFile;
}
function getFilesFromEntries(entries, directory) {
return __awaiter(this, void 0, void 0, function* () {
const fileAndEntries = [];
function _getFilesFromEntries(entries) {
return __awaiter(this, void 0, void 0, function* () {
for (const entry of entries) {
if (!entry)
continue;
if (directory && isFileSystemDirectoryEntry(entry)) {
const directoryReader = entry.createReader();
let allEntries = [];
let readEntries;
try {
do {
readEntries = yield new Promise((resolve, reject) => {
directoryReader.readEntries(resolve, reject);
});
allEntries = allEntries.concat(readEntries);
} while (readEntries.length > 0);
}
catch (e) {
(0, warn_1.error)('upload', 'error happens when handling directory upload', e);
}
yield _getFilesFromEntries(allEntries);
}
else if (isFileSystemFileEntry(entry)) {
try {
const file = yield new Promise((resolve, reject) => {
entry.file(resolve, reject);
});
fileAndEntries.push({ file, entry, source: 'dnd' });
}
catch (e) {
(0, warn_1.error)('upload', 'error happens when handling file upload', e);
}
}
}
});
}
yield _getFilesFromEntries(entries);
return fileAndEntries;
});
}
function createSettledFileInfo(fileInfo) {
const { id, name, percentage, status, url, file, thumbnailUrl, type, fullPath, batchId } = fileInfo;
return {
id,
name,
percentage: percentage !== null && percentage !== void 0 ? percentage : null,
status,
url: url !== null && url !== void 0 ? url : null,
file: file !== null && file !== void 0 ? file : null,
thumbnailUrl: thumbnailUrl !== null && thumbnailUrl !== void 0 ? thumbnailUrl : null,
type: type !== null && type !== void 0 ? type : null,
fullPath: fullPath !== null && fullPath !== void 0 ? fullPath : null,
batchId: batchId !== null && batchId !== void 0 ? batchId : null
};
}
/**
* This is a rather simple version. I may fix it later to make it more accurate.
* I've looked at https://github.com/broofa/mime, however it doesn't has a esm
* version, so I can't simply use it.
*/
function matchType(name, mimeType, accept) {
name = name.toLowerCase();
mimeType = mimeType.toLocaleLowerCase();
accept = accept.toLocaleLowerCase();
const acceptAtoms = accept
.split(',')
.map(acceptAtom => acceptAtom.trim())
.filter(Boolean);
return acceptAtoms.some((acceptAtom) => {
if (acceptAtom.startsWith('.')) {
// suffix
if (name.endsWith(acceptAtom))
return true;
}
else if (acceptAtom.includes('/')) {
// mime type
const [type, subtype] = mimeType.split('/');
const [acceptType, acceptSubtype] = acceptAtom.split('/');
if (acceptType === '*' || (type && acceptType && acceptType === type)) {
if (acceptSubtype === '*'
|| (subtype && acceptSubtype && acceptSubtype === subtype)) {
return true;
}
}
}
else {
// invalid type
return true;
}
return false;
});
}
;