node-comfortv2.0.0

nc.checker

Type checks and validators. Every isX accepts anything and never throws, and most of them are type guards: inside if (nc.isString(value)), your editor knows value is a string, in JavaScript too.

const { checker } = require("@ix-xs/node-comfort");
import { isArray } from "@ix-xs/node-comfort/checker";

These functions are also available at the top level: nc.isArray() is nc.checker.isArray().

if (nc.isEmail(body.email) && nc.isPort(body.port)) connect(body);
nc.assert(user, "User not found");
GuideExplanations and examples for nc.checker.
Read the guide →

Functions

nc.checker.isArray()

isArray(value: unknown): value is any[]

Is it an array?

Parameters

NameType
valueunknown

Returns value is any[]

Example

nc.isArray([1, 2]);        // true
nc.isArray({ length: 0 }); // false

nc.checker.isNumber()

isNumber(value: unknown): value is number

Is it a number? NaN is rejected, Infinity passes (see isFinite).

Parameters

NameType
valueunknown

Returns value is number

Example

nc.isNumber(42);   // true
nc.isNumber(NaN);  // false
nc.isNumber("42"); // false, use isNumeric for strings

nc.checker.isFinite()

isFinite(value: unknown): value is number

Is it a finite number? Unlike the global isFinite, strings are rejected.

Parameters

NameType
valueunknown

Returns value is number

Example

nc.isFinite(42);       // true
nc.isFinite(Infinity); // false
nc.isFinite("42");     // false

nc.checker.isInteger()

isInteger(value: unknown): value is number

Is it an integer?

Parameters

NameType
valueunknown

Returns value is number

Example

nc.isInteger(4);   // true
nc.isInteger(4.5); // false

nc.checker.isSafeInteger()

isSafeInteger(value: unknown): value is number

Is it an integer JavaScript can represent exactly (up to 2^53 - 1)?

Parameters

NameType
valueunknown

Returns value is number

Example

nc.isSafeInteger(2 ** 53 - 1); // true
nc.isSafeInteger(2 ** 53);     // false

nc.checker.isFloat()

isFloat(value: unknown): value is number

Is it a finite number with a decimal part?

Parameters

NameType
valueunknown

Returns value is number

Example

nc.isFloat(4.2); // true
nc.isFloat(4);   // false

nc.checker.isPositive()

isPositive(value: unknown): value is number

Is it a number greater than zero?

Parameters

NameType
valueunknown

Returns value is number

Example

nc.isPositive(3); // true
nc.isPositive(0); // false

nc.checker.isNegative()

isNegative(value: unknown): value is number

Is it a number lower than zero?

Parameters

NameType
valueunknown

Returns value is number

Example

nc.isNegative(-3); // true
nc.isNegative(0);  // false

nc.checker.isBoolean()

isBoolean(value: unknown): value is boolean

Is it true or false? Truthy and falsy values don't count.

Parameters

NameType
valueunknown

Returns value is boolean

Example

nc.isBoolean(false); // true
nc.isBoolean(0);     // false

nc.checker.isString()

isString(value: unknown): value is string

Is it a string?

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isString("hello");             // true
nc.isString(new String("hello")); // false

nc.checker.isSymbol()

isSymbol(value: unknown): value is symbol

Is it a symbol?

Parameters

NameType
valueunknown

Returns value is symbol

nc.checker.isBigInt()

isBigInt(value: unknown): value is bigint

Is it a bigint?

Parameters

NameType
valueunknown

Returns value is bigint

Example

nc.isBigInt(10n); // true
nc.isBigInt(10);  // false

nc.checker.isUndefined()

isUndefined(value: unknown): value is undefined

Is it undefined?

Parameters

NameType
valueunknown

Returns value is undefined

nc.checker.isNull()

isNull(value: unknown): value is null

Is it null?

Parameters

NameType
valueunknown

Returns value is null

nc.checker.isNil()

isNil(value: unknown): value is null | undefined

Is it null or undefined?

Parameters

NameType
valueunknown

Returns value is null | undefined

Example

nc.isNil(undefined); // true
nc.isNil(0);         // false

nc.checker.isDefined()

isDefined<T>(value: T): value is NonNullable<T>

Is it anything but null or undefined? Pass it to filter() to drop missing values and keep the right type.

Parameters

NameType
valueT

Returns value is NonNullable<T>

Example

const ids = [1, null, 2, undefined].filter(nc.isDefined); // number[]

nc.checker.isPrimitive()

isPrimitive(value: unknown): value is Primitive

