2022-06-11 17:44:01 +07:00
import type { Buffer } from 'node:buffer' ;
2022-06-13 15:05:26 +08:00
import type { Class , Falsy , TypedArray , ObservableLike , Primitive , 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' ,
. . . objectTypeNames ,
. . . primitiveTypeNames ,
] as const ;
export type AssertionTypeDescription = typeof assertionTypeDescriptions [ number ] ;
2020-06-20 16:28:47 +09:00
// eslint-disable-next-line @typescript-eslint/ban-types
function isOfType < T extends Primitive | Function > ( type : PrimitiveTypeName | 'function' ) {
return ( value : unknown ) : value is T = > typeof value === type ;
}
const { toString } = Object . prototype ;
const getObjectType = ( value : unknown ) : ObjectTypeName | undefined = > {
2020-06-28 05:20:36 +09:00
const objectTypeName = toString . call ( value ) . slice ( 8 , - 1 ) ;
if ( /HTML\w+Element/ . test ( objectTypeName ) && is . domElement ( value ) ) {
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
} ;
2020-06-20 16:28:47 +09:00
const isObjectOfType = < T > ( type : ObjectTypeName ) = > ( value : unknown ) : value is T = > getObjectType ( value ) === type ;
2017-11-19 21:07:24 +01:00
2019-02-04 02:13:23 +07:00
function is ( 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
}
2018-05-03 05:22:32 +02:00
if ( is . observable ( value ) ) {
2020-06-20 16:28:47 +09:00
return 'Observable' ;
2018-05-03 05:22:32 +02:00
}
2019-02-04 02:13:23 +07:00
if ( is . array ( value ) ) {
2020-06-20 16:28:47 +09:00
return 'Array' ;
2017-11-06 16:26:59 +01:00
}
2019-02-04 02:13:23 +07:00
if ( is . buffer ( 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
}
2019-02-02 01:14:08 +07:00
is . undefined = isOfType < undefined > ( 'undefined' ) ;
2022-06-11 17:44:01 +07:00
2019-02-02 01:14:08 +07:00
is . string = isOfType < string > ( 'string' ) ;
2019-06-30 10:09:07 +02:00
const isNumberType = isOfType < number > ( 'number' ) ;
is . number = ( value : unknown ) : value is number = > isNumberType ( value ) && ! is . nan ( value ) ;
2023-07-14 23:26:30 +01:00
is . positiveNumber = ( value : unknown ) : value is number = > is . number ( value ) && value > 0 ;
is . negativeNumber = ( value : unknown ) : value is number = > is . number ( value ) && value < 0 ;
2019-05-04 12:05:23 +03:00
is . bigint = isOfType < bigint > ( 'bigint' ) ;
2019-03-31 20:41:19 +07:00
// eslint-disable-next-line @typescript-eslint/ban-types
2019-02-02 01:14:08 +07:00
is . function_ = isOfType < Function > ( 'function' ) ;
2019-03-31 20:41:19 +07:00
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line @typescript-eslint/ban-types
2019-02-02 01:14:08 +07:00
is . null_ = ( value : unknown ) : value is null = > value === null ;
2022-06-11 17:44:01 +07:00
2019-02-02 01:14:08 +07:00
is . class_ = ( value : unknown ) : value is Class = > is . function_ ( value ) && value . toString ( ) . startsWith ( 'class ' ) ;
2022-06-11 17:44:01 +07:00
2019-02-02 01:14:08 +07:00
is . boolean = ( value : unknown ) : value is boolean = > value === true || value === false ;
2022-06-11 17:44:01 +07:00
2019-02-04 02:13:23 +07:00
is . symbol = isOfType < symbol > ( 'symbol' ) ;
2019-02-02 01:14:08 +07:00
2023-05-30 13:43:51 +02:00
is . numericString = ( value : unknown ) : value is ` ${ number } ` = >
2020-04-18 03:25:02 +05:30
is . string ( value ) && ! is . emptyStringOrWhitespace ( value ) && ! Number . isNaN ( Number ( value ) ) ;
2019-02-02 01:14:08 +07:00
2020-07-25 10:11:59 +03:00
is . array = < T = unknown > ( value : unknown , assertion ? : ( value : T ) = > value is T ) : value is T [ ] = > {
if ( ! Array . isArray ( value ) ) {
return false ;
}
2020-08-21 15:18:34 -07:00
if ( ! is . function_ ( 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 ) ) ;
2020-07-25 10:11:59 +03:00
} ;
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call
2020-02-22 02:01:58 +07:00
is . buffer = ( value : unknown ) : value is Buffer = > ( value as any ) ? . constructor ? . isBuffer ? . ( value ) ? ? false ;
2022-06-11 17:44:01 +07:00
2022-02-27 15:16:25 +08:00
is . blob = ( value : unknown ) : value is Blob = > isObjectOfType < Blob > ( 'Blob' ) ( value ) ;
2019-02-02 01:14:08 +07:00
2022-06-11 17:44:01 +07:00
is . nullOrUndefined = ( value : unknown ) : value is null | undefined = > is . null_ ( value ) || is . undefined ( value ) ; // eslint-disable-line @typescript-eslint/ban-types
is . object = ( value : unknown ) : value is object = > ! is . null_ ( value ) && ( typeof value === 'object' || is . function_ ( value ) ) ; // eslint-disable-line @typescript-eslint/ban-types
2022-01-07 09:32:06 -05:00
is . iterable = < T = unknown > ( value : unknown ) : value is Iterable < T > = > is . function_ ( ( value as Iterable < T > ) ? . [ Symbol . iterator ] ) ;
2019-03-31 20:41:19 +07:00
2022-01-07 09:32:06 -05:00
is . asyncIterable = < T = unknown > ( value : unknown ) : value is AsyncIterable < T > = > is . function_ ( ( value as AsyncIterable < T > ) ? . [ Symbol . asyncIterator ] ) ;
2019-03-31 20:41:19 +07:00
2022-01-07 09:32:06 -05:00
is . generator = ( value : unknown ) : value is Generator = > is . iterable ( value ) && is . function_ ( ( value as Generator ) ? . next ) && is . function_ ( ( value as Generator ) ? . throw ) ;
2019-02-02 01:14:08 +07:00
2022-01-07 09:32:06 -05:00
is . asyncGenerator = ( value : unknown ) : value is AsyncGenerator = > is . asyncIterable ( value ) && is . function_ ( ( value as AsyncGenerator ) . next ) && is . function_ ( ( value as AsyncGenerator ) . throw ) ;
2020-01-29 18:35:58 +01:00
2020-01-29 17:22:35 +01:00
is . nativePromise = < T = unknown > ( value : unknown ) : value is Promise < T > = >
2020-06-20 16:28:47 +09:00
isObjectOfType < Promise < T > > ( 'Promise' ) ( value ) ;
2019-02-02 01:14:08 +07:00
2022-06-11 17:44:01 +07:00
const hasPromiseApi = < T = unknown > ( value : unknown ) : value is Promise < T > = >
is . function_ ( ( value as Promise < T > ) ? . then )
&& is . function_ ( ( value as Promise < T > ) ? . catch ) ;
2019-02-02 01:14:08 +07:00
2022-06-11 17:44:01 +07:00
is . promise = < T = unknown > ( value : unknown ) : value is Promise < T > = > is . nativePromise ( value ) || hasPromiseApi ( value ) ;
2019-02-02 01:14:08 +07:00
2020-06-20 16:28:47 +09:00
is . generatorFunction = isObjectOfType < GeneratorFunction > ( 'GeneratorFunction' ) ;
2019-03-31 20:41:19 +07:00
2020-06-20 16:28:47 +09:00
is . asyncGeneratorFunction = ( value : unknown ) : value is ( ( . . . args : any [ ] ) = > Promise < unknown > ) = > getObjectType ( value ) === 'AsyncGeneratorFunction' ;
2020-01-29 18:35:58 +01:00
2020-06-20 16:28:47 +09:00
is . asyncFunction = < T = unknown > ( value : unknown ) : value is ( ( . . . args : any [ ] ) = > Promise < T > ) = > getObjectType ( value ) === 'AsyncFunction' ;
2019-03-31 20:41:19 +07:00
// eslint-disable-next-line no-prototype-builtins, @typescript-eslint/ban-types
2019-02-02 01:14:08 +07:00
is . boundFunction = ( value : unknown ) : value is Function = > is . function_ ( value ) && ! value . hasOwnProperty ( 'prototype' ) ;
2020-06-20 16:28:47 +09:00
is . regExp = isObjectOfType < RegExp > ( 'RegExp' ) ;
2022-06-11 17:44:01 +07:00
2020-06-20 16:28:47 +09:00
is . date = isObjectOfType < Date > ( 'Date' ) ;
2022-06-11 17:44:01 +07:00
2020-06-20 16:28:47 +09:00
is . error = isObjectOfType < Error > ( 'Error' ) ;
2022-06-11 17:44:01 +07:00
2020-06-20 16:28:47 +09:00
is . map = < Key = unknown , Value = unknown > ( value : unknown ) : value is Map < Key , Value > = > isObjectOfType < Map < Key , Value > > ( 'Map' ) ( value ) ;
2022-06-11 17:44:01 +07:00
2020-06-20 16:28:47 +09:00
is . set = < T = unknown > ( value : unknown ) : value is Set < T > = > isObjectOfType < Set < T > > ( 'Set' ) ( value ) ;
2022-06-11 17:44:01 +07:00
is . weakMap = < Key extends object = object , Value = unknown > ( value : unknown ) : value is WeakMap < Key , Value > = > isObjectOfType < WeakMap < Key , Value > > ( 'WeakMap' ) ( value ) ; // eslint-disable-line @typescript-eslint/ban-types
is . weakSet = ( value : unknown ) : value is WeakSet < object > = > isObjectOfType < WeakSet < object > > ( 'WeakSet' ) ( value ) ; // eslint-disable-line @typescript-eslint/ban-types
2020-06-20 16:28:47 +09:00
2022-06-13 15:05:26 +08:00
is . weakRef = ( value : unknown ) : value is WeakRef < object > = > isObjectOfType < WeakRef < object > > ( 'WeakRef' ) ( value ) ; // eslint-disable-line @typescript-eslint/ban-types
2020-06-20 16:28:47 +09:00
is . int8Array = isObjectOfType < Int8Array > ( 'Int8Array' ) ;
is . uint8Array = isObjectOfType < Uint8Array > ( 'Uint8Array' ) ;
is . uint8ClampedArray = isObjectOfType < Uint8ClampedArray > ( 'Uint8ClampedArray' ) ;
is . int16Array = isObjectOfType < Int16Array > ( 'Int16Array' ) ;
is . uint16Array = isObjectOfType < Uint16Array > ( 'Uint16Array' ) ;
is . int32Array = isObjectOfType < Int32Array > ( 'Int32Array' ) ;
is . uint32Array = isObjectOfType < Uint32Array > ( 'Uint32Array' ) ;
is . float32Array = isObjectOfType < Float32Array > ( 'Float32Array' ) ;
is . float64Array = isObjectOfType < Float64Array > ( 'Float64Array' ) ;
is . bigInt64Array = isObjectOfType < BigInt64Array > ( 'BigInt64Array' ) ;
is . bigUint64Array = isObjectOfType < BigUint64Array > ( 'BigUint64Array' ) ;
is . arrayBuffer = isObjectOfType < ArrayBuffer > ( 'ArrayBuffer' ) ;
2022-06-11 17:44:01 +07:00
2020-06-20 16:28:47 +09:00
is . sharedArrayBuffer = isObjectOfType < SharedArrayBuffer > ( 'SharedArrayBuffer' ) ;
2022-06-11 17:44:01 +07:00
2020-06-20 16:28:47 +09:00
is . dataView = isObjectOfType < DataView > ( 'DataView' ) ;
2022-06-11 17:44:01 +07:00
2023-05-30 21:13:40 +07:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2022-10-17 18:02:01 +07:00
is . enumCase = < T = unknown > ( value : unknown , targetEnum : T ) : boolean = > Object . values ( targetEnum as any ) . includes ( value as string ) ;
2019-02-02 01:14:08 +07:00
2019-03-31 21:50:37 +07:00
is . directInstanceOf = < T > ( instance : unknown , class_ : Class < T > ) : instance is T = > Object . getPrototypeOf ( instance ) === class_ . prototype ;
2022-06-11 17:44:01 +07:00
2020-06-20 16:28:47 +09:00
is . urlInstance = ( value : unknown ) : value is URL = > isObjectOfType < URL > ( 'URL' ) ( value ) ;
2019-02-02 01:14:08 +07:00
2019-02-04 02:13:23 +07:00
is . urlString = ( value : unknown ) : value is string = > {
2019-02-02 01:14:08 +07:00
if ( ! is . string ( value ) ) {
return false ;
}
2018-12-13 16:52:55 +01:00
2019-02-02 01:14:08 +07:00
try {
2019-11-07 15:56:02 +07:00
new URL ( value ) ; // eslint-disable-line no-new
2019-02-02 01:14:08 +07:00
return true ;
} catch {
2018-12-13 16:52:55 +01:00
return false ;
2019-02-02 01:14:08 +07:00
}
} ;
2019-02-04 02:13:23 +07:00
// Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);`
2022-06-11 17:44:01 +07:00
is . truthy = < T > ( value : T | Falsy ) : value is T = > Boolean ( value ) ; // eslint-disable-line unicorn/prefer-native-coercion-functions
2019-02-04 02:13:23 +07:00
// Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);`
2023-07-16 22:19:31 +08:00
is . falsy = ( value : unknown ) : value is Falsy = > ! value ;
2018-12-13 16:52:55 +01:00
2019-02-02 01:14:08 +07:00
is . nan = ( value : unknown ) = > Number . isNaN ( value as number ) ;
2017-11-19 15:16:06 -05:00
2020-06-20 16:28:47 +09:00
is . primitive = ( value : unknown ) : value is Primitive = > is . null_ ( value ) || isPrimitiveTypeName ( typeof value ) ;
2019-02-02 01:14:08 +07:00
is . integer = ( value : unknown ) : value is number = > Number . isInteger ( value as number ) ;
2022-06-11 17:44:01 +07:00
2019-02-02 01:14:08 +07:00
is . safeInteger = ( value : unknown ) : value is number = > Number . isSafeInteger ( value as number ) ;
2021-09-07 11:41:26 +07:00
is . plainObject = < Value = unknown > ( value : unknown ) : value is Record < PropertyKey , Value > = > {
2021-01-24 14:20:06 +07:00
// From: https://github.com/sindresorhus/is-plain-obj/blob/main/index.js
2022-06-21 14:05:40 +02:00
if ( typeof value !== 'object' || value === null ) {
2019-03-31 20:41:19 +07:00
return false ;
}
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2019-03-31 20:41:19 +07:00
const prototype = Object . getPrototypeOf ( value ) ;
2019-02-02 01:14:08 +07:00
2022-06-21 14:05:40 +02: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
} ;
2017-11-06 16:26:59 +01:00
2020-06-20 16:28:47 +09:00
is . typedArray = ( value : unknown ) : value is TypedArray = > isTypedArrayName ( getObjectType ( value ) ) ;
2017-11-06 16:26:59 +01:00
2022-10-17 18:02:01 +07:00
export type ArrayLike < T > = {
2019-02-04 02:13:23 +07:00
readonly [ index : number ] : T ;
2020-01-21 17:56:44 +01:00
readonly length : number ;
2022-10-17 18:02:01 +07:00
} ;
2018-09-28 11:54:35 +05:30
2019-03-31 20:41:19 +07:00
const isValidLength = ( value : unknown ) : value is number = > is . safeInteger ( value ) && value >= 0 ;
2020-01-29 17:22:35 +01:00
is . arrayLike = < T = unknown > ( value : unknown ) : value is ArrayLike < T > = > ! is . nullOrUndefined ( value ) && ! is . function_ ( value ) && isValidLength ( ( value as ArrayLike < T > ) . length ) ;
2019-02-04 02:13:23 +07:00
2023-07-23 15:35:23 +03:00
type TypeGuard < T > = ( value : unknown ) = > value is T ;
// 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 ;
is . tupleLike = < T extends Array < TypeGuard < unknown > > > ( value : unknown , guards : [ . . . T ] ) : value is ResolveTypesOfTypeGuardsTuple < T > = > {
if ( is . array ( guards ) && is . array ( value ) && guards . length === value . length ) {
return guards . every ( ( guard , index ) = > guard ( value [ index ] ) ) ;
}
return false ;
} ;
2019-02-04 02:13:23 +07:00
is . inRange = ( value : number , range : number | number [ ] ) : value is number = > {
2019-02-02 01:14:08 +07:00
if ( is . number ( range ) ) {
return value >= Math . min ( 0 , range ) && value <= Math . max ( range , 0 ) ;
}
2018-09-28 11:54:35 +05:30
2019-02-02 01:14:08 +07:00
if ( is . array ( range ) && range . length === 2 ) {
return value >= Math . min ( . . . range ) && value <= Math . max ( . . . range ) ;
}
2018-09-28 11:54:35 +05:30
2019-02-02 01:14:08 +07:00
throw new TypeError ( ` Invalid range: ${ JSON . stringify ( range ) } ` ) ;
} ;
2018-09-28 11:54:35 +05:30
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line @typescript-eslint/naming-convention
2019-02-02 01:14:08 +07:00
const NODE_TYPE_ELEMENT = 1 ;
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line @typescript-eslint/naming-convention
2020-06-20 16:28:47 +09:00
const DOM_PROPERTIES_TO_CHECK : Array < ( keyof HTMLElement ) > = [
2019-02-02 01:14:08 +07:00
'innerHTML' ,
'ownerDocument' ,
'style' ,
'attributes' ,
2022-06-11 17:44:01 +07:00
'nodeValue' ,
2019-02-02 01:14:08 +07:00
] ;
2017-11-06 16:26:59 +01:00
2022-06-11 17:44:01 +07:00
is . domElement = ( value : unknown ) : value is HTMLElement = > is . object ( value )
&& ( value as HTMLElement ) . nodeType === NODE_TYPE_ELEMENT
&& is . string ( ( value as HTMLElement ) . nodeName )
&& ! is . plainObject ( value )
&& DOM_PROPERTIES_TO_CHECK . every ( property = > property in value ) ;
2019-02-04 02:13:23 +07:00
is . observable = ( 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 ;
} ;
2022-10-17 18:02:01 +07:00
export type NodeStream = {
2019-11-13 16:06:18 +07:00
pipe < T extends NodeJS.WritableStream > ( destination : T , options ? : { end? : boolean } ) : T ;
2022-10-17 18:02:01 +07:00
} & NodeJS . EventEmitter ;
2019-02-04 02:13:23 +07:00
2019-07-01 23:19:25 +07:00
is . nodeStream = ( value : unknown ) : value is NodeStream = > is . object ( value ) && is . function_ ( ( value as NodeStream ) . pipe ) && ! is . observable ( value ) ;
2019-02-02 01:14:08 +07:00
2022-06-11 17:44:01 +07:00
is . infinite = ( value : unknown ) : value is number = > value === Number . POSITIVE_INFINITY || value === Number . NEGATIVE_INFINITY ;
2019-02-02 01:14:08 +07:00
2019-03-31 20:41:19 +07:00
const isAbsoluteMod2 = ( remainder : number ) = > ( value : number ) : value is number = > is . integer ( value ) && Math . abs ( value % 2 ) === remainder ;
2019-02-02 00:22:23 -06:00
is . evenInteger = isAbsoluteMod2 ( 0 ) ;
is . oddInteger = isAbsoluteMod2 ( 1 ) ;
2019-02-02 01:14:08 +07:00
2019-02-04 02:13:23 +07:00
is . emptyArray = ( value : unknown ) : value is never [ ] = > is . array ( value ) && value . length === 0 ;
2022-06-11 17:44:01 +07:00
2023-07-17 10:42:04 +01:00
is . nonEmptyArray = < T = unknown , Item = unknown > ( value : T | Item [ ] ) : value is [ Item , . . . Item [ ] ] = > is . array ( value ) && value . length > 0 ;
2019-02-04 02:13:23 +07:00
is . emptyString = ( value : unknown ) : value is '' = > is . string ( value ) && value . length === 0 ;
2020-02-22 02:01:58 +07:00
const isWhiteSpaceString = ( value : unknown ) : value is string = > is . string ( value ) && ! /\S/ . test ( value ) ;
2019-02-04 02:13:23 +07:00
is . emptyStringOrWhitespace = ( value : unknown ) : value is string = > is . emptyString ( value ) || isWhiteSpaceString ( value ) ;
2019-02-02 01:14:08 +07:00
2022-02-25 16:19:29 +07:00
// TODO: Use `not ''` when the `not` operator is available.
is . nonEmptyString = ( value : unknown ) : value is string = > is . string ( value ) && value . length > 0 ;
2022-02-25 09:10:57 +00:00
// TODO: Use `not ''` when the `not` operator is available.
is . nonEmptyStringAndNotWhitespace = ( value : unknown ) : value is string = > is . string ( value ) && ! is . emptyStringOrWhitespace ( value ) ;
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line unicorn/no-array-callback-reference
2020-01-29 17:22:35 +01:00
is . emptyObject = < Key extends keyof any = string > ( value : unknown ) : value is Record < Key , never > = > is . object ( value ) && ! is . map ( value ) && ! is . set ( value ) && Object . keys ( value ) . length === 0 ;
2019-02-02 01:14:08 +07:00
2019-02-04 02:13:23 +07:00
// TODO: Use `not` operator here to remove `Map` and `Set` from type guard:
// - https://github.com/Microsoft/TypeScript/pull/29317
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line unicorn/no-array-callback-reference
2020-01-29 17:22:35 +01:00
is . nonEmptyObject = < Key extends keyof any = string , Value = unknown > ( value : unknown ) : value is Record < Key , Value > = > is . object ( value ) && ! is . map ( value ) && ! is . set ( value ) && Object . keys ( value ) . length > 0 ;
2019-02-02 01:14:08 +07:00
2019-02-04 02:13:23 +07:00
is . emptySet = ( value : unknown ) : value is Set < never > = > is . set ( value ) && value . size === 0 ;
2022-06-11 17:44:01 +07:00
2020-01-29 17:22:35 +01:00
is . nonEmptySet = < T = unknown > ( value : unknown ) : value is Set < T > = > is . set ( value ) && value . size > 0 ;
2019-02-02 01:14:08 +07:00
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line unicorn/no-array-callback-reference
2019-02-04 02:13:23 +07:00
is . emptyMap = ( value : unknown ) : value is Map < never , never > = > is . map ( value ) && value . size === 0 ;
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line unicorn/no-array-callback-reference
2020-01-29 17:22:35 +01:00
is . nonEmptyMap = < Key = unknown , Value = unknown > ( value : unknown ) : value is Map < Key , Value > = > is . map ( value ) && value . size > 0 ;
2019-02-02 01:14:08 +07:00
2021-09-10 10:26:13 +02:00
// `PropertyKey` is any value that can be used as an object key (string, number, or symbol)
is . propertyKey = ( value : unknown ) : value is PropertyKey = > is . any ( [ is . string , is . number , is . symbol ] , value ) ;
2022-06-11 17:44:01 +07:00
2021-09-13 22:25:44 +08:00
is . formData = ( value : unknown ) : value is FormData = > isObjectOfType < FormData > ( 'FormData' ) ( value ) ;
is . urlSearchParams = ( value : unknown ) : value is URLSearchParams = > isObjectOfType < URLSearchParams > ( 'URLSearchParams' ) ( value ) ;
2021-09-10 10:26:13 +02:00
2019-02-04 02:13:23 +07:00
export type Predicate = ( value : unknown ) = > boolean ;
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
const predicateOnArray = ( method : ArrayMethod , predicate : Predicate , values : unknown [ ] ) = > {
2020-02-22 02:01:58 +07:00
if ( ! is . function_ ( 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 ) ;
2019-02-02 01:14:08 +07:00
} ;
2020-02-16 19:06:19 -06:00
is . any = ( predicate : Predicate | Predicate [ ] , . . . values : unknown [ ] ) : boolean = > {
const predicates = is . array ( predicate ) ? predicate : [ predicate ] ;
return predicates . some ( singlePredicate = >
2022-06-11 17:44:01 +07:00
predicateOnArray ( Array . prototype . some , singlePredicate , values ) ,
2020-02-16 19:06:19 -06:00
) ;
} ;
2019-02-04 02:13:23 +07:00
is . all = ( predicate : Predicate , . . . values : unknown [ ] ) : boolean = > predicateOnArray ( Array . prototype . every , predicate , values ) ;
2017-11-06 16:26:59 +01:00
2023-07-30 19:32:34 +08:00
const assertType = ( condition : boolean , description : AssertionTypeDescription , value : unknown , options : { multipleValues? : boolean } = { } ) : asserts condition = > {
2020-01-22 12:08:35 +01:00
if ( ! condition ) {
2021-04-22 04:00:08 -05:00
const { multipleValues } = options ;
2022-06-11 17:44:01 +07:00
const valuesMessage = multipleValues
? ` received values of types ${ [
2021-04-22 04:00:08 -05:00
. . . new Set (
2022-06-11 17:44:01 +07:00
( value as any [ ] ) . map ( singleValue = > ` \` ${ is ( singleValue ) } \` ` ) ,
) ,
] . join ( ', ' ) } `
: ` received value of type \` ${ is ( value ) } \` ` ;
2021-04-22 04:00:08 -05:00
throw new TypeError ( ` Expected value which is \` ${ description } \` , ${ valuesMessage } . ` ) ;
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.
undefined : ( value : unknown ) = > asserts value is undefined ;
string : ( value : unknown ) = > asserts value is string ;
number : ( value : unknown ) = > asserts value is number ;
2023-07-14 23:26:30 +01:00
positiveNumber : ( value : unknown ) = > asserts value is number ;
negativeNumber : ( value : unknown ) = > asserts value is number ;
2020-01-22 12:08:35 +01:00
bigint : ( value : unknown ) = > asserts value is bigint ;
// eslint-disable-next-line @typescript-eslint/ban-types
function_ : ( value : unknown ) = > asserts value is Function ;
2022-06-11 17:44:01 +07:00
null_ : ( value : unknown ) = > asserts value is null ; // eslint-disable-line @typescript-eslint/ban-types
2020-01-22 12:08:35 +01:00
class_ : ( value : unknown ) = > asserts value is Class ;
boolean : ( value : unknown ) = > asserts value is boolean ;
symbol : ( value : unknown ) = > asserts value is symbol ;
2023-05-30 13:43:51 +02:00
numericString : ( value : unknown ) = > asserts value is ` ${ number } ` ;
2020-07-25 10:11:59 +03:00
array : < T = unknown > ( value : unknown , assertion ? : ( element : unknown ) = > asserts element is T ) = > asserts value is T [ ] ;
2020-01-22 12:08:35 +01:00
buffer : ( value : unknown ) = > asserts value is Buffer ;
2022-02-27 15:16:25 +08:00
blob : ( value : unknown ) = > asserts value is Blob ;
2022-06-11 17:44:01 +07:00
nullOrUndefined : ( value : unknown ) = > asserts value is null | undefined ; // eslint-disable-line @typescript-eslint/ban-types
2020-01-29 17:22:35 +01:00
object : < Key extends keyof any = string , Value = unknown > ( value : unknown ) = > asserts value is Record < Key , Value > ;
2020-01-22 12:08:35 +01:00
iterable : < T = unknown > ( value : unknown ) = > asserts value is Iterable < T > ;
asyncIterable : < T = unknown > ( value : unknown ) = > asserts value is AsyncIterable < T > ;
generator : ( value : unknown ) = > asserts value is Generator ;
2020-01-29 18:35:58 +01:00
asyncGenerator : ( value : unknown ) = > asserts value is AsyncGenerator ;
2020-01-22 12:08:35 +01:00
nativePromise : < T = unknown > ( value : unknown ) = > asserts value is Promise < T > ;
promise : < T = unknown > ( value : unknown ) = > asserts value is Promise < T > ;
generatorFunction : ( value : unknown ) = > asserts value is GeneratorFunction ;
2020-01-29 18:35:58 +01:00
asyncGeneratorFunction : ( value : unknown ) = > asserts value is AsyncGeneratorFunction ;
2020-01-22 12:08:35 +01:00
// eslint-disable-next-line @typescript-eslint/ban-types
asyncFunction : ( value : unknown ) = > asserts value is Function ;
// eslint-disable-next-line @typescript-eslint/ban-types
boundFunction : ( value : unknown ) = > asserts value is Function ;
regExp : ( value : unknown ) = > asserts value is RegExp ;
date : ( value : unknown ) = > asserts value is Date ;
error : ( value : unknown ) = > asserts value is Error ;
2020-01-29 17:22:35 +01:00
map : < Key = unknown , Value = unknown > ( value : unknown ) = > asserts value is Map < Key , Value > ;
2020-01-22 12:08:35 +01:00
set : < T = unknown > ( value : unknown ) = > asserts value is Set < T > ;
2022-06-11 17:44:01 +07:00
weakMap : < Key extends object = object , Value = unknown > ( value : unknown ) = > asserts value is WeakMap < Key , Value > ; // eslint-disable-line @typescript-eslint/ban-types
weakSet : < T extends object = object > ( value : unknown ) = > asserts value is WeakSet < T > ; // eslint-disable-line @typescript-eslint/ban-types
2022-06-13 15:05:26 +08:00
weakRef : < T extends object = object > ( value : unknown ) = > asserts value is WeakRef < T > ; // eslint-disable-line @typescript-eslint/ban-types
2020-01-22 12:08:35 +01:00
int8Array : ( value : unknown ) = > asserts value is Int8Array ;
uint8Array : ( value : unknown ) = > asserts value is Uint8Array ;
uint8ClampedArray : ( value : unknown ) = > asserts value is Uint8ClampedArray ;
int16Array : ( value : unknown ) = > asserts value is Int16Array ;
uint16Array : ( value : unknown ) = > asserts value is Uint16Array ;
int32Array : ( value : unknown ) = > asserts value is Int32Array ;
uint32Array : ( value : unknown ) = > asserts value is Uint32Array ;
float32Array : ( value : unknown ) = > asserts value is Float32Array ;
float64Array : ( value : unknown ) = > asserts value is Float64Array ;
bigInt64Array : ( value : unknown ) = > asserts value is BigInt64Array ;
bigUint64Array : ( value : unknown ) = > asserts value is BigUint64Array ;
arrayBuffer : ( value : unknown ) = > asserts value is ArrayBuffer ;
sharedArrayBuffer : ( value : unknown ) = > asserts value is SharedArrayBuffer ;
dataView : ( value : unknown ) = > asserts value is DataView ;
2022-01-17 00:55:40 -05:00
enumCase : < T = unknown > ( value : unknown , targetEnum : T ) = > asserts value is T [ keyof T ] ;
2020-01-22 12:08:35 +01:00
urlInstance : ( value : unknown ) = > asserts value is URL ;
urlString : ( value : unknown ) = > asserts value is string ;
2023-07-16 22:19:31 +08:00
truthy : < T > ( value : T | Falsy ) = > asserts value is T ;
falsy : ( value : unknown ) = > asserts value is Falsy ;
nan : ( value : unknown ) = > asserts value is number ;
2020-01-22 12:08:35 +01:00
primitive : ( value : unknown ) = > asserts value is Primitive ;
integer : ( value : unknown ) = > asserts value is number ;
safeInteger : ( value : unknown ) = > asserts value is number ;
2021-09-07 11:41:26 +07:00
plainObject : < Value = unknown > ( value : unknown ) = > asserts value is Record < PropertyKey , Value > ;
2020-01-22 12:08:35 +01:00
typedArray : ( value : unknown ) = > asserts value is TypedArray ;
arrayLike : < T = unknown > ( value : unknown ) = > asserts value is ArrayLike < T > ;
2023-07-23 15:35:23 +03:00
tupleLike : < T extends Array < TypeGuard < unknown > > > ( value : unknown , guards : [ . . . T ] ) = > asserts value is ResolveTypesOfTypeGuardsTuple < T > ;
2020-06-20 16:28:47 +09:00
domElement : ( value : unknown ) = > asserts value is HTMLElement ;
2020-01-22 12:08:35 +01:00
observable : ( value : unknown ) = > asserts value is ObservableLike ;
nodeStream : ( value : unknown ) = > asserts value is NodeStream ;
infinite : ( value : unknown ) = > asserts value is number ;
emptyArray : ( value : unknown ) = > asserts value is never [ ] ;
2023-07-17 10:42:04 +01:00
nonEmptyArray : < T = unknown , Item = unknown > ( value : T | Item [ ] ) = > asserts value is [ Item , . . . Item [ ] ] ;
2020-01-22 12:08:35 +01:00
emptyString : ( value : unknown ) = > asserts value is '' ;
emptyStringOrWhitespace : ( value : unknown ) = > asserts value is string ;
2022-02-25 16:19:29 +07:00
nonEmptyString : ( value : unknown ) = > asserts value is string ;
2022-02-25 09:10:57 +00:00
nonEmptyStringAndNotWhitespace : ( value : unknown ) = > asserts value is string ;
2020-01-29 17:22:35 +01:00
emptyObject : < Key extends keyof any = string > ( value : unknown ) = > asserts value is Record < Key , never > ;
nonEmptyObject : < Key extends keyof any = string , Value = unknown > ( value : unknown ) = > asserts value is Record < Key , Value > ;
2020-01-22 12:08:35 +01:00
emptySet : ( value : unknown ) = > asserts value is Set < never > ;
2020-01-29 17:22:35 +01:00
nonEmptySet : < T = unknown > ( value : unknown ) = > asserts value is Set < T > ;
2020-01-22 12:08:35 +01:00
emptyMap : ( value : unknown ) = > asserts value is Map < never , never > ;
2020-01-29 17:22:35 +01:00
nonEmptyMap : < Key = unknown , Value = unknown > ( value : unknown ) = > asserts value is Map < Key , Value > ;
2021-09-10 10:26:13 +02:00
propertyKey : ( value : unknown ) = > asserts value is PropertyKey ;
2021-09-13 22:25:44 +08:00
formData : ( value : unknown ) = > asserts value is FormData ;
urlSearchParams : ( value : unknown ) = > asserts value is URLSearchParams ;
2020-01-22 12:08:35 +01:00
// Numbers.
evenInteger : ( value : number ) = > asserts value is number ;
oddInteger : ( value : number ) = > asserts value is number ;
// Two arguments.
directInstanceOf : < T > ( instance : unknown , class_ : Class < T > ) = > asserts instance is T ;
inRange : ( value : number , range : number | number [ ] ) = > asserts value is number ;
// 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
2022-06-11 17:44:01 +07:00
/* eslint-disable @typescript-eslint/no-confusing-void-expression */
2020-01-22 12:08:35 +01:00
export const assert : Assert = {
// Unknowns.
2020-06-20 16:28:47 +09:00
undefined : ( value : unknown ) : asserts value is undefined = > assertType ( is . undefined ( value ) , 'undefined' , value ) ,
string : ( value : unknown ) : asserts value is string = > assertType ( is . string ( value ) , 'string' , value ) ,
number : ( value : unknown ) : asserts value is number = > assertType ( is . number ( value ) , 'number' , value ) ,
2023-07-30 19:32:34 +08:00
positiveNumber : ( value : unknown ) : asserts value is number = > assertType ( is . positiveNumber ( value ) , 'positive number' , value ) ,
negativeNumber : ( value : unknown ) : asserts value is number = > assertType ( is . negativeNumber ( value ) , 'negative number' , value ) ,
2020-06-20 16:28:47 +09:00
bigint : ( value : unknown ) : asserts value is bigint = > assertType ( is . bigint ( value ) , 'bigint' , value ) ,
2020-01-22 12:08:35 +01:00
// eslint-disable-next-line @typescript-eslint/ban-types
2020-06-20 16:28:47 +09:00
function_ : ( value : unknown ) : asserts value is Function = > assertType ( is . function_ ( value ) , 'Function' , value ) ,
2022-06-11 17:44:01 +07:00
null_ : ( value : unknown ) : asserts value is null = > assertType ( is . null_ ( value ) , 'null' , value ) , // eslint-disable-line @typescript-eslint/ban-types
2023-07-30 19:32:34 +08:00
class_ : ( value : unknown ) : asserts value is Class = > assertType ( is . class_ ( value ) , 'Class' , value ) ,
2020-06-20 16:28:47 +09:00
boolean : ( value : unknown ) : asserts value is boolean = > assertType ( is . boolean ( value ) , 'boolean' , value ) ,
symbol : ( value : unknown ) : asserts value is symbol = > assertType ( is . symbol ( value ) , 'symbol' , value ) ,
2023-07-30 19:32:34 +08:00
numericString : ( value : unknown ) : asserts value is ` ${ number } ` = > assertType ( is . numericString ( value ) , 'string with a number' , value ) ,
2022-06-11 17:44:01 +07:00
array : < T = unknown > ( value : unknown , assertion ? : ( element : unknown ) = > asserts element is T ) : asserts value is T [ ] = > { // eslint-disable-line object-shorthand
2023-07-30 19:32:34 +08:00
const assert : ( condition : boolean , description : AssertionTypeDescription , value : unknown ) = > asserts condition = assertType ;
2020-07-25 10:11:59 +03:00
assert ( is . array ( value ) , 'Array' , value ) ;
if ( assertion ) {
2022-06-11 17:44:01 +07:00
// eslint-disable-next-line unicorn/no-array-for-each, unicorn/no-array-callback-reference
2020-07-25 10:11:59 +03:00
value . forEach ( assertion ) ;
}
} ,
2020-06-20 16:28:47 +09:00
buffer : ( value : unknown ) : asserts value is Buffer = > assertType ( is . buffer ( value ) , 'Buffer' , value ) ,
2022-02-27 15:16:25 +08:00
blob : ( value : unknown ) : asserts value is Blob = > assertType ( is . blob ( value ) , 'Blob' , value ) ,
2023-07-30 19:32:34 +08:00
nullOrUndefined : ( value : unknown ) : asserts value is null | undefined = > assertType ( is . nullOrUndefined ( value ) , 'null or undefined' , value ) , // eslint-disable-line @typescript-eslint/ban-types
2022-06-11 17:44:01 +07:00
object : ( value : unknown ) : asserts value is object = > assertType ( is . object ( value ) , 'Object' , value ) , // eslint-disable-line @typescript-eslint/ban-types
2023-07-30 19:32:34 +08:00
iterable : < T = unknown > ( value : unknown ) : asserts value is Iterable < T > = > assertType ( is . iterable ( value ) , 'Iterable' , value ) ,
asyncIterable : < T = unknown > ( value : unknown ) : asserts value is AsyncIterable < T > = > assertType ( is . asyncIterable ( value ) , 'AsyncIterable' , value ) ,
2020-06-20 16:28:47 +09:00
generator : ( value : unknown ) : asserts value is Generator = > assertType ( is . generator ( value ) , 'Generator' , value ) ,
asyncGenerator : ( value : unknown ) : asserts value is AsyncGenerator = > assertType ( is . asyncGenerator ( value ) , 'AsyncGenerator' , value ) ,
2023-07-30 19:32:34 +08:00
nativePromise : < T = unknown > ( value : unknown ) : asserts value is Promise < T > = > assertType ( is . nativePromise ( value ) , 'native Promise' , value ) ,
2020-06-20 16:28:47 +09:00
promise : < T = unknown > ( value : unknown ) : asserts value is Promise < T > = > assertType ( is . promise ( value ) , 'Promise' , value ) ,
generatorFunction : ( value : unknown ) : asserts value is GeneratorFunction = > assertType ( is . generatorFunction ( value ) , 'GeneratorFunction' , value ) ,
asyncGeneratorFunction : ( value : unknown ) : asserts value is AsyncGeneratorFunction = > assertType ( is . asyncGeneratorFunction ( value ) , 'AsyncGeneratorFunction' , value ) ,
2020-01-22 12:08:35 +01:00
// eslint-disable-next-line @typescript-eslint/ban-types
2020-06-20 16:28:47 +09:00
asyncFunction : ( value : unknown ) : asserts value is Function = > assertType ( is . asyncFunction ( value ) , 'AsyncFunction' , value ) ,
2020-01-22 12:08:35 +01:00
// eslint-disable-next-line @typescript-eslint/ban-types
2020-06-20 16:28:47 +09:00
boundFunction : ( value : unknown ) : asserts value is Function = > assertType ( is . boundFunction ( value ) , 'Function' , value ) ,
regExp : ( value : unknown ) : asserts value is RegExp = > assertType ( is . regExp ( value ) , 'RegExp' , value ) ,
date : ( value : unknown ) : asserts value is Date = > assertType ( is . date ( value ) , 'Date' , value ) ,
error : ( value : unknown ) : asserts value is Error = > assertType ( is . error ( value ) , 'Error' , value ) ,
2022-06-11 17:44:01 +07:00
map : < Key = unknown , Value = unknown > ( value : unknown ) : asserts value is Map < Key , Value > = > assertType ( is . map ( value ) , 'Map' , value ) , // eslint-disable-line unicorn/no-array-callback-reference
2020-06-20 16:28:47 +09:00
set : < T = unknown > ( value : unknown ) : asserts value is Set < T > = > assertType ( is . set ( value ) , 'Set' , value ) ,
2022-06-11 17:44:01 +07:00
weakMap : < Key extends object = object , Value = unknown > ( value : unknown ) : asserts value is WeakMap < Key , Value > = > assertType ( is . weakMap ( value ) , 'WeakMap' , value ) , // eslint-disable-line @typescript-eslint/ban-types
weakSet : < T extends object = object > ( value : unknown ) : asserts value is WeakSet < T > = > assertType ( is . weakSet ( value ) , 'WeakSet' , value ) , // eslint-disable-line @typescript-eslint/ban-types
2022-06-13 15:05:26 +08:00
weakRef : < T extends object = object > ( value : unknown ) : asserts value is WeakRef < T > = > assertType ( is . weakRef ( value ) , 'WeakRef' , value ) , // eslint-disable-line @typescript-eslint/ban-types
2020-06-20 16:28:47 +09:00
int8Array : ( value : unknown ) : asserts value is Int8Array = > assertType ( is . int8Array ( value ) , 'Int8Array' , value ) ,
uint8Array : ( value : unknown ) : asserts value is Uint8Array = > assertType ( is . uint8Array ( value ) , 'Uint8Array' , value ) ,
uint8ClampedArray : ( value : unknown ) : asserts value is Uint8ClampedArray = > assertType ( is . uint8ClampedArray ( value ) , 'Uint8ClampedArray' , value ) ,
int16Array : ( value : unknown ) : asserts value is Int16Array = > assertType ( is . int16Array ( value ) , 'Int16Array' , value ) ,
uint16Array : ( value : unknown ) : asserts value is Uint16Array = > assertType ( is . uint16Array ( value ) , 'Uint16Array' , value ) ,
int32Array : ( value : unknown ) : asserts value is Int32Array = > assertType ( is . int32Array ( value ) , 'Int32Array' , value ) ,
uint32Array : ( value : unknown ) : asserts value is Uint32Array = > assertType ( is . uint32Array ( value ) , 'Uint32Array' , value ) ,
float32Array : ( value : unknown ) : asserts value is Float32Array = > assertType ( is . float32Array ( value ) , 'Float32Array' , value ) ,
float64Array : ( value : unknown ) : asserts value is Float64Array = > assertType ( is . float64Array ( value ) , 'Float64Array' , value ) ,
bigInt64Array : ( value : unknown ) : asserts value is BigInt64Array = > assertType ( is . bigInt64Array ( value ) , 'BigInt64Array' , value ) ,
bigUint64Array : ( value : unknown ) : asserts value is BigUint64Array = > assertType ( is . bigUint64Array ( value ) , 'BigUint64Array' , value ) ,
arrayBuffer : ( value : unknown ) : asserts value is ArrayBuffer = > assertType ( is . arrayBuffer ( value ) , 'ArrayBuffer' , value ) ,
sharedArrayBuffer : ( value : unknown ) : asserts value is SharedArrayBuffer = > assertType ( is . sharedArrayBuffer ( value ) , 'SharedArrayBuffer' , value ) ,
dataView : ( value : unknown ) : asserts value is DataView = > assertType ( is . dataView ( value ) , 'DataView' , value ) ,
2022-01-17 00:55:40 -05:00
enumCase : < T = unknown > ( value : unknown , targetEnum : T ) : asserts value is T [ keyof T ] = > assertType ( is . enumCase ( value , targetEnum ) , 'EnumCase' , value ) ,
2020-06-20 16:28:47 +09:00
urlInstance : ( value : unknown ) : asserts value is URL = > assertType ( is . urlInstance ( value ) , 'URL' , value ) ,
2023-07-30 19:32:34 +08:00
urlString : ( value : unknown ) : asserts value is string = > assertType ( is . urlString ( value ) , 'string with a URL' , value ) ,
truthy : < T > ( value : T | Falsy ) : asserts value is T = > assertType ( is . truthy ( value ) , 'truthy' , value ) ,
falsy : ( value : unknown ) : asserts value is Falsy = > assertType ( is . falsy ( value ) , 'falsy' , value ) ,
nan : ( value : unknown ) : asserts value is number = > assertType ( is . nan ( value ) , 'NaN' , value ) ,
primitive : ( value : unknown ) : asserts value is Primitive = > assertType ( is . primitive ( value ) , 'primitive' , value ) ,
integer : ( value : unknown ) : asserts value is number = > assertType ( is . integer ( value ) , 'integer' , value ) ,
safeInteger : ( value : unknown ) : asserts value is number = > assertType ( is . safeInteger ( value ) , 'integer' , value ) ,
plainObject : < Value = unknown > ( value : unknown ) : asserts value is Record < PropertyKey , Value > = > assertType ( is . plainObject ( value ) , 'plain object' , value ) ,
typedArray : ( value : unknown ) : asserts value is TypedArray = > assertType ( is . typedArray ( value ) , 'TypedArray' , value ) ,
arrayLike : < T = unknown > ( value : unknown ) : asserts value is ArrayLike < T > = > assertType ( is . arrayLike ( value ) , 'array-like' , value ) ,
tupleLike : < T extends Array < TypeGuard < unknown > > > ( value : unknown , guards : [ . . . T ] ) : asserts value is ResolveTypesOfTypeGuardsTuple < T > = > assertType ( is . tupleLike ( value , guards ) , 'tuple-like' , value ) ,
domElement : ( value : unknown ) : asserts value is HTMLElement = > assertType ( is . domElement ( value ) , 'HTMLElement' , value ) ,
2020-06-20 16:28:47 +09:00
observable : ( value : unknown ) : asserts value is ObservableLike = > assertType ( is . observable ( value ) , 'Observable' , value ) ,
2023-07-30 19:32:34 +08:00
nodeStream : ( value : unknown ) : asserts value is NodeStream = > assertType ( is . nodeStream ( value ) , 'Node.js Stream' , value ) ,
infinite : ( value : unknown ) : asserts value is number = > assertType ( is . infinite ( value ) , 'infinite number' , value ) ,
emptyArray : ( value : unknown ) : asserts value is never [ ] = > assertType ( is . emptyArray ( value ) , 'empty array' , value ) ,
nonEmptyArray : < T = unknown , Item = unknown > ( value : T | Item [ ] ) : asserts value is [ Item , . . . Item [ ] ] = > assertType ( is . nonEmptyArray ( value ) , 'non-empty array' , value ) ,
emptyString : ( value : unknown ) : asserts value is '' = > assertType ( is . emptyString ( value ) , 'empty string' , value ) ,
emptyStringOrWhitespace : ( value : unknown ) : asserts value is string = > assertType ( is . emptyStringOrWhitespace ( value ) , 'empty string or whitespace' , value ) ,
nonEmptyString : ( value : unknown ) : asserts value is string = > assertType ( is . nonEmptyString ( value ) , 'non-empty string' , value ) ,
nonEmptyStringAndNotWhitespace : ( value : unknown ) : asserts value is string = > assertType ( is . nonEmptyStringAndNotWhitespace ( value ) , 'non-empty string and not whitespace' , value ) ,
emptyObject : < Key extends keyof any = string > ( value : unknown ) : asserts value is Record < Key , never > = > assertType ( is . emptyObject ( value ) , 'empty object' , value ) ,
nonEmptyObject : < Key extends keyof any = string , Value = unknown > ( value : unknown ) : asserts value is Record < Key , Value > = > assertType ( is . nonEmptyObject ( value ) , 'non-empty object' , value ) ,
emptySet : ( value : unknown ) : asserts value is Set < never > = > assertType ( is . emptySet ( value ) , 'empty set' , value ) ,
nonEmptySet : < T = unknown > ( value : unknown ) : asserts value is Set < T > = > assertType ( is . nonEmptySet ( value ) , 'non-empty set' , value ) ,
emptyMap : ( value : unknown ) : asserts value is Map < never , never > = > assertType ( is . emptyMap ( value ) , 'empty map' , value ) ,
nonEmptyMap : < Key = unknown , Value = unknown > ( value : unknown ) : asserts value is Map < Key , Value > = > assertType ( is . nonEmptyMap ( value ) , 'non-empty map' , value ) ,
2021-09-10 10:26:13 +02:00
propertyKey : ( value : unknown ) : asserts value is number = > assertType ( is . propertyKey ( value ) , 'PropertyKey' , value ) ,
2021-09-13 22:25:44 +08:00
formData : ( value : unknown ) : asserts value is FormData = > assertType ( is . formData ( value ) , 'FormData' , value ) ,
urlSearchParams : ( value : unknown ) : asserts value is URLSearchParams = > assertType ( is . urlSearchParams ( value ) , 'URLSearchParams' , value ) ,
2020-01-22 12:08:35 +01:00
// Numbers.
2023-07-30 19:32:34 +08:00
evenInteger : ( value : number ) : asserts value is number = > assertType ( is . evenInteger ( value ) , 'even integer' , value ) ,
oddInteger : ( value : number ) : asserts value is number = > assertType ( is . oddInteger ( value ) , 'odd integer' , value ) ,
2020-01-22 12:08:35 +01:00
// Two arguments.
2023-07-30 19:32:34 +08:00
directInstanceOf : < T > ( instance : unknown , class_ : Class < T > ) : asserts instance is T = > assertType ( is . directInstanceOf ( instance , class_ ) , 'T' , instance ) ,
inRange : ( value : number , range : number | number [ ] ) : asserts value is number = > assertType ( is . inRange ( value , range ) , 'in range' , value ) ,
2020-01-22 12:08:35 +01:00
// Variadic functions.
2023-07-30 19:32:34 +08:00
any : ( predicate : Predicate | Predicate [ ] , . . . values : unknown [ ] ) : void | never = > assertType ( is . any ( predicate , . . . values ) , 'predicate returns truthy for any value' , values , { multipleValues : true } ) ,
all : ( predicate : Predicate , . . . values : unknown [ ] ) : void | never = > assertType ( is . all ( predicate , . . . values ) , 'predicate returns truthy for all values' , values , { multipleValues : true } ) ,
2020-01-22 12:08:35 +01:00
} ;
2022-06-11 17:44:01 +07:00
/* eslint-enable @typescript-eslint/no-confusing-void-expression */
2020-01-22 12:08:35 +01:00
2017-11-06 22:36:51 +07:00
// Some few keywords are reserved, but we'll populate them for Node.js users
2017-11-06 16:26:59 +01:00
// See https://github.com/Microsoft/TypeScript/issues/2536
Object . defineProperties ( is , {
2017-11-06 22:36:51 +07:00
class : {
2022-06-11 17:44:01 +07:00
value : is.class_ ,
2017-11-06 22:36:51 +07:00
} ,
function : {
2022-06-11 17:44:01 +07:00
value : is.function_ ,
2017-11-06 22:36:51 +07:00
} ,
null : {
2022-06-11 17:44:01 +07:00
value : is.null_ ,
} ,
2017-11-06 16:26:59 +01:00
} ) ;
2020-01-22 12:08:35 +01:00
Object . defineProperties ( assert , {
class : {
2022-06-11 17:44:01 +07:00
value : assert.class_ ,
2020-01-22 12:08:35 +01:00
} ,
function : {
2022-06-11 17:44:01 +07:00
value : assert.function_ ,
2020-01-22 12:08:35 +01:00
} ,
null : {
2022-06-11 17:44:01 +07:00
value : assert.null_ ,
} ,
2020-01-22 12:08:35 +01: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
2022-06-11 17:44:01 +07:00
export type { Class , TypedArray , ObservableLike , Primitive } from './types.js' ;