npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

typelib-js

v0.10.0

Published

A library that helps you to verify different types and kinds of data.

Downloads

12

Readme

TypeLib JS

This is a JavaScript library that can help you to verify types of data. Usually, to do this it is used the typeof operator, but it doesn't specifically recognize every type of data, and might return unexpected results, so this leads to use methods such as Array.isArray(), isNaN(), or others, this library tries to address this problem by just using one function that returns a set of properties and methods to make data type verification easy.

Contents

Installation

You can install it with NPM:

npm i typelib-js

If you use ES modules:

import {type, typeErrorIf} from "typelib-js";

If you use Common JS:

const {type, typeErrorIf} = require("typelib-js");

Alternatively you can include it in the browser:

<script src="dist/typelib.min.js"></script>

Quick Start

TypeLib is composed by 2 main functions, type and typeErrorIf. In short, the type function helps you to detect types of data; typeErrorIf helps you to debug, with it you can generate TypeError objects and throw them or catch them.

The type function (quick start)

With TypeLib JS you can verify specific types of data, but also kinds of data. For example:

A value such as ['mango', 'pineapple'] is an array type, but in JS an array type can also be considered a kind of object, and a kind of truthy value.

An empty string "" is a string type but also a kind of falsy value, and even though everything or almost everything is an object in JS, strings are considered a kind of primitive value.

Following that line of thought, let's see a few examples in code:

// Properties
// .is
type(['mango', 'pineapple']).is; // "array"
type("").is; // "string"
type(0/0).is; // "nan"

// .kinds
type(['mango', 'pineapple']).kinds; // ["truthy", "object"]
type("").kinds; // ["falsy", "primitive"]
type(0/0).kinds; // ["falsy", "numeric", "number", "primitive"]

// Specific Kinds
type(0).isTruthy; // false
type(0).isFalsy; // true
type(undefined).isNullish; // true
type(NaN).isNumber; // true
type(123n).isNumeric; // true
type(class HelloDev{}).isFunction; // true
type(new TypeError("Hey!")).isError; // true
type(null).isPrimitive; // true
type(null).isObject; // false

Notice that kinds are basically groups where a type of data can be categorized, on the other hand the .is property is very specific, so for example, a .is equal to "number" only refers to numbers but not NaN, Infinity or -Infinity, the .isNumber property refers to all of them.

This library also comes with the methods .isIt() and .isNot() to verify types of data, you can pass a string or an array of strings as an argument to verify if the data type is or isn't as expected, for example:

// Methods to verify types

// .isIt()
type(1000/0).isIt('infinity'); //returns true
type({}).isIt(['array', 'object']); //returns true

// .isNot()
type(['John', 'Jane']).isNot('array'); //returns false
type(0).isNot(['nan', 'infinity', '-infinity']); //returns true

You can also use them to validate customized group types:

function myUtil(func, params){
  // Accept arrow functions and normal functions but not classes as the `.isFunction` property would.
  let isValidFunction = type(func).isIt(['function','arrowfunction']);
  // Accept an array or a plain object as the `params` argument.
  let isValidParams = type(params).isIt(['array','object']);

  // [...]
}

To get a deeper understanding of how does the properties and methods work read the next sections cause there are a few things to consider, but at the least is advisable to check the Table of types tests section.

The typeErrorIf function (quick start)

A very common method to debug types in JS is throwing errors when certain data doesn't meet an specific type, for that, generally you would do something like this:

function convertData(file){
  if (typeof file != "string" || !Array.isArray(file)) throw TypeError("The argument `file` is expected to be a string or an array");
}

The typeErrorIf function allows you to semantically throw and catch these errors by verifying a single or multiple types of data, and at the same time do the conditional logic. For example, the code above could be translated to:

function convertData(file){
  typeErrorIf(file).isNot(["string","array"]).throwIt();
}

convertData(Math.PI);
// throws: TypeError: Unexpected type: number; The only allowed types are: string,array

To cath an error, instead you would use the cathIt() method, like this:

function message(str){
  let err = typeErrorIf(str).isNot("string").catchIt();
  // returns `null` when it does not catch an error.
  if(err) return "Please enter a valid message";
}

