@vpmedia/simplify 1.74.0 → 1.75.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 +60 -0
- package/dist/const/http_status.d.ts +66 -0
- package/dist/const/http_status.d.ts.map +1 -0
- package/dist/const/http_status.js +133 -0
- package/dist/const/http_status.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/{src → dist}/index.js +3 -20
- 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/AbstractLogHandler.js +16 -0
- package/dist/logging/AbstractLogHandler.js.map +1 -0
- package/dist/logging/ConsoleLogHandler.d.ts +13 -0
- package/dist/logging/ConsoleLogHandler.d.ts.map +1 -0
- package/dist/logging/ConsoleLogHandler.js +41 -0
- package/dist/logging/ConsoleLogHandler.js.map +1 -0
- package/dist/logging/Logger.d.ts +19 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +51 -0
- package/dist/logging/Logger.js.map +1 -0
- package/dist/logging/OpenTelemetryLogHandler.d.ts +15 -0
- package/dist/logging/OpenTelemetryLogHandler.d.ts.map +1 -0
- package/dist/logging/OpenTelemetryLogHandler.js +21 -0
- package/dist/logging/OpenTelemetryLogHandler.js.map +1 -0
- package/dist/logging/SentryLogHandler.d.ts +13 -0
- package/dist/logging/SentryLogHandler.d.ts.map +1 -0
- package/dist/logging/SentryLogHandler.js +36 -0
- package/dist/logging/SentryLogHandler.js.map +1 -0
- package/dist/logging/const.d.ts +14 -0
- package/dist/logging/const.d.ts.map +1 -0
- package/dist/logging/const.js +21 -0
- package/dist/logging/const.js.map +1 -0
- package/dist/logging/util.d.ts +14 -0
- package/dist/logging/util.d.ts.map +1 -0
- package/dist/logging/util.js +34 -0
- package/dist/logging/util.js.map +1 -0
- package/dist/pagelifecycle/const.d.ts +15 -0
- package/dist/pagelifecycle/const.d.ts.map +1 -0
- package/dist/pagelifecycle/const.js +27 -0
- package/dist/pagelifecycle/const.js.map +1 -0
- package/dist/pagelifecycle/typedef.d.ts +4 -0
- package/dist/pagelifecycle/typedef.d.ts.map +1 -0
- package/dist/pagelifecycle/typedef.js +2 -0
- package/dist/pagelifecycle/typedef.js.map +1 -0
- package/dist/pagelifecycle/util.d.ts +31 -0
- package/dist/pagelifecycle/util.d.ts.map +1 -0
- package/dist/pagelifecycle/util.js +117 -0
- package/dist/pagelifecycle/util.js.map +1 -0
- package/dist/typecheck/TypeCheckError.d.ts +11 -0
- package/dist/typecheck/TypeCheckError.d.ts.map +1 -0
- package/dist/typecheck/TypeCheckError.js +12 -0
- package/dist/typecheck/TypeCheckError.js.map +1 -0
- package/dist/typecheck/TypeChecker.d.ts +27 -0
- package/dist/typecheck/TypeChecker.d.ts.map +1 -0
- package/dist/typecheck/TypeChecker.js +69 -0
- package/dist/typecheck/TypeChecker.js.map +1 -0
- package/dist/typecheck/util.d.ts +17 -0
- package/dist/typecheck/util.d.ts.map +1 -0
- package/dist/typecheck/util.js +42 -0
- package/dist/typecheck/util.js.map +1 -0
- package/dist/util/async.d.ts +13 -0
- package/dist/util/async.d.ts.map +1 -0
- package/dist/util/async.js +39 -0
- package/dist/util/async.js.map +1 -0
- package/dist/util/error.d.ts +16 -0
- package/dist/util/error.d.ts.map +1 -0
- package/dist/util/error.js +27 -0
- package/dist/util/error.js.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/event_emitter.js +127 -0
- package/dist/util/event_emitter.js.map +1 -0
- package/dist/util/fetch.d.ts +22 -0
- package/dist/util/fetch.d.ts.map +1 -0
- package/dist/util/fetch.js +75 -0
- package/dist/util/fetch.js.map +1 -0
- package/dist/util/number.d.ts +23 -0
- package/dist/util/number.d.ts.map +1 -0
- package/dist/util/number.js +52 -0
- package/dist/util/number.js.map +1 -0
- package/dist/util/object.d.ts +24 -0
- package/dist/util/object.d.ts.map +1 -0
- package/dist/util/object.js +83 -0
- package/dist/util/object.js.map +1 -0
- package/dist/util/query.d.ts +11 -0
- package/dist/util/query.d.ts.map +1 -0
- package/dist/util/query.js +24 -0
- package/dist/util/query.js.map +1 -0
- package/dist/util/state.d.ts +5 -0
- package/dist/util/state.d.ts.map +1 -0
- package/dist/util/state.js +19 -0
- package/dist/util/state.js.map +1 -0
- package/dist/util/string.d.ts +25 -0
- package/dist/util/string.d.ts.map +1 -0
- package/dist/util/string.js +59 -0
- package/dist/util/string.js.map +1 -0
- package/dist/util/uuid.d.ts +13 -0
- package/dist/util/uuid.d.ts.map +1 -0
- package/dist/util/uuid.js +27 -0
- package/dist/util/uuid.js.map +1 -0
- package/dist/util/validate.d.ts +106 -0
- package/dist/util/validate.d.ts.map +1 -0
- package/dist/util/validate.js +139 -0
- package/dist/util/validate.js.map +1 -0
- package/package.json +31 -16
- package/src/const/http_status.test.ts +7 -0
- package/src/const/{http_status.js → http_status.ts} +1 -1
- package/src/index.ts +51 -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,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
|
+
});
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { isEqual, isGreater, isGreaterOrEqual, isInRange, isLess, isLessOrEqual } from './number.js';
|
|
2
|
+
|
|
3
|
+
export type Validator<T> = (value: unknown) => value is T;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Validates `value` as `boolean`.
|
|
7
|
+
*/
|
|
8
|
+
export const isBoolean = (value: unknown): value is boolean => typeof value === 'boolean';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Validates `value` as `number`.
|
|
12
|
+
*/
|
|
13
|
+
export const isNumber = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Validates `value` as positive `number`.
|
|
17
|
+
*/
|
|
18
|
+
export const isPositiveNumber = (value: unknown): value is number => isNumber(value) && value > 0;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Validates `value` as non-negative `number`.
|
|
22
|
+
*/
|
|
23
|
+
export const isNonNegativeNumber = (value: unknown): value is number => isNumber(value) && value >= 0;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Validates `value` as `integer`.
|
|
27
|
+
*/
|
|
28
|
+
export const isInteger = (value: unknown): value is number => isNumber(value) && Number.isInteger(value);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Validates `value` as positive `integer`.
|
|
32
|
+
*/
|
|
33
|
+
export const isPositiveInteger = (value: unknown): value is number => isInteger(value) && value > 0;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Validates `value` as non-negative `integer`.
|
|
37
|
+
*/
|
|
38
|
+
export const isNonNegativeInteger = (value: unknown): value is number => isInteger(value) && value >= 0;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Validates `value` as `string`.
|
|
42
|
+
*/
|
|
43
|
+
export const isString = (value: unknown): value is string => typeof value === 'string';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Validates `value` as `array`.
|
|
47
|
+
*/
|
|
48
|
+
export const isArray = <T = unknown>(value: unknown): value is T[] => Array.isArray(value);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Validates `value` as `null`.
|
|
52
|
+
*/
|
|
53
|
+
export const isNull = (value: unknown): value is null => value === null;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Validates `value` as `undefined`.
|
|
57
|
+
*/
|
|
58
|
+
export const isUndefined = (value: unknown): value is undefined => value === undefined;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Validates `value` as `null` or `undefined`.
|
|
62
|
+
*/
|
|
63
|
+
export const isNullOrUndefined = (value: unknown): value is null | undefined => isNull(value) || isUndefined(value);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Validates `value` as plain `object`.
|
|
67
|
+
*/
|
|
68
|
+
export const isPlainObject = (value: unknown): value is Record<string, unknown> =>
|
|
69
|
+
Object.prototype.toString.call(value) === '[object Object]';
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Validates `value` as `function`.
|
|
73
|
+
*/
|
|
74
|
+
export const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Validates `value` as `type`.
|
|
78
|
+
*/
|
|
79
|
+
export const isInstance = <T>(value: unknown, type: new (...args: any[]) => T): value is T =>
|
|
80
|
+
isFunction(type) && value instanceof type;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Validates `value` as `enum`.
|
|
84
|
+
*/
|
|
85
|
+
export const isEnum = (
|
|
86
|
+
value: unknown,
|
|
87
|
+
choices:
|
|
88
|
+
| ReadonlyArray<string | number>
|
|
89
|
+
| ReadonlySet<string | number>
|
|
90
|
+
| Readonly<Record<string | number, string | number>>
|
|
91
|
+
| null
|
|
92
|
+
| undefined
|
|
93
|
+
): boolean => {
|
|
94
|
+
if (!isString(value) && !isNumber(value)) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return (
|
|
98
|
+
(isArray<string | number>(choices) && choices.includes(value)) ||
|
|
99
|
+
(isPlainObject(choices) && Object.values(choices).includes(value)) ||
|
|
100
|
+
(isInstance(choices, Set) && (choices as Set<string | number>).has(value))
|
|
101
|
+
);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Type check an array of values using a validator.
|
|
106
|
+
*/
|
|
107
|
+
export const isArrayOf = <T>(values: unknown, validator: Validator<T>): values is T[] => {
|
|
108
|
+
if (!isArray(values)) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
for (const value of values) {
|
|
112
|
+
if (!validator(value)) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Type check a plain object of values using a validator.
|
|
121
|
+
*/
|
|
122
|
+
export const isPlainObjectOf = <T>(
|
|
123
|
+
record: unknown,
|
|
124
|
+
validator: Validator<T>
|
|
125
|
+
): record is Record<string | number, T> => {
|
|
126
|
+
if (!isPlainObject(record)) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
for (const value of Object.values(record)) {
|
|
130
|
+
if (!validator(value)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Refine a base validator with an extra condition.
|
|
139
|
+
*/
|
|
140
|
+
export const refineValidator = <T>(
|
|
141
|
+
base: Validator<T>,
|
|
142
|
+
predicate: (value: T) => boolean,
|
|
143
|
+
name: string | null = null
|
|
144
|
+
): Validator<T> => {
|
|
145
|
+
const refinedValidator = (value: unknown): value is T => base(value) && predicate(value as T);
|
|
146
|
+
Object.defineProperty(refinedValidator, 'name', {
|
|
147
|
+
value: isString(name) ? name : `${base.name}Refined`,
|
|
148
|
+
});
|
|
149
|
+
return refinedValidator;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Logical OR of two validators.
|
|
154
|
+
*/
|
|
155
|
+
export const isAnyOf =
|
|
156
|
+
<A, B>(a: Validator<A>, b: Validator<B>): Validator<A | B> =>
|
|
157
|
+
(value: unknown): value is A | B =>
|
|
158
|
+
a(value) || b(value);
|
|
159
|
+
|
|
160
|
+
export const isNumberGreater = (min: number): Validator<number> =>
|
|
161
|
+
refineValidator(isNumber, (value) => isGreater(value, min));
|
|
162
|
+
|
|
163
|
+
export const isNumberGreaterOrEqual = (min: number): Validator<number> =>
|
|
164
|
+
refineValidator(isNumber, (value) => isGreaterOrEqual(value, min));
|
|
165
|
+
|
|
166
|
+
export const isNumberLess = (min: number): Validator<number> =>
|
|
167
|
+
refineValidator(isNumber, (value) => isLess(value, min));
|
|
168
|
+
|
|
169
|
+
export const isNumberLessOrEqual = (min: number): Validator<number> =>
|
|
170
|
+
refineValidator(isNumber, (value) => isLessOrEqual(value, min));
|
|
171
|
+
|
|
172
|
+
export const isNumberInRange = (min: number, max: number): Validator<number> =>
|
|
173
|
+
refineValidator(isNumber, (value) => isInRange(value, min, max));
|
|
174
|
+
|
|
175
|
+
export const isNumberEqual = (expected: number): Validator<number> =>
|
|
176
|
+
refineValidator(isNumber, (value) => isEqual(value, expected));
|
|
177
|
+
|
|
178
|
+
export const isIntegerGreater = (min: number): Validator<number> =>
|
|
179
|
+
refineValidator(isInteger, (value) => isGreater(value, min));
|
|
180
|
+
|
|
181
|
+
export const isIntegerGreaterOrEqual = (min: number): Validator<number> =>
|
|
182
|
+
refineValidator(isInteger, (value) => isGreaterOrEqual(value, min));
|
|
183
|
+
|
|
184
|
+
export const isIntegerLess = (min: number): Validator<number> =>
|
|
185
|
+
refineValidator(isInteger, (value) => isLess(value, min));
|
|
186
|
+
|
|
187
|
+
export const isIntegerLessOrEqual = (min: number): Validator<number> =>
|
|
188
|
+
refineValidator(isInteger, (value) => isLessOrEqual(value, min));
|
|
189
|
+
|
|
190
|
+
export const isIntegerInRange = (min: number, max: number): Validator<number> =>
|
|
191
|
+
refineValidator(isInteger, (value) => isInRange(value, min, max));
|
|
192
|
+
|
|
193
|
+
export const isIntegerEqual = (expected: number): Validator<number> =>
|
|
194
|
+
refineValidator(isInteger, (value) => isEqual(value, expected));
|
|
195
|
+
|
|
196
|
+
export const isStringLengthGreater = (min: number): Validator<string> =>
|
|
197
|
+
refineValidator(isString, (value) => isGreater(value.length, min));
|
|
198
|
+
|
|
199
|
+
export const isStringLengthGreaterOrEqual = (min: number): Validator<string> =>
|
|
200
|
+
refineValidator(isString, (value) => isGreaterOrEqual(value.length, min));
|
|
201
|
+
|
|
202
|
+
export const isStringLengthLess = (min: number): Validator<string> =>
|
|
203
|
+
refineValidator(isString, (value) => isLess(value.length, min));
|
|
204
|
+
|
|
205
|
+
export const isStringLengthLessOrEqual = (min: number): Validator<string> =>
|
|
206
|
+
refineValidator(isString, (value) => isLessOrEqual(value.length, min));
|
|
207
|
+
|
|
208
|
+
export const isStringLengthInRange = (min: number, max: number): Validator<string> =>
|
|
209
|
+
refineValidator(isString, (value) => isInRange(value.length, min, max));
|
|
210
|
+
|
|
211
|
+
export const isStringLengthEqual = (expected: number): Validator<string> =>
|
|
212
|
+
refineValidator(isString, (value) => isEqual(value.length, expected));
|
|
213
|
+
|
|
214
|
+
export const isArrayLengthGreater = (min: number): Validator<unknown[]> =>
|
|
215
|
+
refineValidator(isArray, (value) => isGreater(value.length, min));
|
|
216
|
+
|
|
217
|
+
export const isArrayLengthGreaterOrEqual = (min: number): Validator<unknown[]> =>
|
|
218
|
+
refineValidator(isArray, (value) => isGreaterOrEqual(value.length, min));
|
|
219
|
+
|
|
220
|
+
export const isArrayLengthLess = (min: number): Validator<unknown[]> =>
|
|
221
|
+
refineValidator(isArray, (value) => isLess(value.length, min));
|
|
222
|
+
|
|
223
|
+
export const isArrayLengthLessOrEqual = (min: number): Validator<unknown[]> =>
|
|
224
|
+
refineValidator(isArray, (value) => isLessOrEqual(value.length, min));
|
|
225
|
+
|
|
226
|
+
export const isArrayLengthInRange = (min: number, max: number): Validator<unknown[]> =>
|
|
227
|
+
refineValidator(isArray, (value) => isInRange(value.length, min, max));
|
|
228
|
+
|
|
229
|
+
export const isArrayLengthEqual = (expected: number): Validator<unknown[]> =>
|
|
230
|
+
refineValidator(isArray, (value) => isEqual(value.length, expected));
|
package/.vscode/extensions.json
DELETED
package/.vscode/settings.json
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"files.watcherExclude": {
|
|
3
|
-
"**/.git/objects/**": true,
|
|
4
|
-
"**/.git/subtree-cache/**": true,
|
|
5
|
-
"**/build/**": true,
|
|
6
|
-
"**/node_modules/**": true
|
|
7
|
-
},
|
|
8
|
-
"editor.codeActionsOnSave": {
|
|
9
|
-
"source.removeUnusedImports": "explicit",
|
|
10
|
-
"source.organizeImports": "explicit"
|
|
11
|
-
},
|
|
12
|
-
"oxc.enable": true,
|
|
13
|
-
"[javascript]": {
|
|
14
|
-
"editor.defaultFormatter": "oxc.oxc-vscode"
|
|
15
|
-
},
|
|
16
|
-
"[javascriptreact]": {
|
|
17
|
-
"editor.defaultFormatter": "oxc.oxc-vscode"
|
|
18
|
-
},
|
|
19
|
-
"javascript.updateImportsOnFileMove.enabled": "always",
|
|
20
|
-
"[typescript]": {
|
|
21
|
-
"editor.defaultFormatter": "oxc.oxc-vscode",
|
|
22
|
-
},
|
|
23
|
-
"[typescriptreact]": {
|
|
24
|
-
"editor.defaultFormatter": "oxc.oxc-vscode"
|
|
25
|
-
},
|
|
26
|
-
"typescript.updateImportsOnFileMove.enabled": "always",
|
|
27
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export class AbstractLogHandler {
|
|
2
|
-
/**
|
|
3
|
-
* Abstract log handler.
|
|
4
|
-
* @param {number} level - Log handler level.
|
|
5
|
-
*/
|
|
6
|
-
constructor(level) {
|
|
7
|
-
this.level = level;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Emit log record.
|
|
12
|
-
* @param {import('./Logger.js').Logger} logger - Logger instance.
|
|
13
|
-
* @param {number} timestamp - Log timestamp.
|
|
14
|
-
* @param {number} level - Log level.
|
|
15
|
-
* @param {string} message - Log message.
|
|
16
|
-
* @param {object | null | undefined} extra - Log extra data.
|
|
17
|
-
* @param {Error | null | undefined} error - Log error.
|
|
18
|
-
* @throws {Error}
|
|
19
|
-
*/
|
|
20
|
-
emit(logger, timestamp, level, message, extra, error) {
|
|
21
|
-
throw new Error('Not implemented.');
|
|
22
|
-
}
|
|
23
|
-
}
|