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

condor-validate

v0.0.1

Published

Validate GRPC Requests and Metadata

Downloads

5

Readme

condor-validate

Validation middleware for Condor GRPC Server. It provide helpers to validate requests and metadata.

Build Status Coverage Status

Installation

npm i --save condor-validate
npm i --save condor-framework

Usage

const Condor = require('condor-framework');
const condorValidator = require('condor-validator');
const Greeter = require('./greeter');

const server = new Condor()
  .add('path/to/file.proto', 'GreeterService', new Greeter())
  .use(condorValidator(/* options */))
  .start();

And, then in your Greeter class:

module.exports = class {
  sayHello(ctx) {
    // check the values of request
    ctx.checkRequest('name').notEmpty('Name cannot be empty');
    ctx.checkRequest('age').optional().isInt().gte(0, 'Age cannot be negative');
    ctx.checkRequest('other.email').optional().isEmail('Invalid email');
    
    // checks the value of ctx.metadata.get('authorization')[0]
    ctx.checkMetadata('authorization').notEmpty();
    
    // you can determine the index of metadata to check
    ctx.checkMetadata('authorization', 1).notEmpty();
    
    // You can also check using jsonpath (view https://github.com/dchester/jsonpath)
    ctx.checkRequest('$.store.book[*].author').first().notEmpty();
    
    // if any errors, finalizes the call
    ctx.validate();
    
    // this line will execute only if there aren't any errors
    return {'greeting': `Hello ${ctx.req.name}`};
  }
}

