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

veso

v1.0.0-alpha.12

Published

Simple, lightweight and typesafe chain validator!

Downloads

16

Readme

Introduction

Veso is a typesafe chain validation library. The main goal of this library is to make a universal tool for easily checking data of any type.

Some great aspects:

  • Zero dependencies
  • Tiny
  • Works with plain JavaScript
  • Immutable
  • Chainable interface

Instalation

npm install veso       # npm

Basic usage

Creating simple string validator.

import { v } from "veso";

// creating validator
const validator = v.string().minLength(4);

// validating
validator.validate("string"); // => true
validator.validate("str"); // => "The value must have more than or equal to 4 characters!"
validator.validate(321); // => false (with console error 'String Validator: Type of the value must be valid! Current type: number')

Validators

import { v } from "veso";

// validators
v.string(); // => VesoString instance
v.number(); // => VesoNumber instance
v.array(); // => VesoArray instance
v.date(); // => VesoDate instance

Important! - Without .required() values null and undefined are valid!

String Validator

// string validations
v.string().required();
v.string().minLength(number);
v.string().maxLength(number);
v.string().exactLength(number);
v.string().startsWith(string);
v.string().endsWith(string);
v.string().includes(string);
v.string().regex(regex);
v.string().ip(); // allows to validate IPv4 and IPv6 (default IPv4)
v.string().mac();
v.string().email();
v.string().url();
v.string().unique(number);
v.string().numeric();
v.string().alpha();
v.string().alphaNum();
v.string().hex();
v.string().notIn(string[]);

All validations support custom error message. You can pass in an additional argument to provide it.

// string validations
v.string().required({ message: "Is required!" });
v.string().minLength(5, { message: "Must be 5 or more characters long!" });
v.string().maxLength(5, { message: "Must be 5 or fewer characters long!" });
v.string().exactLength(5, { message: "Must be exactly 5 characters long!" });
v.string().startsWith("https://", { message: "Must provide secure URL!" });
v.string().endsWith(".ru", { message: "Only .ru domains allowed!" });
v.string().includes("veso", { message: "Must include veso!" });
v.string().regex(/\d/, { message: "Must contain at least one digit!" });
v.string().ip("v6", { message: "Invalid IP address!" });
v.string().mac({ message: "Invalid MAC!" });
v.string().email({ message: "Invalid email!" });
v.string().url({ message: "Invalid URL!" });
v.string().unique(3, { message: "Must include minimum 3 unique characters!" });
v.string().numeric({ message: "Must be a number!" });
v.string().alpha({ message: "Must include only letters!" });
v.string().alphaNum({ message: "Must include only letters and numbers!" });
v.string().hex({ message: "Must be hexadecimal!" });
v.string().notIn(["foo", "bar"], {
  message: "There shouldn't be 'foo' or 'bar'!",
});

IP

The v.string().ip() method by default validate IPv4.

const ip = v.string().ip();

ip.validate("192.168.4.1"); // valid
ip.validate("192.168.4.341"); // invalid
ip.validate("a4d5:91a0:7114:1f55:41fa:f2d7:1212:f00b"); // invalid
ip.validate("a4d5:91a0:7114:1f55:41fa:f2d7:1212:gggg"); // invalid

You can set the IPv6 version.

const ip = v.string().ip("v6");

ip.validate("a4d5:91a0:7114:1f55:41fa:f2d7:1212:f00b"); // valid
ip.validate("a4d5:91a0:7114:1f55:41fa:f2d7:1212:gggg"); // invalid
ip.validate("192.168.4.1"); // invalid
ip.validate("192.168.4.341"); // invalid

MAC

const mac = v.string().mac();

mac.validate("BC:00:00:01:FF:11"); // valid
mac.validate("00-1B-63-84-45-E6"); // valid
mac.validate("BC:00:00-01-FF:11"); // invalid
mac.validate("BC:00:00"); // invalid

