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つの変換関数 (toCamelCase・toSnakeCase・toPascalCase・toConstantCase・toKebabCase)に渡してConversionItem[]として返します。 - 日付変換:
convertDate(input)がparseDate()で日付部分を抽出し、 3形式(yyyyMMdd・yyyy/MM/dd・yyyy-MM-dd)のConversionItem[]として返します。
Client Component(Layer 2)はどちらの関数も同じ ConversionItem[]インターフェースで受け取るため、UIの描画ロジックを共通化できています。
3. ロジック解説
命名規則変換の要となるのが tokenize() 関数です。 入力がどの形式であっても、単語トークンの配列(すべて小文字)に正規化します。
- ACRONYM境界の分離:
/([A-Z]+)([A-Z][a-z])/gでXMLParser→XML Parserのように分割します。 - camelCase境界の分離:
/([a-z\d])([A-Z])/gでgetUserName→get User Nameのように分割します。 - 区切り文字での分割:
/[\s_\-/]+/で スペース・アンダースコア・ハイフン・スラッシュを区切りとして分割します。 - 小文字化: すべてのトークンを
toLowerCase()で正規化します。
このパイプラインにより、getUserName・get_user_name・GetUserName はすべて ['get', 'user', 'name'] に変換され、 同一の変換結果が得られます。
4. 品質管理
src/lib/tools/__tests__/text-format-converter.test.ts に Vitest による単体テストを実装しています。
- 命名規則テスト: camelCase・snake_case・PascalCase・CONSTANT_CASE・ kebab-case の各入力から全5形式への変換精度を確認。
- 日付テスト:
yyyyMMdd・yyyy/MM/dd・yyyy-MM-ddの相互変換、無効な月日(例:2026-13-01)のエラーハンドリング。 - ACRONYM処理:
parseHTML・XMLParserのような 大文字連続を含む入力の正確なトークン化を検証。