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

guarder

v0.9.0

Published

Guarder provides simple validation logic to reduce clutter with inline guard statements

Downloads

235

Readme

Guarder

NPM Version Quality Gate Status Coverage Code Smells Vulnerabilities

Guarder is a simple validation library that allows quick validation on properties.

This project is still in development.

Contents

Getting Started

You can get started with cloning the Guarder repository by using the following command:

$ git clone [email protected]:ToeFungi/guarder.git
$ cd guarder
$ npm i

Installation

Use the following command to install the Guarder package:

npm i guarder

Guides

Guides are basic information about the package for easier use. This section aims to satisfy FAQs.

Default Guards

The default configured guards are the following:

  • EmptyGuard
    Empty Guard ensures that the property is not null or undefined. A string should contain at least one character, an array should contain at least one item, an object should contain at least one key
  • FalsyGuard
    Falsy Guard ensures that the property does not evaluate to false in a type coercion
  • NullGuard
    Undefined Guard ensures that the property is not null
  • UndefinedGuard
    Undefined Guard ensures that the property is not undefined

As a general rule of thumb, default configured guards will always be available by name within the Guarder class.

Official Guards

The full list of packaged official guards include:

  • EmptyGuard
    Empty Guard ensures that the property is not null or undefined. A string should contain at least one character, an array should contain at least one item, an object should contain at least one key
  • FalsyGuard
    Falsy Guard ensures that the property does not evaluate to false in a type coercion
  • NegativeGuard
    Negative Guard validates a property is not a negative number
  • NullGuard
    Undefined Guard ensures that the property is not null
  • NumberGuard
    Number Guard validates that the property is a number
  • UndefinedGuard
    Undefined Guard ensures that the property is not undefined
  • WhitespaceGuard
    Whitespace Guard validates that the string does not contain only whitespace
  • ZeroGuard
    Zero Guard validates that the property is not zero

Examples

Considering this is a convenience package, the following example highlights reducing line count.

// This is
if (property === undefined || property === null) {
  throw new Error('Property cannot be null')
}

// Replace by this
Guard.null(property)
// Or this
Guard.null(property, 'Custom Error Message')
// Or this
Guard.null(property, 'Custom Error Message', CustomError)

Usage

.null(property: T, message?: string, error?: Instantiable)

You can validate that the specified property is not null using the .null guard and specify the error message and error to be thrown if the property is null.

// Returns the property
const property = Guarder.null('not null')
console.log({ property })

// Throws `ArgumentError`
const property = Guarder.null(null)

// Throws `ArgumentError('Property is null')`
const property = Guarder.null(null, 'Property is null')

// Throws `CustomError('Property is null')`
const property = Guarder.null(null, 'Property is null', CustomError)

.undefined(property: T, message?: string, error?: Instantiable)

You can validate that the specified property is not undefined using the .undefined guard and specify the error message and error to be thrown if the property is undefined.

// Returns the property
const property = Guarder.undefined('not undefined')
console.log({ property })

// Throws `ArgumentError`
const property = Guarder.undefined(undefined)

// Throws `ArgumentError('Property is undefined')`
const property = Guarder.undefined(undefined, 'Property is undefined')

// Throws `CustomError('Property is undefined')`
const property = Guarder.undefined(undefined, 'Property is undefined', CustomError)

.empty(property: T, message?: string, error?: Instantiable)

You can validate that the specified property is not empty using the .empty guard and specify the error message and error to be thrown if the property is empty. The property will be considered empty if:

It is an empty string, an array with length of 0 or an object with no keys. Undefined and null are also considered to be empty.

// Returns the property
const property = Guarder.empty('not empty')
console.log({ property })

// Throws `ArgumentError`
const property = Guarder.empty('')
const property = Guarder.empty([])
const property = Guarder.empty({})
const property = Guarder.empty(null)
const property = Guarder.empty(undefined)

// Throws `ArgumentError('Property is empty')`
const property = Guarder.empty('', 'Property is empty')

// Throws `CustomError('Property is empty')`
const property = Guarder.empty('', 'Property is undefined', CustomError)

.falsy(property: T, message?: string, error?: Instantiable)

You can guard against values that evaluate to false in type coercion.

Falsy Values

Guarder.falsy('') // Error
Guarder.falsy(false) // Error
Guarder.falsy(0) // Error
Guarder.falsy(-0) // Error
Guarder.falsy(null) // Error
Guarder.falsy(undefined) // Error

Guarder.falsy('foo') // 'foo'
Guarder.falsy(1) // 1
Guarder.falsy([]) // []
Guarder.falsy({}) // {}

.getRegisteredGuards()

You can retrieve the list of registered guards to validate the guard functionality available. By default, the empty, null and undefined guards are initialised.

const guards = Guarder.getRegisteredGuards()
console.log({ guards })
// [ 'null', 'empty', 'undefined' ]

.unregisterGuard(guardName: string)

You can unregister a specific guard by name. This will remove the guard from the map and it will no longer be available for use.

Guarder.unregisterGuard('empty')

const guards = Guarder.getRegisteredGuards()
console.log({ guards })
// [ 'null', 'undefined' ]

.registerGuard(guardName: string, guard: Instantiable)

You can register guards and specify the guard name. This allows you to build custom guards and register them for use.

Guarder.registerGuard('custom-guard', TestGuard)

const guards = Guarder.getRegisteredGuards()
console.log({ guards })
// [ 'null', 'empty', 'undefined', 'custom-guard' ]

.custom(guardName: string, property: T, message?: string, error?: Instantiable)

You can use your custom guard after it is registered with the custom functionality. You need to specify which guard you want to use and pass the remaining parameters as normal.

Guarder.registerGuard('custom-guard', TestGuard)
const property = Guarder.custom('custom-guard', 'property', 'Property failed validation', CustomError)
console.log({ property })

.guard(guard: Guard, property: T, message?: string, error?: Instantiable)

You can specify the guard to use as a once off guard without needing to register it using the inlineCustom mechanism. The TestGuard guard will not be registered in the guard map and will need to be passed each time the mechanism is used.

const property = Guarder.inlineCustom(TestGuard, 'property', 'Property failed validation', CustomError)
console.log({ property })

Tests

To run tests, you should be able to simply run be able to run the following.

$ npm run test
$ npm run coverage

The testing framework used is Mocha. Chai and nyc are used for assertions and coverage reporting respectively. Ensure that any new changes are covered by an accompanying test suite.

Issues

If you find any problems while working with this library, please log an issue here so that development can begin to rectify the error.

Contributions

This project is completely open source and as such, you are invited to make contributions. Fork the project, make some changes and make the pull request. If you have any feedback regarding the functionality, please don't hesitate to open an issue so this can be resolved. Please ensure that any pull requests have unit tests that cover any additional functionality.

License

MIT License

Copyright (c) 2021 Alex Pickering