UNPKG

@uploadx/core

Version:
93 lines (92 loc) 3.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FileName = exports.Metadata = exports.File = void 0; exports.isExpired = isExpired; exports.extractOriginalName = extractOriginalName; exports.extractMimeType = extractMimeType; exports.hasContent = hasContent; exports.partMatch = partMatch; exports.updateSize = updateSize; exports.isMetadata = isMetadata; exports.updateMetadata = updateMetadata; exports.getFileStatus = getFileStatus; const utils_1 = require("../utils"); const path_1 = require("path"); function isExpired(file) { if (!file.expiredAt) return false; return Date.now() > +new Date(file.expiredAt); } function extractOriginalName(meta) { return meta.name || meta.title || meta.originalName || meta.filename; } function extractMimeType(meta) { return meta.mimeType || meta.contentType || meta.type || meta.filetype; } const generateFileId = (file) => { const { originalName, size, userId, metadata } = file; const mtime = String(metadata.lastModified || Date.now()); return [userId, originalName, size, mtime].filter(Boolean).map(String).map(utils_1.hash).join('-'); }; class File { constructor({ metadata = {}, originalName, contentType, size, userId }) { this.bytesWritten = NaN; this.name = ''; this.metadata = metadata; this.originalName = originalName || extractOriginalName(metadata) || (this.id = (0, utils_1.uid)()); this.contentType = contentType || extractMimeType(metadata) || 'application/octet-stream'; this.size = Number(size || metadata.size); this.userId = userId; this.id || (this.id = generateFileId(this)); } } exports.File = File; function hasContent(part) { return typeof part.start === 'number' && part.start >= 0 && !!part.body; } function partMatch(part, file) { if (part.size && part.size > file.size) return false; return (part.start || 0) + (part.contentLength || 0) <= file.size; } function updateSize(file, size) { if (size < file.size) file.size = size; return file; } /** User-provided metadata */ class Metadata { } exports.Metadata = Metadata; function isMetadata(raw) { return (0, utils_1.isRecord)(raw); } function updateMetadata(file, metadata) { (0, utils_1.extendObject)(file, metadata); file.originalName = extractOriginalName(file.metadata) || file.originalName; } function getFileStatus(file) { return file.bytesWritten === file.size ? 'completed' : !file.createdAt ? 'created' : 'part'; } class FileName { static isValid(name) { if (!name || name.length < FileName.MIN_LENGTH || name.length > FileName.MAX_LENGTH || (0, path_1.isAbsolute)(name)) { return false; } else { const upperCase = name.toUpperCase(); return !(FileName.INVALID_CHARS.filter(Boolean).some(chars => upperCase.includes(chars)) || FileName.INVALID_PREFIXES.filter(Boolean).some(chars => upperCase.startsWith(chars)) || FileName.INVALID_SUFFIXES.filter(Boolean).some(chars => upperCase.endsWith(chars))); } } } exports.FileName = FileName; FileName.INVALID_CHARS = ['"', '*', ':', '<', '>', '?', '\\', '|', '../']; FileName.INVALID_PREFIXES = []; FileName.INVALID_SUFFIXES = []; FileName.MAX_LENGTH = 255; FileName.MIN_LENGTH = 3;