npm.io
0.12.1 • Published yesterday

@rcompat/is

Licence
MIT
Version
0.12.1
Deps
0
Size
23 kB
Vulns
0
Weekly
0
Stars
35

@rcompat/is

Type guard predicates for JavaScript runtimes.

What is @rcompat/is?

A cross-runtime module providing type guard functions for common value checks. All functions return boolean and include TypeScript type narrowing. Works consistently across Node, Deno, and Bun.

Installation

npm install @rcompat/is
pnpm add @rcompat/is
yarn add @rcompat/is
bun add @rcompat/is

Usage

nullish

Checks if a value is null or undefined.

import is from "@rcompat/is";

is.nullish(null);      // true
is.nullish(undefined); // true
is.nullish(0);         // false
is.nullish("");        // false
is.nullish(false);     // false
defined

Checks if a value is not undefined.

import is from "@rcompat/is";

is.defined("hello");   // true
is.defined(0);         // true
is.defined(null);      // true
is.defined(undefined); // false
truthy

Checks if a value is truthy.

import is from "@rcompat/is";

is.truthy(1);       // true
is.truthy("hello"); // true
is.truthy([]);      // true
is.truthy(0);       // false
is.truthy("");      // false
is.truthy(null);    // false
falsy

Checks if a value is falsy.

import is from "@rcompat/is";

is.falsy(0);         // true
is.falsy("");        // true
is.falsy(null);      // true
is.falsy(undefined); // true
is.falsy(false);     // true
is.falsy(NaN);       // true
is.falsy(1);         // false
empty

Checks if a value is empty (strings, arrays, Sets, Maps, objects).

import is from "@rcompat/is";

is.empty("");        // true
is.empty([]);        // true
is.empty({});        // true
is.empty(new Set()); // true
is.empty(new Map()); // true
is.empty("hello");   // false
is.empty([1, 2]);    // false
is.empty({ a: 1 });  // false
blank

Checks if a string is empty or contains only whitespace.

import is from "@rcompat/is";

is.blank("");      // true
is.blank("   ");   // true
is.blank("\t\n");  // true
is.blank("hello"); // false
is.blank(" hi ");  // false
numeric

Checks if a string represents a valid number.

import is from "@rcompat/is";

is.numeric("123");    // true
is.numeric("-45.67"); // true
is.numeric("1e10");   // true
is.numeric("+3.14");  // true
is.numeric("abc");    // false
is.numeric("");       // false
is.numeric("12px");   // false
int

Checks if a value is an integer number.

import is from "@rcompat/is";

is.int(42);   // true
is.int(-10);  // true
is.int(0);    // true
is.int(3.14); // false
is.int(NaN);  // false
is.int("42"); // false
uint

Checks if a value is a positive integer (unsigned).

import is from "@rcompat/is";

is.uint(1);    // true
is.uint(100);  // true
is.uint(0);    // false
is.uint(-1);   // false
is.uint(3.14); // false
safeint

Checks if a value is a safe integer (within JavaScript's safe range).

import is from "@rcompat/is";

is.safeint(42);                          // true
is.safeint(Number.MAX_SAFE_INTEGER);     // true
is.safeint(Number.MAX_SAFE_INTEGER + 1); // false
is.safeint(3.14);                        // false
finite

Checks if a number or bigint is finite.

import is from "@rcompat/is";

is.finite(42);        // true
is.finite(3.14);      // true
is.finite(100n);      // true (bigints are always finite)
is.finite(Infinity);  // false
is.finite(-Infinity); // false
is.finite(NaN);       // false
nan

Checks if a value is NaN.

import is from "@rcompat/is";

is.nan(NaN);            // true
is.nan(Number.NaN);     // true
is.nan(0 / 0);          // true
is.nan(42);             // false
is.nan("NaN");          // false
primitive

Checks if a value is a primitive type.

import is from "@rcompat/is";

is.primitive("hello");   // true
is.primitive(42);        // true
is.primitive(true);      // true
is.primitive(null);      // true
is.primitive(undefined); // true
is.primitive(Symbol());  // true
is.primitive(100n);      // true
is.primitive({});        // false
is.primitive([]);        // false
dict

Checks if a value is a plain object (not array, Date, class instance, etc.).

import is from "@rcompat/is";

is.dict({});                  // true
is.dict({ a: 1 });            // true
is.dict(Object.create(null)); // true
is.dict([]);                  // false
is.dict(new Date());          // false
is.dict(new Map());           // false
is.dict(null);                // false
newable

Checks if a value is a constructor (can be called with new).

import is from "@rcompat/is";

is.newable(class {});      // true
is.newable(function() {}); // true
is.newable(Date);          // true
is.newable(() => {});      // false (arrow functions)
is.newable({});            // false
boolish

Checks if a value is the string "true" or "false".

import is from "@rcompat/is";

is.boolish("true");  // true
is.boolish("false"); // true
is.boolish(true);    // false (not a string)
is.boolish("yes");   // false
is.boolish("1");     // false

API Reference

All functions follow the same pattern:

declare function is<Name>(value: unknown): value is <Type>;
Function Type Guard Description
nullish null | undefined null or undefined
defined unknown not undefined
truthy unknown true in boolean contexts
falsy unknown false in boolean contexts
empty unknown empty collection/string/object
blank string empty/whitespace string
numeric string numeric string
int number integer number
uint number | bigint unsigned (positive) integer
safeint number safe integer
finite number | bigint finite number
nan number NaN
f32 number 32-bit float number
primitive Primitive primitive type
dict Dict plain object
f32array Float32Array 32-bit float typed array
f64array Float64Array 64-bit float typed array
newable Newable constructor
boolish "true" | "false" boolean string

Examples

Filter valid values
import is from "@rcompat/is";

const values = [1, null, 2, undefined, 3];

values.filter(is.defined);     // [1, null, 2, 3]
values.filter(v => !is.nullish(v));  // [1, 2, 3]
Parse configuration
import is from "@rcompat/is";

function parseEnvVar(value) {
  if (is.boolish(value)) return value === "true";
  if (is.numeric(value)) return Number(value);
  return value;
}

parseEnvVar("true");   // true
parseEnvVar("42");     // 42
parseEnvVar("hello");  // "hello"
Validate input
import is from "@rcompat/is";

function validateForm(data) {
  const errors = [];

  if (is.blank(data.name)) {
    errors.push("Name is required");
  }

  if (!uint(data.age)) {
    errors.push("Age must be a positive integer");
  }

  return errors;
}
Type-safe guards
import is from "@rcompat/is";

function process(value) {
  if (is.primitive(value)) {
    // TypeScript knows: value is:
    // string | number | boolean | bigint | symbol | null | undefined
    return String(value);
  }

  if (is.dict(value)) {
    // TypeScript knows: value is Record<string, unknown>
    return JSON.stringify(value);
  }

  return "[complex object]";
}

Cross-Runtime Compatibility

Runtime Supported
Node.js
Deno
Bun

No configuration required — just import and use.

License

MIT

Contributing

See CONTRIBUTING.md in the repository root.