parryというバリデーションモジュールを作った
2015年3月8日
Node.js と browserify 経由でブラウザ使用ができる、Isomophic なバリデーションモジュールを作成しました。
Usage
こんな風に使います。
Field をクラスっぽく定義して、
それを結合して Form をクラスっぽく定義して、
そして (new Form()).validate(inputs, callback) という感じです
Field.type で指定できる組み込みバリデーションは、validator.js のものです。
var Field = require('parry').Field;
var Form = require('parry').Form;
var UsernameField = Field.extend()
.type('matches', /[-_a-z0-9]/i)
.type('isLength', [4, 16])
;
var PasswordField = Field.extend()
.type('isAlphanumeric')
.type('isLength', [8, 16])
;
var GenderField = Field.extend({ passIfEmpty: true })
.type('isIn', ['male', 'female'])
;
var UserForm = Form.extend()
.field('username', UsernameField)
.field('password', PasswordField)
.field('gender', GenderField)
;
// Validate inputs
var inputs = {
username: 'my-username@',
password: 'abcd123',
gender: 'man'
};
var userForm = new UserForm(inputs);
userForm.validate(function(err, validationResult) {
console.log(validationResult);
// -> {
// isValid: false,
// errors: {
// username: [ 'Not matched' ],
// password: [ 'String is not in range' ],
// gender: [ 'Unexpected value' ]
// },
// reporter: { ErrorReporter instance }
// }
});
趣旨と特徴
同じ値に対するバリデーションルールが散在する問題に対応したかった、というのが元々の趣旨です。
– browserify を使えばブラウザでも使え、サーバーとクライアントで同じバリデーションが実行できます。
– 非同期処理に対応しています。というより callback or promise による非同期制御しかありません。
– 定義した Field の再利用が可能です。
– Form も Fieldも継承して修正することができます。
– 組み込みの型がない場合は、自分で定義できます。
本当の趣旨とポエム
実装者のバリデーションがずさんで、DBが壊れて、特定の責任感ある人が調査・復旧に消耗する、というパターンを最近色々な職場でみてしまい、その際のイラッとしたパワーで作成しました。
これで評価を受けるのが実装者だったりすると第三者ながら心が荒むんですが、幸いにもあからさまなそういうケースはまだ見たことが無いです。
なお、実際の案件で使ってないので、ドックフーディングはほぼしていません。