Skip to content

TomerAberbach/builtin-type

Repository files navigation

builtin-type

What is the type of this builtin JS value?

Features

Install

Note

Determining the builtin type in a way that works cross-realm and is resilient to spoofing is significantly slower than plain instanceof or Object.prototype.toString.call(...). If you don't need those guarantees, then just use these simpler options directly.

$ npm i builtin-type

Usage

import assert from 'node:assert'
import builtinType from 'builtin-type'

assert.equal(builtinType(undefined), `undefined`)
assert.equal(builtinType(null), `null`)
assert.equal(builtinType(false), `boolean`)
assert.equal(builtinType(42), `number`)
assert.equal(builtinType(42n), `bigint`)
assert.equal(builtinType(`foo`), `string`)
assert.equal(builtinType(Symbol()), `symbol`)
assert.equal(builtinType(new Boolean(false)), `Boolean`)
assert.equal(builtinType(new Number(42)), `Number`)
assert.equal(builtinType(Object(42n)), `BigInt`)
assert.equal(builtinType(new String(`foo`)), `String`)
assert.equal(builtinType(Object(Symbol())), `Symbol`)
assert.equal(builtinType([]), `Array`)
assert.equal(builtinType(new Map()), `Map`)
assert.equal(builtinType(new Set()), `Set`)
assert.equal(builtinType(new WeakMap()), `WeakMap`)
assert.equal(builtinType(new WeakSet()), `WeakSet`)
assert.equal(
  builtinType(() => {}),
  `Function`,
)
assert.equal(
  builtinType(function* () {}),
  `GeneratorFunction`,
)
assert.equal(
  builtinType(async () => {}),
  `AsyncFunction`,
)
assert.equal(
  builtinType(async function* () {}),
  `AsyncGeneratorFunction`,
)
assert.equal(
  builtinType(
    (function () {
      return arguments
    })(),
  ),
  `Arguments`,
)
assert.equal(builtinType(Promise.resolve()), `Promise`)
assert.equal(builtinType(new Date()), `Date`)
assert.equal(builtinType(/a/g), `RegExp`)
assert.equal(builtinType(new URL(`https://example.com/`)), `URL`)
assert.equal(builtinType(new URLSearchParams()), `URLSearchParams`)
assert.equal(builtinType(new WeakRef({})), `WeakRef`)
assert.equal(
  builtinType(new FinalizationRegistry(() => {})),
  `FinalizationRegistry`,
)
assert.equal(builtinType(new ArrayBuffer()), `ArrayBuffer`)
assert.equal(builtinType(new SharedArrayBuffer()), `SharedArrayBuffer`)
assert.equal(builtinType(Buffer.from([])), `Buffer`)
assert.equal(builtinType(new Int8Array()), `Int8Array`)
assert.equal(builtinType(new Uint8Array()), `Uint8Array`)
assert.equal(builtinType(new Uint8ClampedArray()), `Uint8ClampedArray`)
assert.equal(builtinType(new Int16Array()), `Int16Array`)
assert.equal(builtinType(new Uint16Array()), `Uint16Array`)
assert.equal(builtinType(new Int32Array()), `Int32Array`)
assert.equal(builtinType(new Uint32Array()), `Uint32Array`)
assert.equal(builtinType(new BigInt64Array()), `BigInt64Array`)
assert.equal(builtinType(new BigUint64Array()), `BigUint64Array`)
assert.equal(builtinType(new Float16Array()), `Float16Array`)
assert.equal(builtinType(new Float32Array()), `Float32Array`)
assert.equal(builtinType(new Float64Array()), `Float64Array`)
assert.equal(builtinType(new DataView(new ArrayBuffer())), `DataView`)
assert.equal(builtinType(new Temporal.Duration()), `Temporal.Duration`)
assert.equal(
  builtinType(Temporal.Instant.fromEpochMilliseconds(0)),
  `Temporal.Instant`,
)
assert.equal(
  builtinType(new Temporal.PlainDate(2024, 1, 15)),
  `Temporal.PlainDate`,
)
assert.equal(
  builtinType(new Temporal.PlainDateTime(2024, 1, 15, 12)),
  `Temporal.PlainDateTime`,
)
assert.equal(
  builtinType(new Temporal.PlainMonthDay(1, 15)),
  `Temporal.PlainMonthDay`,
)
assert.equal(builtinType(new Temporal.PlainTime(12)), `Temporal.PlainTime`)
assert.equal(
  builtinType(new Temporal.PlainYearMonth(2024, 1)),
  `Temporal.PlainYearMonth`,
)
assert.equal(
  builtinType(new Temporal.ZonedDateTime(0n, `UTC`)),
  `Temporal.ZonedDateTime`,
)
assert.equal(builtinType({}), `Object`)

Benchmarks

builtin-type is around 1.45x faster than which-builtin-type for a diverse set of 500 values.

Here's an example run of the benchmark:

 ✓ src/index.bench.ts 3069ms
     name                   hz      min      max     mean      p75      p99     p995     p999     rme  samples
   · whichBuiltinType  66.2924  14.9159  15.6526  15.0847  15.1303  15.6526  15.6526  15.6526  ±0.39%       34
   · builtinType       96.9832   9.9813  10.8347  10.3111  10.3934  10.8347  10.8347  10.8347  ±0.60%       49

Contributing

Stars are always welcome!

For bugs and feature requests, please create an issue.

License

MIT © Tomer Aberbach

About

What is the type of this builtin JS value?

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

 

Contributors