Next.js(App Router) の Server Actions を前提とした、エラーハンドリングと表示メッセージの統一ルール。
このスキルは、Network Boundary を跨ぐエラーの扱いと、ユーザー向けメッセージの一元管理を徹底するための規約です。
アプリ全体のエラーメッセージは src/domain/errors/error-messages.ts を単一の正解 (SSoT) とします。
Error.message を直接表示しない。Network Boundary を跨いだ Error は production で秘匿される。Result 形式(success / failure)に畳み込み、message は 安全に表示できる文言に限定する。ERROR_MESSAGES を経由ServerActionResult<T> を基本形とする(src/lib/async-handler.ts)。{ success: true, data?: T }(削除系などは data 省略可)。{ success: false, error: string } とし、error は ERROR_MESSAGES から生成する。needsReauth / requiresSubscription などの追加フィールドを許容する。ServerActionResult の型定義export interface ServerActionResult<T> {
success: boolean;
data?: T;
error?: string;
}
handleAsyncAction で統一する(src/lib/async-handler.ts)。onSuccess / setLoading / setMessage で UI 状態とメッセージを集中管理する。handleAsyncAction を使用する。result.error を自前で扱うパターンも可。その場合も result.error は表示専用とし、メッセージは ERROR_MESSAGES 由来に限定する。src/hooks/useGscSetup.ts と同型の最小パターン)await handleAsyncAction(fetchGscStatus, {
onSuccess: data => setStatus(data as GscConnectionStatus),
setLoading: setIsSyncingStatus,
setMessage: setAlertMessage,
defaultErrorMessage: ERROR_MESSAGES.GSC.STATUS_FETCH_FAILED,
});
ERROR_MESSAGES を唯一の参照元とする。result.error を表示するだけに留める。try/catch で捕捉し、{ success: false, error } に畳み込む。src/domain/errors/error-messages.ts に集約Error を throw せず { success: false, error } を返すresult.error を表示するだけに留めるhandleAsyncAction を使い、それ以外でも result.error 表示と ERROR_MESSAGES の利用を守るError.message を直接表示するhandleAsyncAction を使わずにエラーハンドリングを分散させるERROR_MESSAGES に追加した文言が他用途で重複しないかServerActionResult の形に沿っているかError.message を使っていないかhandleAsyncAction を使っているか。他では result.error と ERROR_MESSAGES を守っているか