@vpmedia/simplify 1.74.0 → 1.76.0
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/CHANGELOG.md +75 -0
- package/dist/const/http_status.d.ts +66 -0
- package/dist/const/http_status.d.ts.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1119 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/AbstractLogHandler.d.ts +17 -0
- package/dist/logging/AbstractLogHandler.d.ts.map +1 -0
- package/dist/logging/ConsoleLogHandler.d.ts +13 -0
- package/dist/logging/ConsoleLogHandler.d.ts.map +1 -0
- package/dist/logging/Logger.d.ts +19 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/OpenTelemetryLogHandler.d.ts +15 -0
- package/dist/logging/OpenTelemetryLogHandler.d.ts.map +1 -0
- package/dist/logging/SentryLogHandler.d.ts +13 -0
- package/dist/logging/SentryLogHandler.d.ts.map +1 -0
- package/dist/logging/const.d.ts +14 -0
- package/dist/logging/const.d.ts.map +1 -0
- package/dist/logging/util.d.ts +14 -0
- package/dist/logging/util.d.ts.map +1 -0
- package/dist/pagelifecycle/const.d.ts +15 -0
- package/dist/pagelifecycle/const.d.ts.map +1 -0
- package/dist/pagelifecycle/typedef.d.ts +4 -0
- package/dist/pagelifecycle/typedef.d.ts.map +1 -0
- package/dist/pagelifecycle/util.d.ts +31 -0
- package/dist/pagelifecycle/util.d.ts.map +1 -0
- package/dist/typecheck/TypeCheckError.d.ts +11 -0
- package/dist/typecheck/TypeCheckError.d.ts.map +1 -0
- package/dist/typecheck/TypeChecker.d.ts +27 -0
- package/dist/typecheck/TypeChecker.d.ts.map +1 -0
- package/dist/typecheck/util.d.ts +17 -0
- package/dist/typecheck/util.d.ts.map +1 -0
- package/dist/util/async.d.ts +13 -0
- package/dist/util/async.d.ts.map +1 -0
- package/dist/util/error.d.ts +16 -0
- package/dist/util/error.d.ts.map +1 -0
- package/dist/util/event_emitter.d.ts +42 -0
- package/dist/util/event_emitter.d.ts.map +1 -0
- package/dist/util/fetch.d.ts +22 -0
- package/dist/util/fetch.d.ts.map +1 -0
- package/dist/util/number.d.ts +23 -0
- package/dist/util/number.d.ts.map +1 -0
- package/dist/util/object.d.ts +24 -0
- package/dist/util/object.d.ts.map +1 -0
- package/dist/util/query.d.ts +11 -0
- package/dist/util/query.d.ts.map +1 -0
- package/dist/util/state.d.ts +5 -0
- package/dist/util/state.d.ts.map +1 -0
- package/dist/util/string.d.ts +25 -0
- package/dist/util/string.d.ts.map +1 -0
- package/dist/util/uuid.d.ts +13 -0
- package/dist/util/uuid.d.ts.map +1 -0
- package/dist/util/validate.d.ts +106 -0
- package/dist/util/validate.d.ts.map +1 -0
- package/package.json +32 -16
- package/src/const/http_status.test.ts +7 -0
- package/src/const/{http_status.js → http_status.ts} +1 -1
- package/src/{index.js → index.ts} +8 -0
- package/src/logging/AbstractLogHandler.ts +31 -0
- package/src/logging/{ConsoleLogHandler.js → ConsoleLogHandler.ts} +15 -13
- package/src/logging/Logger.test.ts +69 -0
- package/src/logging/Logger.ts +77 -0
- package/src/logging/OpenTelemetryLogHandler.ts +40 -0
- package/src/logging/SentryLogHandler.ts +44 -0
- package/src/logging/{const.js → const.ts} +1 -1
- package/src/logging/util.test.ts +33 -0
- package/src/logging/util.ts +36 -0
- package/src/pagelifecycle/{const.js → const.ts} +2 -2
- package/src/pagelifecycle/typedef.ts +5 -0
- package/src/pagelifecycle/util.test.ts +99 -0
- package/src/pagelifecycle/{util.js → util.ts} +14 -27
- package/src/typecheck/{TypeCheckError.js → TypeCheckError.ts} +7 -3
- package/src/typecheck/TypeChecker.test.ts +70 -0
- package/src/typecheck/{TypeChecker.js → TypeChecker.ts} +10 -27
- package/src/typecheck/util.test.ts +36 -0
- package/src/typecheck/util.ts +50 -0
- package/src/util/async.test.ts +74 -0
- package/src/util/{async.js → async.ts} +3 -12
- package/src/util/error.test.ts +32 -0
- package/src/util/error.ts +37 -0
- package/src/util/event_emitter.test.ts +228 -0
- package/src/util/event_emitter.ts +147 -0
- package/src/util/fetch.test.ts +62 -0
- package/src/util/{fetch.js → fetch.ts} +40 -31
- package/src/util/number.test.ts +124 -0
- package/src/util/number.ts +58 -0
- package/src/util/object.test.ts +203 -0
- package/src/util/{object.js → object.ts} +14 -21
- package/src/util/query.test.ts +71 -0
- package/src/util/query.ts +35 -0
- package/src/util/state.test.ts +47 -0
- package/src/util/{state.js → state.ts} +3 -6
- package/src/util/string.test.ts +64 -0
- package/src/util/string.ts +65 -0
- package/src/util/uuid.test.ts +53 -0
- package/src/util/uuid.ts +31 -0
- package/src/util/validate.test.ts +309 -0
- package/src/util/validate.ts +230 -0
- package/.vscode/extensions.json +0 -6
- package/.vscode/settings.json +0 -27
- package/src/logging/AbstractLogHandler.js +0 -23
- package/src/logging/Logger.js +0 -115
- package/src/logging/OpenTelemetryLogHandler.js +0 -30
- package/src/logging/SentryLogHandler.js +0 -46
- package/src/logging/util.js +0 -41
- package/src/pagelifecycle/typedef.js +0 -9
- package/src/typecheck/util.js +0 -60
- package/src/util/error.js +0 -33
- package/src/util/event_emitter.js +0 -196
- package/src/util/number.js +0 -118
- package/src/util/query.js +0 -32
- package/src/util/string.js +0 -76
- package/src/util/uuid.js +0 -35
- package/src/util/validate.js +0 -247
- package/types/const/http_status.d.ts +0 -131
- package/types/const/http_status.d.ts.map +0 -1
- package/types/index.d.ts +0 -26
- package/types/index.d.ts.map +0 -1
- package/types/logging/AbstractLogHandler.d.ts +0 -20
- package/types/logging/AbstractLogHandler.d.ts.map +0 -1
- package/types/logging/ConsoleLogHandler.d.ts +0 -9
- package/types/logging/ConsoleLogHandler.d.ts.map +0 -1
- package/types/logging/Logger.d.ts +0 -66
- package/types/logging/Logger.d.ts.map +0 -1
- package/types/logging/OpenTelemetryLogHandler.d.ts +0 -11
- package/types/logging/OpenTelemetryLogHandler.d.ts.map +0 -1
- package/types/logging/SentryLogHandler.d.ts +0 -9
- package/types/logging/SentryLogHandler.d.ts.map +0 -1
- package/types/logging/const.d.ts +0 -14
- package/types/logging/const.d.ts.map +0 -1
- package/types/logging/util.d.ts +0 -4
- package/types/logging/util.d.ts.map +0 -1
- package/types/pagelifecycle/const.d.ts +0 -15
- package/types/pagelifecycle/const.d.ts.map +0 -1
- package/types/pagelifecycle/typedef.d.ts +0 -4
- package/types/pagelifecycle/typedef.d.ts.map +0 -1
- package/types/pagelifecycle/util.d.ts +0 -8
- package/types/pagelifecycle/util.d.ts.map +0 -1
- package/types/typecheck/TypeCheckError.d.ts +0 -13
- package/types/typecheck/TypeCheckError.d.ts.map +0 -1
- package/types/typecheck/TypeChecker.d.ts +0 -40
- package/types/typecheck/TypeChecker.d.ts.map +0 -1
- package/types/typecheck/util.d.ts +0 -4
- package/types/typecheck/util.d.ts.map +0 -1
- package/types/util/async.d.ts +0 -4
- package/types/util/async.d.ts.map +0 -1
- package/types/util/error.d.ts +0 -3
- package/types/util/error.d.ts.map +0 -1
- package/types/util/event_emitter.d.ts +0 -69
- package/types/util/event_emitter.d.ts.map +0 -1
- package/types/util/fetch.d.ts +0 -22
- package/types/util/fetch.d.ts.map +0 -1
- package/types/util/number.d.ts +0 -11
- package/types/util/number.d.ts.map +0 -1
- package/types/util/object.d.ts +0 -6
- package/types/util/object.d.ts.map +0 -1
- package/types/util/query.d.ts +0 -3
- package/types/util/query.d.ts.map +0 -1
- package/types/util/state.d.ts +0 -2
- package/types/util/state.d.ts.map +0 -1
- package/types/util/string.d.ts +0 -7
- package/types/util/string.d.ts.map +0 -1
- package/types/util/uuid.d.ts +0 -4
- package/types/util/uuid.d.ts.map +0 -1
- package/types/util/validate.d.ts +0 -45
- package/types/util/validate.d.ts.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {
|
|
2
|
+
underscoreToCamelCase,
|
|
3
|
+
capitalize,
|
|
4
|
+
addLeadingZero,
|
|
5
|
+
getTypeFromValue,
|
|
6
|
+
getDisplayValue,
|
|
7
|
+
saveAsFile,
|
|
8
|
+
} from './string.js';
|
|
9
|
+
|
|
10
|
+
describe('string', () => {
|
|
11
|
+
test('addLeadingZero', () => {
|
|
12
|
+
expect(addLeadingZero(1)).toBe('01');
|
|
13
|
+
expect(addLeadingZero('1')).toBe('01');
|
|
14
|
+
expect(addLeadingZero(1, 3)).toBe('001');
|
|
15
|
+
expect(addLeadingZero('21')).toBe('21');
|
|
16
|
+
expect(addLeadingZero(21)).toBe('21');
|
|
17
|
+
expect(addLeadingZero(null)).toBe(null);
|
|
18
|
+
expect(addLeadingZero(undefined)).toBe(null);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('capitalize', () => {
|
|
22
|
+
expect(capitalize('test')).toBe('Test');
|
|
23
|
+
expect(capitalize('TEST')).toBe('Test');
|
|
24
|
+
expect(capitalize('tEST')).toBe('Test');
|
|
25
|
+
expect(capitalize(null)).toBe(null);
|
|
26
|
+
expect(capitalize('')).toBe('');
|
|
27
|
+
expect(capitalize(' ')).toBe(' ');
|
|
28
|
+
expect(capitalize('a')).toBe('A');
|
|
29
|
+
expect(capitalize('A')).toBe('A');
|
|
30
|
+
expect(capitalize('test123')).toBe('Test123');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('underscoreToCamelCase', () => {
|
|
34
|
+
expect(underscoreToCamelCase('test')).toBe('test');
|
|
35
|
+
expect(underscoreToCamelCase('test_variable')).toBe('testVariable');
|
|
36
|
+
expect(underscoreToCamelCase('test_variable_name')).toBe('testVariableName');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('getTypeFromValue', () => {
|
|
40
|
+
expect(getTypeFromValue('test')).toBe('string');
|
|
41
|
+
expect(getTypeFromValue(() => null)).toBe('function');
|
|
42
|
+
expect(getTypeFromValue([])).toBe('array');
|
|
43
|
+
expect(getTypeFromValue({})).toBe('object');
|
|
44
|
+
expect(getTypeFromValue(new Date())).toBe('date');
|
|
45
|
+
expect(getTypeFromValue(null)).toBe('null');
|
|
46
|
+
expect(getTypeFromValue(true)).toBe('boolean');
|
|
47
|
+
expect(getTypeFromValue(undefined)).toBe('undefined');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('getDisplayValue', () => {
|
|
51
|
+
expect(getDisplayValue('test')).toBe('"test"');
|
|
52
|
+
expect(getDisplayValue(() => null)).toBe('() => null');
|
|
53
|
+
expect(getDisplayValue([])).toBe('[]');
|
|
54
|
+
expect(getDisplayValue({})).toBe('{}');
|
|
55
|
+
expect(getDisplayValue(new Date())).not.toBe(null);
|
|
56
|
+
expect(getDisplayValue(null)).toBe('null');
|
|
57
|
+
expect(getDisplayValue(true)).toBe('true');
|
|
58
|
+
expect(getDisplayValue(undefined)).toBe('undefined');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('saveAsFile', () => {
|
|
62
|
+
expect(() => saveAsFile('test.txt', 'test content')).not.toThrowError(Error);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add leading zeros to a value to ensure it has a minimum width.
|
|
3
|
+
*/
|
|
4
|
+
export const addLeadingZero = (value: number | string | null | undefined, size = 2): string | null => {
|
|
5
|
+
if (value === null || value === undefined) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
let str = value.toString();
|
|
9
|
+
while (str.length < size) {
|
|
10
|
+
str = `0${str}`;
|
|
11
|
+
}
|
|
12
|
+
return str;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Capitalize a string.
|
|
17
|
+
*/
|
|
18
|
+
export const capitalize = (value: string | null | undefined): string | null => {
|
|
19
|
+
if (value === null || value === undefined) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
if (!value || value.length === 0) {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
const normValue = value.toLowerCase();
|
|
26
|
+
return normValue.charAt(0).toUpperCase() + normValue.slice(1);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Converts underscore case string to camel case.
|
|
31
|
+
*/
|
|
32
|
+
export const underscoreToCamelCase = (value: string): string =>
|
|
33
|
+
value.replaceAll(/(_\w)/gu, (m) => m[1]!.toUpperCase());
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Saves text file.
|
|
37
|
+
*/
|
|
38
|
+
export const saveAsFile = (filename: string, text: string): void => {
|
|
39
|
+
const element = document.createElement('a');
|
|
40
|
+
element.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(text)}`);
|
|
41
|
+
element.setAttribute('download', filename);
|
|
42
|
+
element.style.display = 'none';
|
|
43
|
+
document.body.append(element);
|
|
44
|
+
element.click();
|
|
45
|
+
element.remove();
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Get type from value in human readable format.
|
|
50
|
+
*/
|
|
51
|
+
export const getTypeFromValue = (value: unknown): string =>
|
|
52
|
+
Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get value in human readable format.
|
|
56
|
+
*/
|
|
57
|
+
export const getDisplayValue = (value: unknown): string => {
|
|
58
|
+
if (typeof value === 'string') {
|
|
59
|
+
return `"${value}"`;
|
|
60
|
+
}
|
|
61
|
+
if (typeof value === 'object') {
|
|
62
|
+
return JSON.stringify(value);
|
|
63
|
+
}
|
|
64
|
+
return String(value);
|
|
65
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { randomUUIDFallback, uuidv4 } from './uuid.js';
|
|
3
|
+
|
|
4
|
+
const uuidV4Regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
|
|
5
|
+
|
|
6
|
+
describe('UUID functions', () => {
|
|
7
|
+
let originalRandomUUID: typeof crypto.randomUUID;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
originalRandomUUID = crypto.randomUUID;
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
crypto.randomUUID = originalRandomUUID;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('randomUUIDFallback generates a valid UUID v4', () => {
|
|
18
|
+
const uuid = randomUUIDFallback();
|
|
19
|
+
expect(uuid).toMatch(uuidV4Regex);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('uuidv4 returns a valid UUID v4', () => {
|
|
23
|
+
const uuid = uuidv4();
|
|
24
|
+
expect(uuid).toMatch(uuidV4Regex);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('uuidv4 uses crypto.randomUUID if available', () => {
|
|
28
|
+
crypto.randomUUID = vi.fn(() => 'mock-uuid' as `${string}-${string}-${string}-${string}-${string}`);
|
|
29
|
+
const uuid = uuidv4();
|
|
30
|
+
expect(uuid).toBe('mock-uuid');
|
|
31
|
+
expect(crypto.randomUUID).toHaveBeenCalled();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('randomUUIDFallback fallback works if crypto.randomUUID not available', () => {
|
|
35
|
+
// @ts-expect-error - allow deleting non-optional property for test
|
|
36
|
+
delete crypto.randomUUID;
|
|
37
|
+
const uuid = randomUUIDFallback();
|
|
38
|
+
expect(uuid).toMatch(uuidV4Regex);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('randomUUIDFallback does not generate duplicates', () => {
|
|
42
|
+
const uuidMap = new Map<string, boolean>();
|
|
43
|
+
const numSamples = 1000;
|
|
44
|
+
for (let i = 0; i < numSamples; i += 1) {
|
|
45
|
+
const uuid = randomUUIDFallback();
|
|
46
|
+
if (uuidMap.has(uuid)) {
|
|
47
|
+
throw new Error('Duplicate UUIDv4 found');
|
|
48
|
+
}
|
|
49
|
+
uuidMap.set(uuid, true);
|
|
50
|
+
}
|
|
51
|
+
expect(uuidMap.size).toBe(numSamples);
|
|
52
|
+
});
|
|
53
|
+
});
|
package/src/util/uuid.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a byte (0–255) to a 2-character hex string.
|
|
3
|
+
*/
|
|
4
|
+
export const byteToHex = (byte: number): string => (byte >>> 4).toString(16) + (byte & 0b1111).toString(16);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* UUIDv4 fallback generator (RFC 4122 compliant).
|
|
8
|
+
*/
|
|
9
|
+
export const randomUUIDFallback = (): string => {
|
|
10
|
+
const bytes: number[] | Uint8Array = crypto.getRandomValues
|
|
11
|
+
? crypto.getRandomValues(new Uint8Array(16))
|
|
12
|
+
: Array.from({ length: 16 }, () => Math.floor(Math.random() * 256));
|
|
13
|
+
|
|
14
|
+
bytes[6] = (bytes[6]! & 0x0f) | 0x40;
|
|
15
|
+
bytes[8] = (bytes[8]! & 0x3f) | 0x80;
|
|
16
|
+
|
|
17
|
+
let uuid = '';
|
|
18
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
19
|
+
if (index === 4 || index === 6 || index === 8 || index === 10) {
|
|
20
|
+
uuid += '-';
|
|
21
|
+
}
|
|
22
|
+
uuid += byteToHex(bytes[index]!);
|
|
23
|
+
}
|
|
24
|
+
return uuid;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Crypto UUIDv4 wrapper with fallback.
|
|
29
|
+
*/
|
|
30
|
+
export const uuidv4 = (): string =>
|
|
31
|
+
typeof crypto.randomUUID === 'function' ? crypto.randomUUID() : randomUUIDFallback();
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isArray,
|
|
3
|
+
isArrayOf,
|
|
4
|
+
isBoolean,
|
|
5
|
+
isEnum,
|
|
6
|
+
isFunction,
|
|
7
|
+
isInstance,
|
|
8
|
+
isInteger,
|
|
9
|
+
isNonNegativeInteger,
|
|
10
|
+
isNonNegativeNumber,
|
|
11
|
+
isNull,
|
|
12
|
+
isNumber,
|
|
13
|
+
isPlainObject,
|
|
14
|
+
isPlainObjectOf,
|
|
15
|
+
isAnyOf,
|
|
16
|
+
isPositiveInteger,
|
|
17
|
+
isPositiveNumber,
|
|
18
|
+
isString,
|
|
19
|
+
isUndefined,
|
|
20
|
+
refineValidator,
|
|
21
|
+
isNumberLess,
|
|
22
|
+
isNumberGreater,
|
|
23
|
+
isNumberLessOrEqual,
|
|
24
|
+
isNumberGreaterOrEqual,
|
|
25
|
+
isIntegerLess,
|
|
26
|
+
isIntegerGreater,
|
|
27
|
+
isIntegerLessOrEqual,
|
|
28
|
+
isIntegerGreaterOrEqual,
|
|
29
|
+
isNumberInRange,
|
|
30
|
+
isIntegerInRange,
|
|
31
|
+
isArrayLengthEqual,
|
|
32
|
+
isArrayLengthInRange,
|
|
33
|
+
isStringLengthEqual,
|
|
34
|
+
isStringLengthInRange,
|
|
35
|
+
isNullOrUndefined,
|
|
36
|
+
} from './validate.js';
|
|
37
|
+
|
|
38
|
+
describe('validate', () => {
|
|
39
|
+
test('isArray', () => {
|
|
40
|
+
expect(isArray('string')).toBe(false);
|
|
41
|
+
expect(isArray([])).toBe(true);
|
|
42
|
+
expect(isArray([1, 2, 3])).toBe(true);
|
|
43
|
+
expect(isArray({ string: '1' })).toBe(false);
|
|
44
|
+
expect(isArray(0.1)).toBe(false);
|
|
45
|
+
expect(isArray(1)).toBe(false);
|
|
46
|
+
expect(isArray(false)).toBe(false);
|
|
47
|
+
expect(isArray(null)).toBe(false);
|
|
48
|
+
expect(isArray(true)).toBe(false);
|
|
49
|
+
expect(isArray(undefined)).toBe(false);
|
|
50
|
+
expect(isArray(() => true)).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('isBoolean', () => {
|
|
54
|
+
expect(isBoolean('string')).toBe(false);
|
|
55
|
+
expect(isBoolean([])).toBe(false);
|
|
56
|
+
expect(isBoolean([1, 2, 3])).toBe(false);
|
|
57
|
+
expect(isBoolean({ string: '1' })).toBe(false);
|
|
58
|
+
expect(isBoolean(0.1)).toBe(false);
|
|
59
|
+
expect(isBoolean(1)).toBe(false);
|
|
60
|
+
expect(isBoolean(false)).toBe(true);
|
|
61
|
+
expect(isBoolean(null)).toBe(false);
|
|
62
|
+
expect(isBoolean(true)).toBe(true);
|
|
63
|
+
expect(isBoolean(undefined)).toBe(false);
|
|
64
|
+
expect(isBoolean(() => true)).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('isNumber', () => {
|
|
68
|
+
expect(isNumber('string')).toBe(false);
|
|
69
|
+
expect(isNumber([])).toBe(false);
|
|
70
|
+
expect(isNumber([1, 2, 3])).toBe(false);
|
|
71
|
+
expect(isNumber({ string: '1' })).toBe(false);
|
|
72
|
+
expect(isNumber(0.1)).toBe(true);
|
|
73
|
+
expect(isNumber(1)).toBe(true);
|
|
74
|
+
expect(isNumber(false)).toBe(false);
|
|
75
|
+
expect(isNumber(null)).toBe(false);
|
|
76
|
+
expect(isNumber(Number.NaN)).toBe(false);
|
|
77
|
+
expect(isNumber(Number.POSITIVE_INFINITY)).toBe(false);
|
|
78
|
+
expect(isNumber(true)).toBe(false);
|
|
79
|
+
expect(isNumber(undefined)).toBe(false);
|
|
80
|
+
expect(isNumber(() => true)).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('isPositiveNumber', () => {
|
|
84
|
+
expect(isPositiveNumber(0)).toBe(false);
|
|
85
|
+
expect(isPositiveNumber(1)).toBe(true);
|
|
86
|
+
expect(isPositiveNumber(1.1)).toBe(true);
|
|
87
|
+
expect(isPositiveNumber(-1)).toBe(false);
|
|
88
|
+
expect(isPositiveNumber(-1.1)).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('isNonNegativeNumber', () => {
|
|
92
|
+
expect(isNonNegativeNumber(0)).toBe(true);
|
|
93
|
+
expect(isNonNegativeNumber(1)).toBe(true);
|
|
94
|
+
expect(isNonNegativeNumber(1.1)).toBe(true);
|
|
95
|
+
expect(isNonNegativeNumber(-1)).toBe(false);
|
|
96
|
+
expect(isNonNegativeNumber(-1.1)).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('isInteger', () => {
|
|
100
|
+
expect(isInteger('string')).toBe(false);
|
|
101
|
+
expect(isInteger(() => true)).toBe(false);
|
|
102
|
+
expect(isInteger([])).toBe(false);
|
|
103
|
+
expect(isInteger([1, 2, 3])).toBe(false);
|
|
104
|
+
expect(isInteger({ string: '1' })).toBe(false);
|
|
105
|
+
expect(isInteger(0.1)).toBe(false);
|
|
106
|
+
expect(isInteger(1)).toBe(true);
|
|
107
|
+
expect(isInteger(false)).toBe(false);
|
|
108
|
+
expect(isInteger(null)).toBe(false);
|
|
109
|
+
expect(isInteger(Number.NaN)).toBe(false);
|
|
110
|
+
expect(isInteger(Number.POSITIVE_INFINITY)).toBe(false);
|
|
111
|
+
expect(isInteger(true)).toBe(false);
|
|
112
|
+
expect(isInteger(undefined)).toBe(false);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('isPositiveInteger', () => {
|
|
116
|
+
expect(isPositiveInteger(0)).toBe(false);
|
|
117
|
+
expect(isPositiveInteger(1)).toBe(true);
|
|
118
|
+
expect(isPositiveInteger(1.1)).toBe(false);
|
|
119
|
+
expect(isPositiveInteger(-1)).toBe(false);
|
|
120
|
+
expect(isPositiveInteger(-1.1)).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('isNonNegativeInteger', () => {
|
|
124
|
+
expect(isNonNegativeInteger(0)).toBe(true);
|
|
125
|
+
expect(isNonNegativeInteger(1)).toBe(true);
|
|
126
|
+
expect(isNonNegativeInteger(1.1)).toBe(false);
|
|
127
|
+
expect(isNonNegativeInteger(-1)).toBe(false);
|
|
128
|
+
expect(isNonNegativeInteger(-1.1)).toBe(false);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('isString', () => {
|
|
132
|
+
expect(isString('string')).toBe(true);
|
|
133
|
+
expect(isString([])).toBe(false);
|
|
134
|
+
expect(isString([1, 2, 3])).toBe(false);
|
|
135
|
+
expect(isString({ string: '1' })).toBe(false);
|
|
136
|
+
expect(isString(0.1)).toBe(false);
|
|
137
|
+
expect(isString(1)).toBe(false);
|
|
138
|
+
expect(isString(false)).toBe(false);
|
|
139
|
+
expect(isString(null)).toBe(false);
|
|
140
|
+
expect(isString(true)).toBe(false);
|
|
141
|
+
expect(isString(undefined)).toBe(false);
|
|
142
|
+
expect(isString(() => true)).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('isFunction', () => {
|
|
146
|
+
expect(isFunction('string')).toBe(false);
|
|
147
|
+
expect(isFunction([])).toBe(false);
|
|
148
|
+
expect(isFunction([1, 2, 3])).toBe(false);
|
|
149
|
+
expect(isFunction({ string: '1' })).toBe(false);
|
|
150
|
+
expect(isFunction(0.1)).toBe(false);
|
|
151
|
+
expect(isFunction(1)).toBe(false);
|
|
152
|
+
expect(isFunction(false)).toBe(false);
|
|
153
|
+
expect(isFunction(null)).toBe(false);
|
|
154
|
+
expect(isFunction(true)).toBe(false);
|
|
155
|
+
expect(isFunction(undefined)).toBe(false);
|
|
156
|
+
expect(isFunction(() => true)).toBe(true);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('isNull', () => {
|
|
160
|
+
expect(isNull('string')).toBe(false);
|
|
161
|
+
expect(isNull([])).toBe(false);
|
|
162
|
+
expect(isNull([1, 2, 3])).toBe(false);
|
|
163
|
+
expect(isNull({ string: '1' })).toBe(false);
|
|
164
|
+
expect(isNull(0.1)).toBe(false);
|
|
165
|
+
expect(isNull(1)).toBe(false);
|
|
166
|
+
expect(isNull(false)).toBe(false);
|
|
167
|
+
expect(isNull(null)).toBe(true);
|
|
168
|
+
expect(isNull(true)).toBe(false);
|
|
169
|
+
expect(isNull(undefined)).toBe(false);
|
|
170
|
+
expect(isNull(() => true)).toBe(false);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('isUndefined', () => {
|
|
174
|
+
expect(isUndefined('string')).toBe(false);
|
|
175
|
+
expect(isUndefined([])).toBe(false);
|
|
176
|
+
expect(isUndefined([1, 2, 3])).toBe(false);
|
|
177
|
+
expect(isUndefined({ string: '1' })).toBe(false);
|
|
178
|
+
expect(isUndefined(0.1)).toBe(false);
|
|
179
|
+
expect(isUndefined(1)).toBe(false);
|
|
180
|
+
expect(isUndefined(false)).toBe(false);
|
|
181
|
+
expect(isUndefined(null)).toBe(false);
|
|
182
|
+
expect(isUndefined(true)).toBe(false);
|
|
183
|
+
expect(isUndefined(undefined)).toBe(true);
|
|
184
|
+
expect(isUndefined(() => true)).toBe(false);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test('isNullOrUndefined', () => {
|
|
188
|
+
expect(isNullOrUndefined('string')).toBe(false);
|
|
189
|
+
expect(isNullOrUndefined([])).toBe(false);
|
|
190
|
+
expect(isNullOrUndefined([1, 2, 3])).toBe(false);
|
|
191
|
+
expect(isNullOrUndefined({ string: '1' })).toBe(false);
|
|
192
|
+
expect(isNullOrUndefined(0.1)).toBe(false);
|
|
193
|
+
expect(isNullOrUndefined(1)).toBe(false);
|
|
194
|
+
expect(isNullOrUndefined(false)).toBe(false);
|
|
195
|
+
expect(isNullOrUndefined(null)).toBe(true);
|
|
196
|
+
expect(isNullOrUndefined(true)).toBe(false);
|
|
197
|
+
expect(isNullOrUndefined(undefined)).toBe(true);
|
|
198
|
+
expect(isNullOrUndefined(() => true)).toBe(false);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('isPlainObject', () => {
|
|
202
|
+
expect(isPlainObject('string')).toBe(false);
|
|
203
|
+
expect(isPlainObject(() => true)).toBe(false);
|
|
204
|
+
expect(isPlainObject([])).toBe(false);
|
|
205
|
+
expect(isPlainObject([1, 2, 3])).toBe(false);
|
|
206
|
+
expect(isPlainObject({ string: '1' })).toBe(true);
|
|
207
|
+
expect(isPlainObject(0.1)).toBe(false);
|
|
208
|
+
expect(isPlainObject(1)).toBe(false);
|
|
209
|
+
expect(isPlainObject(false)).toBe(false);
|
|
210
|
+
expect(isPlainObject(new Date())).toBe(false);
|
|
211
|
+
expect(isPlainObject(null)).toBe(false);
|
|
212
|
+
expect(isPlainObject(true)).toBe(false);
|
|
213
|
+
expect(isPlainObject(undefined)).toBe(false);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
test('isInstance', () => {
|
|
217
|
+
class CustomError extends Error {
|
|
218
|
+
override name = 'CustomError';
|
|
219
|
+
}
|
|
220
|
+
// @ts-expect-error
|
|
221
|
+
expect(isInstance({}, {})).toBe(false);
|
|
222
|
+
expect(isInstance({}, Number)).toBe(false);
|
|
223
|
+
// @ts-expect-error
|
|
224
|
+
expect(isInstance(new CustomError(), {})).toBe(false);
|
|
225
|
+
expect(isInstance(new CustomError(), Error)).toBe(true);
|
|
226
|
+
expect(isInstance(new CustomError(), Number)).toBe(false);
|
|
227
|
+
expect(isInstance(new Date(), Date)).toBe(true);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test('isEnum', () => {
|
|
231
|
+
expect(isEnum(0, [1, 2])).toBe(false);
|
|
232
|
+
expect(isEnum(1, [1, 2])).toBe(true);
|
|
233
|
+
expect(isEnum('AB', ['AB', 'CD'])).toBe(true);
|
|
234
|
+
expect(isEnum('EF', ['AB', 'CD'])).toBe(false);
|
|
235
|
+
expect(isEnum('AB', { AB: 'AB', CD: 'CD' })).toBe(true);
|
|
236
|
+
expect(isEnum('EF', { AB: 'AB', CD: 'CD' })).toBe(false);
|
|
237
|
+
expect(isEnum('AB', new Set(['AB', 'CD']))).toBe(true);
|
|
238
|
+
expect(isEnum('EF', new Set(['AB', 'CD']))).toBe(false);
|
|
239
|
+
expect(isEnum('EF', null)).toBe(false);
|
|
240
|
+
expect(isEnum('EF', undefined)).toBe(false);
|
|
241
|
+
// @ts-expect-error
|
|
242
|
+
expect(isEnum('EF', 1)).toBe(false);
|
|
243
|
+
// @ts-expect-error
|
|
244
|
+
expect(isEnum('EF', 'string')).toBe(false);
|
|
245
|
+
// @ts-expect-error
|
|
246
|
+
expect(isEnum(false, 'string')).toBe(false);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
test('isArrayOf', () => {
|
|
250
|
+
expect(isArrayOf(0.1, isNumber)).toBe(false);
|
|
251
|
+
expect(isArrayOf([0.1, 'string'], isNumber)).toBe(false);
|
|
252
|
+
expect(isArrayOf([0.1, 0.2], isNumber)).toBe(true);
|
|
253
|
+
expect(isArrayOf([0.1, 1, 2], isInteger)).toBe(false);
|
|
254
|
+
expect(isArrayOf([1, 2], isInteger)).toBe(true);
|
|
255
|
+
expect(isArrayOf([1, 'string', undefined], isAnyOf(isInteger, isNullOrUndefined))).toBe(false);
|
|
256
|
+
expect(isArrayOf([1, null, undefined], isAnyOf(isInteger, isNullOrUndefined))).toBe(true);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test('isPlainObjectOf', () => {
|
|
260
|
+
expect(isPlainObjectOf(0.1, isNumber)).toBe(false);
|
|
261
|
+
expect(isPlainObjectOf({ a: 0.1, b: 'string' }, isNumber)).toBe(false);
|
|
262
|
+
expect(isPlainObjectOf({ a: 0.1, b: 0.2 }, isNumber)).toBe(true);
|
|
263
|
+
expect(isPlainObjectOf({ a: 0.1, b: 1, c: 2 }, isInteger)).toBe(false);
|
|
264
|
+
expect(isPlainObjectOf({ a: 1, b: 2 }, isInteger)).toBe(true);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
test('isAnyOf', () => {
|
|
268
|
+
expect(isAnyOf(isNumber, isNull)(1)).toBe(true);
|
|
269
|
+
expect(isAnyOf(isNumber, isNull)(null)).toBe(true);
|
|
270
|
+
expect(isAnyOf(isNumber, isNull)('string')).toBe(false);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test('refineValidator', () => {
|
|
274
|
+
expect(refineValidator(isNumber, (v) => v > 0)(-1)).toBe(false);
|
|
275
|
+
expect(refineValidator(isNumber, (v) => v > 0)(1)).toBe(true);
|
|
276
|
+
expect(refineValidator(isNumber, (v) => v > 0).name).toBe('isNumberRefined');
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
test('isRefinedExtensions', () => {
|
|
280
|
+
expect(isNumberLess(0)(-1.1)).toBe(true);
|
|
281
|
+
expect(isNumberLess(0)(0)).toBe(false);
|
|
282
|
+
expect(isNumberLessOrEqual(0)(0)).toBe(true);
|
|
283
|
+
expect(isNumberGreater(0)(0)).toBe(false);
|
|
284
|
+
expect(isNumberGreater(0)(1.1)).toBe(true);
|
|
285
|
+
expect(isNumberGreaterOrEqual(0)(0)).toBe(true);
|
|
286
|
+
expect(isNumberInRange(0, 1.1)(0)).toBe(true);
|
|
287
|
+
expect(isNumberInRange.name).toBe('isNumberInRange');
|
|
288
|
+
|
|
289
|
+
expect(isIntegerLess(0)(-1)).toBe(true);
|
|
290
|
+
expect(isIntegerLess(0)(0)).toBe(false);
|
|
291
|
+
expect(isIntegerLessOrEqual(0)(0)).toBe(true);
|
|
292
|
+
expect(isIntegerGreater(0)(0)).toBe(false);
|
|
293
|
+
expect(isIntegerGreater(0)(1)).toBe(true);
|
|
294
|
+
expect(isIntegerGreater(0)(1.1)).toBe(false);
|
|
295
|
+
expect(isIntegerGreaterOrEqual(0)(0)).toBe(true);
|
|
296
|
+
expect(isIntegerInRange(0, 1)(0)).toBe(true);
|
|
297
|
+
expect(isIntegerInRange(0, 1)(2)).toBe(false);
|
|
298
|
+
|
|
299
|
+
expect(isStringLengthEqual(1)('a')).toBe(true);
|
|
300
|
+
expect(isStringLengthEqual(1)('ab')).toBe(false);
|
|
301
|
+
expect(isStringLengthInRange(1, 2)('ab')).toBe(true);
|
|
302
|
+
expect(isStringLengthInRange(1, 2)('abc')).toBe(false);
|
|
303
|
+
|
|
304
|
+
expect(isArrayLengthEqual(1)([1])).toBe(true);
|
|
305
|
+
expect(isArrayLengthEqual(1)([1, 2])).toBe(false);
|
|
306
|
+
expect(isArrayLengthInRange(1, 2)([1, 2])).toBe(true);
|
|
307
|
+
expect(isArrayLengthInRange(1, 2)([1, 2, 3])).toBe(false);
|
|
308
|
+
});
|
|
309
|
+
});
|