Skip to content

feat(local): format virtualTree boot failure as readable stderr + exit 1#759

Merged
YusukeHirao merged 3 commits into
devfrom
feat/local-server-startup-conflict-ux
May 8, 2026
Merged

feat(local): format virtualTree boot failure as readable stderr + exit 1#759
YusukeHirao merged 3 commits into
devfrom
feat/local-server-startup-conflict-ux

Conversation

@YusukeHirao
Copy link
Copy Markdown
Member

Summary

Closes #754.

virtualTree.enabled = true で起動するときに loadResolverState が throw すると、Node のデフォルト uncaught handler が Error: プレフィックスとスタックトレースを混ぜて出すため、PathConflictError.message が持つ「どのファイルが衝突しているか」の構造化情報が読みづらかった。また、process.exit(1) の契約を保証するテストもなく、commands/server.ts から loadResolverState 呼び出しを丸ごと消してもテストが green のままだった(ゴーストコード)。

  • commands/load-resolver-state-or-exit.ts を追加し、try/catch で PathConflictError と一般 Error を整形して stderr に出してから process.exit(1)
  • commands/server.ts を新ヘルパ経由に切り替え、JSDoc も更新
  • commands/load-resolver-state-or-exit.spec.ts で 3 ケース検証:
    • 正常系: 状態を返し process.exit は呼ばれない
    • PathConflictError: 衝突ファイル名と論理パスを stderr に出す + exit 1 + スタックトレース漏れなし
    • pathKey 欠落: ファイル名を含むエラーメッセージ + exit 1

Test plan

  • npx vitest run src/commands/load-resolver-state-or-exit.spec.ts — 3 passed
  • npx vitest run src/route.spec.ts ... src/commands/load-resolver-state-or-exit.spec.ts — 既存 100 + 新規 3 すべてパス
  • yarn build --scope @burger-editor/local — typecheck + bundle 成功

Notes

  • elseError 以外もまとめて String(error) 経由で扱うことで分岐を 2 つに減らし、テスト可能な範囲だけを残した(観点 5: ゴーストコード回避)
  • 既存の commands/search.ts と同様、CLI 経路の console.errorno-console の意図的な warning(既存パターンに合わせている)

@YusukeHirao
Copy link
Copy Markdown
Member Author

QA レビュー反映:

  • 🔴 commands/server.spec.ts を追加。tsx 経由で runServerCommand を子プロセスとして実 boot し、boot 失敗時の exit code・整形済み stderr・スタックトレース不在を end-to-end で検証。loadResolverStateOrExit 呼び出しを commands/server.ts から消すと spec が落ちるよう変更されたので、issue @burger-editor/local: 起動時 loadResolverState 失敗の終了挙動にテストがない #754 のゴーストコード懸念がこれで解消。
  • 🟡 String(error) の到達不能フォールバックを除去し、else if (error instanceof Error) + 非 Error は再 throw に変更。これで wrapper 内の全分岐がテストで網羅される。

…ror branch

- New `commands/server.spec.ts` boots `runServerCommand` via tsx in a child
  process so the wrapper integration is now covered: removing the
  `loadResolverStateOrExit` call from `runServerCommand` would now fail.
- Replace `String(error)` fallback in the wrapper with an explicit
  `instanceof Error` check that re-throws on non-Error values, eliminating
  the previously untestable code path.
@YusukeHirao YusukeHirao force-pushed the feat/local-server-startup-conflict-ux branch from a835e4c to 7119d75 Compare May 8, 2026 14:41
@YusukeHirao YusukeHirao merged commit 61a738b into dev May 8, 2026
1 check passed
@YusukeHirao YusukeHirao deleted the feat/local-server-startup-conflict-ux branch May 8, 2026 14:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

@burger-editor/local: 起動時 loadResolverState 失敗の終了挙動にテストがない

1 participant