/* * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ /** * Array.includes()よりSet.has()の方が高速 */ const targetExtsToSkip = new Set([ '.gz', '.tar', '.tgz', '.bz2', '.xz', '.zip', '.7z', ]); const extRegExp = /\.[0-9a-zA-Z]+$/i; /** * 与えられた拡張子とファイル名が一致しているかどうかを確認し、 * 一致していない場合は拡張子を付与して返す * * extはfile-typeのextを想定 */ export function correctFilename(filename: string, ext: string | null) { const dotExt = ext ? ext[0] === '.' ? ext : `.${ext}` : '.unknown'; const match = extRegExp.exec(filename); if (!match || !match[0]) { // filenameが拡張子を持っていない場合は拡張子をつける return `${filename}${dotExt}`; } const filenameExt = match[0].toLowerCase(); if ( // 未知のファイル形式かつ拡張子がある場合は何もしない ext === null || // 拡張子が一致している場合は何もしない filenameExt === dotExt || // jpeg, tiffを同一視 dotExt === '.jpg' && filenameExt === '.jpeg' || dotExt === '.tif' && filenameExt === '.tiff' || // dllもexeもportable executableなので判定が正しく行われない dotExt === '.exe' && filenameExt === '.dll' || // 圧縮形式っぽければ下手に拡張子を変えない // https://github.com/misskey-dev/misskey/issues/11482 targetExtsToSkip.has(dotExt) ) { return filename; } // 拡張子があるが一致していないなどの場合は拡張子を付け足す return `${filename}${dotExt}`; }