You can also change the error message and add a cause to the error (recommended) to provide higher guidance to others:

function setTheme(theme){
  typeErrorIf(theme).isNot("object").throwIt({
    message: "The `theme` argument must be an object including the values `h`, `s`, `l`, `a`",
    cause: setTheme
  })
}

setTheme("hsla(12deg 100% 70% / 100%)");
/*Throws:
TypeError: The `theme` argument must be an object including the values `h`, `s`, `l`, `a`
[...]
cause: [Function: setTheme]
*/

If you want a deeper understanding of TypeLib you can check the rest of the documentation.

The type(data, params) function

Returns|Description :-:|:-: Object|Helps you to verify types of data that can be passed as a function argument.

This is the base function of TypeLib JS, the data you pass in this function is verified and an instance to a constructor is made, this returns an object with properties and methods that helps you to check types and kinds of data.

data argument

Mandatory|Allowed Types| Description :-:|:-:|:-: no|Any| The data to be verified

The data passed in this argument will be used to generate an object with the properties and methods.

customParams argument

Mandatory|Allowed Types| Description :-:|:-:|:-: no|Plain object| It can help you to change the default behavior of the constructor.

Available parameters:

  • writable

Notice you can't store more parameters in the customParams object argument than the ones available or it will throw an error.

writable parameter

Allowed Types|default|Description :-:|:-:|:-: boolean|false|By default, the properties and methods returned with the constructor are readonly, changing this parameter to true makes them writable.

For security reasons and how sensible data validation can be, properties and methods are not writable by default. It is possible to store the constructor object in a variable, after that, the data can't be changed, if you want to reuse the constructor you can set this parameter to true.

An example with writable disabled:

var myType = type(NaN);
console.log(myType.is); // logs: "nan"
myType.is = "number";
console.log(myType.is); // logs: "nan"
myType.constructor(123); // Uncaught TypeError: "is" is read-only

An example with writable enabled:

var myType = type(NaN, {writable: true});
console.log(myType.is); // logs: "nan"
myType.is = "number";
console.log(myType.is); // logs: "number"
myType.constructor("Hello!");
console.log(myType.is, myType.kinds); // logs: "string", Array [ "truthy", "primitive" ]

Properties

.is

Type|Writable|Description :-:|:-:|:-: String|no|contains the type of data passed in the type() function.

The .is property stores a more specific type than the typeof operator which returns 8 different types of data, it can also help you to verify class, ()=>"", NaN, Infinity, -Infinity primitive objects, different error types, and a numerous set of built-in objects.

In the section Table of types tests you can see some examples.

.kinds

Type|Writable|Description :-:|:-:|:-: Array|no|Contains a list of the different kinds of the data passed in the type() function.

