vest-utils 0.0.2-rc → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/vest-utils.development.js +342 -0
- package/dist/cjs/vest-utils.js +7 -0
- package/dist/cjs/vest-utils.production.js +1 -0
- package/dist/es/package.json +1 -0
- package/dist/es/vest-utils.development.js +299 -0
- package/dist/es/vest-utils.production.js +1 -0
- package/dist/umd/vest-utils.development.js +348 -0
- package/dist/umd/vest-utils.production.js +1 -0
- package/package.json +4 -662
- package/src/__tests__/bindNot.test.ts +37 -0
- package/src/__tests__/bus.test.ts +81 -0
- package/src/__tests__/cache.test.ts +113 -0
- package/src/__tests__/defaultTo.test.ts +50 -0
- package/src/__tests__/deferThrow.test.ts +24 -0
- package/src/__tests__/greaterThan.test.ts +59 -0
- package/src/__tests__/invariant.test.ts +45 -0
- package/src/__tests__/isArray.test.ts +15 -0
- package/src/__tests__/isNull.test.ts +25 -0
- package/src/__tests__/isNumeric.test.ts +26 -0
- package/src/__tests__/isUndefined.test.ts +26 -0
- package/src/__tests__/lengthEquals.test.ts +56 -0
- package/src/__tests__/longerThan.test.ts +56 -0
- package/src/__tests__/mapFirst.test.ts +29 -0
- package/src/__tests__/numberEquals.test.ts +59 -0
- package/src/__tests__/optionalFunctionValue.test.ts +27 -0
- package/src/__tests__/seq.test.ts +12 -0
- package/src/asArray.ts +3 -0
- package/src/assign.ts +1 -0
- package/src/bindNot.ts +3 -0
- package/src/bus.ts +32 -0
- package/src/cache.ts +49 -0
- package/src/callEach.ts +5 -0
- package/src/defaultTo.ts +8 -0
- package/src/deferThrow.ts +5 -0
- package/src/either.ts +3 -0
- package/src/globals.d.ts +3 -0
- package/src/greaterThan.ts +8 -0
- package/src/hasOwnProperty.ts +9 -0
- package/src/invariant.ts +24 -0
- package/src/isArrayValue.ts +11 -0
- package/src/isBooleanValue.ts +3 -0
- package/src/isEmpty.ts +17 -0
- package/src/isFunction.ts +5 -0
- package/src/isNull.ts +7 -0
- package/src/isNullish.ts +9 -0
- package/src/isNumeric.ts +11 -0
- package/src/isPositive.ts +5 -0
- package/src/isPromise.ts +5 -0
- package/src/isStringValue.ts +3 -0
- package/src/isUndefined.ts +7 -0
- package/src/last.ts +7 -0
- package/src/lengthEquals.ts +11 -0
- package/src/longerThan.ts +8 -0
- package/src/mapFirst.ts +25 -0
- package/src/nestedArray.ts +69 -0
- package/src/numberEquals.ts +11 -0
- package/src/optionalFunctionValue.ts +8 -0
- package/src/seq.ts +10 -0
- package/src/utilityTypes.ts +9 -0
- package/src/vest-utils.ts +31 -0
- package/tsconfig.json +3 -1
- package/types/vest-utils.d.ts +92 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { random, datatype } from 'faker';
|
|
2
|
+
|
|
3
|
+
import { numberEquals } from 'numberEquals';
|
|
4
|
+
|
|
5
|
+
describe('Tests numberEquals rule', () => {
|
|
6
|
+
let arg0;
|
|
7
|
+
|
|
8
|
+
describe('Arguments are numbers', () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
arg0 = datatype.number();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe('When first argument is larger', () => {
|
|
14
|
+
it('Should return false', () => {
|
|
15
|
+
expect(numberEquals(arg0, arg0 - 1)).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('When first argument is smaller', () => {
|
|
20
|
+
it('Should return false', () => {
|
|
21
|
+
expect(numberEquals(arg0, arg0 + 1)).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('When values are equal', () => {
|
|
26
|
+
it('Should return true', () => {
|
|
27
|
+
expect(numberEquals(arg0, arg0)).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('Arguments are numeric strings', () => {
|
|
33
|
+
describe('When first argument is larger', () => {
|
|
34
|
+
it('Should return false', () => {
|
|
35
|
+
expect(numberEquals(`${arg0}`, `${arg0 - 1}`)).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('When first argument is smaller', () => {
|
|
40
|
+
it('Should return false', () => {
|
|
41
|
+
expect(numberEquals(`${arg0}`, `${arg0 + 1}`)).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('When values are equal', () => {
|
|
46
|
+
it('Should return true', () => {
|
|
47
|
+
expect(numberEquals(arg0, arg0)).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('Arguments are non numeric', () => {
|
|
53
|
+
[random.word(), `${datatype.number()}`.split(''), {}].forEach(element => {
|
|
54
|
+
it('Should return false', () => {
|
|
55
|
+
expect(numberEquals(element, 0)).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { optionalFunctionValue } from 'vest-utils';
|
|
2
|
+
|
|
3
|
+
describe('optionalFunctionValue', () => {
|
|
4
|
+
describe('When not a function', () => {
|
|
5
|
+
it.each([0, undefined, false, true, 1, [], {}, null, NaN])(
|
|
6
|
+
'Should return the same value',
|
|
7
|
+
value => {
|
|
8
|
+
expect(optionalFunctionValue(value)).toBe(value);
|
|
9
|
+
}
|
|
10
|
+
);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe('When value is a function', () => {
|
|
14
|
+
it('Should call the function and return its return value', () => {
|
|
15
|
+
const value = jest.fn(() => 'return value');
|
|
16
|
+
|
|
17
|
+
expect(optionalFunctionValue(value)).toBe('return value');
|
|
18
|
+
expect(value).toHaveBeenCalled();
|
|
19
|
+
});
|
|
20
|
+
it('Should run with arguments arry', () => {
|
|
21
|
+
const value = jest.fn((...args) => args.join('|'));
|
|
22
|
+
const args = [1, 2, 3, 4];
|
|
23
|
+
expect(optionalFunctionValue(value, ...args)).toBe('1|2|3|4');
|
|
24
|
+
expect(value).toHaveBeenCalledWith(...args);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import seq from 'seq';
|
|
2
|
+
|
|
3
|
+
describe('lib:seq', () => {
|
|
4
|
+
it('Should return a new id on each run', () => {
|
|
5
|
+
Array.from({ length: 100 }, () => seq()).reduce((existing, seq) => {
|
|
6
|
+
expect(existing).not.toHaveProperty(seq.toString());
|
|
7
|
+
Object.assign(existing, { [seq]: true });
|
|
8
|
+
expect(existing).toHaveProperty(seq.toString());
|
|
9
|
+
return existing;
|
|
10
|
+
}, {});
|
|
11
|
+
});
|
|
12
|
+
});
|
package/src/asArray.ts
ADDED
package/src/assign.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default Object.assign;
|
package/src/bindNot.ts
ADDED
package/src/bus.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CB } from 'utilityTypes';
|
|
2
|
+
|
|
3
|
+
export function createBus(): {
|
|
4
|
+
on: (event: string, handler: CB) => OnReturn;
|
|
5
|
+
emit: (event: string, ...args: any[]) => void;
|
|
6
|
+
} {
|
|
7
|
+
const listeners: Record<string, CB[]> = {};
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
emit(event: string, data: any) {
|
|
11
|
+
listener(event).forEach(handler => {
|
|
12
|
+
handler(data);
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
on(event: string, handler: CB): OnReturn {
|
|
17
|
+
listeners[event] = listener(event).concat(handler);
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
off() {
|
|
21
|
+
listeners[event] = listener(event).filter(h => h !== handler);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function listener(event: string): CB[] {
|
|
28
|
+
return listeners[event] || [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type OnReturn = { off: () => void };
|
package/src/cache.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { lengthEquals } from 'lengthEquals';
|
|
2
|
+
import { longerThan } from 'longerThan';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates a cache function
|
|
6
|
+
*/
|
|
7
|
+
export default function createCache(maxSize = 1): {
|
|
8
|
+
<T>(deps: unknown[], cacheAction: (...args: unknown[]) => T): T;
|
|
9
|
+
get(deps: unknown[]): any;
|
|
10
|
+
invalidate(item: any): void;
|
|
11
|
+
} {
|
|
12
|
+
const cacheStorage: Array<[unknown[], any]> = [];
|
|
13
|
+
|
|
14
|
+
const cache = <T>(
|
|
15
|
+
deps: unknown[],
|
|
16
|
+
cacheAction: (...args: unknown[]) => T
|
|
17
|
+
): T => {
|
|
18
|
+
const cacheHit = cache.get(deps);
|
|
19
|
+
// cache hit is not null
|
|
20
|
+
if (cacheHit) return cacheHit[1];
|
|
21
|
+
|
|
22
|
+
const result = cacheAction();
|
|
23
|
+
cacheStorage.unshift([deps.concat(), result]);
|
|
24
|
+
|
|
25
|
+
if (longerThan(cacheStorage, maxSize)) cacheStorage.length = maxSize;
|
|
26
|
+
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// invalidate an item in the cache by its dependencies
|
|
31
|
+
cache.invalidate = (deps: any[]): void => {
|
|
32
|
+
const index = findIndex(deps);
|
|
33
|
+
if (index > -1) cacheStorage.splice(index, 1);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Retrieves an item from the cache.
|
|
37
|
+
cache.get = (deps: unknown[]): [unknown[], any] | null =>
|
|
38
|
+
cacheStorage[findIndex(deps)] || null;
|
|
39
|
+
|
|
40
|
+
return cache;
|
|
41
|
+
|
|
42
|
+
function findIndex(deps: unknown[]): number {
|
|
43
|
+
return cacheStorage.findIndex(
|
|
44
|
+
([cachedDeps]) =>
|
|
45
|
+
lengthEquals(deps, cachedDeps.length) &&
|
|
46
|
+
deps.every((dep, i) => dep === cachedDeps[i])
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
}
|
package/src/callEach.ts
ADDED
package/src/defaultTo.ts
ADDED
package/src/either.ts
ADDED
package/src/globals.d.ts
ADDED
package/src/invariant.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import optionalFunctionValue from 'optionalFunctionValue';
|
|
2
|
+
import { Stringable } from 'utilityTypes';
|
|
3
|
+
|
|
4
|
+
export default function invariant(
|
|
5
|
+
condition: any,
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
7
|
+
message?: String | Stringable
|
|
8
|
+
): asserts condition {
|
|
9
|
+
if (condition) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// If message is a string object (rather than string literal)
|
|
14
|
+
// Throw the value directly as a string
|
|
15
|
+
// Alternatively, throw an error with the message
|
|
16
|
+
throw message instanceof String
|
|
17
|
+
? message.valueOf()
|
|
18
|
+
: new Error(message ? optionalFunctionValue(message) : message);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
22
|
+
export function StringObject(value?: Stringable): String {
|
|
23
|
+
return new String(optionalFunctionValue(value));
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import bindNot from 'bindNot';
|
|
2
|
+
|
|
3
|
+
// The module is named "isArrayValue" since it
|
|
4
|
+
// is conflicting with a nested npm dependency.
|
|
5
|
+
// We may need to revisit this in the future.
|
|
6
|
+
|
|
7
|
+
export function isArray(value: unknown): value is Array<unknown> {
|
|
8
|
+
return Boolean(Array.isArray(value));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const isNotArray = bindNot(isArray);
|
package/src/isEmpty.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import bindNot from 'bindNot';
|
|
2
|
+
import hasOwnProperty from 'hasOwnProperty';
|
|
3
|
+
import { lengthEquals } from 'lengthEquals';
|
|
4
|
+
|
|
5
|
+
export function isEmpty(value: unknown): boolean {
|
|
6
|
+
if (!value) {
|
|
7
|
+
return true;
|
|
8
|
+
} else if (hasOwnProperty(value, 'length')) {
|
|
9
|
+
return lengthEquals(value as string | unknown[], 0);
|
|
10
|
+
} else if (typeof value === 'object') {
|
|
11
|
+
return lengthEquals(Object.keys(value as Record<string, unknown>), 0);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const isNotEmpty = bindNot(isEmpty);
|
package/src/isNull.ts
ADDED
package/src/isNullish.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import bindNot from 'bindNot';
|
|
2
|
+
import { isNull } from 'isNull';
|
|
3
|
+
import { isUndefined } from 'isUndefined';
|
|
4
|
+
|
|
5
|
+
export function isNullish(value: any): value is null | undefined {
|
|
6
|
+
return isNull(value) || isUndefined(value);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const isNotNullish = bindNot(isNullish);
|
package/src/isNumeric.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import bindNot from 'bindNot';
|
|
2
|
+
|
|
3
|
+
export function isNumeric(value: string | number): boolean {
|
|
4
|
+
const str = String(value);
|
|
5
|
+
const num = Number(value);
|
|
6
|
+
const result =
|
|
7
|
+
!isNaN(parseFloat(str)) && !isNaN(Number(value)) && isFinite(num);
|
|
8
|
+
return Boolean(result);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const isNotNumeric = bindNot(isNumeric);
|
package/src/isPromise.ts
ADDED
package/src/last.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import bindNot from 'bindNot';
|
|
2
|
+
import { numberEquals } from 'numberEquals';
|
|
3
|
+
|
|
4
|
+
export function lengthEquals(
|
|
5
|
+
value: string | unknown[],
|
|
6
|
+
arg1: string | number
|
|
7
|
+
): boolean {
|
|
8
|
+
return numberEquals(value.length, arg1);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const lengthNotEquals = bindNot(lengthEquals);
|
package/src/mapFirst.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default function mapFirst<T>(
|
|
2
|
+
array: T[],
|
|
3
|
+
callback: (
|
|
4
|
+
item: T,
|
|
5
|
+
breakout: (conditional: boolean, value: unknown) => void,
|
|
6
|
+
index: number
|
|
7
|
+
) => unknown
|
|
8
|
+
): any {
|
|
9
|
+
let broke = false;
|
|
10
|
+
let breakoutValue = null;
|
|
11
|
+
for (let i = 0; i < array.length; i++) {
|
|
12
|
+
callback(array[i], breakout, i);
|
|
13
|
+
|
|
14
|
+
if (broke) {
|
|
15
|
+
return breakoutValue;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function breakout(conditional: boolean, value: unknown) {
|
|
20
|
+
if (conditional) {
|
|
21
|
+
broke = true;
|
|
22
|
+
breakoutValue = value;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import asArray from 'asArray';
|
|
2
|
+
import defaultTo from 'defaultTo';
|
|
3
|
+
import { isArray } from 'isArrayValue';
|
|
4
|
+
import { isNotNull } from 'isNull';
|
|
5
|
+
import last from 'last';
|
|
6
|
+
|
|
7
|
+
export type NestedArray<T> = Array<NestedArray<T> | T>;
|
|
8
|
+
|
|
9
|
+
// This is kind of a map/filter in one function.
|
|
10
|
+
// Normally, behaves like a nested-array map,
|
|
11
|
+
// but returning `null` will drop the element from the array
|
|
12
|
+
export function transform<T>(
|
|
13
|
+
array: NestedArray<T>,
|
|
14
|
+
cb: (value: T) => NestedArray<T> | T | null
|
|
15
|
+
): NestedArray<T> {
|
|
16
|
+
const res = [];
|
|
17
|
+
for (const v of array) {
|
|
18
|
+
if (isArray(v)) {
|
|
19
|
+
res.push(transform(v, cb));
|
|
20
|
+
} else {
|
|
21
|
+
const output = cb(v);
|
|
22
|
+
|
|
23
|
+
if (isNotNull(output)) {
|
|
24
|
+
res.push(output);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return res as NestedArray<T>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function valueAtPath<T>(
|
|
32
|
+
array: NestedArray<T>,
|
|
33
|
+
path: number[]
|
|
34
|
+
): T | NestedArray<T> {
|
|
35
|
+
return getCurrent(array, path)[last(path)];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function setValueAtPath<T>(
|
|
39
|
+
array: NestedArray<T>,
|
|
40
|
+
path: number[],
|
|
41
|
+
value: NestedArray<T> | T
|
|
42
|
+
): NestedArray<T> {
|
|
43
|
+
const current = getCurrent(array, path);
|
|
44
|
+
|
|
45
|
+
current[last(path)] = value;
|
|
46
|
+
return array;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function flatten<T>(values: NestedArray<T> | T): T[] {
|
|
50
|
+
return asArray(values).reduce((acc, value) => {
|
|
51
|
+
if (isArray(value)) {
|
|
52
|
+
return (acc as NestedArray<T>).concat(flatten(value));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return asArray(acc).concat(value);
|
|
56
|
+
}, [] as T[]) as T[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function getCurrent<T>(
|
|
60
|
+
array: NestedArray<T>,
|
|
61
|
+
path: number[]
|
|
62
|
+
): NestedArray<T> {
|
|
63
|
+
let current: NestedArray<T> = array;
|
|
64
|
+
for (const p of path.slice(0, -1)) {
|
|
65
|
+
current[p] = defaultTo(current[p], []);
|
|
66
|
+
current = current[p] as NestedArray<T>;
|
|
67
|
+
}
|
|
68
|
+
return current;
|
|
69
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import bindNot from 'bindNot';
|
|
2
|
+
import { isNumeric } from 'isNumeric';
|
|
3
|
+
|
|
4
|
+
export function numberEquals(
|
|
5
|
+
value: string | number,
|
|
6
|
+
eq: string | number
|
|
7
|
+
): boolean {
|
|
8
|
+
return isNumeric(value) && isNumeric(eq) && Number(value) === Number(eq);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const numberNotEquals = bindNot(numberEquals);
|
package/src/seq.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export { default as cache } from 'cache';
|
|
2
|
+
export { isNullish, isNotNullish } from 'isNullish';
|
|
3
|
+
export * as nestedArray from 'nestedArray';
|
|
4
|
+
export { default as asArray } from 'asArray';
|
|
5
|
+
export { default as callEach } from 'callEach';
|
|
6
|
+
export { default as hasOwnProperty } from 'hasOwnProperty';
|
|
7
|
+
export { default as isPromise } from 'isPromise';
|
|
8
|
+
export { default as optionalFunctionValue } from 'optionalFunctionValue';
|
|
9
|
+
export { default as assign } from 'assign';
|
|
10
|
+
export { default as defaultTo } from 'defaultTo';
|
|
11
|
+
export { default as invariant, StringObject } from 'invariant';
|
|
12
|
+
export { default as isStringValue } from 'isStringValue';
|
|
13
|
+
export { default as bindNot } from 'bindNot';
|
|
14
|
+
export { default as either } from 'either';
|
|
15
|
+
export { default as isBoolean } from 'isBooleanValue';
|
|
16
|
+
export { default as last } from 'last';
|
|
17
|
+
export { default as deferThrow } from 'deferThrow';
|
|
18
|
+
export * as bus from 'bus';
|
|
19
|
+
export { default as seq } from 'seq';
|
|
20
|
+
export { default as isFunction } from 'isFunction';
|
|
21
|
+
export { default as mapFirst } from 'mapFirst';
|
|
22
|
+
export { greaterThan } from 'greaterThan';
|
|
23
|
+
export { longerThan } from 'longerThan';
|
|
24
|
+
export { isNumeric, isNotNumeric } from 'isNumeric';
|
|
25
|
+
export { lengthEquals, lengthNotEquals } from 'lengthEquals';
|
|
26
|
+
export { numberEquals, numberNotEquals } from 'numberEquals';
|
|
27
|
+
export { isNull, isNotNull } from 'isNull';
|
|
28
|
+
export { isUndefined, isNotUndefined } from 'isUndefined';
|
|
29
|
+
export { isArray, isNotArray } from 'isArrayValue';
|
|
30
|
+
export { isEmpty, isNotEmpty } from 'isEmpty';
|
|
31
|
+
export { isPositive } from 'isPositive';
|