@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.
Files changed (167) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/const/http_status.d.ts +66 -0
  3. package/dist/const/http_status.d.ts.map +1 -0
  4. package/dist/index.d.ts +34 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +1119 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/logging/AbstractLogHandler.d.ts +17 -0
  9. package/dist/logging/AbstractLogHandler.d.ts.map +1 -0
  10. package/dist/logging/ConsoleLogHandler.d.ts +13 -0
  11. package/dist/logging/ConsoleLogHandler.d.ts.map +1 -0
  12. package/dist/logging/Logger.d.ts +19 -0
  13. package/dist/logging/Logger.d.ts.map +1 -0
  14. package/dist/logging/OpenTelemetryLogHandler.d.ts +15 -0
  15. package/dist/logging/OpenTelemetryLogHandler.d.ts.map +1 -0
  16. package/dist/logging/SentryLogHandler.d.ts +13 -0
  17. package/dist/logging/SentryLogHandler.d.ts.map +1 -0
  18. package/dist/logging/const.d.ts +14 -0
  19. package/dist/logging/const.d.ts.map +1 -0
  20. package/dist/logging/util.d.ts +14 -0
  21. package/dist/logging/util.d.ts.map +1 -0
  22. package/dist/pagelifecycle/const.d.ts +15 -0
  23. package/dist/pagelifecycle/const.d.ts.map +1 -0
  24. package/dist/pagelifecycle/typedef.d.ts +4 -0
  25. package/dist/pagelifecycle/typedef.d.ts.map +1 -0
  26. package/dist/pagelifecycle/util.d.ts +31 -0
  27. package/dist/pagelifecycle/util.d.ts.map +1 -0
  28. package/dist/typecheck/TypeCheckError.d.ts +11 -0
  29. package/dist/typecheck/TypeCheckError.d.ts.map +1 -0
  30. package/dist/typecheck/TypeChecker.d.ts +27 -0
  31. package/dist/typecheck/TypeChecker.d.ts.map +1 -0
  32. package/dist/typecheck/util.d.ts +17 -0
  33. package/dist/typecheck/util.d.ts.map +1 -0
  34. package/dist/util/async.d.ts +13 -0
  35. package/dist/util/async.d.ts.map +1 -0
  36. package/dist/util/error.d.ts +16 -0
  37. package/dist/util/error.d.ts.map +1 -0
  38. package/dist/util/event_emitter.d.ts +42 -0
  39. package/dist/util/event_emitter.d.ts.map +1 -0
  40. package/dist/util/fetch.d.ts +22 -0
  41. package/dist/util/fetch.d.ts.map +1 -0
  42. package/dist/util/number.d.ts +23 -0
  43. package/dist/util/number.d.ts.map +1 -0
  44. package/dist/util/object.d.ts +24 -0
  45. package/dist/util/object.d.ts.map +1 -0
  46. package/dist/util/query.d.ts +11 -0
  47. package/dist/util/query.d.ts.map +1 -0
  48. package/dist/util/state.d.ts +5 -0
  49. package/dist/util/state.d.ts.map +1 -0
  50. package/dist/util/string.d.ts +25 -0
  51. package/dist/util/string.d.ts.map +1 -0
  52. package/dist/util/uuid.d.ts +13 -0
  53. package/dist/util/uuid.d.ts.map +1 -0
  54. package/dist/util/validate.d.ts +106 -0
  55. package/dist/util/validate.d.ts.map +1 -0
  56. package/package.json +32 -16
  57. package/src/const/http_status.test.ts +7 -0
  58. package/src/const/{http_status.js → http_status.ts} +1 -1
  59. package/src/{index.js → index.ts} +8 -0
  60. package/src/logging/AbstractLogHandler.ts +31 -0
  61. package/src/logging/{ConsoleLogHandler.js → ConsoleLogHandler.ts} +15 -13
  62. package/src/logging/Logger.test.ts +69 -0
  63. package/src/logging/Logger.ts +77 -0
  64. package/src/logging/OpenTelemetryLogHandler.ts +40 -0
  65. package/src/logging/SentryLogHandler.ts +44 -0
  66. package/src/logging/{const.js → const.ts} +1 -1
  67. package/src/logging/util.test.ts +33 -0
  68. package/src/logging/util.ts +36 -0
  69. package/src/pagelifecycle/{const.js → const.ts} +2 -2
  70. package/src/pagelifecycle/typedef.ts +5 -0
  71. package/src/pagelifecycle/util.test.ts +99 -0
  72. package/src/pagelifecycle/{util.js → util.ts} +14 -27
  73. package/src/typecheck/{TypeCheckError.js → TypeCheckError.ts} +7 -3
  74. package/src/typecheck/TypeChecker.test.ts +70 -0
  75. package/src/typecheck/{TypeChecker.js → TypeChecker.ts} +10 -27
  76. package/src/typecheck/util.test.ts +36 -0
  77. package/src/typecheck/util.ts +50 -0
  78. package/src/util/async.test.ts +74 -0
  79. package/src/util/{async.js → async.ts} +3 -12
  80. package/src/util/error.test.ts +32 -0
  81. package/src/util/error.ts +37 -0
  82. package/src/util/event_emitter.test.ts +228 -0
  83. package/src/util/event_emitter.ts +147 -0
  84. package/src/util/fetch.test.ts +62 -0
  85. package/src/util/{fetch.js → fetch.ts} +40 -31
  86. package/src/util/number.test.ts +124 -0
  87. package/src/util/number.ts +58 -0
  88. package/src/util/object.test.ts +203 -0
  89. package/src/util/{object.js → object.ts} +14 -21
  90. package/src/util/query.test.ts +71 -0
  91. package/src/util/query.ts +35 -0
  92. package/src/util/state.test.ts +47 -0
  93. package/src/util/{state.js → state.ts} +3 -6
  94. package/src/util/string.test.ts +64 -0
  95. package/src/util/string.ts +65 -0
  96. package/src/util/uuid.test.ts +53 -0
  97. package/src/util/uuid.ts +31 -0
  98. package/src/util/validate.test.ts +309 -0
  99. package/src/util/validate.ts +230 -0
  100. package/.vscode/extensions.json +0 -6
  101. package/.vscode/settings.json +0 -27
  102. package/src/logging/AbstractLogHandler.js +0 -23
  103. package/src/logging/Logger.js +0 -115
  104. package/src/logging/OpenTelemetryLogHandler.js +0 -30
  105. package/src/logging/SentryLogHandler.js +0 -46
  106. package/src/logging/util.js +0 -41
  107. package/src/pagelifecycle/typedef.js +0 -9
  108. package/src/typecheck/util.js +0 -60
  109. package/src/util/error.js +0 -33
  110. package/src/util/event_emitter.js +0 -196
  111. package/src/util/number.js +0 -118
  112. package/src/util/query.js +0 -32
  113. package/src/util/string.js +0 -76
  114. package/src/util/uuid.js +0 -35
  115. package/src/util/validate.js +0 -247
  116. package/types/const/http_status.d.ts +0 -131
  117. package/types/const/http_status.d.ts.map +0 -1
  118. package/types/index.d.ts +0 -26
  119. package/types/index.d.ts.map +0 -1
  120. package/types/logging/AbstractLogHandler.d.ts +0 -20
  121. package/types/logging/AbstractLogHandler.d.ts.map +0 -1
  122. package/types/logging/ConsoleLogHandler.d.ts +0 -9
  123. package/types/logging/ConsoleLogHandler.d.ts.map +0 -1
  124. package/types/logging/Logger.d.ts +0 -66
  125. package/types/logging/Logger.d.ts.map +0 -1
  126. package/types/logging/OpenTelemetryLogHandler.d.ts +0 -11
  127. package/types/logging/OpenTelemetryLogHandler.d.ts.map +0 -1
  128. package/types/logging/SentryLogHandler.d.ts +0 -9
  129. package/types/logging/SentryLogHandler.d.ts.map +0 -1
  130. package/types/logging/const.d.ts +0 -14
  131. package/types/logging/const.d.ts.map +0 -1
  132. package/types/logging/util.d.ts +0 -4
  133. package/types/logging/util.d.ts.map +0 -1
  134. package/types/pagelifecycle/const.d.ts +0 -15
  135. package/types/pagelifecycle/const.d.ts.map +0 -1
  136. package/types/pagelifecycle/typedef.d.ts +0 -4
  137. package/types/pagelifecycle/typedef.d.ts.map +0 -1
  138. package/types/pagelifecycle/util.d.ts +0 -8
  139. package/types/pagelifecycle/util.d.ts.map +0 -1
  140. package/types/typecheck/TypeCheckError.d.ts +0 -13
  141. package/types/typecheck/TypeCheckError.d.ts.map +0 -1
  142. package/types/typecheck/TypeChecker.d.ts +0 -40
  143. package/types/typecheck/TypeChecker.d.ts.map +0 -1
  144. package/types/typecheck/util.d.ts +0 -4
  145. package/types/typecheck/util.d.ts.map +0 -1
  146. package/types/util/async.d.ts +0 -4
  147. package/types/util/async.d.ts.map +0 -1
  148. package/types/util/error.d.ts +0 -3
  149. package/types/util/error.d.ts.map +0 -1
  150. package/types/util/event_emitter.d.ts +0 -69
  151. package/types/util/event_emitter.d.ts.map +0 -1
  152. package/types/util/fetch.d.ts +0 -22
  153. package/types/util/fetch.d.ts.map +0 -1
  154. package/types/util/number.d.ts +0 -11
  155. package/types/util/number.d.ts.map +0 -1
  156. package/types/util/object.d.ts +0 -6
  157. package/types/util/object.d.ts.map +0 -1
  158. package/types/util/query.d.ts +0 -3
  159. package/types/util/query.d.ts.map +0 -1
  160. package/types/util/state.d.ts +0 -2
  161. package/types/util/state.d.ts.map +0 -1
  162. package/types/util/string.d.ts +0 -7
  163. package/types/util/string.d.ts.map +0 -1
  164. package/types/util/uuid.d.ts +0 -4
  165. package/types/util/uuid.d.ts.map +0 -1
  166. package/types/util/validate.d.ts +0 -45
  167. 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
+ });
@@ -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
+ });