@naturalcycles/js-lib 14.42.1 → 14.46.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 (139) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.js +7 -3
  4. package/dist/json-schema/from-data/generateJsonSchemaFromData.d.ts +7 -0
  5. package/dist/json-schema/from-data/generateJsonSchemaFromData.js +90 -0
  6. package/dist/json-schema/jsonSchema.model.d.ts +7 -0
  7. package/dist/json-schema/jsonSchemaBuilder.d.ts +3 -0
  8. package/dist/json-schema/jsonSchemaBuilder.js +9 -0
  9. package/dist/string/stringifyAny.d.ts +1 -1
  10. package/dist/string/stringifyAny.js +1 -1
  11. package/dist/typeFest.d.ts +16 -0
  12. package/dist/vendor/is.d.ts +224 -0
  13. package/dist/vendor/is.js +466 -0
  14. package/dist-esm/array/array.util.js +0 -1
  15. package/dist-esm/array/range.js +0 -1
  16. package/dist-esm/decorators/createPromiseDecorator.js +0 -1
  17. package/dist-esm/decorators/debounce.decorator.js +0 -1
  18. package/dist-esm/decorators/debounce.js +0 -1
  19. package/dist-esm/decorators/decorator.util.js +0 -1
  20. package/dist-esm/decorators/logMethod.decorator.js +0 -1
  21. package/dist-esm/decorators/memo.decorator.js +0 -1
  22. package/dist-esm/decorators/memo.util.js +0 -1
  23. package/dist-esm/decorators/memoFn.js +0 -1
  24. package/dist-esm/decorators/memoSimple.decorator.js +0 -1
  25. package/dist-esm/decorators/retry.decorator.js +0 -1
  26. package/dist-esm/decorators/timeout.decorator.js +0 -1
  27. package/dist-esm/error/app.error.js +0 -1
  28. package/dist-esm/error/assert.js +0 -1
  29. package/dist-esm/error/error.model.js +0 -1
  30. package/dist-esm/error/error.util.js +0 -1
  31. package/dist-esm/error/errorMode.js +0 -1
  32. package/dist-esm/error/http.error.js +0 -1
  33. package/dist-esm/error/try.js +0 -1
  34. package/dist-esm/error/tryCatch.js +0 -1
  35. package/dist-esm/index.js +3 -2
  36. package/dist-esm/json-schema/from-data/generateJsonSchemaFromData.js +86 -0
  37. package/dist-esm/json-schema/jsonSchema.cnst.js +0 -1
  38. package/dist-esm/json-schema/jsonSchema.model.js +0 -1
  39. package/dist-esm/json-schema/jsonSchema.util.js +0 -1
  40. package/dist-esm/json-schema/jsonSchemaBuilder.js +9 -1
  41. package/dist-esm/json-schema/jsonSchemas.js +0 -1
  42. package/dist-esm/lodash.types.js +0 -1
  43. package/dist-esm/math/math.util.js +0 -1
  44. package/dist-esm/math/sma.js +0 -1
  45. package/dist-esm/number/createDeterministicRandom.js +0 -1
  46. package/dist-esm/number/number.util.js +0 -1
  47. package/dist-esm/object/deepEquals.js +0 -1
  48. package/dist-esm/object/object.util.js +0 -1
  49. package/dist-esm/object/sortObject.js +0 -1
  50. package/dist-esm/object/sortObjectDeep.js +0 -1
  51. package/dist-esm/promise/AggregatedError.js +0 -1
  52. package/dist-esm/promise/pBatch.js +0 -1
  53. package/dist-esm/promise/pDefer.js +0 -1
  54. package/dist-esm/promise/pDelay.js +0 -1
  55. package/dist-esm/promise/pFilter.js +0 -1
  56. package/dist-esm/promise/pHang.js +0 -1
  57. package/dist-esm/promise/pMap.js +0 -1
  58. package/dist-esm/promise/pProps.js +0 -1
  59. package/dist-esm/promise/pRetry.js +0 -1
  60. package/dist-esm/promise/pState.js +0 -1
  61. package/dist-esm/promise/pTimeout.js +0 -1
  62. package/dist-esm/promise/pTuple.js +0 -1
  63. package/dist-esm/string/case.js +0 -1
  64. package/dist-esm/string/json.util.js +0 -1
  65. package/dist-esm/string/lodash/unicodeWords.js +0 -1
  66. package/dist-esm/string/lodash/words.js +0 -1
  67. package/dist-esm/string/string.util.js +0 -1
  68. package/dist-esm/string/stringifyAny.js +1 -2
  69. package/dist-esm/time/time.util.js +0 -1
  70. package/dist-esm/typeFest.js +0 -1
  71. package/dist-esm/types.js +0 -1
  72. package/dist-esm/unit/size.util.js +0 -1
  73. package/dist-esm/vendor/is.js +463 -0
  74. package/package.json +2 -1
  75. package/src/index.ts +4 -0
  76. package/src/json-schema/from-data/generateJsonSchemaFromData.ts +120 -0
  77. package/src/json-schema/jsonSchema.model.ts +8 -0
  78. package/src/json-schema/jsonSchemaBuilder.ts +16 -10
  79. package/src/string/stringifyAny.ts +2 -2
  80. package/src/typeFest.ts +30 -0
  81. package/src/vendor/is.ts +837 -0
  82. package/dist-esm/array/array.util.js.map +0 -1
  83. package/dist-esm/array/range.js.map +0 -1
  84. package/dist-esm/decorators/createPromiseDecorator.js.map +0 -1
  85. package/dist-esm/decorators/debounce.decorator.js.map +0 -1
  86. package/dist-esm/decorators/debounce.js.map +0 -1
  87. package/dist-esm/decorators/decorator.util.js.map +0 -1
  88. package/dist-esm/decorators/logMethod.decorator.js.map +0 -1
  89. package/dist-esm/decorators/memo.decorator.js.map +0 -1
  90. package/dist-esm/decorators/memo.util.js.map +0 -1
  91. package/dist-esm/decorators/memoFn.js.map +0 -1
  92. package/dist-esm/decorators/memoSimple.decorator.js.map +0 -1
  93. package/dist-esm/decorators/retry.decorator.js.map +0 -1
  94. package/dist-esm/decorators/timeout.decorator.js.map +0 -1
  95. package/dist-esm/error/app.error.js.map +0 -1
  96. package/dist-esm/error/assert.js.map +0 -1
  97. package/dist-esm/error/error.model.js.map +0 -1
  98. package/dist-esm/error/error.util.js.map +0 -1
  99. package/dist-esm/error/errorMode.js.map +0 -1
  100. package/dist-esm/error/http.error.js.map +0 -1
  101. package/dist-esm/error/try.js.map +0 -1
  102. package/dist-esm/error/tryCatch.js.map +0 -1
  103. package/dist-esm/index.js.map +0 -1
  104. package/dist-esm/json-schema/jsonSchema.cnst.js.map +0 -1
  105. package/dist-esm/json-schema/jsonSchema.model.js.map +0 -1
  106. package/dist-esm/json-schema/jsonSchema.util.js.map +0 -1
  107. package/dist-esm/json-schema/jsonSchemaBuilder.js.map +0 -1
  108. package/dist-esm/json-schema/jsonSchemas.js.map +0 -1
  109. package/dist-esm/lodash.types.js.map +0 -1
  110. package/dist-esm/math/math.util.js.map +0 -1
  111. package/dist-esm/math/sma.js.map +0 -1
  112. package/dist-esm/number/createDeterministicRandom.js.map +0 -1
  113. package/dist-esm/number/number.util.js.map +0 -1
  114. package/dist-esm/object/deepEquals.js.map +0 -1
  115. package/dist-esm/object/object.util.js.map +0 -1
  116. package/dist-esm/object/sortObject.js.map +0 -1
  117. package/dist-esm/object/sortObjectDeep.js.map +0 -1
  118. package/dist-esm/promise/AggregatedError.js.map +0 -1
  119. package/dist-esm/promise/pBatch.js.map +0 -1
  120. package/dist-esm/promise/pDefer.js.map +0 -1
  121. package/dist-esm/promise/pDelay.js.map +0 -1
  122. package/dist-esm/promise/pFilter.js.map +0 -1
  123. package/dist-esm/promise/pHang.js.map +0 -1
  124. package/dist-esm/promise/pMap.js.map +0 -1
  125. package/dist-esm/promise/pProps.js.map +0 -1
  126. package/dist-esm/promise/pRetry.js.map +0 -1
  127. package/dist-esm/promise/pState.js.map +0 -1
  128. package/dist-esm/promise/pTimeout.js.map +0 -1
  129. package/dist-esm/promise/pTuple.js.map +0 -1
  130. package/dist-esm/string/case.js.map +0 -1
  131. package/dist-esm/string/json.util.js.map +0 -1
  132. package/dist-esm/string/lodash/unicodeWords.js.map +0 -1
  133. package/dist-esm/string/lodash/words.js.map +0 -1
  134. package/dist-esm/string/string.util.js.map +0 -1
  135. package/dist-esm/string/stringifyAny.js.map +0 -1
  136. package/dist-esm/time/time.util.js.map +0 -1
  137. package/dist-esm/typeFest.js.map +0 -1
  138. package/dist-esm/types.js.map +0 -1
  139. package/dist-esm/unit/size.util.js.map +0 -1
