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