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

api-expect

v1.1.3

Published

A simple input validation system designed for apis or form inputs. Supports custom validators and actually readable outputs.

Downloads

6

Readme

APIExpect

A simple input validation system designed for apis or form inputs. Supports custom validators and actually readable outputs.

Contents

Installation

Use Yarn to add APIExpect to your project:

yarn add api-expect

Usage

APIExpect exports a singleton by default. Import the module and start creating templates!

const expect = require('api-expect')

const template = { myField: 'string:3:50' }
const compiledTemplate = expect.compile(template)

var data = { myField: 'someStuff', _otherMetaField: 42 }
var result = expect.exec(compiledTemplate, data)

// result.error = false
// result.output = { myField: 'someStuff' }

Middleware

APIExpect has a built-in ExpressJS middleware creator. It automatically compiles templates, then executes them for all data incoming data in its route. Usage:

expect.middleware(template, source, options)

Where template is an uncompile template object, source is property of req that has the data, and options is an optional object of configuration.

Example:

const express = require('express')
const expect = require('api-expect')

var router = express.Router()

router.post('/signup',
  expect.middleware({ name: 'string:3', password: 'string:6' }, 'body')),
  (req, res, next) => {
    // req.data will have all validated data
  }
)

Even More Convenient

Convenience functions are provided for the common data sources:

expect.body(template) // same as expect.middleware(template, 'body')
expect.query(template) // same as expect.middleware(template, 'query')
expect.params(template) // same as expect.middleware(template, 'params')

All three functions also support options as a second parameter.

Options

Field | Meaning | Default ------------|-------------------------------------------------------|--------- destination | The field in req where the output should be placed. | 'data' dest | Alias of destination | null inPlace | When true, the output will replace the input data | false

Templates

APIExpect was designed to limit tedium and make it easy to create validation templates on the fly. It supports 3 main style of templates: short-hand, array short-hand, and long-form. As you may have guessed, both short-hand forms are just convinence functions that expand to the long-form internally. The short-hand forms can only pass static arguments to the validators, so in circumstances where you must pass a variable or externally-defined constant, the long form is required. Below is a brief overview of the three forms.

Short-Hand

This is the most common form and is very handy for simple validation. The basic format is:

{
  field: 'validator:arg1:arg2:arg3:...'
}

See the Validators section for more information on the arguments.

Example:

{
  name: 'string:5'
}

In words, this template translates to: "The name field must be a string of at least 5 characters".

Array Short-Hand

Similar to the short-hand form, this form combines the Array validator with any other validator for the values of the array. The format is:

{
  field: ['validator:arg1:arg2:...', minLength, maxLength]
}

The minLength is optional and defaults to 0; maxLength is also optional and defaults to infinity. See the Validators section for more information on the arguments.

Example:

{
  favouriteColours: ['string:3:20', 0, 5]
}

This template translates to: "The favouriteColours field must be an array of strings whose lengths are between 3 and 20 characters; the array must have between 0 and 5 elements".

Long Form

And when the convient methods fail to deliver, we resort to verbose measures. The long format is:

{
  field: { 'validator': [arg1, arg2, arg3, ...] }
}

See the Validators section for more information on the arguments.

Example:

const STATUSES = [ 'Active', 'Inactive', 'Disabled' ]
{
  status: { 'index': [STATUSES] }
}

This template translates to: "The status field must be a number who value is greater than or equal to 0, and less the length of the array STATUSES (in this case 3)".

Optional Fields

How They Work

When a required field is invalid, the whole input is rejected and error messages are returned. When an optional field is invalid, its value is ignored. Most validators have a 'default' field which will be returned in the final output when the optional field is either empty or invalid.

Required By Default

By default, all fields are required. You can change by setting the value defaultOptional. Example:

const expect = require('api-expect')

// Make all fields optional by default
expect.defaultOptional = true

// Make all fields required by default
expect.defaultOptional = false

NOTE: If you change defaultOptional to be true, the short-hand behaviour changes! (See When Optional By Defaul)

To make a specific field optional, insert the '~' field in a short-hand validator, or a boolean value for required as the first parameter for the array in an array-short-hand or long-form entry. Example:

const STATUSES = [ 'Active', 'Inactive', 'Disabled' ]

{
  status: { 'index', [false, STATUSES] },
  colour: '~string:3:50:black'
}

Translation: "The status field should be a number >= 0 and < STATUSES.length but default to 0; and colour should be a string whose length is between 3 and 50, but default to 'black'".

When Optional By Default

When defaultOptional is true, all fields are optional by default. To make a specific field required, preappend an * (asterisk), as such:

{
  name: '*string:3',
  colour: 'string:3:50:black'
}

Translation: "The name field must be a string of at least 3 characters; and the colour field should be a string whose length is between 3 and 50, but default to 'black'".

Validators

There are a wealth of default validators that exist. All validators' first argument is required (omitted for breivity).

| Validator Name | Arg1 | Arg2 | Arg 3 |-------------------|------|------|------ | object | Uncompiled Template | array | Validator | minLength | maxLength | string | minLength | maxLength | defaultValue | html | minLength | maxLength | defaultValue | email | defaultValue | url | defaultValue | bool | defaultValue | number | min | max | defaultValue | index | array | min | defaultValue | date | min | max | defaultValue

Note: the html validator strips all tags except <b>, <blockquote>, <code>, <del>, <dd>, <dl>, <dt>, <em>, <h1>, <h2>, <h3>, <i>, <li>, <ol>, <p>, <pre>, <s>, <sup>, <sub>, <strong>, <strike>, <ul>, <br>, and <hr>, and removes all styling.

Licence

Copyright © 2017 Mesbah Mowlavi. Released under the MIT Licence.