HB DevTools

Technical Docs

Text Format Converter の設計

命名規則と日付フォーマットの変換ロジックを解説します。入力形式を問わず正確にトークン化するアルゴリズムがポイントです。

1. 設計思想 — なぜこのツールが必要か

コードリファクタリング時、変数名の命名規則を統一するシーンは多くあります。 例えば、REST APIのレスポンスは snake_case で返ってくることが多い一方、 Reactコンポーネント内では camelCase が推奨されます。 この変換を手動で行うとミスが起きやすく、特に複数の変数を一括変換したいときには 専用ツールの価値が際立ちます。

日付フォーマット変換も同様です。データベースから取得した 20260101 形式を UIで表示する 2026/01/01 に変換するような処理は頻繁に発生します。 全パターンを一覧表示し、必要な形式をワンクリックでコピーできるUIを実現しました。

2. 技術アーキテクチャ

変換機能は convertNaming()convertDate() の2関数に分かれています。 それぞれが NamingConvertOutput / DateConvertOutput(Success | Error の Union型)を返します。

  • 命名規則変換: convertNaming(input) が入力をtokenize() でword配列に正規化し、5つの変換関数 (toCamelCasetoSnakeCasetoPascalCasetoConstantCasetoKebabCase)に渡してConversionItem[] として返します。
  • 日付変換: convertDate(input)parseDate() で日付部分を抽出し、 3形式(yyyyMMddyyyy/MM/ddyyyy-MM-dd)のConversionItem[] として返します。

Client Component(Layer 2)はどちらの関数も同じ ConversionItem[]インターフェースで受け取るため、UIの描画ロジックを共通化できています。

3. ロジック解説

命名規則変換の要となるのが tokenize() 関数です。 入力がどの形式であっても、単語トークンの配列(すべて小文字)に正規化します。

  1. ACRONYM境界の分離: /([A-Z]+)([A-Z][a-z])/gXMLParserXML Parser のように分割します。
  2. camelCase境界の分離: /([a-z\d])([A-Z])/ggetUserNameget User Name のように分割します。
  3. 区切り文字での分割: /[\s_\-/]+/ で スペース・アンダースコア・ハイフン・スラッシュを区切りとして分割します。
  4. 小文字化: すべてのトークンを toLowerCase() で正規化します。

このパイプラインにより、getUserNameget_user_nameGetUserName はすべて ['get', 'user', 'name'] に変換され、 同一の変換結果が得られます。

4. 品質管理

src/lib/tools/__tests__/text-format-converter.test.ts に Vitest による単体テストを実装しています。

  • 命名規則テスト: camelCase・snake_case・PascalCase・CONSTANT_CASE・ kebab-case の各入力から全5形式への変換精度を確認。
  • 日付テスト: yyyyMMddyyyy/MM/ddyyyy-MM-dd の相互変換、無効な月日(例: 2026-13-01)のエラーハンドリング。
  • ACRONYM処理: parseHTMLXMLParser のような 大文字連続を含む入力の正確なトークン化を検証。