Is it a primitive (string, number, boolean, symbol, bigint, null or undefined)?

Parameters

NameType
valueunknown

Returns value is Primitive

nc.checker.isFunction()

isFunction(value: unknown): value is (...args: any[]) => any

Is it callable? Classes, async and generator functions count.

Parameters

NameType
valueunknown

Returns value is (...args: any[]) => any

nc.checker.isAsyncFunction()

isAsyncFunction(value: unknown): value is (...args: any[]) => Promise<any>

Was it declared with async? A function that merely returns a promise doesn't count.

Parameters

NameType
valueunknown

Returns value is (...args: any[]) => Promise<any>

Example

nc.isAsyncFunction(async () => {});         // true
nc.isAsyncFunction(() => Promise.resolve()); // false

nc.checker.isGeneratorFunction()

isGeneratorFunction(value: unknown): value is (...args: any[]) => Generator<unknown, any, any>

Is it a generator function (function*)?

Parameters

NameType
valueunknown

Returns value is (...args: any[]) => Generator

nc.checker.isGenerator()

isGenerator(value: unknown): value is Generator<unknown, any, any>

Is it a generator object, the result of calling a function*?

Parameters

NameType
valueunknown

Returns value is Generator

nc.checker.isClass()

isClass(value: unknown): value is new (...args: any[]) => any

Is it a class rather than a plain function?

Parameters

NameType
valueunknown

Returns value is new (...args: any[]) => any

Example

nc.isClass(class User {});  // true
nc.isClass(function () {}); // false

nc.checker.isObject()

isObject(value: unknown): value is object

Is it an object, and not null? Arrays, dates and class instances count; use isPlainObject for {} literals only.

Parameters

NameType
valueunknown

Returns value is object

nc.checker.isPlainObject()

isPlainObject(value: unknown): value is Record<string, unknown>

Is it a plain object, made with {}, new Object() or Object.create(null)? Arrays, dates, maps and class instances are rejected.

Parameters

NameType
valueunknown

Returns value is Record<string, unknown>

Example

nc.isPlainObject({ a: 1 });   // true
nc.isPlainObject(new Date()); // false

nc.checker.isPromise()

isPromise(value: unknown): value is PromiseLike<any>

Can it be awaited like a promise (anything with a then method)?

Parameters

NameType
valueunknown

Returns value is PromiseLike<any>

nc.checker.isRegExp()

isRegExp(value: unknown): value is RegExp

Is it a regular expression?

Parameters

NameType
valueunknown

Returns value is RegExp

nc.checker.isDate()

isDate(value: unknown): value is Date

Is it a Date, valid or not? Use isValidDate to reject Invalid Date.

Parameters

NameType
valueunknown

Returns value is Date

nc.checker.isValidDate()

isValidDate(value: unknown): value is Date

Is it a Date holding a real point in time?

Parameters

NameType
valueunknown

Returns value is Date

Example

nc.isValidDate(new Date());       // true
nc.isValidDate(new Date("nope")); // false

nc.checker.isMap()

isMap(value: unknown): value is Map<unknown, unknown>

Is it a Map?

Parameters

NameType
valueunknown

Returns value is Map<unknown, unknown>

nc.checker.isSet()

isSet(value: unknown): value is Set<unknown>

Is it a Set?

Parameters

NameType
valueunknown

Returns value is Set<unknown>

nc.checker.isWeakMap()

isWeakMap(value: unknown): value is WeakMap<object, unknown>

Is it a WeakMap?

Parameters

NameType
valueunknown

Returns value is WeakMap<object, unknown>

nc.checker.isWeakSet()

isWeakSet(value: unknown): value is WeakSet<object>

Is it a WeakSet?

Parameters

NameType
valueunknown

Returns value is WeakSet<object>

nc.checker.isIterable()

isIterable(value: unknown): value is Iterable<unknown>

Does it work with for...of? Strings, arrays, maps, sets and generators do.

Parameters

NameType
valueunknown

Returns value is Iterable<unknown>

nc.checker.isAsyncIterable()

isAsyncIterable(value: unknown): value is AsyncIterable<unknown>

Does it work with for await...of, like streams and async generators?

Parameters

NameType
valueunknown

Returns value is AsyncIterable<unknown>

nc.checker.isBuffer()

isBuffer(value: unknown): value is Buffer<ArrayBufferLike>

Is it a Node.js Buffer?

Parameters

NameType
valueunknown

Returns value is Buffer

nc.checker.isTypedArray()

