Skip to content

Application Boundaries

Vue

  • [必須] Vue component は <script setup lang="ts"> を使い、表示、props/emits、軽い computed、event wiring、feature composable の呼び出しに責務を絞る。
  • [必須] domain rule、主要な状態遷移、validation、server result classification、pending/retry 制御は component に置かない。
  • [必須] ユーザーに見える文言は i18n key から表示し、validation error key も UI 境界で t(key) する。
  • [条件付き] 成功後の単純な route 遷移や query 組み立ては薄い handler に残してよい。複数画面で再利用するか条件が複雑なら composable へ移す。

Composable

  • [必須] useXxx は UI から見える public contract を小さく保ち、外部境界を adapter、plugin、または注入 dependency に寄せる。
  • [必須] UI が編集する form state は writable、読むだけの state は readonly で返す。
  • [推奨] 計算可能な値は computed または pure function に寄せる。
  • [必須] submit 系処理は pending guard を持ち、request 前に古い server error を clear し、finally で pending を戻す。
  • [必須] server result を呼び出し元へ返し、UI は画面固有の表示・遷移だけを扱う。

Model and Validation

  • [必須] form、request body、route/query 由来の user input は Zod schema で shape と値制約を検証する。
  • [必須] flow control は Zod に押し込まず composable で扱う。
  • [必須] Zod message は表示文ではなく i18n key にし、form type は z.infer から導出する。
  • [推奨] form default、empty error は factory で作り、field error は Record<keyof Form, string> を基本にする。
  • [必須] Zod issue から field error への変換は shared utility を使い、composable で最初の issue や field 名を独自解釈しない。
  • [必須] API response と feature result の公開型は model file に置き、composable 内の local type に閉じない。

Result and Errors

  • [必須] success は { ok: true, data }、client failure は { ok: false, source: "client", reason }、server failure は { ok: false, source: "server", error } の repository contract に合わせる。
  • [必須] server error code は shared resolver で i18n key に変換し、raw Problem Details や HTTP status を component で解釈しない。
  • [必須] field error と server error key は別 state にする。