2022-06-11 17:44:01 +07:00
import type { Buffer } from 'node:buffer' ;
2023-08-07 08:50:03 +08:00
import type {
ArrayLike ,
Class ,
Falsy ,
NodeStream ,
2023-10-26 16:37:39 +02:00
NonEmptyString ,
2023-08-07 08:50:03 +08:00
ObservableLike ,
Predicate ,
Primitive ,
TypedArray ,
WeakRef ,
} from './types.js' ;
2020-07-20 11:48:08 +12:00
2020-06-20 16:28:47 +09:00
const typedArrayTypeNames = [
'Int8Array' ,
'Uint8Array' ,
'Uint8ClampedArray' ,
'Int16Array' ,
'Uint16Array' ,
'Int32Array' ,
'Uint32Array' ,
'Float32Array' ,
'Float64Array' ,
'BigInt64Array' ,
2022-06-11 17:44:01 +07:00
'BigUint64Array' ,
2020-06-20 16:28:47 +09:00
] as const ;
type TypedArrayTypeName = typeof typedArrayTypeNames [ number ] ;
function isTypedArrayName ( name : unknown ) : name is TypedArrayTypeName {
return typedArrayTypeNames . includes ( name as TypedArrayTypeName ) ;
2017-11-19 21:07:24 +01:00
}
2020-06-20 16:28:47 +09:00
const objectTypeNames = [
'Function' ,
'Generator' ,
'AsyncGenerator' ,
'GeneratorFunction' ,
'AsyncGeneratorFunction' ,
'AsyncFunction' ,
'Observable' ,
'Array' ,
'Buffer' ,
2022-02-27 15:16:25 +08:00
'Blob' ,
2020-06-20 16:28:47 +09:00
'Object' ,
'RegExp' ,
'Date' ,
'Error' ,
'Map' ,
'Set' ,
'WeakMap' ,
'WeakSet' ,
2022-06-13 15:05:26 +08:00
'WeakRef' ,
2020-06-20 16:28:47 +09:00
'ArrayBuffer' ,
'SharedArrayBuffer' ,
'DataView' ,
'Promise' ,
'URL' ,
2021-09-13 22:25:44 +08:00
'FormData' ,
'URLSearchParams' ,
2020-06-20 16:28:47 +09:00
'HTMLElement' ,
2022-06-09 19:05:31 +02:00
'NaN' ,
2022-06-11 17:44:01 +07:00
. . . typedArrayTypeNames ,
2020-06-20 16:28:47 +09:00
] as const ;
type ObjectTypeName = typeof objectTypeNames [ number ] ;
2020-06-28 05:20:36 +09:00
function isObjectTypeName ( name : unknown ) : name is ObjectTypeName {
return objectTypeNames . includes ( name as ObjectTypeName ) ;
}
2020-06-20 16:28:47 +09:00
const primitiveTypeNames = [
'null' ,
'undefined' ,
'string' ,
'number' ,
'bigint' ,
'boolean' ,
2022-06-11 17:44:01 +07:00
'symbol' ,
2020-06-20 16:28:47 +09:00
] as const ;
2017-11-06 16:26:59 +01:00
2020-06-20 16:28:47 +09:00
type PrimitiveTypeName = typeof primitiveTypeNames [ number ] ;
function isPrimitiveTypeName ( name : unknown ) : name is PrimitiveTypeName {
return primitiveTypeNames . includes ( name as PrimitiveTypeName ) ;
}
export type TypeName = ObjectTypeName | PrimitiveTypeName ;
2023-07-30 19:32:34 +08:00
const assertionTypeDescriptions = [
'positive number' ,
'negative number' ,
'Class' ,
'string with a number' ,
'null or undefined' ,
'Iterable' ,
'AsyncIterable' ,
'native Promise' ,
'EnumCase' ,
'string with a URL' ,
'truthy' ,
'falsy' ,
'primitive' ,
'integer' ,
'plain object' ,
'TypedArray' ,
'array-like' ,
'tuple-like' ,
'Node.js Stream' ,
'infinite number' ,
'empty array' ,
'non-empty array' ,
'empty string' ,
'empty string or whitespace' ,
'non-empty string' ,
'non-empty string and not whitespace' ,
'empty object' ,
'non-empty object' ,
'empty set' ,
'non-empty set' ,
'empty map' ,
'non-empty map' ,
'PropertyKey' ,
'even integer' ,
'odd integer' ,
'T' ,
'in range' ,
'predicate returns truthy for any value' ,
'predicate returns truthy for all values' ,
2024-02-29 08:23:30 +01:00
'valid Date' ,
2023-08-07 08:50:03 +08:00
'valid length' ,
'whitespace string' ,
2023-07-30 19:32:34 +08:00
. . . objectTypeNames ,
. . . primitiveTypeNames ,
] as const ;
export type AssertionTypeDescription = typeof assertionTypeDescriptions [ number ] ;
2020-06-20 16:28:47 +09:00
const getObjectType = ( value : unknown ) : ObjectTypeName | undefined = > {
2023-08-07 08:50:03 +08:00
const objectTypeName = Object . prototype . toString . call ( value ) . slice ( 8 , - 1 ) ;
2020-06-28 05:20:36 +09:00
2023-08-10 22:06:46 +08:00
if ( /HTML\w+Element/ . test ( objectTypeName ) && isHtmlElement ( value ) ) {
2020-06-28 05:20:36 +09:00
return 'HTMLElement' ;
}
if ( isObjectTypeName ( objectTypeName ) ) {
return objectTypeName ;
2017-11-19 21:07:24 +01:00
}
2019-03-31 20:41:19 +07:00
return undefined ;
2017-11-19 21:07:24 +01:00
} ;
2023-08-07 08:50:03 +08:00
function detect ( value : unknown ) : TypeName {
2020-06-20 16:28:47 +09:00
if ( value === null ) {
return 'null' ;
2017-11-06 16:26:59 +01:00
}
2018-05-04 07:29:21 +02:00
switch ( typeof value ) {
2023-05-30 21:13:40 +07:00
case 'undefined' : {
2020-06-20 16:28:47 +09:00
return 'undefined' ;
2023-05-30 21:13:40 +07:00
}
case 'string' : {
2020-06-20 16:28:47 +09:00
return 'string' ;
2023-05-30 21:13:40 +07:00
}
case 'number' : {
2022-06-09 19:05:31 +02:00
return Number . isNaN ( value ) ? 'NaN' : 'number' ;
2023-05-30 21:13:40 +07:00
}
case 'boolean' : {
2020-06-20 16:28:47 +09:00
return 'boolean' ;
2023-05-30 21:13:40 +07:00
}
case 'function' : {
2020-06-20 16:28:47 +09:00
return 'Function' ;
2023-05-30 21:13:40 +07:00
}
case 'bigint' : {
2020-06-20 16:28:47 +09:00
return 'bigint' ;
2023-05-30 21:13:40 +07:00
}
case 'symbol' : {
2020-06-20 16:28:47 +09:00
return 'symbol' ;
2023-05-30 21:13:40 +07:00
}
2018-05-04 07:29:21 +02:00
default :
2017-11-06 16:26:59 +01:00
}
2023-08-07 08:50:03 +08:00
if ( isObservable ( value ) ) {
2020-06-20 16:28:47 +09:00
return 'Observable' ;
2018-05-03 05:22:32 +02:00
}
2023-08-07 08:50:03 +08:00
if ( isArray ( value ) ) {
2020-06-20 16:28:47 +09:00
return 'Array' ;
2017-11-06 16:26:59 +01:00
}
2023-08-07 08:50:03 +08:00
if ( isBuffer ( value ) ) {
2020-06-20 16:28:47 +09:00
return 'Buffer' ;
2017-11-06 16:26:59 +01:00
}
const tagType = getObjectType ( value ) ;
if ( tagType ) {
return tagType ;
}
if ( value instanceof String || value instanceof Boolean || value instanceof Number ) {
throw new TypeError ( 'Please don\'t use object wrappers for primitive types' ) ;
}
2020-06-20 16:28:47 +09:00
return 'Object' ;
2017-11-06 16:26:59 +01:00
}
2023-08-07 08:50:03 +08:00
function hasPromiseApi < T = unknown > ( value : unknown ) : value is Promise < T > {
return isFunction ( ( value as Promise < T > ) ? . then ) && isFunction ( ( value as Promise < T > ) ? . catch ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
const is = Object . assign (
detect ,
{
all : isAll ,
any : isAny ,
array : isArray ,
arrayBuffer : isArrayBuffer ,
arrayLike : isArrayLike ,
asyncFunction : isAsyncFunction ,
asyncGenerator : isAsyncGenerator ,
asyncGeneratorFunction : isAsyncGeneratorFunction ,
asyncIterable : isAsyncIterable ,
bigint : isBigint ,
bigInt64Array : isBigInt64Array ,
bigUint64Array : isBigUint64Array ,
blob : isBlob ,
boolean : isBoolean ,
boundFunction : isBoundFunction ,
buffer : isBuffer ,
class : isClass ,
/** @deprecated Renamed to `class`. */
class_ : isClass ,
dataView : isDataView ,
date : isDate ,
detect ,
directInstanceOf : isDirectInstanceOf ,
2023-08-10 22:06:46 +08:00
/** @deprecated Renamed to `htmlElement` */
domElement : isHtmlElement ,
2023-08-07 08:50:03 +08:00
emptyArray : isEmptyArray ,
emptyMap : isEmptyMap ,
emptyObject : isEmptyObject ,
emptySet : isEmptySet ,
emptyString : isEmptyString ,
emptyStringOrWhitespace : isEmptyStringOrWhitespace ,
enumCase : isEnumCase ,
error : isError ,
evenInteger : isEvenInteger ,
falsy : isFalsy ,
float32Array : isFloat32Array ,
float64Array : isFloat64Array ,
formData : isFormData ,
function : isFunction ,
/** @deprecated Renamed to `function`. */
function_ : isFunction ,
generator : isGenerator ,
generatorFunction : isGeneratorFunction ,
2023-08-10 22:06:46 +08:00
htmlElement : isHtmlElement ,
2023-08-07 08:50:03 +08:00
infinite : isInfinite ,
inRange : isInRange ,
int16Array : isInt16Array ,
int32Array : isInt32Array ,
int8Array : isInt8Array ,
integer : isInteger ,
iterable : isIterable ,
map : isMap ,
nan : isNan ,
nativePromise : isNativePromise ,
negativeNumber : isNegativeNumber ,
nodeStream : isNodeStream ,
nonEmptyArray : isNonEmptyArray ,
nonEmptyMap : isNonEmptyMap ,
nonEmptyObject : isNonEmptyObject ,
nonEmptySet : isNonEmptySet ,
nonEmptyString : isNonEmptyString ,
nonEmptyStringAndNotWhitespace : isNonEmptyStringAndNotWhitespace ,
null : isNull ,
/** @deprecated Renamed to `null`. */
null_ : isNull ,
nullOrUndefined : isNullOrUndefined ,
number : isNumber ,
numericString : isNumericString ,
object : isObject ,
observable : isObservable ,
oddInteger : isOddInteger ,
plainObject : isPlainObject ,
positiveNumber : isPositiveNumber ,
primitive : isPrimitive ,
promise : isPromise ,
propertyKey : isPropertyKey ,
regExp : isRegExp ,
safeInteger : isSafeInteger ,
set : isSet ,
sharedArrayBuffer : isSharedArrayBuffer ,
string : isString ,
symbol : isSymbol ,
truthy : isTruthy ,
tupleLike : isTupleLike ,
typedArray : isTypedArray ,
uint16Array : isUint16Array ,
uint32Array : isUint32Array ,
uint8Array : isUint8Array ,
uint8ClampedArray : isUint8ClampedArray ,
undefined : isUndefined ,
urlInstance : isUrlInstance ,
urlSearchParams : isUrlSearchParams ,
urlString : isUrlString ,
2024-02-29 08:23:30 +01:00
validDate : isValidDate ,
2023-08-07 08:50:03 +08:00
validLength : isValidLength ,
weakMap : isWeakMap ,
weakRef : isWeakRef ,
weakSet : isWeakSet ,
whitespaceString : isWhitespaceString ,
} ,
) ;
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
function isAbsoluteMod2 ( remainder : 0 | 1 ) {
return ( value : unknown ) : value is number = > isInteger ( value ) && Math . abs ( value % 2 ) === remainder ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isAll ( predicate : Predicate , . . . values : unknown [ ] ) : boolean {
return predicateOnArray ( Array . prototype . every , predicate , values ) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isAny ( predicate : Predicate | Predicate [ ] , . . . values : unknown [ ] ) : boolean {
const predicates = isArray ( predicate ) ? predicate : [ predicate ] ;
return predicates . some ( singlePredicate = >
predicateOnArray ( Array . prototype . some , singlePredicate , values ) ,
) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isArray < T = unknown > ( value : unknown , assertion ? : ( value : T ) = > value is T ) : value is T [ ] {
2020-07-25 10:11:59 +03:00
if ( ! Array . isArray ( value ) ) {
return false ;
}
2023-08-07 08:50:03 +08:00
if ( ! isFunction ( assertion ) ) {
2020-07-25 10:11:59 +03:00
return true ;
}
2023-05-30 21:13:40 +07:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2022-06-11 17:44:01 +07:00
return value . every ( element = > assertion ( element ) ) ;
2023-08-07 08:50:03 +08:00
}
export function isArrayBuffer ( value : unknown ) : value is ArrayBuffer {
return getObjectType ( value ) === 'ArrayBuffer' ;
}
export function isArrayLike < T = unknown > ( value : unknown ) : value is ArrayLike < T > {
return ! isNullOrUndefined ( value ) && ! isFunction ( value ) && isValidLength ( ( value as ArrayLike < T > ) . length ) ;
}
export function isAsyncFunction < T = unknown > ( value : unknown ) : value is ( ( . . . args : any [ ] ) = > Promise < T > ) {
return getObjectType ( value ) === 'AsyncFunction' ;
}
2020-07-25 10:11:59 +03:00
2023-08-07 08:50:03 +08:00
export function isAsyncGenerator ( value : unknown ) : value is AsyncGenerator {
return isAsyncIterable ( value ) && isFunction ( ( value as AsyncGenerator ) . next ) && isFunction ( ( value as AsyncGenerator ) . throw ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isAsyncGeneratorFunction ( value : unknown ) : value is ( ( . . . args : any [ ] ) = > Promise < unknown > ) {
return getObjectType ( value ) === 'AsyncGeneratorFunction' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isAsyncIterable < T = unknown > ( value : unknown ) : value is AsyncIterable < T > {
return isFunction ( ( value as AsyncIterable < T > ) ? . [ Symbol . asyncIterator ] ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isBigint ( value : unknown ) : value is bigint {
return typeof value === 'bigint' ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isBigInt64Array ( value : unknown ) : value is BigInt64Array {
return getObjectType ( value ) === 'BigInt64Array' ;
}
2019-03-31 20:41:19 +07:00
2023-08-07 08:50:03 +08:00
export function isBigUint64Array ( value : unknown ) : value is BigUint64Array {
return getObjectType ( value ) === 'BigUint64Array' ;
}
2019-03-31 20:41:19 +07:00
2023-08-07 08:50:03 +08:00
export function isBlob ( value : unknown ) : value is Blob {
return getObjectType ( value ) === 'Blob' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isBoolean ( value : unknown ) : value is boolean {
return value === true || value === false ;
}
2020-01-29 18:35:58 +01:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
export function isBoundFunction ( value : unknown ) : value is Function {
return isFunction ( value ) && ! Object . prototype . hasOwnProperty . call ( value , 'prototype' ) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isBuffer ( value : unknown ) : value is Buffer {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call
return ( value as any ) ? . constructor ? . isBuffer ? . ( value ) ? ? false ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isClass ( value : unknown ) : value is Class {
return isFunction ( value ) && value . toString ( ) . startsWith ( 'class ' ) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isDataView ( value : unknown ) : value is DataView {
return getObjectType ( value ) === 'DataView' ;
}
2019-03-31 20:41:19 +07:00
2023-08-07 08:50:03 +08:00
export function isDate ( value : unknown ) : value is Date {
return getObjectType ( value ) === 'Date' ;
}
2020-01-29 18:35:58 +01:00
2023-08-07 08:50:03 +08:00
export function isDirectInstanceOf < T > ( instance : unknown , class_ : Class < T > ) : instance is T {
2023-10-15 16:01:29 +07:00
if ( instance === undefined || instance === null ) {
return false ;
}
2023-08-07 08:50:03 +08:00
return Object . getPrototypeOf ( instance ) === class_ . prototype ;
}
2019-03-31 20:41:19 +07:00
2023-08-07 08:50:03 +08:00
export function isEmptyArray ( value : unknown ) : value is never [ ] {
return isArray ( value ) && value . length === 0 ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isEmptyMap ( value : unknown ) : value is Map < never , never > {
return isMap ( value ) && value . size === 0 ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isEmptyObject < Key extends keyof any = string > ( value : unknown ) : value is Record < Key , never > {
return isObject ( value ) && ! isMap ( value ) && ! isSet ( value ) && Object . keys ( value ) . length === 0 ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isEmptySet ( value : unknown ) : value is Set < never > {
return isSet ( value ) && value . size === 0 ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isEmptyString ( value : unknown ) : value is '' {
return isString ( value ) && value . length === 0 ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isEmptyStringOrWhitespace ( value : unknown ) : value is string {
return isEmptyString ( value ) || isWhitespaceString ( value ) ;
}
2022-06-11 17:44:01 +07:00
2024-05-16 11:11:44 +03:00
export function isEnumCase < T = unknown > ( value : unknown , targetEnum : T ) : value is T [ keyof T ] {
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
return Object . values ( targetEnum as any ) . includes ( value as string ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isError ( value : unknown ) : value is Error {
return getObjectType ( value ) === 'Error' ;
}
2020-06-20 16:28:47 +09:00
2023-08-07 08:50:03 +08:00
export function isEvenInteger ( value : unknown ) : value is number {
return isAbsoluteMod2 ( 0 ) ( value ) ;
}
2022-06-13 15:05:26 +08:00
2023-08-07 08:50:03 +08:00
// Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);`
export function isFalsy ( value : unknown ) : value is Falsy {
return ! value ;
}
2020-06-20 16:28:47 +09:00
2023-08-07 08:50:03 +08:00
export function isFloat32Array ( value : unknown ) : value is Float32Array {
return getObjectType ( value ) === 'Float32Array' ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isFloat64Array ( value : unknown ) : value is Float64Array {
return getObjectType ( value ) === 'Float64Array' ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isFormData ( value : unknown ) : value is FormData {
return getObjectType ( value ) === 'FormData' ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
export function isFunction ( value : unknown ) : value is Function {
return typeof value === 'function' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isGenerator ( value : unknown ) : value is Generator {
return isIterable ( value ) && isFunction ( ( value as Generator ) ? . next ) && isFunction ( ( value as Generator ) ? . throw ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isGeneratorFunction ( value : unknown ) : value is GeneratorFunction {
return getObjectType ( value ) === 'GeneratorFunction' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/naming-convention
const NODE_TYPE_ELEMENT = 1 ;
// eslint-disable-next-line @typescript-eslint/naming-convention
const DOM_PROPERTIES_TO_CHECK : Array < ( keyof HTMLElement ) > = [
'innerHTML' ,
'ownerDocument' ,
'style' ,
'attributes' ,
'nodeValue' ,
] ;
2023-08-10 22:06:46 +08:00
export function isHtmlElement ( value : unknown ) : value is HTMLElement {
2023-08-07 08:50:03 +08:00
return isObject ( value )
&& ( value as HTMLElement ) . nodeType === NODE_TYPE_ELEMENT
&& isString ( ( value as HTMLElement ) . nodeName )
&& ! isPlainObject ( value )
&& DOM_PROPERTIES_TO_CHECK . every ( property = > property in value ) ;
}
export function isInfinite ( value : unknown ) : value is number {
return value === Number . POSITIVE_INFINITY || value === Number . NEGATIVE_INFINITY ;
}
export function isInRange ( value : number , range : number | [ number , number ] ) : value is number {
if ( isNumber ( range ) ) {
return value >= Math . min ( 0 , range ) && value <= Math . max ( range , 0 ) ;
2019-02-02 01:14:08 +07:00
}
2018-12-13 16:52:55 +01:00
2023-08-07 08:50:03 +08:00
if ( isArray ( range ) && range . length === 2 ) {
return value >= Math . min ( . . . range ) && value <= Math . max ( . . . range ) ;
2019-02-02 01:14:08 +07:00
}
2023-08-07 08:50:03 +08:00
throw new TypeError ( ` Invalid range: ${ JSON . stringify ( range ) } ` ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isInt16Array ( value : unknown ) : value is Int16Array {
return getObjectType ( value ) === 'Int16Array' ;
}
2018-12-13 16:52:55 +01:00
2023-08-07 08:50:03 +08:00
export function isInt32Array ( value : unknown ) : value is Int32Array {
return getObjectType ( value ) === 'Int32Array' ;
}
2017-11-19 15:16:06 -05:00
2023-08-07 08:50:03 +08:00
export function isInt8Array ( value : unknown ) : value is Int8Array {
return getObjectType ( value ) === 'Int8Array' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isInteger ( value : unknown ) : value is number {
return Number . isInteger ( value ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isIterable < T = unknown > ( value : unknown ) : value is Iterable < T > {
return isFunction ( ( value as Iterable < T > ) ? . [ Symbol . iterator ] ) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isMap < Key = unknown , Value = unknown > ( value : unknown ) : value is Map < Key , Value > {
return getObjectType ( value ) === 'Map' ;
}
2019-03-31 20:41:19 +07:00
2023-08-07 08:50:03 +08:00
export function isNan ( value : unknown ) {
return Number . isNaN ( value ) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isNativePromise < T = unknown > ( value : unknown ) : value is Promise < T > {
return getObjectType ( value ) === 'Promise' ;
}
2017-11-06 16:26:59 +01:00
2023-08-07 08:50:03 +08:00
export function isNegativeNumber ( value : unknown ) : value is number {
return isNumber ( value ) && value < 0 ;
}
2017-11-06 16:26:59 +01:00
2023-08-07 08:50:03 +08:00
export function isNodeStream ( value : unknown ) : value is NodeStream {
return isObject ( value ) && isFunction ( ( value as NodeStream ) . pipe ) && ! isObservable ( value ) ;
}
2018-09-28 11:54:35 +05:30
2023-08-07 08:50:03 +08:00
export function isNonEmptyArray < T = unknown , Item = unknown > ( value : T | Item [ ] ) : value is [ Item , . . . Item [ ] ] {
return isArray ( value ) && value . length > 0 ;
}
2019-02-04 02:13:23 +07:00
2023-08-07 08:50:03 +08:00
export function isNonEmptyMap < Key = unknown , Value = unknown > ( value : unknown ) : value is Map < Key , Value > {
return isMap ( value ) && value . size > 0 ;
}
2023-07-23 15:35:23 +03:00
2023-08-07 08:50:03 +08:00
// TODO: Use `not` operator here to remove `Map` and `Set` from type guard:
// - https://github.com/Microsoft/TypeScript/pull/29317
export function isNonEmptyObject < Key extends keyof any = string , Value = unknown > ( value : unknown ) : value is Record < Key , Value > {
return isObject ( value ) && ! isMap ( value ) && ! isSet ( value ) && Object . keys ( value ) . length > 0 ;
}
2023-07-23 15:35:23 +03:00
2023-08-07 08:50:03 +08:00
export function isNonEmptySet < T = unknown > ( value : unknown ) : value is Set < T > {
return isSet ( value ) && value . size > 0 ;
}
2023-07-23 15:35:23 +03:00
2023-08-07 08:50:03 +08:00
// TODO: Use `not ''` when the `not` operator is available.
2023-10-26 16:37:39 +02:00
export function isNonEmptyString ( value : unknown ) : value is NonEmptyString {
2023-08-07 08:50:03 +08:00
return isString ( value ) && value . length > 0 ;
}
2023-07-23 15:35:23 +03:00
2023-08-07 08:50:03 +08:00
// TODO: Use `not ''` when the `not` operator is available.
2023-10-26 16:37:39 +02:00
export function isNonEmptyStringAndNotWhitespace ( value : unknown ) : value is NonEmptyString {
2023-08-07 08:50:03 +08:00
return isString ( value ) && ! isEmptyStringOrWhitespace ( value ) ;
}
2018-09-28 11:54:35 +05:30
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
export function isNull ( value : unknown ) : value is null {
return value === null ;
}
2018-09-28 11:54:35 +05:30
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
export function isNullOrUndefined ( value : unknown ) : value is null | undefined {
return isNull ( value ) || isUndefined ( value ) ;
}
2018-09-28 11:54:35 +05:30
2023-08-07 08:50:03 +08:00
export function isNumber ( value : unknown ) : value is number {
return typeof value === 'number' && ! Number . isNaN ( value ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isNumericString ( value : unknown ) : value is ` ${ number } ` {
return isString ( value ) && ! isEmptyStringOrWhitespace ( value ) && ! Number . isNaN ( Number ( value ) ) ;
}
2017-11-06 16:26:59 +01:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
export function isObject ( value : unknown ) : value is object {
return ! isNull ( value ) && ( typeof value === 'object' || isFunction ( value ) ) ;
}
2019-02-04 02:13:23 +07:00
2023-08-07 08:50:03 +08:00
export function isObservable ( value : unknown ) : value is ObservableLike {
2019-02-02 01:14:08 +07:00
if ( ! value ) {
return false ;
}
2017-11-06 16:26:59 +01:00
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line no-use-extend-native/no-use-extend-native, @typescript-eslint/no-unsafe-call
2020-02-22 02:01:58 +07:00
if ( value === ( value as any ) [ Symbol . observable ] ? . ( ) ) {
2019-02-02 01:14:08 +07:00
return true ;
}
2017-11-06 16:26:59 +01:00
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
2020-02-22 02:01:58 +07:00
if ( value === ( value as any ) [ '@@observable' ] ? . ( ) ) {
2019-02-02 01:14:08 +07:00
return true ;
}
return false ;
2023-08-07 08:50:03 +08:00
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isOddInteger ( value : unknown ) : value is number {
return isAbsoluteMod2 ( 1 ) ( value ) ;
}
2019-02-04 02:13:23 +07:00
2023-08-07 08:50:03 +08:00
export function isPlainObject < Value = unknown > ( value : unknown ) : value is Record < PropertyKey , Value > {
// From: https://github.com/sindresorhus/is-plain-obj/blob/main/index.js
if ( typeof value !== 'object' || value === null ) {
return false ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const prototype = Object . getPrototypeOf ( value ) ;
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
return ( prototype === null || prototype === Object . prototype || Object . getPrototypeOf ( prototype ) === null ) && ! ( Symbol . toStringTag in value ) && ! ( Symbol . iterator in value ) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isPositiveNumber ( value : unknown ) : value is number {
return isNumber ( value ) && value > 0 ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isPrimitive ( value : unknown ) : value is Primitive {
return isNull ( value ) || isPrimitiveTypeName ( typeof value ) ;
}
2019-02-04 02:13:23 +07:00
2023-08-07 08:50:03 +08:00
export function isPromise < T = unknown > ( value : unknown ) : value is Promise < T > {
return isNativePromise ( value ) || hasPromiseApi ( value ) ;
}
2019-02-04 02:13:23 +07:00
2023-08-07 08:50:03 +08:00
// `PropertyKey` is any value that can be used as an object key (string, number, or symbol)
export function isPropertyKey ( value : unknown ) : value is PropertyKey {
return isAny ( [ isString , isNumber , isSymbol ] , value ) ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isRegExp ( value : unknown ) : value is RegExp {
return getObjectType ( value ) === 'RegExp' ;
}
2022-02-25 16:19:29 +07:00
2023-08-07 08:50:03 +08:00
export function isSafeInteger ( value : unknown ) : value is number {
return Number . isSafeInteger ( value ) ;
}
2022-02-25 09:10:57 +00:00
2023-08-07 08:50:03 +08:00
export function isSet < T = unknown > ( value : unknown ) : value is Set < T > {
return getObjectType ( value ) === 'Set' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isSharedArrayBuffer ( value : unknown ) : value is SharedArrayBuffer {
return getObjectType ( value ) === 'SharedArrayBuffer' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
export function isString ( value : unknown ) : value is string {
return typeof value === 'string' ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
export function isSymbol ( value : unknown ) : value is symbol {
return typeof value === 'symbol' ;
}
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
// Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);`
// eslint-disable-next-line unicorn/prefer-native-coercion-functions
export function isTruthy < T > ( value : T | Falsy ) : value is T {
return Boolean ( value ) ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
type TypeGuard < T > = ( value : unknown ) = > value is T ;
2019-02-02 01:14:08 +07:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
type ResolveTypesOfTypeGuardsTuple < TypeGuardsOfT , ResultOfT extends unknown [ ] = [ ] > =
TypeGuardsOfT extends [ TypeGuard < infer U > , . . . infer TOthers ]
? ResolveTypesOfTypeGuardsTuple < TOthers , [ ...ResultOfT , U ] >
: TypeGuardsOfT extends undefined [ ]
? ResultOfT
: never ;
export function isTupleLike < T extends Array < TypeGuard < unknown > > > ( value : unknown , guards : [ . . . T ] ) : value is ResolveTypesOfTypeGuardsTuple < T > {
if ( isArray ( guards ) && isArray ( value ) && guards . length === value . length ) {
return guards . every ( ( guard , index ) = > guard ( value [ index ] ) ) ;
}
return false ;
}
export function isTypedArray ( value : unknown ) : value is TypedArray {
return isTypedArrayName ( getObjectType ( value ) ) ;
}
export function isUint16Array ( value : unknown ) : value is Uint16Array {
return getObjectType ( value ) === 'Uint16Array' ;
}
export function isUint32Array ( value : unknown ) : value is Uint32Array {
return getObjectType ( value ) === 'Uint32Array' ;
}
export function isUint8Array ( value : unknown ) : value is Uint8Array {
return getObjectType ( value ) === 'Uint8Array' ;
}
export function isUint8ClampedArray ( value : unknown ) : value is Uint8ClampedArray {
return getObjectType ( value ) === 'Uint8ClampedArray' ;
}
export function isUndefined ( value : unknown ) : value is undefined {
return value === undefined ;
}
export function isUrlInstance ( value : unknown ) : value is URL {
return getObjectType ( value ) === 'URL' ;
}
// eslint-disable-next-line unicorn/prevent-abbreviations
export function isUrlSearchParams ( value : unknown ) : value is URLSearchParams {
return getObjectType ( value ) === 'URLSearchParams' ;
}
export function isUrlString ( value : unknown ) : value is string {
if ( ! isString ( value ) ) {
return false ;
}
try {
new URL ( value ) ; // eslint-disable-line no-new
return true ;
} catch {
return false ;
}
}
2024-02-29 08:23:30 +01:00
export function isValidDate ( value : unknown ) : value is Date {
return isDate ( value ) && ! isNan ( Number ( value ) ) ;
}
2023-08-07 08:50:03 +08:00
export function isValidLength ( value : unknown ) : value is number {
return isSafeInteger ( value ) && value >= 0 ;
}
// eslint-disable-next-line @typescript-eslint/ban-types
export function isWeakMap < Key extends object = object , Value = unknown > ( value : unknown ) : value is WeakMap < Key , Value > {
return getObjectType ( value ) === 'WeakMap' ;
}
2022-06-11 17:44:01 +07:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
export function isWeakRef ( value : unknown ) : value is WeakRef < object > {
return getObjectType ( value ) === 'WeakRef' ;
}
2021-09-13 22:25:44 +08:00
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
export function isWeakSet ( value : unknown ) : value is WeakSet < object > {
return getObjectType ( value ) === 'WeakSet' ;
}
2021-09-10 10:26:13 +02:00
2023-08-07 08:50:03 +08:00
export function isWhitespaceString ( value : unknown ) : value is string {
return isString ( value ) && /^\s+$/ . test ( value ) ;
}
2019-02-02 01:14:08 +07:00
type ArrayMethod = ( fn : ( value : unknown , index : number , array : unknown [ ] ) = > boolean , thisArg? : unknown ) = > boolean ;
2019-02-04 02:13:23 +07:00
2023-08-07 08:50:03 +08:00
function predicateOnArray ( method : ArrayMethod , predicate : Predicate , values : unknown [ ] ) {
if ( ! isFunction ( predicate ) ) {
2019-02-02 01:14:08 +07:00
throw new TypeError ( ` Invalid predicate: ${ JSON . stringify ( predicate ) } ` ) ;
}
if ( values . length === 0 ) {
throw new TypeError ( 'Invalid number of values' ) ;
}
2019-02-04 02:13:23 +07:00
return method . call ( values , predicate ) ;
2023-08-07 08:50:03 +08:00
}
2017-11-06 16:26:59 +01:00
2023-08-07 08:50:03 +08:00
function typeErrorMessage ( description : AssertionTypeDescription , value : unknown ) : string {
return ` Expected value which is \` ${ description } \` , received value of type \` ${ is ( value ) } \` . ` ;
}
2021-04-22 04:00:08 -05:00
2023-08-09 19:49:06 +08:00
function unique < T > ( values : T [ ] ) : T [ ] {
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line unicorn/prefer-spread
2023-08-09 19:49:06 +08:00
return Array . from ( new Set ( values ) ) ;
}
const andFormatter = new Intl . ListFormat ( 'en' , { style : 'long' , type : 'conjunction' } ) ;
const orFormatter = new Intl . ListFormat ( 'en' , { style : 'long' , type : 'disjunction' } ) ;
function typeErrorMessageMultipleValues ( expectedType : AssertionTypeDescription | AssertionTypeDescription [ ] , values : unknown [ ] ) : string {
const uniqueExpectedTypes = unique ( ( isArray ( expectedType ) ? expectedType : [ expectedType ] ) . map ( value = > ` \` ${ value } \` ` ) ) ;
const uniqueValueTypes = unique ( values . map ( value = > ` \` ${ is ( value ) } \` ` ) ) ;
return ` Expected values which are ${ orFormatter . format ( uniqueExpectedTypes ) } . Received values of type ${ uniqueValueTypes . length > 1 ? 's' : '' } ${ andFormatter . format ( uniqueValueTypes ) } . ` ;
2023-08-07 08:50:03 +08:00
}
2020-01-22 12:08:35 +01:00
// Type assertions have to be declared with an explicit type.
2022-10-17 18:02:01 +07:00
type Assert = {
2020-01-22 12:08:35 +01:00
// Unknowns.
2024-04-23 07:58:28 +02:00
undefined : ( value : unknown , message? : string ) = > asserts value is undefined ;
string : ( value : unknown , message? : string ) = > asserts value is string ;
number : ( value : unknown , message? : string ) = > asserts value is number ;
positiveNumber : ( value : unknown , message? : string ) = > asserts value is number ;
negativeNumber : ( value : unknown , message? : string ) = > asserts value is number ;
bigint : ( value : unknown , message? : string ) = > asserts value is bigint ;
2020-01-22 12:08:35 +01:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
function : ( value : unknown , message? : string ) = > asserts value is Function ;
2023-08-07 08:50:03 +08:00
/** @deprecated Renamed to `function`. */
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
function_ : ( value : unknown , message? : string ) = > asserts value is Function ;
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
null : ( value : unknown , message? : string ) = > asserts value is null ;
2023-08-07 08:50:03 +08:00
/** @deprecated Renamed to `null`. */
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
null_ : ( value : unknown , message? : string ) = > asserts value is null ;
class : ( value : unknown , message? : string ) = > asserts value is Class ;
2023-08-07 08:50:03 +08:00
/** @deprecated Renamed to `class`. */
2024-04-23 07:58:28 +02:00
class_ : ( value : unknown , message? : string ) = > asserts value is Class ;
boolean : ( value : unknown , message? : string ) = > asserts value is boolean ;
symbol : ( value : unknown , message? : string ) = > asserts value is symbol ;
numericString : ( value : unknown , message? : string ) = > asserts value is ` ${ number } ` ;
array : < T = unknown > ( value : unknown , assertion ? : ( element : unknown ) = > asserts element is T , message? : string ) = > asserts value is T [ ] ;
buffer : ( value : unknown , message? : string ) = > asserts value is Buffer ;
blob : ( value : unknown , message? : string ) = > asserts value is Blob ;
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
nullOrUndefined : ( value : unknown , message? : string ) = > asserts value is null | undefined ;
object : < Key extends keyof any = string , Value = unknown > ( value : unknown , message? : string ) = > asserts value is Record < Key , Value > ;
iterable : < T = unknown > ( value : unknown , message? : string ) = > asserts value is Iterable < T > ;
asyncIterable : < T = unknown > ( value : unknown , message? : string ) = > asserts value is AsyncIterable < T > ;
generator : ( value : unknown , message? : string ) = > asserts value is Generator ;
asyncGenerator : ( value : unknown , message? : string ) = > asserts value is AsyncGenerator ;
nativePromise : < T = unknown > ( value : unknown , message? : string ) = > asserts value is Promise < T > ;
promise : < T = unknown > ( value : unknown , message? : string ) = > asserts value is Promise < T > ;
generatorFunction : ( value : unknown , message? : string ) = > asserts value is GeneratorFunction ;
asyncGeneratorFunction : ( value : unknown , message? : string ) = > asserts value is AsyncGeneratorFunction ;
2020-01-22 12:08:35 +01:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
asyncFunction : ( value : unknown , message? : string ) = > asserts value is Function ;
2020-01-22 12:08:35 +01:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
boundFunction : ( value : unknown , message? : string ) = > asserts value is Function ;
regExp : ( value : unknown , message? : string ) = > asserts value is RegExp ;
date : ( value : unknown , message? : string ) = > asserts value is Date ;
error : ( value : unknown , message? : string ) = > asserts value is Error ;
map : < Key = unknown , Value = unknown > ( value : unknown , message? : string ) = > asserts value is Map < Key , Value > ;
set : < T = unknown > ( value : unknown , message? : string ) = > asserts value is Set < T > ;
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
weakMap : < Key extends object = object , Value = unknown > ( value : unknown , message? : string ) = > asserts value is WeakMap < Key , Value > ;
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
weakSet : < T extends object = object > ( value : unknown , message? : string ) = > asserts value is WeakSet < T > ;
2023-08-07 08:50:03 +08:00
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
weakRef : < T extends object = object > ( value : unknown , message? : string ) = > asserts value is WeakRef < T > ;
int8Array : ( value : unknown , message? : string ) = > asserts value is Int8Array ;
uint8Array : ( value : unknown , message? : string ) = > asserts value is Uint8Array ;
uint8ClampedArray : ( value : unknown , message? : string ) = > asserts value is Uint8ClampedArray ;
int16Array : ( value : unknown , message? : string ) = > asserts value is Int16Array ;
uint16Array : ( value : unknown , message? : string ) = > asserts value is Uint16Array ;
int32Array : ( value : unknown , message? : string ) = > asserts value is Int32Array ;
uint32Array : ( value : unknown , message? : string ) = > asserts value is Uint32Array ;
float32Array : ( value : unknown , message? : string ) = > asserts value is Float32Array ;
float64Array : ( value : unknown , message? : string ) = > asserts value is Float64Array ;
bigInt64Array : ( value : unknown , message? : string ) = > asserts value is BigInt64Array ;
bigUint64Array : ( value : unknown , message? : string ) = > asserts value is BigUint64Array ;
arrayBuffer : ( value : unknown , message? : string ) = > asserts value is ArrayBuffer ;
sharedArrayBuffer : ( value : unknown , message? : string ) = > asserts value is SharedArrayBuffer ;
dataView : ( value : unknown , message? : string ) = > asserts value is DataView ;
enumCase : < T = unknown > ( value : unknown , targetEnum : T , message? : string ) = > asserts value is T [ keyof T ] ;
urlInstance : ( value : unknown , message? : string ) = > asserts value is URL ;
urlString : ( value : unknown , message? : string ) = > asserts value is string ;
truthy : < T > ( value : T | Falsy , message? : string ) = > asserts value is T ;
falsy : ( value : unknown , message? : string ) = > asserts value is Falsy ;
nan : ( value : unknown , message? : string ) = > asserts value is number ;
primitive : ( value : unknown , message? : string ) = > asserts value is Primitive ;
integer : ( value : unknown , message? : string ) = > asserts value is number ;
safeInteger : ( value : unknown , message? : string ) = > asserts value is number ;
plainObject : < Value = unknown > ( value : unknown , message? : string ) = > asserts value is Record < PropertyKey , Value > ;
typedArray : ( value : unknown , message? : string ) = > asserts value is TypedArray ;
arrayLike : < T = unknown > ( value : unknown , message? : string ) = > asserts value is ArrayLike < T > ;
tupleLike : < T extends Array < TypeGuard < unknown > > > ( value : unknown , guards : [ . . . T ] , message? : string ) = > asserts value is ResolveTypesOfTypeGuardsTuple < T > ;
2023-08-10 22:06:46 +08:00
/** @deprecated Renamed to `htmlElement` */
2024-04-23 07:58:28 +02:00
domElement : ( value : unknown , message? : string ) = > asserts value is HTMLElement ;
htmlElement : ( value : unknown , message? : string ) = > asserts value is HTMLElement ;
observable : ( value : unknown , message? : string ) = > asserts value is ObservableLike ;
nodeStream : ( value : unknown , message? : string ) = > asserts value is NodeStream ;
infinite : ( value : unknown , message? : string ) = > asserts value is number ;
emptyArray : ( value : unknown , message? : string ) = > asserts value is never [ ] ;
nonEmptyArray : < T = unknown , Item = unknown > ( value : T | Item [ ] , message? : string ) = > asserts value is [ Item , . . . Item [ ] ] ;
emptyString : ( value : unknown , message? : string ) = > asserts value is '' ;
emptyStringOrWhitespace : ( value : unknown , message? : string ) = > asserts value is string ;
nonEmptyString : ( value : unknown , message? : string ) = > asserts value is string ;
nonEmptyStringAndNotWhitespace : ( value : unknown , message? : string ) = > asserts value is string ;
emptyObject : < Key extends keyof any = string > ( value : unknown , message? : string ) = > asserts value is Record < Key , never > ;
nonEmptyObject : < Key extends keyof any = string , Value = unknown > ( value : unknown , message? : string ) = > asserts value is Record < Key , Value > ;
emptySet : ( value : unknown , message? : string ) = > asserts value is Set < never > ;
nonEmptySet : < T = unknown > ( value : unknown , message? : string ) = > asserts value is Set < T > ;
emptyMap : ( value : unknown , message? : string ) = > asserts value is Map < never , never > ;
nonEmptyMap : < Key = unknown , Value = unknown > ( value : unknown , message? : string ) = > asserts value is Map < Key , Value > ;
propertyKey : ( value : unknown , message? : string ) = > asserts value is PropertyKey ;
formData : ( value : unknown , message? : string ) = > asserts value is FormData ;
urlSearchParams : ( value : unknown , message? : string ) = > asserts value is URLSearchParams ;
validDate : ( value : unknown , message? : string ) = > asserts value is Date ;
validLength : ( value : unknown , message? : string ) = > asserts value is number ;
whitespaceString : ( value : unknown , message? : string ) = > asserts value is string ;
2020-01-22 12:08:35 +01:00
// Numbers.
2024-04-23 07:58:28 +02:00
evenInteger : ( value : number , message? : string ) = > asserts value is number ;
oddInteger : ( value : number , message? : string ) = > asserts value is number ;
2020-01-22 12:08:35 +01:00
// Two arguments.
2024-04-23 07:58:28 +02:00
directInstanceOf : < T > ( instance : unknown , class_ : Class < T > , message? : string ) = > asserts instance is T ;
inRange : ( value : number , range : number | [ number , number ] , message? : string ) = > asserts value is number ;
2020-01-22 12:08:35 +01:00
// Variadic functions.
2020-02-16 19:06:19 -06:00
any : ( predicate : Predicate | Predicate [ ] , . . . values : unknown [ ] ) = > void | never ;
2020-01-22 12:08:35 +01:00
all : ( predicate : Predicate , . . . values : unknown [ ] ) = > void | never ;
2022-10-17 18:02:01 +07:00
} ;
2020-01-22 12:08:35 +01:00
export const assert : Assert = {
2023-08-07 08:50:03 +08:00
all : assertAll ,
any : assertAny ,
array : assertArray ,
arrayBuffer : assertArrayBuffer ,
arrayLike : assertArrayLike ,
asyncFunction : assertAsyncFunction ,
asyncGenerator : assertAsyncGenerator ,
asyncGeneratorFunction : assertAsyncGeneratorFunction ,
asyncIterable : assertAsyncIterable ,
bigint : assertBigint ,
bigInt64Array : assertBigInt64Array ,
bigUint64Array : assertBigUint64Array ,
blob : assertBlob ,
boolean : assertBoolean ,
boundFunction : assertBoundFunction ,
buffer : assertBuffer ,
class : assertClass ,
class_ : assertClass ,
dataView : assertDataView ,
date : assertDate ,
directInstanceOf : assertDirectInstanceOf ,
2023-08-10 22:06:46 +08:00
domElement : assertHtmlElement ,
2023-08-07 08:50:03 +08:00
emptyArray : assertEmptyArray ,
emptyMap : assertEmptyMap ,
emptyObject : assertEmptyObject ,
emptySet : assertEmptySet ,
emptyString : assertEmptyString ,
emptyStringOrWhitespace : assertEmptyStringOrWhitespace ,
enumCase : assertEnumCase ,
error : assertError ,
evenInteger : assertEvenInteger ,
falsy : assertFalsy ,
float32Array : assertFloat32Array ,
float64Array : assertFloat64Array ,
formData : assertFormData ,
function : assertFunction ,
function_ : assertFunction ,
generator : assertGenerator ,
generatorFunction : assertGeneratorFunction ,
2023-08-10 22:06:46 +08:00
htmlElement : assertHtmlElement ,
2023-08-07 08:50:03 +08:00
infinite : assertInfinite ,
inRange : assertInRange ,
int16Array : assertInt16Array ,
int32Array : assertInt32Array ,
int8Array : assertInt8Array ,
integer : assertInteger ,
iterable : assertIterable ,
map : assertMap ,
nan : assertNan ,
nativePromise : assertNativePromise ,
negativeNumber : assertNegativeNumber ,
nodeStream : assertNodeStream ,
nonEmptyArray : assertNonEmptyArray ,
nonEmptyMap : assertNonEmptyMap ,
nonEmptyObject : assertNonEmptyObject ,
nonEmptySet : assertNonEmptySet ,
nonEmptyString : assertNonEmptyString ,
nonEmptyStringAndNotWhitespace : assertNonEmptyStringAndNotWhitespace ,
null : assertNull ,
null_ : assertNull ,
nullOrUndefined : assertNullOrUndefined ,
number : assertNumber ,
numericString : assertNumericString ,
object : assertObject ,
observable : assertObservable ,
oddInteger : assertOddInteger ,
plainObject : assertPlainObject ,
positiveNumber : assertPositiveNumber ,
primitive : assertPrimitive ,
promise : assertPromise ,
propertyKey : assertPropertyKey ,
regExp : assertRegExp ,
safeInteger : assertSafeInteger ,
set : assertSet ,
sharedArrayBuffer : assertSharedArrayBuffer ,
string : assertString ,
symbol : assertSymbol ,
truthy : assertTruthy ,
tupleLike : assertTupleLike ,
typedArray : assertTypedArray ,
uint16Array : assertUint16Array ,
uint32Array : assertUint32Array ,
uint8Array : assertUint8Array ,
uint8ClampedArray : assertUint8ClampedArray ,
undefined : assertUndefined ,
urlInstance : assertUrlInstance ,
urlSearchParams : assertUrlSearchParams ,
urlString : assertUrlString ,
2024-02-29 08:23:30 +01:00
validDate : assertValidDate ,
2023-08-07 08:50:03 +08:00
validLength : assertValidLength ,
weakMap : assertWeakMap ,
weakRef : assertWeakRef ,
weakSet : assertWeakSet ,
whitespaceString : assertWhitespaceString ,
} ;
2020-01-22 12:08:35 +01:00
2023-08-09 19:49:06 +08:00
const methodTypeMap = {
isArray : 'Array' ,
isArrayBuffer : 'ArrayBuffer' ,
isArrayLike : 'array-like' ,
isAsyncFunction : 'AsyncFunction' ,
isAsyncGenerator : 'AsyncGenerator' ,
isAsyncGeneratorFunction : 'AsyncGeneratorFunction' ,
isAsyncIterable : 'AsyncIterable' ,
isBigint : 'bigint' ,
isBigInt64Array : 'BigInt64Array' ,
isBigUint64Array : 'BigUint64Array' ,
isBlob : 'Blob' ,
isBoolean : 'boolean' ,
isBoundFunction : 'Function' ,
isBuffer : 'Buffer' ,
isClass : 'Class' ,
isDataView : 'DataView' ,
isDate : 'Date' ,
isDirectInstanceOf : 'T' ,
2023-08-10 22:06:46 +08:00
/** @deprecated */
2023-08-09 19:49:06 +08:00
isDomElement : 'HTMLElement' ,
isEmptyArray : 'empty array' ,
isEmptyMap : 'empty map' ,
isEmptyObject : 'empty object' ,
isEmptySet : 'empty set' ,
isEmptyString : 'empty string' ,
isEmptyStringOrWhitespace : 'empty string or whitespace' ,
isEnumCase : 'EnumCase' ,
isError : 'Error' ,
isEvenInteger : 'even integer' ,
isFalsy : 'falsy' ,
isFloat32Array : 'Float32Array' ,
isFloat64Array : 'Float64Array' ,
isFormData : 'FormData' ,
isFunction : 'Function' ,
isGenerator : 'Generator' ,
isGeneratorFunction : 'GeneratorFunction' ,
2023-08-10 22:06:46 +08:00
isHtmlElement : 'HTMLElement' ,
2023-08-09 19:49:06 +08:00
isInfinite : 'infinite number' ,
isInRange : 'in range' ,
isInt16Array : 'Int16Array' ,
isInt32Array : 'Int32Array' ,
isInt8Array : 'Int8Array' ,
isInteger : 'integer' ,
isIterable : 'Iterable' ,
isMap : 'Map' ,
isNan : 'NaN' ,
isNativePromise : 'native Promise' ,
isNegativeNumber : 'negative number' ,
isNodeStream : 'Node.js Stream' ,
isNonEmptyArray : 'non-empty array' ,
isNonEmptyMap : 'non-empty map' ,
isNonEmptyObject : 'non-empty object' ,
isNonEmptySet : 'non-empty set' ,
isNonEmptyString : 'non-empty string' ,
isNonEmptyStringAndNotWhitespace : 'non-empty string and not whitespace' ,
isNull : 'null' ,
isNullOrUndefined : 'null or undefined' ,
isNumber : 'number' ,
isNumericString : 'string with a number' ,
isObject : 'Object' ,
isObservable : 'Observable' ,
isOddInteger : 'odd integer' ,
isPlainObject : 'plain object' ,
isPositiveNumber : 'positive number' ,
isPrimitive : 'primitive' ,
isPromise : 'Promise' ,
isPropertyKey : 'PropertyKey' ,
isRegExp : 'RegExp' ,
isSafeInteger : 'integer' ,
isSet : 'Set' ,
isSharedArrayBuffer : 'SharedArrayBuffer' ,
isString : 'string' ,
isSymbol : 'symbol' ,
isTruthy : 'truthy' ,
isTupleLike : 'tuple-like' ,
isTypedArray : 'TypedArray' ,
isUint16Array : 'Uint16Array' ,
isUint32Array : 'Uint32Array' ,
isUint8Array : 'Uint8Array' ,
isUint8ClampedArray : 'Uint8ClampedArray' ,
isUndefined : 'undefined' ,
isUrlInstance : 'URL' ,
isUrlSearchParams : 'URLSearchParams' ,
isUrlString : 'string with a URL' ,
2024-02-29 08:23:30 +01:00
isValidDate : 'valid Date' ,
2023-08-09 19:49:06 +08:00
isValidLength : 'valid length' ,
isWeakMap : 'WeakMap' ,
isWeakRef : 'WeakRef' ,
isWeakSet : 'WeakSet' ,
isWhitespaceString : 'whitespace string' ,
} as const ;
function keysOf < T extends Record < PropertyKey , unknown > > ( value : T ) : Array < keyof T > {
return Object . keys ( value ) as Array < keyof T > ;
}
type IsMethodName = keyof typeof methodTypeMap ;
const isMethodNames : IsMethodName [ ] = keysOf ( methodTypeMap ) ;
function isIsMethodName ( value : unknown ) : value is IsMethodName {
return isMethodNames . includes ( value as IsMethodName ) ;
}
2023-08-07 08:50:03 +08:00
export function assertAll ( predicate : Predicate , . . . values : unknown [ ] ) : void | never {
if ( ! isAll ( predicate , . . . values ) ) {
2023-08-09 19:49:06 +08:00
const expectedType = isIsMethodName ( predicate . name ) ? methodTypeMap [ predicate . name ] : 'predicate returns truthy for all values' ;
throw new TypeError ( typeErrorMessageMultipleValues ( expectedType , values ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2020-01-22 12:08:35 +01:00
2023-08-07 08:50:03 +08:00
export function assertAny ( predicate : Predicate | Predicate [ ] , . . . values : unknown [ ] ) : void | never {
if ( ! isAny ( predicate , . . . values ) ) {
2023-08-09 19:49:06 +08:00
const predicates = isArray ( predicate ) ? predicate : [ predicate ] ;
const expectedTypes = predicates . map ( predicate = > isIsMethodName ( predicate . name ) ? methodTypeMap [ predicate . name ] : 'predicate returns truthy for any value' ) ;
throw new TypeError ( typeErrorMessageMultipleValues ( expectedTypes , values ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2020-01-22 12:08:35 +01:00
2024-04-23 07:58:28 +02:00
export function assertArray < T = unknown > ( value : unknown , assertion ? : ( element : unknown ) = > asserts element is T , message? : string ) : asserts value is T [ ] {
2023-08-07 08:50:03 +08:00
if ( ! isArray ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
2020-01-22 12:08:35 +01:00
2023-08-07 08:50:03 +08:00
if ( assertion ) {
// eslint-disable-next-line unicorn/no-array-for-each, unicorn/no-array-callback-reference
value . forEach ( assertion ) ;
}
}
2024-04-23 07:58:28 +02:00
export function assertArrayBuffer ( value : unknown , message? : string ) : asserts value is ArrayBuffer {
2023-08-07 08:50:03 +08:00
if ( ! isArrayBuffer ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'ArrayBuffer' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertArrayLike < T = unknown > ( value : unknown , message? : string ) : asserts value is ArrayLike < T > {
2023-08-07 08:50:03 +08:00
if ( ! isArrayLike ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'array-like' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertAsyncFunction ( value : unknown , message? : string ) : asserts value is Function {
2023-08-07 08:50:03 +08:00
if ( ! isAsyncFunction ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'AsyncFunction' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertAsyncGenerator ( value : unknown , message? : string ) : asserts value is AsyncGenerator {
2023-08-07 08:50:03 +08:00
if ( ! isAsyncGenerator ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'AsyncGenerator' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertAsyncGeneratorFunction ( value : unknown , message? : string ) : asserts value is AsyncGeneratorFunction {
2023-08-07 08:50:03 +08:00
if ( ! isAsyncGeneratorFunction ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'AsyncGeneratorFunction' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertAsyncIterable < T = unknown > ( value : unknown , message? : string ) : asserts value is AsyncIterable < T > {
2023-08-07 08:50:03 +08:00
if ( ! isAsyncIterable ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'AsyncIterable' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertBigint ( value : unknown , message? : string ) : asserts value is bigint {
2023-08-07 08:50:03 +08:00
if ( ! isBigint ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'bigint' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertBigInt64Array ( value : unknown , message? : string ) : asserts value is BigInt64Array {
2023-08-07 08:50:03 +08:00
if ( ! isBigInt64Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'BigInt64Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertBigUint64Array ( value : unknown , message? : string ) : asserts value is BigUint64Array {
2023-08-07 08:50:03 +08:00
if ( ! isBigUint64Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'BigUint64Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertBlob ( value : unknown , message? : string ) : asserts value is Blob {
2023-08-07 08:50:03 +08:00
if ( ! isBlob ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Blob' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertBoolean ( value : unknown , message? : string ) : asserts value is boolean {
2023-08-07 08:50:03 +08:00
if ( ! isBoolean ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'boolean' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertBoundFunction ( value : unknown , message? : string ) : asserts value is Function {
2023-08-07 08:50:03 +08:00
if ( ! isBoundFunction ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Function' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertBuffer ( value : unknown , message? : string ) : asserts value is Buffer {
2023-08-07 08:50:03 +08:00
if ( ! isBuffer ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Buffer' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertClass ( value : unknown , message? : string ) : asserts value is Class {
2023-08-07 08:50:03 +08:00
if ( ! isClass ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Class' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertDataView ( value : unknown , message? : string ) : asserts value is DataView {
2023-08-07 08:50:03 +08:00
if ( ! isDataView ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'DataView' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertDate ( value : unknown , message? : string ) : asserts value is Date {
2023-08-07 08:50:03 +08:00
if ( ! isDate ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Date' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertDirectInstanceOf < T > ( instance : unknown , class_ : Class < T > , message? : string ) : asserts instance is T {
2023-08-07 08:50:03 +08:00
if ( ! isDirectInstanceOf ( instance , class_ ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'T' , instance ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEmptyArray ( value : unknown , message? : string ) : asserts value is never [ ] {
2023-08-07 08:50:03 +08:00
if ( ! isEmptyArray ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'empty array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEmptyMap ( value : unknown , message? : string ) : asserts value is Map < never , never > {
2023-08-07 08:50:03 +08:00
if ( ! isEmptyMap ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'empty map' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEmptyObject < Key extends keyof any = string > ( value : unknown , message? : string ) : asserts value is Record < Key , never > {
2023-08-07 08:50:03 +08:00
if ( ! isEmptyObject ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'empty object' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEmptySet ( value : unknown , message? : string ) : asserts value is Set < never > {
2023-08-07 08:50:03 +08:00
if ( ! isEmptySet ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'empty set' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEmptyString ( value : unknown , message? : string ) : asserts value is '' {
2023-08-07 08:50:03 +08:00
if ( ! isEmptyString ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'empty string' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEmptyStringOrWhitespace ( value : unknown , message? : string ) : asserts value is string {
2023-08-07 08:50:03 +08:00
if ( ! isEmptyStringOrWhitespace ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'empty string or whitespace' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEnumCase < T = unknown > ( value : unknown , targetEnum : T , message? : string ) : asserts value is T [ keyof T ] {
2023-08-07 08:50:03 +08:00
if ( ! isEnumCase ( value , targetEnum ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'EnumCase' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertError ( value : unknown , message? : string ) : asserts value is Error {
2023-08-07 08:50:03 +08:00
if ( ! isError ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Error' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertEvenInteger ( value : number , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isEvenInteger ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'even integer' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertFalsy ( value : unknown , message? : string ) : asserts value is Falsy {
2023-08-07 08:50:03 +08:00
if ( ! isFalsy ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'falsy' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertFloat32Array ( value : unknown , message? : string ) : asserts value is Float32Array {
2023-08-07 08:50:03 +08:00
if ( ! isFloat32Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Float32Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertFloat64Array ( value : unknown , message? : string ) : asserts value is Float64Array {
2023-08-07 08:50:03 +08:00
if ( ! isFloat64Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Float64Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertFormData ( value : unknown , message? : string ) : asserts value is FormData {
2023-08-07 08:50:03 +08:00
if ( ! isFormData ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'FormData' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertFunction ( value : unknown , message? : string ) : asserts value is Function {
2023-08-07 08:50:03 +08:00
if ( ! isFunction ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Function' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertGenerator ( value : unknown , message? : string ) : asserts value is Generator {
2023-08-07 08:50:03 +08:00
if ( ! isGenerator ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Generator' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertGeneratorFunction ( value : unknown , message? : string ) : asserts value is GeneratorFunction {
2023-08-07 08:50:03 +08:00
if ( ! isGeneratorFunction ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'GeneratorFunction' , value ) ) ;
2023-08-10 22:06:46 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertHtmlElement ( value : unknown , message? : string ) : asserts value is HTMLElement {
2023-08-10 22:06:46 +08:00
if ( ! isHtmlElement ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'HTMLElement' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertInfinite ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isInfinite ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'infinite number' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertInRange ( value : number , range : number | [ number , number ] , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isInRange ( value , range ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'in range' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertInt16Array ( value : unknown , message? : string ) : asserts value is Int16Array {
2023-08-07 08:50:03 +08:00
if ( ! isInt16Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Int16Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertInt32Array ( value : unknown , message? : string ) : asserts value is Int32Array {
2023-08-07 08:50:03 +08:00
if ( ! isInt32Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Int32Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertInt8Array ( value : unknown , message? : string ) : asserts value is Int8Array {
2023-08-07 08:50:03 +08:00
if ( ! isInt8Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Int8Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertInteger ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isInteger ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'integer' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertIterable < T = unknown > ( value : unknown , message? : string ) : asserts value is Iterable < T > {
2023-08-07 08:50:03 +08:00
if ( ! isIterable ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Iterable' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertMap < Key = unknown , Value = unknown > ( value : unknown , message? : string ) : asserts value is Map < Key , Value > {
2023-08-07 08:50:03 +08:00
if ( ! isMap ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Map' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNan ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isNan ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'NaN' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNativePromise < T = unknown > ( value : unknown , message? : string ) : asserts value is Promise < T > {
2023-08-09 19:49:06 +08:00
if ( ! isNativePromise ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'native Promise' , value ) ) ;
2023-08-09 19:49:06 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNegativeNumber ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isNegativeNumber ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'negative number' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNodeStream ( value : unknown , message? : string ) : asserts value is NodeStream {
2023-08-07 08:50:03 +08:00
if ( ! isNodeStream ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Node.js Stream' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNonEmptyArray < T = unknown , Item = unknown > ( value : T | Item [ ] , message? : string ) : asserts value is [ Item , . . . Item [ ] ] {
2023-08-07 08:50:03 +08:00
if ( ! isNonEmptyArray ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'non-empty array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNonEmptyMap < Key = unknown , Value = unknown > ( value : unknown , message? : string ) : asserts value is Map < Key , Value > {
2023-08-07 08:50:03 +08:00
if ( ! isNonEmptyMap ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'non-empty map' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNonEmptyObject < Key extends keyof any = string , Value = unknown > ( value : unknown , message? : string ) : asserts value is Record < Key , Value > {
2023-08-07 08:50:03 +08:00
if ( ! isNonEmptyObject ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'non-empty object' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNonEmptySet < T = unknown > ( value : unknown , message? : string ) : asserts value is Set < T > {
2023-08-07 08:50:03 +08:00
if ( ! isNonEmptySet ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'non-empty set' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNonEmptyString ( value : unknown , message? : string ) : asserts value is string {
2023-08-07 08:50:03 +08:00
if ( ! isNonEmptyString ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'non-empty string' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNonEmptyStringAndNotWhitespace ( value : unknown , message? : string ) : asserts value is string {
2023-08-07 08:50:03 +08:00
if ( ! isNonEmptyStringAndNotWhitespace ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'non-empty string and not whitespace' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertNull ( value : unknown , message? : string ) : asserts value is null {
2023-08-07 08:50:03 +08:00
if ( ! isNull ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'null' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertNullOrUndefined ( value : unknown , message? : string ) : asserts value is null | undefined {
2023-08-07 08:50:03 +08:00
if ( ! isNullOrUndefined ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'null or undefined' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNumber ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isNumber ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'number' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertNumericString ( value : unknown , message? : string ) : asserts value is ` ${ number } ` {
2023-08-07 08:50:03 +08:00
if ( ! isNumericString ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'string with a number' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertObject ( value : unknown , message? : string ) : asserts value is object {
2023-08-07 08:50:03 +08:00
if ( ! isObject ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Object' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertObservable ( value : unknown , message? : string ) : asserts value is ObservableLike {
2023-08-07 08:50:03 +08:00
if ( ! isObservable ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Observable' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertOddInteger ( value : number , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isOddInteger ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'odd integer' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertPlainObject < Value = unknown > ( value : unknown , message? : string ) : asserts value is Record < PropertyKey , Value > {
2023-08-07 08:50:03 +08:00
if ( ! isPlainObject ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'plain object' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertPositiveNumber ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isPositiveNumber ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'positive number' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertPrimitive ( value : unknown , message? : string ) : asserts value is Primitive {
2023-08-07 08:50:03 +08:00
if ( ! isPrimitive ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'primitive' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertPromise < T = unknown > ( value : unknown , message? : string ) : asserts value is Promise < T > {
2023-08-07 08:50:03 +08:00
if ( ! isPromise ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Promise' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertPropertyKey ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isPropertyKey ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'PropertyKey' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertRegExp ( value : unknown , message? : string ) : asserts value is RegExp {
2023-08-07 08:50:03 +08:00
if ( ! isRegExp ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'RegExp' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertSafeInteger ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isSafeInteger ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'integer' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertSet < T = unknown > ( value : unknown , message? : string ) : asserts value is Set < T > {
2023-08-07 08:50:03 +08:00
if ( ! isSet ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Set' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertSharedArrayBuffer ( value : unknown , message? : string ) : asserts value is SharedArrayBuffer {
2023-08-07 08:50:03 +08:00
if ( ! isSharedArrayBuffer ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'SharedArrayBuffer' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertString ( value : unknown , message? : string ) : asserts value is string {
2023-08-07 08:50:03 +08:00
if ( ! isString ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'string' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertSymbol ( value : unknown , message? : string ) : asserts value is symbol {
2023-08-07 08:50:03 +08:00
if ( ! isSymbol ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'symbol' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertTruthy < T > ( value : T | Falsy , message? : string ) : asserts value is T {
2023-08-07 08:50:03 +08:00
if ( ! isTruthy ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'truthy' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertTupleLike < T extends Array < TypeGuard < unknown > > > ( value : unknown , guards : [ . . . T ] , message? : string ) : asserts value is ResolveTypesOfTypeGuardsTuple < T > {
2023-08-07 08:50:03 +08:00
if ( ! isTupleLike ( value , guards ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'tuple-like' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertTypedArray ( value : unknown , message? : string ) : asserts value is TypedArray {
2023-08-07 08:50:03 +08:00
if ( ! isTypedArray ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'TypedArray' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertUint16Array ( value : unknown , message? : string ) : asserts value is Uint16Array {
2023-08-07 08:50:03 +08:00
if ( ! isUint16Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Uint16Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertUint32Array ( value : unknown , message? : string ) : asserts value is Uint32Array {
2023-08-07 08:50:03 +08:00
if ( ! isUint32Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Uint32Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertUint8Array ( value : unknown , message? : string ) : asserts value is Uint8Array {
2023-08-07 08:50:03 +08:00
if ( ! isUint8Array ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Uint8Array' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertUint8ClampedArray ( value : unknown , message? : string ) : asserts value is Uint8ClampedArray {
2023-08-07 08:50:03 +08:00
if ( ! isUint8ClampedArray ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'Uint8ClampedArray' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertUndefined ( value : unknown , message? : string ) : asserts value is undefined {
2023-08-07 08:50:03 +08:00
if ( ! isUndefined ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'undefined' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertUrlInstance ( value : unknown , message? : string ) : asserts value is URL {
2023-08-07 08:50:03 +08:00
if ( ! isUrlInstance ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'URL' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line unicorn/prevent-abbreviations
2024-04-23 07:58:28 +02:00
export function assertUrlSearchParams ( value : unknown , message? : string ) : asserts value is URLSearchParams {
2023-08-07 08:50:03 +08:00
if ( ! isUrlSearchParams ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'URLSearchParams' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertUrlString ( value : unknown , message? : string ) : asserts value is string {
2023-08-07 08:50:03 +08:00
if ( ! isUrlString ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'string with a URL' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertValidDate ( value : unknown , message? : string ) : asserts value is Date {
2024-02-29 08:23:30 +01:00
if ( ! isValidDate ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'valid Date' , value ) ) ;
2024-02-29 08:23:30 +01:00
}
}
2024-04-23 07:58:28 +02:00
export function assertValidLength ( value : unknown , message? : string ) : asserts value is number {
2023-08-07 08:50:03 +08:00
if ( ! isValidLength ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'valid length' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertWeakMap < Key extends object = object , Value = unknown > ( value : unknown , message? : string ) : asserts value is WeakMap < Key , Value > {
2023-08-07 08:50:03 +08:00
if ( ! isWeakMap ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'WeakMap' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertWeakRef < T extends object = object > ( value : unknown , message? : string ) : asserts value is WeakRef < T > {
2023-08-07 08:50:03 +08:00
if ( ! isWeakRef ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'WeakRef' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
2024-04-23 07:58:28 +02:00
export function assertWeakSet < T extends object = object > ( value : unknown , message? : string ) : asserts value is WeakSet < T > {
2023-08-07 08:50:03 +08:00
if ( ! isWeakSet ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'WeakSet' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2024-04-23 07:58:28 +02:00
export function assertWhitespaceString ( value : unknown , message? : string ) : asserts value is string {
2023-08-07 08:50:03 +08:00
if ( ! isWhitespaceString ( value ) ) {
2024-04-23 07:58:28 +02:00
throw new TypeError ( message ? ? typeErrorMessage ( 'whitespace string' , value ) ) ;
2023-08-07 08:50:03 +08:00
}
}
2017-11-06 16:26:59 +01:00
2017-11-06 23:00:28 +07:00
export default is ;
2019-05-21 16:44:18 +07:00
2023-08-07 08:50:03 +08:00
export type {
ArrayLike ,
Class ,
NodeStream ,
ObservableLike ,
Predicate ,
Primitive ,
TypedArray ,
} from './types.js' ;