API

  • checkRequest(field). Checks the field in the request. Field is an string that can be simple, nested, contain arrays, or be a jsonpath:

    • simple: When the property you want to check is ctx.req.simple
    • nested.field: When the property you want to check is ctx.req.nested.field
    • other[0].field: When the property you want to check is ctx.req.other[0].field
    • $.another[0].field: When you want to use json path to access the property. See [jsonpath](https://github.com/dchester/jsonpath) documentation for more information.
  • checkMetadata(field, [index]): Checks the filed in the authorization metadata. If no index provided, index 0 will be used.

  • validate([code], [message]): Validates if there are any errors in ctx.errors.

If there are one or more errors, ctx.validate() will throw an error with INVALID_ARGUMENT code, and the ctx.errors object in the detail, finishing the request.

The user will receive an error like:

{
  "code": 3,
  "details": "{\"name\": \"Name cannot be empty\", \"other.email\": \"Invalid email\"}"
}

If you want to launch with another status code or with your own message, you can do it as well:

// if there are errors, respond with cancelled status
ctx.validate(ctx.status.CANCELLED);

// if there are errors, respond with cancelled status and custom message
ctx.validate(ctx.status.CANCELLED, 'Request cancelled by the server');

// which is the same as
if (ctx.errors) {
  throw {
    'code': ctx.status.CANCELLED,
    'details': 'Request cancelled by server',
  };
}

Validators

options,version or locale please see validator

  • optional() - the param may not in the params.if the param not exists,it has no error,no matter whether have other checker or not.
  • empty([tip]) - the params can be a empty string.
  • notEmpty([tip]) - check if the param is not empty.
  • notBlank([tip]) - check if the param is not blank,use /^\s*$/gi reg to check.
  • match(pattern,[tip]) - pattern must be a RegExp instance ,eg. /abc/i
  • notMatch(pattern,[tip]) - pattern must be a RegExp instance ,eg. /xyz/i
  • ensure(assertion, [tip], [shouldBail]) if assertion is false,the asserting failed.
  • ensureNot(assertion, [tip], [shouldBail]) if assertion is true,the asserting failed.
  • isInt([tip],[options]) - check if the param is integer.
  • isFloat([tip],[options]) - check if the param is float.
  • isLength(min,[max],[tip]) - check the param length.
  • len(min,[max],[tip]) - the abbreviation of isLength.
  • isIn(arr,[tip]) - check if the param is in the array.
  • in(arr,[tip]) - the abbreviation of isIn.
  • eq(value,[tip]) - check if the param equal to the value.
  • neq(value,[tip]) - check if the param not equal to the value.
  • gt(num,[tip]) - check if the param great then the value.
  • lt(num,[tip]) - check if the param less then the value.
  • ge(num,[tip]) - check if the param great then or equal the value.
  • le(num,[tip]) - check if the param less then or equal the value.
  • contains(str,[tip]) - check if the param contains the str.
  • notContains(str,[tip]) - check if the param not contains the str.
  • isEmail([tip],[options]) - check if the param is an email.
  • isUrl([tip],[options]) - check if the param is an URL.
  • isIp([tip]) - check if the param is an IP (version 4 or 6).
  • isAlpha([tip],[locale]) - check if the param contains only letters (a-zA-Z).
  • isNumeric([tip]) - check if the param contains only numbers.
  • isAlphanumeric([tip],[locale]) - check if the param contains only letters and numbers.
  • isBase64([tip]) - check if a param is base64 encoded.
  • isHexadecimal([tip]) - check if the param is a hexadecimal number.
  • isHexColor([tip]) - check if the param is a hexadecimal color.
  • isLowercase([tip]) - check if the param is lowercase.
  • isUppercase([tip]) - check if the param is uppercase.
  • isDivisibleBy(num,[tip]) - check if the param is a number that's divisible by another.
  • isNull([tip]) - check if the param is null.
  • isByteLength(min,max,[tip]) - check if the param's length (in bytes) falls in a range.
  • byteLength(min,max,[tip]) - the abbreviation of isByteLength.
  • isUUID([tip],[version]) - check if the param is a UUID (version 3, 4 or 5).
  • isDate([tip]) - check if the param is a date.
  • isAfter(date,[tip]) - check if the param is a date that's after the specified date.
  • isBefore(date,[tip]) - check if the param is a date that's before the specified date.
  • isCreditCard([tip]) - check if the param is a credit card.
  • isISBN([tip],version) - check if the param is an ISBN (version 10 or 13).
  • isJSON([tip]) - check if the param is valid JSON (note: uses JSON.parse).
  • isMultibyte([tip]) - check if the param contains one or more multibyte chars.
  • isAscii([tip]) - check if the param contains ASCII chars only.
  • isFullWidth([tip]) - check if the param contains any full-width chars.
  • isHalfWidth([tip]) - check if the param contains any half-width chars.
  • isVariableWidth([tip]) - check if the param contains a mixture of full and half-width chars
  • isSurrogatePair([tip]) - check if the param contains any surrogate pairs chars.
  • isCurrency([tip],[options]) - check if the param is a currency.
  • isDataURI([tip]) - check if the param is a data uri.
  • isMobilePhone([tip],[locale]) - check if the param is a mobile phone.
  • isISO8601([tip]) - check if the param is a ISO8601 string. eg.2004-05-03
  • isMACAddress([tip]) - check if the param is a MAC address.eg.C8:3A:35:CC:ED:80
  • isISIN([tip]) - check if the param is a ISIN.
  • isFQDN([tip],[options]) - check if the param is a fully qualified domain name. eg.www.google.com

For json path:

  • check(fn,tip,scope) - if fn return false then check failed.fn format function(value,key,requestParams):boolean
  • filter(fn,scope) - filter the value if value is array.fn format function(value,index,key,requestParams):boolean
  • get(index) - change the value to the specified index value
  • first() - get the first value!

Known issues

  • Sanitizers haven't been tested, and should not work, except maybe for simple fields.
  • json path options haven't been fully tested

Under the hood

Built on top of Validator class of koa-validate module, which uses validator module. Inspired on express-validator and koa-validate.

In the future, we will use a differente Validator class in order to make sanitizers work.

License and Credits

MIT License. Copyright 2017

Built by the GRPC experts at Devsu.