JPEGの出力名を組み立てるとき、scan.final.heic の途中のドットは残します。最初の要素を取る split(".")[0] では final が消えるので、最後のドットで名前と拡張子を分けます。
ここで扱うのは File.name のようなファイル名です。MDNでは、File.name にパスは含まれないと説明されています。次の関数もパスやURLを解析せず、名前だけを受け取ります。
function jpegName(name) {
if (typeof name !== "string" || name.length === 0) {
return "image.jpg";
}
const dot = name.lastIndexOf(".");
const stem = dot > 0 ? name.slice(0, dot) : name;
return `${stem}.jpg`;
}
拡張子の区切りを dot > 0 としたため、先頭のドットは残ります。.photo の出力は .photo.jpg です。photo と photo. は photo.jpg になり、空文字や文字列でない値には image.jpg を返します。
Node.jsの assert.equal で、途中のドット、大文字の拡張子、拡張子なし、先頭のドット、末尾のドット、空文字、null、日本語名、既存の .jpg を含む9ケースを確認しました。
名前を生成しても画像の内容は変わりません。この関数はHEICをデコードせず、JPEGへのエンコードも行いません。実際にJPEGで生成した出力に使い、入力の File と出力画像を分けて管理します。
同名ファイルの扱いは保存処理で決めます。複数の入力が同じ出力名になるなら、識別子を加えるなどの衝突対策が必要です。ディレクトリやURLを扱う場合も、別の処理として用意します。