Why another JS util library?
1) 101 will be maintained to minimize overlap with vanilla JS.
- 101 utils are made to work well with vanilla JS methods.
- 101 will only duplicate vanilla JS to provide Functional Programming paradigms, or if
the method is not available in a widely supported JS version (currently ES5).
- Other libraries often duplicate a lot of ES5: forEach, map, reduce, filter, sort, and more.
2) No need for custom builds.
- With 101, import naturally, and what you use will be bundled.
- Each util method is a module that can be required
require('101/<util>')
. - Currently node/browserify is supported, I will add other module system support on request.
- Other libraries can be large, and require manually creating custom builds when optimizing for size.
Why not release each as individual modules?
I ussually agree with this philosophy; however, while in practice, adherence to the module-pattern
can become quite annoying for micro-modules (like those in 101):
- Micro-modules existance throughout a project can change very frequently, because of this one may find
themselves constantly updating their package.json (repeatedly adding and removing the same micro-modules).
- Unbundling micro-modules can lead to projects with 100's of dependencies which can be tedious to maintain.
Installation
npm install 101
Usage
and
Functional version of &&
. Works great with array.reduce
.
var and = require('101/and');
and(true, false);
and(true, true);
apply
Functional version of function.apply
.
Supports partial functionality (great with array functions).
var apply = require('101/apply');
[sum].map(apply(null, [1, 2, 3]));
function sum () { }
apply({ prop: 'val' })(function () { return this.prop; });
clone
It's clone (Only exporting this bc it is used internal to 101)
var clone = require('101/clone');
var obj = {
foo: 1,
bar: 2
};
clone(obj);
compose
Functional composition method. Works great with array.reduce
.
var compose = require('101/compose');
compose(isNaN, parseInt)('nope');
envIs
Functional version of str === process.env.NODE_ENV
.
Or's multiple environments.
var envIs = require('101/env-is');
envIs('development');
envIs('production');
envIs('staging', 'production');
envIs('development', 'production');
equals
Functional version of ===
.
Supports partial functionality (great with array functions).
var equals = require('101/equals');
equals(1, 1);
[1,2,3].some(equals(1));
equals(1, '1');
exists
Simple exists function.
var exists = require('101/exists');
exists('foo');
exists(null);
exists(undefined);
find
Just like ES6's array.find
.
Finds the first value in the list that passes the given function (predicate) and returns it.
If list is not provided find will return a partial-function which accepts a list as the first argument.
var find = require('101/find');
var hasProps = require('101/has-properties');
var arr = [{ a: 1, b: 1 }, { b: 1 }, { c: 1 }];
var item = find(arr, hasProps({ a:1 }));
findIndex
Just like ES6's array.findIndex
.
Finds the first value in the list that passes the given function (predicate) and returns it's index.
If list is not provided findIndex will return a partial-function which accepts a list as the first argument.
var findIndex = require('101/find-index');
var arr = [1, 2, 3];
var index = findIndex(arr, function (val, i, arr) {
return val === 2;
});
hasKeypaths
Determines whether the keypaths exist and have the specified values.
Supports partial functionality (great with array functions, and 101/find).
var hasKeypaths = require('101/has-keypaths');
var obj = {
foo: {
bar: {
qux: 1
}
}
};
hasKeypaths(obj, ['foo.bar.qux']);
hasKeypaths(obj, { 'foo.bar.qux': 1 });
hasKeypaths(obj, ['foo.qux']);
hasKeypaths(obj, { 'foo.bar': 2 });
hasKeypaths(obj, { 'foo.bar': 1, 'nope': 1 });
var barObj = { bar: 1 };
hasKeypaths(obj, { 'foo.bar': barObj });
hasKeypaths(obj, { 'foo.bar': barObj }, true);
hasKeypaths(obj, { 'foo.bar': barObj }, false);
hasKeypaths(obj, { 'foo.bar': obj.foo }, false);
hasKeypaths(obj, ['foo.bar'], false);
var arr = [obj, { b: 1 }, { c: 1 }];
find(arr, hasProps({ 'foo.bar.qux':1 }));
find(arr, hasProps(['foo.bar.qux']));
hasProperties
Determines whether the keys exist and, if specified, has the values.
Supports partial functionality (great with array functions, and 101/find).
var hasProps = require('101/has-properties');
var obj = {
foo: {
bar: 1
},
qux: 1
};
hasProps(obj, ['foo', 'qux']);
hasProps(obj, { qux: 1 })
var barObj = { bar: 1 };
hasProps(obj, { 'foo.bar': barObj });
hasProps(obj, { 'foo.bar': barObj }, true);
hasProps(obj, { 'foo.bar': barObj }, false);
hasProps(obj, ['foo.bar'], false);
var arr = [{ a: 1, b: 1 }, { b: 1 }, { c: 1 }];
find(arr, hasProps({ a:1 }));
find(arr, hasProps(['a']));
assign (aka extend)
Just like ES6's Object.assign
. Extend an object with any number of objects (returns original).
var assign = require('101/assign');
var target = { foo: 1 };
var source1 = { bar: 1 };
var source2 = { baz: 1 };
assign(target, source1)
assign(target, source1, source2)
instanceOf
Functional version of JavaScript's instanceof.
Supports partial functionality (great with array functions).
var instanceOf = require('101/instance-of');
['foo', 'bar', 1].map(instanceOf('string'));
isBoolean
Functional version of typeof val === 'boolean'
.
Supports partial functionality (great with array functions).
var isBoolean = require('101/is-boolean');
[true, false, 1].map(isBoolean);
isEmpty
Functional version of val empty object, array or object
var isEmpty = require('101/is-empty');
isEmpty([]);
isEmpty({});
isEmpty("");
isEmpty(" ");
isFunction
Functional version of typeof val === 'function'
var isFunction = require('101/is-function');
[parseInt, function () {}, 'foo'].map(isFunction);
isNumber
Functional version of val typeof 'number'
var isNumber = require('101/is-number');
['foo', 'bar', 1].map(isString);
isObject
Functional strict version of val typeof 'object' (and not array or regexp)
var isObject = require('101/is-object');
[{}, { foo: 1 }, 100].map(isObject);
isString
Functional version of val typeof 'string'
var isString = require('101/is-string');
['foo', 'bar', 1].map(isString);
last
Returns the last value of a list
var last = require('101/last');
last([1, 2, 3]);
last('hello');
noop
No-op function
require('101/noop');
not
Functional version of !
.
var not = require('101/not');
not(isString)('hey');
not(isString)(100);
omit
Returns a new object without the specified keys.
Supports partial functionality (great with array functions, like map).
var omit = require('101/omit');
var obj = {
foo: 1,
bar: 2
};
omit(obj, 'foo');
omit(obj, ['foo']);
omit(obj, ['foo', 'bar']);
[obj, obj, obj].map(omit('foo'));
or
Functional version of ||
.
Works great with array.reduce
.
var or = require('101/or');
or(true, true);
or(true, false);
or(false, false);
passAll
Muxes arguments across many functions and &&
's the results.
Supports partial functionality (great with array functions, like map).
var passAll = require('101/pass-all');
['', 'foo', 'bar', 100].map(passAll(isString, isTruthy));
passAny
Muxes arguments across many functions and ||
's the results.
Supports partial functionality (great with array functions, like map).
var passAny = require('101/pass-any');
['', 'foo', 'bar', 100].map(passAny(isString, isNumber));
pick
Returns a new object with the specified keys (with key values from obj).
Supports partial functionality (great with array functions, like map).
var pick = require('101/pick');
var obj = {
foo: 1,
bar: 2
};
pick(obj, 'foo');
pick(obj, ['foo']);
pick(obj, ['foo', 'bar']);
[obj, obj, obj].map(pick('foo'));
pluck
Functional version of obj[key], returns the value of the key from obj.
Supports partial functionality (great with array functions, like map).
var pluck = require('101/pluck');
var obj = {
foo: 1,
bar: 2
};
pluck(obj, 'foo');
[obj, obj, obj].map(pluck('foo'));
var obj = {
foo: {
bar: 1
},
'foo.bar': 2
};
pluck(obj, 'foo.bar');
pluck(obj, 'foo.bar', false);
set
Functional version of obj[key] = val, returns a new obj with the key and value set.
Supports partial functionality (great with array functions, like map).
var set = require('101/set');
var obj = {
foo: 1,
bar: 2
};
set(obj, 'foo');
[obj, obj, obj].map(set('foo', 100));
var obj = {
foo: 1,
bar: 2
};
set(obj, 'foo', 100);
License
MIT