Kinds refers to data that can be categorized in a group type, for example, any kind of data is truthy or falsy, a class is a class but is also considered a kind of function (special function), a NaN value is not a number (That's what "NaN" means) but it can be categorized in the number or numeric group.

The next properties below are a list of the possible kinds that a type of data can have, the .kinds property basically stores all kinds of those properties that are true.

.isTruthy

Type|Writable|Description :-:|:-:|:-: Boolean|no|Values that in a boolean context are considered true.

Some truthy values are:

  • Positive and negative numbers (not zero)
  • Non-empty strings
  • Objects and arrays
  • Functions

And many more, check: Truthy

.isFalsy

Type|Writable|Description :-:|:-:|:-: Boolean|no|Values that in a boolean context are considered false.

Some falsy values are:

  • The zero number (0)
  • Empty strings ("")
  • NaN value
  • null and undefined

And others. Check: Falsy

.isNullish

Type|Writable|Description :-:|:-:|:-: Boolean|no|null or undefined values

null and undefined values are a primitive type of data and they are different from other primitives, for example:

var dataA = "Hello!";
var dataB = null;

console.log(dataA.length); // logs: 6
console.log(dataB.length); // Uncaught TypeError: dataB is null

Check: Nullish

.isNumeric

Type|Writable|Description :-:|:-:|:-: Boolean|no|Values that are of numeric type.

This includes decimal numbers, NaN, Infinity, -Infinity, binary, hex, octal, exponential and also big integer values.

For more information:

.isNumber

Type|Writable|Description :-:|:-:|:-: Boolean|no|Values that are any type of number.

It includes the same values as the numeric kinds, but the difference is that big integers are not included in this group.

for more information: Number type

.isFunction

Type|Writable|Description :-:|:-:|:-: Boolean|no|Any data that is a type of function.

These could be declarations or expressions of functions, generator functions, arrow functions and classes.

For more information:

.isError

Type|Writable|Description :-:|:-:|:-: Boolean|no|If it's an error object.

It refers to any type of error object, like: Error, TypeError, SyntaxError, ReferenceError.

More Information: Error

.isPrimitive

Type|Writable|Description :-:|:-:|:-: Boolean|no|A value that is not considered an object.

This refers to data that falls in the category of any of these groups: numbers, strings, booleans, big integers, symbols, null and undefined.

Check: Primitive

.isObject

Type|Writable|Description :-:|:-:|:-: Boolean|no|A value that is not considered primitive.

Everything else that is not a primitive value is considered an object, it includes, but is not limited to: objects, arrays, functions, the arguments object, regular expressions, and kind of primitive values that are created with a constructor such as new String('This is a type of object').

Check: Object

type Methods

.isIt(verifyType)

Writable|returns|Description :-:|:-:|:-: no|boolean|Helps to check expected types of data

.isNot(verifyType)

Writable|returns|Description :-:|:-:|:-: no|boolean|Helps to check not expected types of data

.isIt and .isNot, verifyType argument

mandatory|Allowed Types|Description :-:|:-:|:-: yes|String, Array |the type or types you want to verify

The typeErrorIf(data) function

Returns|Description :-:|:-: Object|Helps you to debug type errors

With it you can generate TypeError objects and throw them or catch them.

The data argument

Mandatory|Allowed Types| Description :-:|:-:|:-: no|Any| The data to be verified

The data passed in this argument will be used to generate an object with the methods to debug type errors.

typeErrorIf Primary Methods

.isIt(verifyType)

returns|Description :-:|:-: object|Helps to check expected types of data and returns additional methods

.isNot(verifyType)

returns|Description :-:|:-: object|Helps to check not expected types of data and returns additional methods

.isIt and .isNot, verifyType argument

mandatory|Allowed Types|Description :-:|:-:|:-: yes|String, Array |the type or types you want to verify

typeErrorIf Secondary Methods

After you verify the data with the methods isIt() or isNot(), you have available these methods:

.throwIt(params)

returns|Description :-:|:-: throws an exception or returns null|When the verification results in an error it throws a TypeError object, otherwise returns a null value.

.catchIt(params)

returns|Description :-:|:-: object or null|When the verification results in an error it returns a TypeError object, otherwise returns a null value.

throwIt and catchIt, params argument

Mandatory|Allowed Types| Description :-:|:-:|:-: no|Plain object| It can help you to add specific properties to the TypeError object.

Available parameters:

  • message
  • cause

message parameter

Allowed Types|default|Description :-:|:-:|:-: string or function that returns a string|Custom message based on the data passed throught the functions|It allows you to add a custom message to the TypeError object.

cause parameter

Allowed Types|default|Description :-:|:-:|:-: Any|undefined|It allows you to add a cause to the TypeError object, is recommended to provide more guidance.

Table of types tests

This table shows some data types and the results you can expect by using the .is property and is compared with the native typeof operator.

Test| native typeof | TypeLib .is :-:|:-:|:-: "Hello Dev!"|string|string new String("Hello")|object|stringobject true|boolean|boolean new Boolean(true)|object|booleanobject 123|number|number new Number(123)|object|numberobject 0/0|number|nan 100/0|number|infinity -100/0|number|-infinity ()=>"Hello"|function|function function(){}|function|function new TypeError()|object|typeerror new Error()|object|error

Testing

Tests are done with Jest, to perform the tests you need to install the dev-dependencies and run the command:

npm run test

References, Credits and important links

Some references and important mentions can be found along this document in relevant areas, but the rest are found here.

License

The source code and documentation files are licensed under the MIT license by Rodrigo Calix.

Support

You can support this project With Ko-fi!

ko-fi