Valid
- Valid.valid - 例外を発生させます
- Valid.args - 自動的にバリデーションコードを生成し引数を評価します
- Valid.type - 型の一致を検査します
- Valid.keys - 引数で与えられた Object/Array の key の値が想定通りか検査します
- Valid.values - 引数で与えられた Object/Array の value の値が想定通りか検査します
- Valid.some - 引数で与えられた文字列が想定通りか検査します
- Valid.json - 引数で与えられたJSONの構造と型が想定通りか検査します
- Valid.stack - コールスタックの不要部分をカットした状態でダンプします
Valid(value:Boolean, api:Function, highlihgt:String = ""):void は value が false の場合に例外を発生させます
- api には関数を指定します
- highlihgt には Syntax Highlight させたいキーワードを指定します
api に指定した関数がコンソールにダンプされます
Valid(false) // -> Error("Validation Error: " + api.name + "(" + highlihgt + ") is invalid value.");
Valid.args(api:Function, args:Array|ArrayLike):void は、Help.js のフォーマットで記述された 関数のコメント部分から、関数の引数の型と戻り値の情報を読み取り、バリデーションコードを生成し args に渡された引数を自動的に評価します。
具体的には @arg ...
, @var_args ...
, @ret ...
を読み取り、全ての引数と戻り値に対してバリデーション( $valid($type(...))
相当のコード) を実行します。
function foo(arg1, // @arg Number|String
arg2) { // @arg String = ""
//{@dev
$args(foo, arguments);
//}@dev
// your code
}
上記のコードは、以下のコードと同じ結果になります。
function foo(arg1, // @arg Number|String
arg2) { // @arg String = ""
//{@dev
$valid($type(arg1, "Number|String"), foo, "arg1");
$valid($type(arg2, "String|omit"), foo, "arg2");
//}@dev
// your code
}
Valid.type(value:Any, types:String):Boolean は、value の型が types のいずれかと一致する場合に true を返します。
types には value が取りうる型名を複数指定可能です。
複数指定する場合は "Object|Function"
のように区切り文字(|
)で区切って指定します。一部の型名は大文字小文字を区別しません。
$type(123, "String"); // -> false
$type(null, "null|undefined"); // -> true
value が types のいずれかのベースクラスと型が一致するかどうかも比較できます。
$type(new TypeError(), "TypeError"); // -> true
$type(new Error(), "TypeError"); // -> false
$type(new TypeError(), "Error"); // -> true (TypeError は Error から派生しているため true になります)
ユーザ定義クラスとインスタンスも指定できます。
function MyClass() { }
var myclass = new MyClass();
$type(myclass, "MyClass"); // -> true
特別な機能をもった型名も指定可能です。
types | |
---|---|
"omit" | 引数が省略可能なことを明示します。 `"null |
"integer" | 小数点以下を持たない数値なら true になります |
"typedarray" | value が TypedArray 型(Uint8Array, Float32Array, ...)なら true になります |
Valid.keys(object:Object|Array|null|undefined, key:String):Boolean は、 Object.keys(object) が返す配列と key を比較し、key で明示されていない要素が配列に含まれている場合に false を返します。
- object が null または undefined の場合は true を返します
-
key に複数の値を指定する場合は、区切り文字(
|
)で連結し,"a|b"
のようにします
var object = { "foo": 1, "bar": 2, "buz": 3, };
var array = [ 1, 2 ]; // { 0: 1, 1: 2, length: 2 }
$keys(object, "foo|bar"); // -> false (foo or bar を想定しているが、object に想定外の buz が存在する → false)
$keys(object, "foo|bar|buz|pee"); // -> true (foo or bar or buz or pee を想定しており、 object に foo, bar, buz が含まれる → true)
$keys(array, "0|1"); // -> true (0 or 1 を想定しており、array に 0, 1 が含まれる → true)
$keys(array, "0|2"); // -> false (0 or 1 を想定しており、array に想定外の 2 が含まれる → false)
$kyes(null, ""); // -> true
$kyes(undefined, ""); // -> true
Valid.values(object:Object|Array|null|undefined, value:Array):Boolean は、 Object.values(object) が返す配列と value を比較し、value で明示されていない要素が配列に含まれている場合に false を返します。
- object が null または undefined の場合は true を返します
var object = { "foo": 1, "bar": 2, "buz": 3, };
var array = [ 1, 2 ]; // { 0: 1, 1: 2, length: 2 }
$values(object, [1,2]); // -> false (1 or 2 を想定しているが、object に想定外の 3 が存在する → false)
$values(object, [1,2,3,4]); // -> true (1 or 2 or 3 or 4 を想定しており、object に 1, 2, 3 が含まれる → true)
$values(array, [1,2]); // -> true (1 or 2 を想定しており、array に 1, 2 が含まれる → true)
$values(array, [1,3]); // -> false (1 or 3 を想定しており、array に想定外の 2 が含まれる → false)
$values(null, []); // -> true
$values(undefined, []); // -> true
Valid.some(value:String|null|undefined, candidate:String|Object, ignoreCase:Boolean = false):Boolean は、
value が candidate で指定された文字列のどれかである場合に true を返します。
candidate には、区切り文字(|
)で区切られた文字列を指定できます。
-
candidate が Object の場合は、内部で
candidate = Object.keys(candidate).join("|")
相当の前処理を行います - value が null または undefined の場合は true を返します。
- ignoreCase が true なら大文字小文字を区別せずに比較します。
$values("foo", "foo|bar" ); // -> true
$values("foo", { 1:"foo", 2:"bar" }); // -> true
$values(null, "foo|bar" ); // -> true
Valid.json(data:JSONObject, validate:JSONObject):Boolean は、data と validate を比較し、構造と型が一致する場合に true を返します。
data と同じ構造で同じ型を持つダミーの JSON Object を validate に指定します。
この関数は、階層構造と型のチェックを行いますが、値が一致しているかどうかは検査しません。
var data = {
"key1": "abc",
"key2": 123
};
var validate = {
"key1": "", // validate.key1 は String 型
"key2": 0 // validate.key2 は Number 型
};
Valid.json(data, validate); // -> true
var data = {
"key1": "abc",
"key2": [
{
"key3": [
1111111111,
false
]
}
]
};
var validate = {
"key1": "", // validate.key1 は String 型
"key2": [ // validate.key2 は Array 型
{ // validate.key2[0] は Object 型
"key3": [ // validate.key2[0].key3 は Array 型
0, // validate.key2[0].key3[0] は Number 型
true // validate.key2[0].key3[1] は Boolean 型
]
}
]
};
Valid.json(data, validate); // -> true
Valid.stack(message:String = "", depth:Integer = 3):String は、コールスタックを生成し、depth 分の行をカットした文字列を返します。
- message を先頭行に出力します。
Valid.stack("Hello callstack");
Hello callstack
at FrameMirror.evaluate (native)
at Object.evaluate (<anonymous>:354:28)
at Object.InjectedScript._evaluateOn (<anonymous>:641:39)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:580:52)
at Object.InjectedScript.evaluateOnCallFrame (<anonymous>:691:21)
at testValidType (file://localhost/Users/obara.takao/oss/my/Valid.js/test/test.js:62:16)
at _next (file://localhost/Users/obara.takao/oss/my/Valid.js/node_modules/uupaa.test.js/lib/Test.js:212:13)
at _runTest (file://localhost/Users/obara.takao/oss/my/Valid.js/node_modules/uupaa.test.js/lib/Test.js:206:5)