@@ -0,0 +1,837 @@
1
+ /// <reference lib="es2018"/>
2
+ /// <reference lib="dom"/>
3
+ /// <reference types="node"/>
4
+
5
+ /*
6
+ From: https://github.com/sindresorhus/is
7
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
8
+ */
9
+
10
+ /* eslint-disable id-blacklist, no-prototype-builtins */
11
+ /* tslint:disable */
12
+
13
+ import { Class, ObservableLike, Primitive, TypedArray } from '../typeFest'
14
+
15
+ const typedArrayTypeNames = [
16
+ 'Int8Array',
17
+ 'Uint8Array',
18
+ 'Uint8ClampedArray',
19
+ 'Int16Array',
20
+ 'Uint16Array',
21
+ 'Int32Array',
22
+ 'Uint32Array',
23
+ 'Float32Array',
24
+ 'Float64Array',
25
+ 'BigInt64Array',
26
+ 'BigUint64Array',
27
+ ] as const
28
+
29
+ type TypedArrayTypeName = typeof typedArrayTypeNames[number]
30
+
31
+ function isTypedArrayName(name: unknown): name is TypedArrayTypeName {
32
+ return typedArrayTypeNames.includes(name as TypedArrayTypeName)
33
+ }
34
+
35
+ const objectTypeNames = [
36
+ 'Function',
37
+ 'Generator',
38
+ 'AsyncGenerator',
39
+ 'GeneratorFunction',
40
+ 'AsyncGeneratorFunction',
41
+ 'AsyncFunction',
42
+ 'Observable',
43
+ 'Array',
44
+ 'Buffer',
45
+ 'Object',
46
+ 'RegExp',
47
+ 'Date',
48
+ 'Error',
49
+ 'Map',
50
+ 'Set',
51
+ 'WeakMap',
52
+ 'WeakSet',
53
+ 'ArrayBuffer',
54
+ 'SharedArrayBuffer',
55
+ 'DataView',
56
+ 'Promise',
57
+ 'URL',
58
+ 'FormData',
59
+ 'URLSearchParams',
60
+ 'HTMLElement',
61
+ ...typedArrayTypeNames,
62
+ ] as const
63
+
64
+ type ObjectTypeName = typeof objectTypeNames[number]
65
+
66
+ function isObjectTypeName(name: unknown): name is ObjectTypeName {
67
+ return objectTypeNames.includes(name as ObjectTypeName)
68
+ }
69
+
70
+ const primitiveTypeNames = [
71
+ 'null',
72
+ 'undefined',
73
+ 'string',
74
+ 'number',
75
+ 'bigint',
76
+ 'boolean',
77
+ 'symbol',
78
+ ] as const
79
+
80
+ type PrimitiveTypeName = typeof primitiveTypeNames[number]
81
+
82
+ function isPrimitiveTypeName(name: unknown): name is PrimitiveTypeName {
83
+ return primitiveTypeNames.includes(name as PrimitiveTypeName)
84
+ }
85
+
86
+ export type TypeName = ObjectTypeName | PrimitiveTypeName
87
+
88
+ // eslint-disable-next-line @typescript-eslint/ban-types
89
+ function isOfType<T extends Primitive | Function>(type: PrimitiveTypeName | 'function') {
90
+ return (value: unknown): value is T => typeof value === type
91
+ }
92
+
93
+ const { toString } = Object.prototype
94
+ const getObjectType = (value: unknown): ObjectTypeName | undefined => {
95
+ const objectTypeName = toString.call(value).slice(8, -1)
96
+
97
+ if (/HTML\w+Element/.test(objectTypeName) && is.domElement(value)) {
98
+ return 'HTMLElement'
99
+ }
100
+
101
+ if (isObjectTypeName(objectTypeName)) {
102
+ return objectTypeName
103
+ }
104
+
105
+ return undefined
106
+ }
107
+
108
+ const isObjectOfType =
109
+ <T>(type: ObjectTypeName) =>
110
+ (value: unknown): value is T =>
111
+ getObjectType(value) === type
112
+
113
+ export function is(value: unknown): TypeName {
114
+ if (value === null) {
115
+ return 'null'
116
+ }
117
+
118
+ switch (typeof value) {
119
+ case 'undefined':
120
+ return 'undefined'
121
+ case 'string':
122
+ return 'string'
123
+ case 'number':
124
+ return 'number'
125
+ case 'boolean':
126
+ return 'boolean'
127
+ case 'function':
128
+ return 'Function'
129
+ case 'bigint':
130
+ return 'bigint'
131
+ case 'symbol':
132
+ return 'symbol'
133
+ default:
134
+ }
135
+
136
+ if (is.observable(value)) {
137
+ return 'Observable'
138
+ }
139
+
140
+ if (is.array(value)) {
141
+ return 'Array'
142
+ }
143
+
144
+ if (is.buffer(value)) {
145
+ return 'Buffer'
146
+ }
147
+
148
+ const tagType = getObjectType(value)
149
+ if (tagType) {
150
+ return tagType
151
+ }
152
+
153
+ if (
154
+ (value as any) instanceof String ||
155
+ (value as any) instanceof Boolean ||
156
+ (value as any) instanceof Number
157
+ ) {
158
+ throw new TypeError("Please don't use object wrappers for primitive types")
159
+ }
160
+
161
+ return 'Object'
162
+ }
163
+
164
+ is.undefined = isOfType<undefined>('undefined')
165
+ is.string = isOfType<string>('string')
166
+
167
+ const isNumberType = isOfType<number>('number')
168
+ is.number = (value: unknown): value is number => isNumberType(value) && !is.nan(value)
169
+
170
+ is.bigint = isOfType<bigint>('bigint')
171
+
172
+ // eslint-disable-next-line @typescript-eslint/ban-types
173
+ is.function_ = isOfType<Function>('function')
174
+
175
+ is.null_ = (value: unknown): value is null => value === null
176
+ is.class_ = (value: unknown): value is Class =>
177
+ is.function_(value) && value.toString().startsWith('class ')
178
+ is.boolean = (value: unknown): value is boolean => value === true || value === false
179
+ is.symbol = isOfType<symbol>('symbol')
180
+
181
+ is.numericString = (value: unknown): value is string =>
182
+ is.string(value) && !is.emptyStringOrWhitespace(value) && !Number.isNaN(Number(value))
183
+
184
+ is.array = <T = unknown>(value: unknown, assertion?: (value: T) => value is T): value is T[] => {
185
+ if (!Array.isArray(value)) {
186
+ return false
187
+ }
188
+
189
+ if (!is.function_(assertion)) {
190
+ return true
191
+ }
192
+
193
+ return value.every(assertion)
194
+ }
195
+
196
+ is.buffer = (value: unknown): value is Buffer =>
197
+ (value as any)?.constructor?.isBuffer?.(value) ?? false
198
+
199
+ is.nullOrUndefined = (value: unknown): value is null | undefined =>
200
+ is.null_(value) || is.undefined(value)
201
+ is.object = (value: unknown): value is object =>
202
+ !is.null_(value) && (typeof value === 'object' || is.function_(value))
203
+ is.iterable = <T = unknown>(value: unknown): value is IterableIterator<T> =>
204
+ is.function_((value as IterableIterator<T>)?.[Symbol.iterator])
205
+
206
+ is.asyncIterable = <T = unknown>(value: unknown): value is AsyncIterableIterator<T> =>
207
+ is.function_((value as AsyncIterableIterator<T>)?.[Symbol.asyncIterator])
208
+
209
+ is.generator = (value: unknown): value is Generator =>
210
+ is.iterable(value) && is.function_(value.next) && is.function_(value.throw)
211
+
212
+ is.asyncGenerator = (value: unknown): value is AsyncGenerator =>
213
+ is.asyncIterable(value) && is.function_(value.next) && is.function_(value.throw)
214
+
215
+ is.nativePromise = <T = unknown>(value: unknown): value is Promise<T> =>
216
+ isObjectOfType<Promise<T>>('Promise')(value)
217
+
218
+ const hasPromiseAPI = <T = unknown>(value: unknown): value is Promise<T> =>
219
+ is.function_((value as Promise<T>)?.then) && is.function_((value as Promise<T>)?.catch)
220
+
221
+ is.promise = <T = unknown>(value: unknown): value is Promise<T> =>
222
+ is.nativePromise(value) || hasPromiseAPI(value)
223
+
224
+ is.generatorFunction = isObjectOfType<GeneratorFunction>('GeneratorFunction')
225
+
226
+ is.asyncGeneratorFunction = (value: unknown): value is (...args: any[]) => Promise<unknown> =>
227
+ getObjectType(value) === 'AsyncGeneratorFunction'
228
+
229
+ is.asyncFunction = <T = unknown>(value: unknown): value is (...args: any[]) => Promise<T> =>
230
+ getObjectType(value) === 'AsyncFunction'
231
+
232
+ // eslint-disable-next-line no-prototype-builtins, @typescript-eslint/ban-types
233
+ is.boundFunction = (value: unknown): value is Function =>
234
+ is.function_(value) && !value.hasOwnProperty('prototype')
235
+
236
+ is.regExp = isObjectOfType<RegExp>('RegExp')
237
+ is.date = isObjectOfType<Date>('Date')
238
+ is.error = isObjectOfType<Error>('Error')
239
+ is.map = <Key = unknown, Value = unknown>(value: unknown): value is Map<Key, Value> =>
240
+ isObjectOfType<Map<Key, Value>>('Map')(value)
241
+ is.set = <T = unknown>(value: unknown): value is Set<T> => isObjectOfType<Set<T>>('Set')(value)
242
+ is.weakMap = <Key extends object = object, Value = unknown>(
243
+ value: unknown,
244
+ ): value is WeakMap<Key, Value> => isObjectOfType<WeakMap<Key, Value>>('WeakMap')(value)
245
+ is.weakSet = (value: unknown): value is WeakSet<object> =>
246
+ isObjectOfType<WeakSet<object>>('WeakSet')(value)
247
+
248
+ is.int8Array = isObjectOfType<Int8Array>('Int8Array')
249
+ is.uint8Array = isObjectOfType<Uint8Array>('Uint8Array')
250
+ is.uint8ClampedArray = isObjectOfType<Uint8ClampedArray>('Uint8ClampedArray')
251
+ is.int16Array = isObjectOfType<Int16Array>('Int16Array')
252
+ is.uint16Array = isObjectOfType<Uint16Array>('Uint16Array')
253
+ is.int32Array = isObjectOfType<Int32Array>('Int32Array')
254
+ is.uint32Array = isObjectOfType<Uint32Array>('Uint32Array')
255
+ is.float32Array = isObjectOfType<Float32Array>('Float32Array')
256
+ is.float64Array = isObjectOfType<Float64Array>('Float64Array')
257
+ is.bigInt64Array = isObjectOfType<BigInt64Array>('BigInt64Array')
258
+ is.bigUint64Array = isObjectOfType<BigUint64Array>('BigUint64Array')
259
+
260
+ is.arrayBuffer = isObjectOfType<ArrayBuffer>('ArrayBuffer')
261
+ is.sharedArrayBuffer = isObjectOfType<SharedArrayBuffer>('SharedArrayBuffer')
262
+ is.dataView = isObjectOfType<DataView>('DataView')
263
+
264
+ is.directInstanceOf = <T>(instance: unknown, class_: Class<T>): instance is T =>
265
+ Object.getPrototypeOf(instance) === class_.prototype
266
+ is.urlInstance = (value: unknown): value is URL => isObjectOfType<URL>('URL')(value)
267
+
268
+ is.urlString = (value: unknown): value is string => {
269
+ if (!is.string(value)) {
270
+ return false
271
+ }
272
+
273
+ try {
274
+ new URL(value) // eslint-disable-line no-new
275
+ return true
276
+ } catch {
277
+ return false
278
+ }
279
+ }
280
+
281
+ // TODO: Use the `not` operator with a type guard here when it's available.
282
+ // Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);`
283
+ is.truthy = (value: unknown) => Boolean(value)
284
+ // Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);`
285
+ is.falsy = (value: unknown) => !value
286
+
287
+ is.nan = (value: unknown) => Number.isNaN(value as number)
288
+
289
+ is.primitive = (value: unknown): value is Primitive =>
290
+ is.null_(value) || isPrimitiveTypeName(typeof value)
291
+
292
+ is.integer = (value: unknown): value is number => Number.isInteger(value as number)
293
+ is.safeInteger = (value: unknown): value is number => Number.isSafeInteger(value as number)
294
+
295
+ is.plainObject = <Value = unknown>(value: unknown): value is Record<PropertyKey, Value> => {
296
+ // From: https://github.com/sindresorhus/is-plain-obj/blob/main/index.js
297
+ if (toString.call(value) !== '[object Object]') {
298
+ return false
299
+ }
300
+
301
+ const prototype = Object.getPrototypeOf(value)
302
+
303
+ return prototype === null || prototype === Object.getPrototypeOf({})
304
+ }
305
+
306
+ is.typedArray = (value: unknown): value is TypedArray => isTypedArrayName(getObjectType(value))
307
+
308
+ export interface ArrayLike<T> {
309
+ readonly [index: number]: T
310
+ readonly length: number
311
+ }
312
+
313
+ const isValidLength = (value: unknown): value is number => is.safeInteger(value) && value >= 0
314
+ is.arrayLike = <T = unknown>(value: unknown): value is ArrayLike<T> =>
315
+ !is.nullOrUndefined(value) &&
316
+ !is.function_(value) &&
317
+ isValidLength((value as ArrayLike<T>).length)
318
+
319
+ is.inRange = (value: number, range: number | number[]): value is number => {
320
+ if (is.number(range)) {
321
+ return value >= Math.min(0, range) && value <= Math.max(range, 0)
322
+ }
323
+
324
+ if (is.array(range) && range.length === 2) {
325
+ return value >= Math.min(...range) && value <= Math.max(...range)
326
+ }
327
+
328
+ throw new TypeError(`Invalid range: ${JSON.stringify(range)}`)
329
+ }
330
+
331
+ const NODE_TYPE_ELEMENT = 1
332
+ const DOM_PROPERTIES_TO_CHECK: (keyof HTMLElement)[] = [
333
+ 'innerHTML',
334
+ 'ownerDocument',
335
+ 'style',
336
+ 'attributes',
337
+ 'nodeValue',
338
+ ]
339
+
340
+ is.domElement = (value: unknown): value is HTMLElement => {
341
+ return (
342
+ is.object(value) &&
343
+ (value as HTMLElement).nodeType === NODE_TYPE_ELEMENT &&
344
+ is.string((value as HTMLElement).nodeName) &&
345
+ !is.plainObject(value) &&
346
+ DOM_PROPERTIES_TO_CHECK.every(property => property in value)
347
+ )
348
+ }
349
+
350
+ is.observable = (value: unknown): value is ObservableLike => {
351
+ if (!value) {
352
+ return false
353
+ }
354
+
355
+ if (value === (value as any)[Symbol.observable]?.()) {
356
+ return true
357
+ }
358
+
359
+ if (value === (value as any)['@@observable']?.()) {
360
+ return true
361
+ }
362
+
363
+ return false
364
+ }
365
+
366
+ export interface NodeStream extends NodeJS.EventEmitter {
367
+ pipe<T extends NodeJS.WritableStream>(destination: T, options?: { end?: boolean }): T
368
+ }
369
+
370
+ is.nodeStream = (value: unknown): value is NodeStream =>
371
+ is.object(value) && is.function_((value as NodeStream).pipe) && !is.observable(value)
372
+
373
+ is.infinite = (value: unknown): value is number => value === Infinity || value === -Infinity
374
+
375
+ const isAbsoluteMod2 =
376
+ (remainder: number) =>
377
+ (value: number): value is number =>
378
+ is.integer(value) && Math.abs(value % 2) === remainder
379
+ is.evenInteger = isAbsoluteMod2(0)
380
+ is.oddInteger = isAbsoluteMod2(1)
381
+
382
+ is.emptyArray = (value: unknown): value is never[] => is.array(value) && value.length === 0
383
+ is.nonEmptyArray = (value: unknown): value is unknown[] => is.array(value) && value.length > 0
384
+
385
+ is.emptyString = (value: unknown): value is '' => is.string(value) && value.length === 0
386
+
387
+ // TODO: Use `not ''` when the `not` operator is available.
388
+ is.nonEmptyString = (value: unknown): value is string => is.string(value) && value.length > 0
389
+
390
+ const isWhiteSpaceString = (value: unknown): value is string =>
391
+ is.string(value) && !/\S/.test(value)
392
+ is.emptyStringOrWhitespace = (value: unknown): value is string =>
393
+ is.emptyString(value) || isWhiteSpaceString(value)
394
+
395
+ is.emptyObject = <Key extends keyof any = string>(value: unknown): value is Record<Key, never> =>
396
+ is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0
397
+
398
+ // TODO: Use `not` operator here to remove `Map` and `Set` from type guard:
399
+ // - https://github.com/Microsoft/TypeScript/pull/29317
400
+ is.nonEmptyObject = <Key extends keyof any = string, Value = unknown>(
401
+ value: unknown,
402
+ ): value is Record<Key, Value> =>
403
+ is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0
404
+
405
+ is.emptySet = (value: unknown): value is Set<never> => is.set(value) && value.size === 0
406
+ is.nonEmptySet = <T = unknown>(value: unknown): value is Set<T> => is.set(value) && value.size > 0
407
+
408
+ is.emptyMap = (value: unknown): value is Map<never, never> => is.map(value) && value.size === 0
409
+ is.nonEmptyMap = <Key = unknown, Value = unknown>(value: unknown): value is Map<Key, Value> =>
410
+ is.map(value) && value.size > 0
411
+
412
+ // `PropertyKey` is any value that can be used as an object key (string, number, or symbol)
413
+ is.propertyKey = (value: unknown): value is PropertyKey =>
414
+ is.any([is.string, is.number, is.symbol], value)
415
+ is.formData = (value: unknown): value is FormData => isObjectOfType<FormData>('FormData')(value)
416
+
417
+ is.urlSearchParams = (value: unknown): value is URLSearchParams =>
418
+ isObjectOfType<URLSearchParams>('URLSearchParams')(value)
419
+
420
+ export type Predicate = (value: unknown) => boolean
421
+
422
+ type ArrayMethod = (
423
+ fn: (value: unknown, index: number, array: unknown[]) => boolean,
424
+ thisArg?: unknown,
425
+ ) => boolean
426
+
427
+ const predicateOnArray = (method: ArrayMethod, predicate: Predicate, values: unknown[]) => {
428
+ if (!is.function_(predicate)) {
429
+ throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`)
430
+ }
431
+
432
+ if (values.length === 0) {
433
+ throw new TypeError('Invalid number of values')
434
+ }
435
+
436
+ return method.call(values, predicate)
437
+ }
438
+
439
+ is.any = (predicate: Predicate | Predicate[], ...values: unknown[]): boolean => {
440
+ const predicates = is.array(predicate) ? predicate : [predicate]
441
+ return predicates.some(singlePredicate =>
442
+ predicateOnArray(Array.prototype.some, singlePredicate, values),
443
+ )
444
+ }
445
+
446
+ is.all = (predicate: Predicate, ...values: unknown[]): boolean =>
447
+ predicateOnArray(Array.prototype.every, predicate, values)
448
+
449
+ const assertType = (
450
+ condition: boolean,
451
+ description: string,
452
+ value: unknown,
453
+ options: { multipleValues?: boolean } = {},
454
+ ): asserts condition => {
455
+ if (!condition) {
456
+ const { multipleValues } = options
457
+ const valuesMessage = multipleValues
458
+ ? `received values of types ${[
459
+ ...new Set((value as any[]).map(singleValue => `\`${is(singleValue)}\``)),
460
+ ].join(', ')}`
461
+ : `received value of type \`${is(value)}\``
462
+
463
+ throw new TypeError(`Expected value which is \`${description}\`, ${valuesMessage}.`)
464
+ }
465
+ }
466
+
467
+ export const enum AssertionTypeDescription {
468
+ class_ = 'Class',
469
+ numericString = 'string with a number',
470
+ nullOrUndefined = 'null or undefined',
471
+ iterable = 'Iterable',
472
+ asyncIterable = 'AsyncIterable',
473
+ nativePromise = 'native Promise',
474
+ urlString = 'string with a URL',
475
+ truthy = 'truthy',
476
+ falsy = 'falsy',
477
+ nan = 'NaN',
478
+ primitive = 'primitive',
479
+ integer = 'integer',
480
+ safeInteger = 'integer',
481
+ plainObject = 'plain object',
482
+ arrayLike = 'array-like',
483
+ typedArray = 'TypedArray',
484
+ domElement = 'HTMLElement',
485
+ nodeStream = 'Node.js Stream',
486
+ infinite = 'infinite number',
487
+ emptyArray = 'empty array',
488
+ nonEmptyArray = 'non-empty array',
489
+ emptyString = 'empty string',
490
+ nonEmptyString = 'non-empty string',
491
+ emptyStringOrWhitespace = 'empty string or whitespace',
492
+ emptyObject = 'empty object',
493
+ nonEmptyObject = 'non-empty object',
494
+ emptySet = 'empty set',
495
+ nonEmptySet = 'non-empty set',
496
+ emptyMap = 'empty map',
497
+ nonEmptyMap = 'non-empty map',
498
+
499
+ evenInteger = 'even integer',
500
+ oddInteger = 'odd integer',
501
+
502
+ directInstanceOf = 'T',
503
+ inRange = 'in range',
504
+
505
+ any = 'predicate returns truthy for any value',
506
+ all = 'predicate returns truthy for all values',
507
+ }
508
+
509
+ // Type assertions have to be declared with an explicit type.
510
+ interface Assert {
511
+ // Unknowns.
512
+ undefined: (value: unknown) => asserts value is undefined
513
+ string: (value: unknown) => asserts value is string
514
+ number: (value: unknown) => asserts value is number
515
+ bigint: (value: unknown) => asserts value is bigint
516
+ // eslint-disable-next-line @typescript-eslint/ban-types
517
+ function_: (value: unknown) => asserts value is Function
518
+ null_: (value: unknown) => asserts value is null
519
+ class_: (value: unknown) => asserts value is Class
520
+ boolean: (value: unknown) => asserts value is boolean
521
+ symbol: (value: unknown) => asserts value is symbol
522
+ numericString: (value: unknown) => asserts value is string
523
+ array: <T = unknown>(
524
+ value: unknown,
525
+ assertion?: (element: unknown) => asserts element is T,
526
+ ) => asserts value is T[]
527
+ buffer: (value: unknown) => asserts value is Buffer
528
+ nullOrUndefined: (value: unknown) => asserts value is null | undefined
529
+ object: <Key extends keyof any = string, Value = unknown>(
530
+ value: unknown,
531
+ ) => asserts value is Record<Key, Value>
532
+ iterable: <T = unknown>(value: unknown) => asserts value is Iterable<T>
533
+ asyncIterable: <T = unknown>(value: unknown) => asserts value is AsyncIterable<T>
534
+ generator: (value: unknown) => asserts value is Generator
535
+ asyncGenerator: (value: unknown) => asserts value is AsyncGenerator
536
+ nativePromise: <T = unknown>(value: unknown) => asserts value is Promise<T>
537
+ promise: <T = unknown>(value: unknown) => asserts value is Promise<T>
538
+ generatorFunction: (value: unknown) => asserts value is GeneratorFunction
539
+ asyncGeneratorFunction: (value: unknown) => asserts value is AsyncGeneratorFunction
540
+ // eslint-disable-next-line @typescript-eslint/ban-types
541
+ asyncFunction: (value: unknown) => asserts value is Function
542
+ // eslint-disable-next-line @typescript-eslint/ban-types
543
+ boundFunction: (value: unknown) => asserts value is Function
544
+ regExp: (value: unknown) => asserts value is RegExp
545
+ date: (value: unknown) => asserts value is Date
546
+ error: (value: unknown) => asserts value is Error
547
+ map: <Key = unknown, Value = unknown>(value: unknown) => asserts value is Map<Key, Value>
548
+ set: <T = unknown>(value: unknown) => asserts value is Set<T>
549
+ weakMap: <Key extends object = object, Value = unknown>(
550
+ value: unknown,
551
+ ) => asserts value is WeakMap<Key, Value>
552
+ weakSet: <T extends object = object>(value: unknown) => asserts value is WeakSet<T>
553
+ int8Array: (value: unknown) => asserts value is Int8Array
554
+ uint8Array: (value: unknown) => asserts value is Uint8Array
555
+ uint8ClampedArray: (value: unknown) => asserts value is Uint8ClampedArray
556
+ int16Array: (value: unknown) => asserts value is Int16Array
557
+ uint16Array: (value: unknown) => asserts value is Uint16Array
558
+ int32Array: (value: unknown) => asserts value is Int32Array
559
+ uint32Array: (value: unknown) => asserts value is Uint32Array
560
+ float32Array: (value: unknown) => asserts value is Float32Array
561
+ float64Array: (value: unknown) => asserts value is Float64Array
562
+ bigInt64Array: (value: unknown) => asserts value is BigInt64Array
563
+ bigUint64Array: (value: unknown) => asserts value is BigUint64Array
564
+ arrayBuffer: (value: unknown) => asserts value is ArrayBuffer
565
+ sharedArrayBuffer: (value: unknown) => asserts value is SharedArrayBuffer
566
+ dataView: (value: unknown) => asserts value is DataView
567
+ urlInstance: (value: unknown) => asserts value is URL
568
+ urlString: (value: unknown) => asserts value is string
569
+ truthy: (value: unknown) => asserts value is unknown
570
+ falsy: (value: unknown) => asserts value is unknown
571
+ nan: (value: unknown) => asserts value is unknown
572
+ primitive: (value: unknown) => asserts value is Primitive
573
+ integer: (value: unknown) => asserts value is number
574
+ safeInteger: (value: unknown) => asserts value is number
575
+ plainObject: <Value = unknown>(value: unknown) => asserts value is Record<PropertyKey, Value>
576
+ typedArray: (value: unknown) => asserts value is TypedArray
577
+ arrayLike: <T = unknown>(value: unknown) => asserts value is ArrayLike<T>
578
+ domElement: (value: unknown) => asserts value is HTMLElement
579
+ observable: (value: unknown) => asserts value is ObservableLike
580
+ nodeStream: (value: unknown) => asserts value is NodeStream
581
+ infinite: (value: unknown) => asserts value is number
582
+ emptyArray: (value: unknown) => asserts value is never[]
583
+ nonEmptyArray: (value: unknown) => asserts value is unknown[]
584
+ emptyString: (value: unknown) => asserts value is ''
585
+ nonEmptyString: (value: unknown) => asserts value is string
586
+ emptyStringOrWhitespace: (value: unknown) => asserts value is string
587
+ emptyObject: <Key extends keyof any = string>(
588
+ value: unknown,
589
+ ) => asserts value is Record<Key, never>
590
+ nonEmptyObject: <Key extends keyof any = string, Value = unknown>(
591
+ value: unknown,
592
+ ) => asserts value is Record<Key, Value>
593
+ emptySet: (value: unknown) => asserts value is Set<never>
594
+ nonEmptySet: <T = unknown>(value: unknown) => asserts value is Set<T>
595
+ emptyMap: (value: unknown) => asserts value is Map<never, never>
596
+ nonEmptyMap: <Key = unknown, Value = unknown>(value: unknown) => asserts value is Map<Key, Value>
597
+ propertyKey: (value: unknown) => asserts value is PropertyKey
598
+ formData: (value: unknown) => asserts value is FormData
599
+ urlSearchParams: (value: unknown) => asserts value is URLSearchParams
600
+
601
+ // Numbers.
602
+ evenInteger: (value: number) => asserts value is number
603
+ oddInteger: (value: number) => asserts value is number
604
+
605
+ // Two arguments.
606
+ directInstanceOf: <T>(instance: unknown, class_: Class<T>) => asserts instance is T
607
+ inRange: (value: number, range: number | number[]) => asserts value is number
608
+
609
+ // Variadic functions.
610
+ any: (predicate: Predicate | Predicate[], ...values: unknown[]) => void | never
611
+ all: (predicate: Predicate, ...values: unknown[]) => void | never
612
+ }
613
+
614
+ export const assert: Assert = {
615
+ // Unknowns.
616
+ undefined: (value: unknown): asserts value is undefined =>
617
+ assertType(is.undefined(value), 'undefined', value),
618
+ string: (value: unknown): asserts value is string =>
619
+ assertType(is.string(value), 'string', value),
620
+ number: (value: unknown): asserts value is number =>
621
+ assertType(is.number(value), 'number', value),
622
+ bigint: (value: unknown): asserts value is bigint =>
623
+ assertType(is.bigint(value), 'bigint', value),
624
+ // eslint-disable-next-line @typescript-eslint/ban-types
625
+ function_: (value: unknown): asserts value is Function =>
626
+ assertType(is.function_(value), 'Function', value),
627
+ null_: (value: unknown): asserts value is null => assertType(is.null_(value), 'null', value),
628
+ class_: (value: unknown): asserts value is Class =>
629
+ assertType(is.class_(value), AssertionTypeDescription.class_, value),
630
+ boolean: (value: unknown): asserts value is boolean =>
631
+ assertType(is.boolean(value), 'boolean', value),
632
+ symbol: (value: unknown): asserts value is symbol =>
633
+ assertType(is.symbol(value), 'symbol', value),
634
+ numericString: (value: unknown): asserts value is string =>
635
+ assertType(is.numericString(value), AssertionTypeDescription.numericString, value),
636
+ array: <T = unknown>(
637
+ value: unknown,
638
+ assertion?: (element: unknown) => asserts element is T,
639
+ ): asserts value is T[] => {
640
+ const assert: (condition: boolean, description: string, value: unknown) => asserts condition =
641
+ assertType
642
+ assert(is.array(value), 'Array', value)
643
+
644
+ if (assertion) {
645
+ value.forEach(assertion)
646
+ }
647
+ },
648
+ buffer: (value: unknown): asserts value is Buffer =>
649
+ assertType(is.buffer(value), 'Buffer', value),
650
+ nullOrUndefined: (value: unknown): asserts value is null | undefined =>
651
+ assertType(is.nullOrUndefined(value), AssertionTypeDescription.nullOrUndefined, value),
652
+ object: (value: unknown): asserts value is object =>
653
+ assertType(is.object(value), 'Object', value),
654
+ iterable: <T = unknown>(value: unknown): asserts value is Iterable<T> =>
655
+ assertType(is.iterable(value), AssertionTypeDescription.iterable, value),
656
+ asyncIterable: <T = unknown>(value: unknown): asserts value is AsyncIterable<T> =>
657
+ assertType(is.asyncIterable(value), AssertionTypeDescription.asyncIterable, value),
658
+ generator: (value: unknown): asserts value is Generator =>
659
+ assertType(is.generator(value), 'Generator', value),
660
+ asyncGenerator: (value: unknown): asserts value is AsyncGenerator =>
661
+ assertType(is.asyncGenerator(value), 'AsyncGenerator', value),
662
+ nativePromise: <T = unknown>(value: unknown): asserts value is Promise<T> =>
663
+ assertType(is.nativePromise(value), AssertionTypeDescription.nativePromise, value),
664
+ promise: <T = unknown>(value: unknown): asserts value is Promise<T> =>
665
+ assertType(is.promise(value), 'Promise', value),
666
+ generatorFunction: (value: unknown): asserts value is GeneratorFunction =>
667
+ assertType(is.generatorFunction(value), 'GeneratorFunction', value),
668
+ asyncGeneratorFunction: (value: unknown): asserts value is AsyncGeneratorFunction =>
669
+ assertType(is.asyncGeneratorFunction(value), 'AsyncGeneratorFunction', value),
670
+ // eslint-disable-next-line @typescript-eslint/ban-types
671
+ asyncFunction: (value: unknown): asserts value is Function =>
672
+ assertType(is.asyncFunction(value), 'AsyncFunction', value),
673
+ // eslint-disable-next-line @typescript-eslint/ban-types
674
+ boundFunction: (value: unknown): asserts value is Function =>
675
+ assertType(is.boundFunction(value), 'Function', value),
676
+ regExp: (value: unknown): asserts value is RegExp =>
677
+ assertType(is.regExp(value), 'RegExp', value),
678
+ date: (value: unknown): asserts value is Date => assertType(is.date(value), 'Date', value),
679
+ error: (value: unknown): asserts value is Error => assertType(is.error(value), 'Error', value),
680
+ map: <Key = unknown, Value = unknown>(value: unknown): asserts value is Map<Key, Value> =>
681
+ assertType(is.map(value), 'Map', value),
682
+ set: <T = unknown>(value: unknown): asserts value is Set<T> =>
683
+ assertType(is.set(value), 'Set', value),
684
+ weakMap: <Key extends object = object, Value = unknown>(
685
+ value: unknown,
686
+ ): asserts value is WeakMap<Key, Value> => assertType(is.weakMap(value), 'WeakMap', value),
687
+ weakSet: <T extends object = object>(value: unknown): asserts value is WeakSet<T> =>
688
+ assertType(is.weakSet(value), 'WeakSet', value),
689
+ int8Array: (value: unknown): asserts value is Int8Array =>
690
+ assertType(is.int8Array(value), 'Int8Array', value),
691
+ uint8Array: (value: unknown): asserts value is Uint8Array =>
692
+ assertType(is.uint8Array(value), 'Uint8Array', value),
693
+ uint8ClampedArray: (value: unknown): asserts value is Uint8ClampedArray =>
694
+ assertType(is.uint8ClampedArray(value), 'Uint8ClampedArray', value),
695
+ int16Array: (value: unknown): asserts value is Int16Array =>
696
+ assertType(is.int16Array(value), 'Int16Array', value),
697
+ uint16Array: (value: unknown): asserts value is Uint16Array =>
698
+ assertType(is.uint16Array(value), 'Uint16Array', value),
699
+ int32Array: (value: unknown): asserts value is Int32Array =>
700
+ assertType(is.int32Array(value), 'Int32Array', value),
701
+ uint32Array: (value: unknown): asserts value is Uint32Array =>
702
+ assertType(is.uint32Array(value), 'Uint32Array', value),
703
+ float32Array: (value: unknown): asserts value is Float32Array =>
704
+ assertType(is.float32Array(value), 'Float32Array', value),
705
+ float64Array: (value: unknown): asserts value is Float64Array =>
706
+ assertType(is.float64Array(value), 'Float64Array', value),
707
+ bigInt64Array: (value: unknown): asserts value is BigInt64Array =>
708
+ assertType(is.bigInt64Array(value), 'BigInt64Array', value),
709
+ bigUint64Array: (value: unknown): asserts value is BigUint64Array =>
710
+ assertType(is.bigUint64Array(value), 'BigUint64Array', value),
711
+ arrayBuffer: (value: unknown): asserts value is ArrayBuffer =>
712
+ assertType(is.arrayBuffer(value), 'ArrayBuffer', value),
713
+ sharedArrayBuffer: (value: unknown): asserts value is SharedArrayBuffer =>
714
+ assertType(is.sharedArrayBuffer(value), 'SharedArrayBuffer', value),
715
+ dataView: (value: unknown): asserts value is DataView =>
716
+ assertType(is.dataView(value), 'DataView', value),
717
+ urlInstance: (value: unknown): asserts value is URL =>
718
+ assertType(is.urlInstance(value), 'URL', value),
719
+ urlString: (value: unknown): asserts value is string =>
720
+ assertType(is.urlString(value), AssertionTypeDescription.urlString, value),
721
+ truthy: (value: unknown): asserts value is unknown =>
722
+ assertType(is.truthy(value), AssertionTypeDescription.truthy, value),
723
+ falsy: (value: unknown): asserts value is unknown =>
724
+ assertType(is.falsy(value), AssertionTypeDescription.falsy, value),
725
+ nan: (value: unknown): asserts value is unknown =>
726
+ assertType(is.nan(value), AssertionTypeDescription.nan, value),
727
+ primitive: (value: unknown): asserts value is Primitive =>
728
+ assertType(is.primitive(value), AssertionTypeDescription.primitive, value),
729
+ integer: (value: unknown): asserts value is number =>
730
+ assertType(is.integer(value), AssertionTypeDescription.integer, value),
731
+ safeInteger: (value: unknown): asserts value is number =>
732
+ assertType(is.safeInteger(value), AssertionTypeDescription.safeInteger, value),
733
+ plainObject: <Value = unknown>(value: unknown): asserts value is Record<PropertyKey, Value> =>
734
+ assertType(is.plainObject(value), AssertionTypeDescription.plainObject, value),
735
+ typedArray: (value: unknown): asserts value is TypedArray =>
736
+ assertType(is.typedArray(value), AssertionTypeDescription.typedArray, value),
737
+ arrayLike: <T = unknown>(value: unknown): asserts value is ArrayLike<T> =>
738
+ assertType(is.arrayLike(value), AssertionTypeDescription.arrayLike, value),
739
+ domElement: (value: unknown): asserts value is HTMLElement =>
740
+ assertType(is.domElement(value), AssertionTypeDescription.domElement, value),
741
+ observable: (value: unknown): asserts value is ObservableLike =>
742
+ assertType(is.observable(value), 'Observable', value),
743
+ nodeStream: (value: unknown): asserts value is NodeStream =>
744
+ assertType(is.nodeStream(value), AssertionTypeDescription.nodeStream, value),
745
+ infinite: (value: unknown): asserts value is number =>
746
+ assertType(is.infinite(value), AssertionTypeDescription.infinite, value),
747
+ emptyArray: (value: unknown): asserts value is never[] =>
748
+ assertType(is.emptyArray(value), AssertionTypeDescription.emptyArray, value),
749
+ nonEmptyArray: (value: unknown): asserts value is unknown[] =>
750
+ assertType(is.nonEmptyArray(value), AssertionTypeDescription.nonEmptyArray, value),
751
+ emptyString: (value: unknown): asserts value is '' =>
752
+ assertType(is.emptyString(value), AssertionTypeDescription.emptyString, value),
753
+ nonEmptyString: (value: unknown): asserts value is string =>
754
+ assertType(is.nonEmptyString(value), AssertionTypeDescription.nonEmptyString, value),
755
+ emptyStringOrWhitespace: (value: unknown): asserts value is string =>
756
+ assertType(
757
+ is.emptyStringOrWhitespace(value),
758
+ AssertionTypeDescription.emptyStringOrWhitespace,
759
+ value,
760
+ ),
761
+ emptyObject: <Key extends keyof any = string>(
762
+ value: unknown,
763
+ ): asserts value is Record<Key, never> =>
764
+ assertType(is.emptyObject(value), AssertionTypeDescription.emptyObject, value),
765
+ nonEmptyObject: <Key extends keyof any = string, Value = unknown>(
766
+ value: unknown,
767
+ ): asserts value is Record<Key, Value> =>
768
+ assertType(is.nonEmptyObject(value), AssertionTypeDescription.nonEmptyObject, value),
769
+ emptySet: (value: unknown): asserts value is Set<never> =>
770
+ assertType(is.emptySet(value), AssertionTypeDescription.emptySet, value),
771
+ nonEmptySet: <T = unknown>(value: unknown): asserts value is Set<T> =>
772
+ assertType(is.nonEmptySet(value), AssertionTypeDescription.nonEmptySet, value),
773
+ emptyMap: (value: unknown): asserts value is Map<never, never> =>
774
+ assertType(is.emptyMap(value), AssertionTypeDescription.emptyMap, value),
775
+ nonEmptyMap: <Key = unknown, Value = unknown>(value: unknown): asserts value is Map<Key, Value> =>
776
+ assertType(is.nonEmptyMap(value), AssertionTypeDescription.nonEmptyMap, value),
777
+ propertyKey: (value: unknown): asserts value is number =>
778
+ assertType(is.propertyKey(value), 'PropertyKey', value),
779
+ formData: (value: unknown): asserts value is FormData =>
780
+ assertType(is.formData(value), 'FormData', value),
781
+ urlSearchParams: (value: unknown): asserts value is URLSearchParams =>
782
+ assertType(is.urlSearchParams(value), 'URLSearchParams', value),
783
+
784
+ // Numbers.
785
+ evenInteger: (value: number): asserts value is number =>
786
+ assertType(is.evenInteger(value), AssertionTypeDescription.evenInteger, value),
787
+ oddInteger: (value: number): asserts value is number =>
788
+ assertType(is.oddInteger(value), AssertionTypeDescription.oddInteger, value),
789
+
790
+ // Two arguments.
791
+ directInstanceOf: <T>(instance: unknown, class_: Class<T>): asserts instance is T =>
792
+ assertType(
793
+ is.directInstanceOf(instance, class_),
794
+ AssertionTypeDescription.directInstanceOf,
795
+ instance,
796
+ ),
797
+ inRange: (value: number, range: number | number[]): asserts value is number =>
798
+ assertType(is.inRange(value, range), AssertionTypeDescription.inRange, value),
799
+
800
+ // Variadic functions.
801
+ any: (predicate: Predicate | Predicate[], ...values: unknown[]): void | never => {
802
+ return assertType(is.any(predicate, ...values), AssertionTypeDescription.any, values, {
803
+ multipleValues: true,
804
+ })
805
+ },
806
+ all: (predicate: Predicate, ...values: unknown[]): void | never =>
807
+ assertType(is.all(predicate, ...values), AssertionTypeDescription.all, values, {
808
+ multipleValues: true,
809
+ }),
810
+ }
811
+
812
+ // Some few keywords are reserved, but we'll populate them for Node.js users
813
+ // See https://github.com/Microsoft/TypeScript/issues/2536
814
+ Object.defineProperties(is, {
815
+ class: {
816
+ value: is.class_,
817
+ },
818
+ function: {
819
+ value: is.function_,
820
+ },
821
+ null: {
822
+ value: is.null_,
823
+ },
824
+ })
825
+ Object.defineProperties(assert, {
826
+ class: {
827
+ value: assert.class_,
828
+ },
829
+ function: {
830
+ value: assert.function_,
831
+ },
832
+ null: {
833
+ value: assert.null_,
834
+ },
835
+ })
836
+
837
+ // export {Class, TypedArray, ObservableLike, Primitive} from './types';