Open1

Valibotのactionを条件分岐させるternary, strain関数Proposal

じょうげんじょうげん

現状、Valibotで条件に応じた検証をしたい場合、v.customv.checkで任意の条件に応じた検証schema、actionを実装することができますが、これらは単一のメッセージしか返却することができません。

また、Valibotにはv.urlv.emailなどの自分で正規表現を実装するのが面倒な検証アクションが用意されています。
これらをカスタムの検証アクション内で再利用することはできません。

actionを条件分岐させ、それぞれに異なるメッセージを返却させるために以下のAPIが提案されています。
https://github.com/fabian-hiller/valibot/issues/1009

const TernarySchema = v.pipe(
  v.string(),
  v.ternary(
    v.url(),
    [
      v.startsWith('http', 'Only http based URLs are accepted'),
      v.check(hasPort, 'URL should explicitly provide port to be used'),
    ],
    [
      v.check(isPathLike, 'Should be path or URL'),
      v.check(isAbsolutePath, 'Only absolute path is allowed'),
    ]
  )
);

const StrainSchema = v.pipe(
 v.string(),
 v.strain(
   [v.email(), [v.endsWith('@org.com'), v.check(isEmailAvailable)]],
   [v.check(isPhoneNumber), [v.check(isPhoneAvailable)]],
   'Fallback error message'
 )
);

これらは言語構文のifに似ています。
strainは、複数のternaryを組み合わせたくなった時に使う関数であり、ネストして可読性が悪化することを防ぎます。
早期リターンするイメージですね。

これらが提供されれば、検証結果に応じて異なる検証を実装することができるようになり、バリデーションメッセージを条件の応じて出し分ける実装が簡単になります。