From 535ca9c636f34c55b3e78ca14107a45594e67c23 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Mon, 12 Aug 2024 17:36:39 +0900 Subject: [PATCH] =?UTF-8?q?errorToMessage=E9=96=A2=E6=95=B0=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=97=E3=80=81createLogger=E3=81=AE=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=97=E3=81=A6=E3=80=81?= =?UTF-8?q?eslint=E3=81=AE=E3=83=AB=E3=83=BC=E3=83=AB=E3=82=92=EF=BC=91?= =?UTF-8?q?=E3=81=A4=E6=8E=A1=E7=94=A8=20(#2212)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit errorToMessage作ってeslintの例外ルールをなくす --- .eslintrc.js | 3 --- src/backend/browser/browserConfig.ts | 2 +- src/backend/browser/fileImpl.ts | 2 +- src/backend/common/ConfigManager.ts | 2 +- src/backend/electron/main.ts | 6 ++--- .../electron/manager/RuntimeInfoManager.ts | 2 +- src/backend/electron/manager/engineManager.ts | 2 +- src/backend/electron/manager/vvppManager.ts | 9 ++++---- src/domain/frontend/log.ts | 2 +- src/helpers/ensureNotNullish.ts | 10 -------- src/helpers/errorHelper.ts | 23 +++++++++++++++++++ src/helpers/mapHelper.ts | 4 ++-- src/store/audio.ts | 5 +++- 13 files changed, 43 insertions(+), 29 deletions(-) delete mode 100644 src/helpers/ensureNotNullish.ts create mode 100644 src/helpers/errorHelper.ts diff --git a/.eslintrc.js b/.eslintrc.js index 1390ef93e3..7daee3dd03 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,9 +9,6 @@ const tsEslintOptions = { }; const tsEslintRules = { - // Template String Literalでcatchなどからのunknownを入れられなくなるので無効化 - // TODO: いずれは有効化する - "@typescript-eslint/restrict-template-expressions": "off", // Storeでよくasyncなしの関数を定義するので無効化 // TODO: いずれは有効化する "@typescript-eslint/require-await": "off", diff --git a/src/backend/browser/browserConfig.ts b/src/backend/browser/browserConfig.ts index 8925a1c56d..a24d3b1c1e 100644 --- a/src/backend/browser/browserConfig.ts +++ b/src/backend/browser/browserConfig.ts @@ -3,7 +3,7 @@ import { defaultEngine, directoryHandleStoreKey } from "./contract"; import { BaseConfigManager, Metadata } from "@/backend/common/ConfigManager"; import { ConfigType, EngineId, engineSettingSchema } from "@/type/preload"; -import { ensureNotNullish } from "@/helpers/ensureNotNullish"; +import { ensureNotNullish } from "@/helpers/errorHelper"; import { UnreachableError } from "@/type/utility"; const dbName = `${import.meta.env.VITE_APP_NAME}-web`; diff --git a/src/backend/browser/fileImpl.ts b/src/backend/browser/fileImpl.ts index e2e246c525..4d161007ad 100644 --- a/src/backend/browser/fileImpl.ts +++ b/src/backend/browser/fileImpl.ts @@ -208,7 +208,7 @@ export const showOpenFilePickerImpl = async (options: { } return handles.length > 0 ? paths : undefined; } catch (e) { - log.warn(`showOpenFilePicker error: ${e}`); + log.warn("showOpenFilePicker error:", e); return undefined; } }; diff --git a/src/backend/common/ConfigManager.ts b/src/backend/common/ConfigManager.ts index 50aef80bfd..c071b07a28 100644 --- a/src/backend/common/ConfigManager.ts +++ b/src/backend/common/ConfigManager.ts @@ -14,7 +14,7 @@ import { PresetKey, envEngineInfoSchema, } from "@/type/preload"; -import { ensureNotNullish } from "@/helpers/ensureNotNullish"; +import { ensureNotNullish } from "@/helpers/errorHelper"; const lockKey = "save"; diff --git a/src/backend/electron/main.ts b/src/backend/electron/main.ts index cb2931766e..32557a483e 100644 --- a/src/backend/electron/main.ts +++ b/src/backend/electron/main.ts @@ -164,7 +164,7 @@ if (!fs.existsSync(vvppEngineDir)) { const onEngineProcessError = (engineInfo: EngineInfo, error: Error) => { const engineId = engineInfo.uuid; - log.error(`ENGINE ${engineId} ERROR: ${error}`); + log.error(`ENGINE ${engineId} ERROR:`, error); // winが作られる前にエラーが発生した場合はwinへの通知を諦める // FIXME: winが作られた後にエンジンを起動させる @@ -213,7 +213,7 @@ async function installVvppEngine(vvppPath: string) { "インストールエラー", `${vvppPath} をインストールできませんでした。`, ); - log.error(`Failed to install ${vvppPath}, ${e}`); + log.error(`Failed to install ${vvppPath},`, e); return false; } } @@ -308,7 +308,7 @@ async function uninstallVvppEngine(engineId: EngineId) { "アンインストールエラー", `${engineName} をアンインストールできませんでした。`, ); - log.error(`Failed to uninstall ${engineId}, ${e}`); + log.error(`Failed to uninstall ${engineId},`, e); return false; } } diff --git a/src/backend/electron/manager/RuntimeInfoManager.ts b/src/backend/electron/manager/RuntimeInfoManager.ts index 77e26d6584..0dc2c0fd2e 100644 --- a/src/backend/electron/manager/RuntimeInfoManager.ts +++ b/src/backend/electron/manager/RuntimeInfoManager.ts @@ -96,7 +96,7 @@ export class RuntimeInfoManager { } catch (e) { // ディスクの空き容量がない、他ツールからのファイルロック時をトラップ。 // サードパーティ向けなのでVOICEVOX側には通知せず、エラー記録して継続 - log.error(`Failed to write file : ${e}`); + log.error("Failed to write file :", e); } }); } diff --git a/src/backend/electron/manager/engineManager.ts b/src/backend/electron/manager/engineManager.ts index 5a0696fb4c..6563074cb5 100644 --- a/src/backend/electron/manager/engineManager.ts +++ b/src/backend/electron/manager/engineManager.ts @@ -338,7 +338,7 @@ export class EngineManager { let errorNotified = false; engineProcess.on("error", (err) => { - log.error(`ENGINE ${engineId} ERROR: ${err}`); + log.error(`ENGINE ${engineId} ERROR:`, err); if (!errorNotified) { errorNotified = true; this.onEngineProcessError(engineInfo, err); diff --git a/src/backend/electron/manager/vvppManager.ts b/src/backend/electron/manager/vvppManager.ts index 30fe02236f..5e5ca9ae45 100644 --- a/src/backend/electron/manager/vvppManager.ts +++ b/src/backend/electron/manager/vvppManager.ts @@ -13,6 +13,7 @@ import { minimumEngineManifestSchema, MinimumEngineManifestType, } from "@/type/preload"; +import { errorToMessage } from "@/helpers/errorHelper"; const isNotWin = process.platform !== "win32"; @@ -320,10 +321,10 @@ export class VvppManager { log.error(e); dialog.showErrorBox( "エンジン削除エラー", - `エンジンの削除に失敗しました。エンジンのフォルダを手動で削除してください。\n${deletingEngineDir}\nエラー内容: ${e}`, + `エンジンの削除に失敗しました。エンジンのフォルダを手動で削除してください。\n${deletingEngineDir}\nエラー内容: ${errorToMessage(e)}`, ); } else { - log.error(`Failed to rename engine directory: ${e}, retrying`); + log.error("Failed to rename engine directory: ", e, ", retrying"); await new Promise((resolve) => setTimeout(resolve, 1000)); } } @@ -344,10 +345,10 @@ export class VvppManager { log.error(e); dialog.showErrorBox( "エンジン追加エラー", - `エンジンの追加に失敗しました。エンジンのフォルダを手動で移動してください。\n${from}\nエラー内容: ${e}`, + `エンジンの追加に失敗しました。エンジンのフォルダを手動で移動してください。\n${from}\nエラー内容: ${errorToMessage(e)}`, ); } else { - log.error(`Failed to rename engine directory: ${e}, retrying`); + log.error("Failed to rename engine directory: ", e, ", retrying"); await new Promise((resolve) => setTimeout(resolve, 1000)); } } diff --git a/src/domain/frontend/log.ts b/src/domain/frontend/log.ts index 3b7a224d9f..2aa6cdfbd2 100644 --- a/src/domain/frontend/log.ts +++ b/src/domain/frontend/log.ts @@ -4,7 +4,7 @@ export function createLogger(scope: string) { const createInner = (method: "logInfo" | "logError" | "logWarn") => (...args: unknown[]) => { - window.backend[method](`[${scope}] ${args[0]}`, ...args.slice(1)); + window.backend[method](`[${scope}]`, ...args); }; return { info: createInner("logInfo"), diff --git a/src/helpers/ensureNotNullish.ts b/src/helpers/ensureNotNullish.ts deleted file mode 100644 index aae3d39daf..0000000000 --- a/src/helpers/ensureNotNullish.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** 入力がnullかundefinedの場合エラーを投げ、それ以外の場合は入力をそのまま返す */ -export const ensureNotNullish = ( - value: T | null | undefined, - message = "Unexpected nullish value", -): T => { - if (value == null) { - throw new Error(message); - } - return value; -}; diff --git a/src/helpers/errorHelper.ts b/src/helpers/errorHelper.ts new file mode 100644 index 0000000000..76fc0f1f80 --- /dev/null +++ b/src/helpers/errorHelper.ts @@ -0,0 +1,23 @@ +/** 入力がnullかundefinedの場合エラーを投げ、それ以外の場合は入力をそのまま返す */ +export const ensureNotNullish = ( + value: T | null | undefined, + message = "Unexpected nullish value", +): T => { + if (value == null) { + throw new Error(message); + } + return value; +}; + +/** エラーからエラー文を作る */ +export const errorToMessage = (e: unknown): string => { + if (e instanceof Error) { + return `${e.toString()}: ${e.message}`; + } else if (typeof e === "string") { + return `String Error: ${e}`; + } else if (typeof e === "object" && e != undefined) { + return `Object Error: ${JSON.stringify(e).slice(0, 100)}`; + } else { + return `Unknown Error: ${String(e)}`; + } +}; diff --git a/src/helpers/mapHelper.ts b/src/helpers/mapHelper.ts index 418aa227cb..4f1148bf13 100644 --- a/src/helpers/mapHelper.ts +++ b/src/helpers/mapHelper.ts @@ -3,7 +3,7 @@ /** Mapから値を取得する。指定したキーが存在しない場合は例外を投げる */ export const getOrThrow = (map: Map, key: K) => { if (!map.has(key)) { - throw new Error(`Key not found: ${key}`); + throw new Error(`Key not found: ${String(key)}`); } return map.get(key) as V; }; @@ -11,7 +11,7 @@ export const getOrThrow = (map: Map, key: K) => { /** Mapから値を削除する。指定したキーが存在しない場合は例外を投げる */ export const deleteOrThrow = (map: Map, key: K) => { if (!map.has(key)) { - throw new Error(`Key not found: ${key}`); + throw new Error(`Key not found: ${String(key)}`); } map.delete(key); }; diff --git a/src/store/audio.ts b/src/store/audio.ts index f3d2c97a02..7bded00aca 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -64,6 +64,7 @@ import { generateWriteErrorMessage } from "@/helpers/fileHelper"; import { uuid4 } from "@/helpers/random"; import { cloneWithUnwrapProxy } from "@/helpers/cloneWithUnwrapProxy"; import { UnreachableError } from "@/type/utility"; +import { errorToMessage } from "@/helpers/errorHelper"; function generateAudioKey() { return AudioKey(uuid4()); @@ -2138,7 +2139,9 @@ export const audioCommandStore = transformCommandStore( if (Object.keys(errors).length > 0) { throw new Error( `話者の変更に失敗しました:\n${Object.entries(errors) - .map(([audioKey, error]) => `${audioKey}:${error}`) + .map( + ([audioKey, error]) => `${audioKey}:${errorToMessage(error)}`, + ) .join("\n")}`, ); }