Gathering detailed insights and metrics for check-more-types
Gathering detailed insights and metrics for check-more-types
Gathering detailed insights and metrics for check-more-types
Gathering detailed insights and metrics for check-more-types
Lots and lots of predicates and checks for JavaScript (Node/Browser)
npm install check-more-types
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
65 Stars
235 Commits
10 Forks
31 Watching
2 Branches
3 Contributors
Updated on 31 Mar 2023
Minified
Minified + Gzipped
JavaScript (100%)
Cumulative downloads
Total Downloads
Last day
-6.2%
992,125
Compared to previous day
Last week
2.9%
5,559,575
Compared to previous week
Last month
4.6%
23,469,459
Compared to previous month
Last year
4.8%
266,351,026
Compared to previous year
35
Large collection of predicates, inspired by check-types.js
See Readable conditions for advice and examples.
node: npm install check-more-types --save
var check = require('check-more-types');
console.assert(check.bit(1), 'check.bit works');
browser bower install check-more-types --save
<script src="check-more-types.js"></script>
check.ext
)secure
)url
)check.positive
)check.negative
)strings
)check.number
is part of the check-types
library, but as a note, it does not pass
null
, undefined
or NaN
values
1check.number(null); // false 2check.not.number(undefined); // true 3check.number(NaN); // false
Really simple regex email check. Should not be relied to be robust.
1check.email('me@foo.bar') // true 2check.email('me.foo.bar') // false
check.ext
)Confirms that given file name has expected extension
1check.extension('txt', 'foo/bar.txt') // true
It is curried, so you can create convenient methods
1const isJs = check.extension('js') 2isJs('script.js') // true
There are a couple of convenient shortcuts, like check.isJs
, check.isJson
, check.isJpg
Check if a number odd or even
1check.odd(2) // false 2check.odd(3) // true 3check.even(2) // true
Returns true if passed argument is positive number less or equal to largest allowed port number 65535
Returns true if passed argument is number between 0 and 1024
Returns true if passed argument is a port number and larger than 1024
Returns true if given argument is an instance of type Error
secure
)Returns true if the provided url starts with https://
. Alias secure
.
Returns true if the provided url starts with http://
url
)Returns true if the given string is http or https url.
Returns true if given array contains an item, or given string contains substring.
1check.contains(['foo', 42], 'foo'); // true 2check.contains('apple', 'pp'); // true
check.defined(0); // true
check.defined(1); // true
check.defined(true); // true
check.defined(false); // true
check.defined(null); // true
check.defined(''); // true
check.defined(); // false
check.defined(root.doesNotExist); // false
check.defined({}.doesNotExist); // false
check.semver('1.0.2'); // true
check.semver('1.0.2-alpha'); // false
check.positive
)1check.positive(100); // true 2check.not.positive(-1); // true
check.negative
)1check.negative(-10); // true 2check.not.negativeNumber(1); // true
check.type('string', 'foo'); // true
check.type('number', 42); // true
check.type
is curried.
check.bit(0); // true
check.bit(1); // true
check.bit('1'); // false
check.bit(2); // false
check.bit(true); // false
Returns true for primitive JavaScript types
check.primitive(42); // true
check.primitive(true); // true
check.primitive('foo'); // true
check.primitive([]); // false
Also returns true for Symbol
ES6 syntax.
check.zero(0); // true
check.zero(); // false
check.zero(null); // false
check.git('url string');
var colors = ['red', 'green', 'blue'];
var color = 'green';
check.oneOf(colors, color); // true
check.oneOf(colors, 'brown'); // false
Function is curried
var foo = {}
var bar = {}
check.same(foo, foo); // true
check.same(foo, bar); // false
// primitives are compared by value
check.same(0, 0); // true
check.same('foo', 'foo'); // true
check.same
should produce same result as ===
.
Confirms length of a string or an Array. The function is curried and can guess the argument order
1check.length([1, 2], 2); // true 2check.length('foo', 3); // true 3// argument order 4check.length(3, 'foo'); // true 5// curried call 6check.length('foo')(3); // true 7check.length(3)('foo'); // true
check.sameLength([1, 2], ['a', 'b']); // true
check.sameLength('ab', 'cd'); // true
// different types
check.sameLength([1, 2], 'ab'); // false
var foo = {}
var bar = {}
check.allSame([foo, foo, foo]); // true
check.allSame([foo, foo, bar]); // false
// primitives are compared by value
check.allSame([0, 0]); // true
check.allSame(['foo', 'foo', 'foo']); // true
check.allSame([false, 0]); // false
check.unit(0); // true
check.unit(1); // true
check.unit(0.1); // true
check.unit(1.2); // false
check.unit(-0.1); // false
check.hexRgb('#FF00FF'); // true
check.hexRgb('#000'); // true
check.hexRgb('#aaffed'); // true
check.hexRgb('#00aaffed'); // false
check.hexRgb('aaffed'); // false
check.bool(true); // true
check.bool(false); // true
check.bool(0); // false
check.bool(1); // false
check.bool('1'); // false
check.bool(2); // false
check.emptyString(''); // true
check.emptyString(' '); // false
check.emptyString(0); // false
check.emptyString([]); // false
check.empty([]); // true
check.empty(''); // true
check.empty({}); // true
check.empty(0); // false
check.empty(['foo']); // false
check.unempty([]); // false
check.unempty(''); // false
check.unempty({}); // false
check.unempty(0); // true
check.unempty(['foo']); // true
check.unempty('foo'); // true
check.unemptyArray(null); // false
check.unemptyArray(1); // false
check.unemptyArray({}); // false
check.unemptyArray([]); // false
check.unemptyArray(root.doesNotExist); // false
check.unemptyArray([1]); // true
check.unemptyArray(['foo', 'bar']); // true
strings
)// second argument is checkLowerCase
check.arrayOfStrings(['foo', 'Foo']); // true
check.arrayOfStrings(['foo', 'Foo'], true); // false
check.arrayOfStrings(['foo', 'bar'], true); // true
check.arrayOfStrings(['FOO', 'BAR'], true); // false
Returns true if all items in an array are numbers
1check.arrayOf(check.unemptyString, ['foo', '']); // false 2check.arrayOf(check.unemptyString, ['foo', 'bar']); // true 3// can be partially applied and combined with check.schema 4var person = { 5 first: check.unemptyString, 6 last: check.unemptyString 7}; 8var isPerson = check.schema.bind(null, person); 9var arePeople = check.arrayOf.bind(null, isPerson); 10var people = [{ first: 'foo', last: 'bar'}]; 11arePeople(people); // true
Why would you need check.arrayOf(predicate, x)
and not simply use x.every(predicate)
?
Because x
might not be an Array.
Finds items that do not pass predicate
1check.badItems(check.unemptyString, ['foo', '', 'bar']); // ['']
// second argument is checkLowerCase
check.arrayOfArraysOfStrings([['foo'], ['bar'}}); // true
check.arrayOfArraysOfStrings([['foo'], ['bar'}}, true); // true
check.arrayOfArraysOfStrings([['foo'], ['BAR'}}, true); // false
check.lowerCase('foo bar'); // true
check.lowerCase('*foo ^bar'); // true
check.lowerCase('fooBar'); // false
// non-strings return false
check.lowerCase(10); // false
var obj = {
foo: 'foo',
bar: 0
}
check.has(obj, 'foo'); // true
check.has(obj, 'bar'); // true
check.has(obj, 'baz'); // false
// non-object returns false
check.has(5, 'foo'); // false
check.has('foo', 'length'); // true
var obj = {
foo: 'foo',
bar: 'bar',
baz: 'baz'
}
var predicates = {
foo: check.unemptyString,
bar: function(value) {
return value === 'bar'
}
}
check.all(obj, predicates); // true
var obj = {
foo: 'foo',
bar: 'bar',
baz: 'baz'
}
var schema = {
foo: check.unemptyString,
bar: function(value) {
return value === 'bar'
}
}
check.schema(schema, obj); // true
check.schema(schema, {}); // false
check.spec
is equivalent to check.all
but with arguments reversed.
This makes it very convenient to create new validator functions using partial
argument application
The method is curried, thus you can easily create predicate function
1var hasName = check.schema({ name: check.unemptyString }); 2hasName({ name: 'joe' }); // true
var personSchema = {
name: check.unemptyString,
age: check.positiveNumber
}
var isValidPerson = check.schema.bind(null, personSchema)
var h1 = {
name: 'joe',
age: 10
}
var h2 = {
name: 'ann'
// missing age property
}
isValidPerson(h1); // true
isValidPerson(h2); // false
If you want you can manually bind check.schema
to first argument
var personSchema = {
name: check.unemptyString,
age: check.positiveNumber
};
var isValidPerson = check.schema.bind(null, personSchema);
var h1 = {
name: 'joe',
age: 10
};
var h2 = {
name: 'ann'
// missing age property
};
isValidPerson(h1); // true
isValidPerson(h2); // false
You can use Function.prototype.bind
or any partial application method, for example
_.partial(check.schema, personSchema);
.
Because bound schema parameter generates a valid function, you can nest checks using
schema composition. For example let us combine the reuse isValidPerson
as part of
another check
var teamSchema = {
manager: isValidPerson,
members: check.unemptyArray
}
var team = {
manager: {
name: 'jim',
age: 20
},
members: ['joe', 'ann']
}
check.schema(teamSchema, team); // true
function foo() {
throw new Error('foo')
}
function bar() {}
function isValidError(err) {
return err.message === 'foo'
}
function isInvalid(err) {
check.instance(err, Error); // true
return false
}
check.raises(foo); // true
check.raises(bar); // false
check.raises(foo, isValidError); // true
check.raises(foo, isInvalid); // false
Every predicate function is also added to check.maybe
object.
The maybe
predicate passes if the argument is null or undefined,
or the predicate returns true.
check.maybe.bool(); // true
check.maybe.bool('true'); // false
var empty
check.maybe.lowerCase(empty); // true
check.maybe.unemptyArray(); // true
check.maybe.unemptyArray([]); // false
check.maybe.unemptyArray(['foo', 'bar']); // true
Every function has a negated predicate in check.not
object
check.not.bool(4); // true
check.not.bool('true'); // true
check.not.bool(true); // false
Every predicate can also throw an exception if it fails
check.verify.arrayOfStrings(['foo', 'bar'])
check.verify.bit(1)
function nonStrings() {
check.verify.arrayOfStrings(['Foo', 1])
}
check.raises(nonStrings); // true
function nonLowerCase() {
check.verify.lowerCase('Foo')
}
check.raises(nonLowerCase); // true
You can add new predicates to check
, check.maybe
, etc. by using check.mixin(predicate)
method. If you do not pass a name, it will try using function's name.
function isBar(a) {
return a === 'bar'
}
check.mixin(isBar, 'bar')
check.bar('bar'); // true
check.bar('anything else'); // false
// supports modifiers
check.maybe.bar(); // true
check.maybe.bar('bar'); // true
check.not.bar('foo'); // true
check.not.bar('bar'); // false
Mixin will not override existing functions
function isFoo(a) {
return a === 'foo'
}
function isBar(a) {
return a === 'bar'
}
check.mixin(isFoo, 'isFoo')
check.isFoo; // isFoo
check.mixin(isBar, 'isFoo')
check.isFoo; // isFoo
Using check-more-types you can separate the inner function logic from checking input arguments. Instead of this
1function add(a, b) { 2 la(check.number(a), 'first argument should be a number', a); 3 la(check.number(a), 'second argument should be a number', b); 4 return a + b; 5}
you can use check.defend
function
function add(a, b) {
return a + b
}
var safeAdd = check.defend(add, check.number, check.number)
add('foo', 2); // 'foo2'
// calling safeAdd('foo', 2) raises an exception
check.raises(safeAdd.bind(null, 'foo', 2)); // true
function add(a, b) {
if (typeof b === 'undefined') {
return 'foo'
}
return a + b
}
add(2); // 'foo'
var safeAdd = check.defend(add, check.number, check.maybe.number)
safeAdd(2, 3); // 5
safeAdd(2); // 'foo'
You can add extra message after a predicate
function add(a, b) {
return a + b
}
var safeAdd = check.defend(add, check.number, 'a should be a number', check.string, 'b should be a string')
safeAdd(2, 'foo'); // '2foo'
function addNumbers() {
return safeAdd(2, 3)
}
function checkException(err) {
err.message; // 'Argument 2: 3 does not pass predicate: b should be a string'
return true
}
check.raises(addNumbers, checkException); // true
This works great when combined with JavaScript module pattern as in this example
var add = (function() {
// inner private function without any argument checks
function add(a, b) {
return a + b
}
// return defended function
return check.defend(add, check.number, check.number)
}())
add(2, 3); // 5
// trying to call with non-numbers raises an exception
function callAddWithNonNumbers() {
return add('foo', 'bar')
}
check.raises(callAddWithNonNumbers); // true
Sometimes we want to execute a function depending on the condition, but without throwing an
exception. For these cases, there is check.then
function isSum10(a, b) {
return a + b === 10
}
function sum(a, b) {
return a + b
}
var onlyAddTo10 = check.then(isSum10, sum)
// isSum10 returns true for these arguments
// then sum is executed
onlyAddTo10(3, 7); // 10
onlyAddTo10(1, 2); // undefined
// sum is never called because isSum10 condition is false
Great for quickly checking string or array search results
1check.found('foo'.indexOf('f')); // true 2check.found('foo bar'.indexOf('bar')); // true
Returns true if the passed value is a regular expression.
Returns true if given object has promise methods (.then
, etc)
Returns true if the given instance is a Date and is valid.
Curried shallow strict comparison
1var foo = 'foo'; 2check.equal(foo, 'foo'); // true 3var isFoo = check.equal('foo'); 4isFoo('foo'); // true 5isFoo('bar'); // false
Combines multiple predicates into single one using OR logic
1var predicate = check.or(check.bool, check.unemptyString); 2predicate(true); // true 3predicate('foo'); // true 4predicate(42); // false
It treats non-functions as boolean values
1var predicate = check.or(check.unemptyString, 42); 2// will always return true 3predicate('foo'); // true, because it is unempty string 4predicate(false); // true, because 42 is truthy
Note: if there are any exceptions inside the individual predicate functions, they are
treated as false
values.
Combines multiple predicates using AND. If the predicate is not a function, evaluates it as a boolean value.
1function isFoo(x) { return x === 'foo'; } 2check.and(check.unemptyString, isFoo); // only true for "foo"
Both check.or
and check.and
are very useful inside check.schema
to create
more powerful predicates on the fly.
1var isFirstLastNames = check.schema.bind(null, { 2 first: check.unemptyString, 3 last: check.unemptyString 4}); 5var isValidPerson = check.schema.bind(null, { 6 name: check.or(check.unemptyString, isFirstLastNames) 7}); 8isValidPerson({ name: 'foo' }); // true 9isValidPerson({ name: { 10 first: 'foo', 11 last: 'bar' 12}}); // true
Author: Kensho © 2014
Support: if you find any problems with this library, open issue on Github
This documentation was generated using grunt-xplain and grunt-readme.
The MIT License (MIT)
Copyright (c) 2014 Kensho
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
No vulnerabilities found.
Reason
no binaries found in the repo
Reason
0 existing vulnerabilities detected
Reason
license file detected
Details
Reason
Found 0/30 approved changesets -- score normalized to 0
Reason
0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Reason
no SAST tool detected
Details
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
project is not fuzzed
Details
Reason
branch protection not enabled on development/release branches
Details
Reason
security policy file not detected
Details
Score
Last Scanned on 2024-11-18
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More