isTypedArray(value: unknown): value is AnyTypedArray

Is it a typed array (Uint8Array, Float64Array...)? Buffers count.

Parameters

NameType
valueunknown

Returns value is AnyTypedArray

nc.checker.isError()

isError(value: unknown): value is Error

Is it an Error, including subclasses and errors from other realms?

Parameters

NameType
valueunknown

Returns value is Error

nc.checker.isEmpty()

isEmpty(value: unknown): boolean

Is it empty? null, undefined, "", [], {} and empty maps and sets are. Numbers, booleans and functions never are.

Parameters

NameType
valueunknown

Returns boolean

Example

nc.isEmpty({});  // true
nc.isEmpty(0);   // false
nc.isEmpty(" "); // false, see isBlank

nc.checker.isBlank()

isBlank(value: unknown): boolean

Is it null, undefined, or a string with nothing but whitespace?

Parameters

NameType
valueunknown

Returns boolean

Example

nc.isBlank("  \n"); // true
nc.isBlank(" a ");  // false

nc.checker.isArrayOf()

isArrayOf<T>(value: unknown, guard: (item: unknown) => item is T): value is T[]

Is it an array where every item passes guard?

Parameters

NameTypeDescription
valueunknown
guard(item: unknown) => item is TChecked against every item, like nc.isString.

Returns value is T[]

Example

if (nc.isArrayOf(input, nc.isString)) input.join(", "); // input: string[]

nc.checker.isOneOf()

isOneOf<L extends readonly unknown[]>(value: unknown, allowed: L): value is L[number]

Is it one of the allowed values? With a constant list, the value gets the matching literal type.

Parameters

NameType
valueunknown
allowedL

Returns value is L[number]

Example

const ROLES = ["admin", "user"] as const;
if (nc.isOneOf(input, ROLES)) input; // "admin" | "user"

nc.checker.isEmail()

isEmail(value: unknown): value is string

Does it look like an email address? The rules are practical rather than the full RFC: one @, no stray dots, a real top-level domain. International addresses are accepted.

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isEmail("jose@exemple.fr");     // true
nc.isEmail("john..doe@example.com"); // false
nc.isEmail("john@localhost");       // false

nc.checker.isURL()

isURL(value: unknown, options?: IsURLOptions): value is string

Is it an absolute URL with an allowed protocol (http and https by default)?

Parameters

NameType
valueunknown
optionsoptionalIsURLOptions

Returns value is string

Example

nc.isURL("https://example.com/a?b=1");                 // true
nc.isURL("ftp://example.com", { protocols: ["ftp:"] }); // true
nc.isURL("http://localhost:3000", { requireTld: true }); // false

nc.checker.isUUID()

isUUID(value: unknown, options?: IsUUIDOptions): value is string

Is it a UUID?

Parameters

NameType
valueunknown
optionsoptionalIsUUIDOptions

Returns value is string

Example

nc.isUUID(nc.id.uuid());           // true
nc.isUUID(id, { version: 7 });     // only v7

nc.checker.isJSON()

isJSON(value: unknown): value is string

Is it a string of valid JSON?

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isJSON('{"a":1}'); // true
nc.isJSON("{a:1}");   // false

nc.checker.isNumeric()

isNumeric(value: unknown): value is string | number

Is it a finite number, or a string that is exactly one (spaces around are fine)?

Parameters

NameType
valueunknown

Returns value is number | string

Example

nc.isNumeric("4.2e3"); // true
nc.isNumeric(" 12 ");  // true
nc.isNumeric("12px");  // false

nc.checker.isIP()

isIP(value: unknown, version?: 4 | 6): value is string

Is it an IP address?

Parameters

NameTypeDescription
valueunknown
versionoptional4|6Only accept IPv4 or IPv6.

Returns value is string

Example

nc.isIP("192.168.0.1"); // true
nc.isIP("::1");         // true
nc.isIP("::1", 4);      // false

nc.checker.isIPv4()

isIPv4(value: unknown): value is string

Is it an IPv4 address, like 192.168.0.1?

Parameters

NameType
valueunknown

Returns value is string

nc.checker.isIPv6()

isIPv6(value: unknown): value is string

Is it an IPv6 address, like ::1?

Parameters

NameType
valueunknown

Returns value is string

nc.checker.isPort()

isPort(value: unknown): boolean

Is it a valid port (0 to 65535), as a number or a numeric string?

Parameters

NameType
valueunknown

Returns boolean

Example

nc.isPort("8080"); // true
nc.isPort(70000);  // false