Email

const email = v.string().email();

email.validate("[email protected]"); // valid
email.validate("[email protected]"); // invalid

URL

const url = v.string().url();

url.validate("http://test.c"); // valid
url.validate("https://test.c"); // valid
url.validate("ftp://test.c"); // valid
url.validate("htps://test.c"); // invalid

Numeric

Validates negatives, integers and decimals.

import { v } from "veso";

const numeric = v.string().numeric();

numeric.validate("10.33"); // valid
numeric.validate("10."); // invalid
numeric.validate("notanumber"); // invalid

Alpha

Validates only latin characters.

import { v } from "veso";

const alpha = v.string().alpha();

alpha.validate("test"); // valid
alpha.validate("test123"); // invalid

AlphaNum

Validates latin characters and numbers.

import { v } from "veso";

const alphaNum = v.string().alpha();

alphaNum.validate("test"); // valid
alphaNum.validate("test123"); // valid
alphaNum.validate("test12.3"); // invalid

Hex

Validates hexadecimal characters.

import { v } from "veso";

const hex = v.string().alpha();

hex.validate("ab03"); // valid
hex.validate("ffffff"); // valid
hex.validate("abct"); // invalid

Number Validator

// number validations
v.number().required();
v.number().min(number); // >= number
v.number().max(number); // <= number
v.number().between(minNumber, maxNumber); // >= minNumber and <= maxNumber
v.number().positive(); // > 0
v.number().negative(); // < 0
v.number().nonpositive(); // <= 0
v.number().nonnegative(); // >= 0
v.number().multipleOf(number); // Evenly devisible by number. Can be used as "step"
v.number().safe(); // Value must be between Number.MIN_SAFE_INTEGER and Number.MAX_SAFE_INTEGER
v.number().integer(); // Value must be integer
v.number().notIn(number[]); // Value must not be in an array

Optionaly, you can pass in an additional argument to provide a custom error message.

Array Validator

// array validations
v.array().required();
v.array().minLength(number); // >= number
v.array().maxLength(number); // <= number
v.array().exactLength(number); // === number

Optionaly, you can pass in an additional argument to provide a custom error message.

Date Validator

// date validations
v.date().required();
v.date().min(Date); // >= Date
v.date().max(Date); // <= Date
v.date().between(minDate, maxDate); // >= minDate and <= maxDate
v.date().notIn(Date[]); // Value must not be in an array

Optionaly, you can pass in an additional argument to provide a custom error message.

Validator settings

Every validator method has its own settings.

// Base settings
message?: string; // Setting for custom message
validateIf?: boolean | () => boolean; // Setting for optional validating with this method

Coercion

Veso provides coercion. During the validation, the value is passing through JavaScript built-in functions for coercing data.

import { v } from "veso";

v.coerce.string(); // String(value)
v.coerce.number(); // => Number(value)
v.coerce.date(); // => new Date(value)

Note - values "", undefined and null are not coersing and will be valid without .required().

Translation of errors

setTranslate

You can pass in translation function to make your custom errors without providing messages to every validator every single time.

import { setTranslate, VesoTranslateFunction } from "veso";

const myTranslateFn: VesoTranslateFunction = (key, settings) => {
  // Your translation logic
};

setTranslate(myTranslateFn);

The key is a constant value for each validator and the settings are the data you pass to the validator.

VesoTranslateKey - type for every posible key!

The best way to use this type of translation is with i18n library. You can pass the t function to setTranslate and thats it! It fully supports additional parameters to translation.

setMap

You can pass in translation map to make your custom errors without providing messages to every validator every single time.

import { setMap, VesoMap } from "veso";

const myMap: VesoMap = {
  // Your translations
};

setMap(myMap);

Translation order

  1. Message, passed in validator.
  2. Translation with setTranslate.
  3. Translation with setMap.
  4. Default error message.

Changelog

View the changelog at CHANGELOG.md