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

prop-validator

v1.0.4

Published

Runtime type checker for plain objects

Downloads

6

Readme

MIT license npm version

prop-validator

A simplified rewrite of the React PropTypes library, designed for use outside of React on arbitrary Javascript data.

This can be used as a quick and simple data validation tool—for example, to validate config files, or data passed by a user into a function.

Usage

To validate an object:

const { validateProps, PropTypes } = require('prop-validator')

const propTypes = {
  foo: PropTypes.string,
  bar: PropTypes.number,
  baz: PropTypes.oneOfType([PropTypes.string, PropTypes.number])
}

const props = {
  foo: 'something',
  bar: 1234,
  baz: 'something else'
}

const { results, errors, isValid } = validateProps(propTypes, props)

console.log(isValid) // true

console.log(results) // see below

The results array will contain the following feedback:

[
  {
    isValid: true,
    isRequired: false,
    valueType: 'string',
    valueExpectedType: 'string | null',
    valueExpectedTypeList: [ 'string', 'null' ],
    objectPath: 'foo',
    objectPathList: [ 'foo' ],
    key: 'foo',
    value: 'something',
    message: null,
    exception: null
  },
  {
    isValid: true,
    isRequired: false,
    valueType: 'number',
    valueExpectedType: 'number | null',
    valueExpectedTypeList: [ 'number', 'null' ],
    objectPath: 'bar',
    objectPathList: [ 'bar' ],
    key: 'bar',
    value: 1234,
    message: null,
    exception: null
  },
  {
    isValid: true,
    isRequired: false,
    valueType: 'string',
    valueExpectedType: 'string | number | null',
    valueExpectedTypeList: [ 'string', 'number', 'null' ],
    objectPath: 'baz',
    objectPathList: [ 'baz' ],
    key: 'baz',
    value: 'something else',
    message: null,
    exception: null
  }
]

Running the validator returns an object of two arrays: results and errors, and a boolean isValid. The former contains the validation results of all props, and the latter contains only any errors. If any errors were found, isValid will be false.

If a given prop is invalid, like if we instead set bar to "1234" instead of a string in the previous example, the given error message will be the following:

"Property 'bar' should be type 'number | null', but type 'string' was found"

As can be seen from the contents of the results array, all checks are permitted to have a null value as well (which can also be undefined). If a value must be present and be a given type, the .isRequired type can be referenced instead, e.g. PropTypes.string.isRequired.

Nested type checking

Nested properties can be checked through the use of PropTypes.shape():

const propTypes = {
  options: PropTypes.shape({
    name: PropTypes.string,
    age: PropTypes.integer,
    job: PropTypes.shape({
      title: PropTypes.string,
      tags: PropTypes.arrayOf(PropTypes.string)
    })
  })
}

const props = {
  options: {
    name: 'Alice',
    age: 500,
    job: {
      title: 'CEO of Self-employed',
      tags: ['nothing', 'particularly', 'interesting']
    }
  }
}

All validation results, including the nested ones inside of a PropTypes.shape() object, are returned in the results and errors flat arrays.

Note that extra values are permitted inside of a shape object: it only checks whether all values that exist pass validation. If you must be sure that only the expected values are present and no others, the PropTypes.exact() validator can be used instead.

Available type checkers

| Name | Matches | |:-------|:--------| | string | Any string | | number | Any number | | numberRange(min, max) | Number in the range min ≤ n ≤ max, or another range type; see below | | integer | Number that passes Number.isInteger() | | integerRange(min, max) | Number that passes Number.isInteger() and is in a given range; see below | | boolean | Any boolean (note: aliased as bool) | | function | Any function (note: aliased as func) | | object | Any plain object | | symbol | Any symbol | | array | Any array | | regex | Any regular expression | | error | Any error instance | | any | Any defined value* | | null | Only null | | undefined | Only undefined** | | stringMatching(/regex/) | String that matches a given regular expression | | oneOf([...values]) | Value that matches a given literal | | oneOfType([...propTypes]) | Value that matches a given propType | | arrayOf(propType) | Array containing only members of a given propType | | objectOf(propType) | Plain object containing only values of a given propType | | instanceOf(classObject) | Instance of a given class | | customProp(func, type) | Value that passes the given validator function (type is for output) | | shape({...propTypes}) | Plain object whose values pass a given propTypes object | | exact({...propTypes}) | Plain object whose values pass a given propTypes object and which is not allowed to have extra values |

*: any still requires a value to be set when .isRequired is used, so it does not validate undefined in that case.

**: undefined still accepts the null value if .isRequired is not used.

The error validator applies to any instance of an Error class or one that extends it (including TypeError, RangeError, etc).

Number range checkers

The numberRange type checker has several different subtypes:

const propTypes = {
  rangeA: PropTypes.numberRange(0, 5),                  // 0 ≤ n ≤ 5
  rangeB: PropTypes.numberRange.inclusive(0, 5),        // 0 ≤ n ≤ 5; alias for .numberRange
  rangeC: PropTypes.numberRange.exclusive(0, 5),        // 0 < n < 5
  rangeD: PropTypes.numberRange.greaterThan(5),         // n > 5
  rangeE: PropTypes.numberRange.greaterThanOrEqual(5),  // n ≥ 5
  rangeF: PropTypes.numberRange.lessThan(5),            // n < 5
  rangeG: PropTypes.numberRange.lessThanOrEqual(5)      // n ≤ 5
}

Additionally, the integerRange type checker does the exact same thing, except it also verifies if the given value is an integer.

Differences with the original PropTypes library

The API is similar to the original PropTypes library, but there are a few small changes. Since this is not designed for React or DOM objects, the following types are not supported: node, element, elementType.

Conversely, this library contains the following validators that the original does not have: numberRange(), integer, integerRange(), boolean (bool in original), function (func in original), regex, stringMatching(), error, null, undefined.

In the original library, the customProp() validator has to throw an Error object; in this library, it needs to return true or false to indicate the validation result.

Additionally, the original PropTypes library only logs error strings directly to the console rather than returning an object of information.

Links

Copyright

MIT license