nc.checker.isHex()

isHex(value: unknown): value is string

Is it a hexadecimal string? A 0x prefix is allowed.

Parameters

NameType
valueunknown

Returns value is string

nc.checker.isHexColor()

isHexColor(value: unknown): value is string

Is it a CSS hex color (#rgb, #rgba, #rrggbb or #rrggbbaa)?

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isHexColor("#f80"); // true
nc.isHexColor("f80");  // false, the # is required

nc.checker.isBase64()

isBase64(value: unknown, options?: IsBase64Options): value is string

Is it valid Base64?

Parameters

NameType
valueunknown
optionsoptionalIsBase64Options

Returns value is string

Example

nc.isBase64("aGVsbG8=");                   // true
nc.isBase64("aGVsbG8", { urlSafe: true }); // true

nc.checker.isSemver()

isSemver(value: unknown): value is string

Is it a semantic version? A leading v is fine.

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isSemver("v2.0.0-rc.1"); // true
nc.isSemver("1.2");         // false

nc.checker.isISODate()

isISODate(value: unknown): value is string

Is it an ISO 8601 date or date-time, and a real calendar date?

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isISODate("2024-02-29T10:00:00Z"); // true
nc.isISODate("2023-02-29");           // false, not a leap year

nc.checker.isSlug()

isSlug(value: unknown): value is string

Is it a URL slug like my-first-post? See nc.str.slugify() to make one.

Parameters

NameType
valueunknown

Returns value is string

nc.checker.isAlpha()

isAlpha(value: unknown): value is string

Is it made only of letters, in any alphabet?

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isAlpha("Élodie"); // true
nc.isAlpha("abc1");   // false

nc.checker.isAlphanumeric()

isAlphanumeric(value: unknown): value is string

Is it made only of letters and digits, in any alphabet?

Parameters

NameType
valueunknown

Returns value is string

nc.checker.isCreditCard()

isCreditCard(value: unknown): value is string

Could it be a card number? Checks the length and the Luhn checksum; spaces and dashes are ignored.

Parameters

NameType
valueunknown

Returns value is string

Example

nc.isCreditCard("4242 4242 4242 4242"); // true

nc.checker.isJWT()

isJWT(value: unknown): value is string

Does it look like a JSON Web Token? The signature is not verified; use nc.crypto.verifyJWT() for that.

Parameters

NameType
valueunknown

Returns value is string

nc.checker.assert()

assert(condition: unknown, message?: string | (() => string) | undefined): asserts condition

Throws an AssertionError if condition is falsy. Afterwards, TypeScript knows the condition holds.

Parameters

NameTypeDescription
conditionunknown
messageoptionalstring | (() => string)A message, or a function that builds it.Default: "Assertion failed"

Returns asserts condition

Throws AssertionError

Example

const user = users.find((u) => u.id === id);
nc.assert(user, `User ${id} not found`);
user.name; // no "possibly undefined" here

nc.checker.assertType()

assertType<T>(value: unknown, guard: (value: unknown) => value is T, message?: string | (() => string) | undefined): asserts value is T

Throws an AssertionError unless value passes guard. Afterwards, value has the guarded type.

Parameters

NameTypeDescription
valueunknown
guard(value: unknown) => value is TA check like nc.isString.
messageoptionalstring | (() => string)

Returns asserts value is T

Throws AssertionError

Example

nc.assertType(config.port, nc.isInteger, "port must be an integer");

Types

Import any of them in TypeScript with import type { AnyTypedArray } from "@ix-xs/node-comfort", or in JavaScript with import("@ix-xs/node-comfort").AnyTypedArray.

AnyTypedArray

Any built-in typed array.

type AnyTypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array

IsBase64Options

Options for isBase64().

PropertyTypeDescription
urlSafeoptionalbooleanExpect the URL-safe alphabet (- and _), padding optional.

IsURLOptions

Options for isURL().

PropertyTypeDescription
protocolsoptionalstring[]Accepted protocols, colon included. Defaults to ["http:", "https:"].
requireTldoptionalbooleanRequire a domain like example.com, rejecting localhost and bare IPs.

IsUUIDOptions

Options for isUUID().

PropertyTypeDescription
versionoptional4 | 6 | 2 | 1 | 3 | 5 | 7 | 8Only accept this version. Otherwise versions 1 to 8 pass, plus the nil and max UUIDs.

Primitive

Any primitive value.

type Primitive = string | number | boolean | symbol | bigint | null | undefined
node-comfort v2.0.0View the source