This repository has been archived on 2020-11-15. You can view files and clone it, but cannot push or open issues or pull requests.
Go to file
Andrew Chilton 05ddd126de Add a .gitignore file for the now gone node_modules 2011-11-14 13:07:26 +13:00
lib empty strings vs non empty ones 2011-09-24 22:17:24 -07:00
node_modules/underscore Remove the checked in version of underscore, since npm takes care of it anyway 2011-11-14 13:06:36 +13:00
test Start of some tests for schemajs :) 2011-11-14 13:01:24 +13:00
.gitignore Add a .gitignore file for the now gone node_modules 2011-11-14 13:07:26 +13:00
README.md empty strings vs non empty ones 2011-09-24 22:17:24 -07:00
package.json Start of some tests for schemajs :) 2011-11-14 13:01:24 +13:00
schema.js let there be code 2011-09-23 14:58:47 -07:00

README.md

#v0.1.2

schemajs

validate objects (including http request params) against a schema. includes express middleware.

Installing

npm install schemajs

FEATURES

  • validates schema for deep objects and arrays as well
  • schema is in JSON, making it portable
  • properties, types and filters are extensible

EXAMPLE USAGE - validate an object

  var schema  = require("./path/to/schemajs");
  var model   = schema.create({
		name:		{type:"string", filters:"trim", properties:{max:255}, required:true},
     email:   {type:"email", filters:"trim", required:true},
     wins:    {type:"int", filters:["trim", "toInt"], default:0},
     average: {type:"float", filters:["trim", "toFloat"], default:0}
	});

  var form    = model.validate({name:" your name ", email:" name@example.com "});

  // form.valid  - boolean, true if object matches schema
  // form.data   - contains filtered version of the object {name:"your name", email:"name@example.com", wins:0, average:0}
  // form.errors - contains associative array of any errors found

EXAMPLE USAGE - in expressjs, validate the request parameters

  var schema  = require("./path/to/schemajs");
  var query   = schema.create({
     wins:    {type:"int", filters:"toInt"},
     query:   {type:"string", filters:"trim", required:true, error:"invalid query"}
	});

  app.get("/users", schema.middleware(query), function(req, res)
  {
     // schema validation is attached to req.form
     if(req.form.valid)
     {
        db_lookup({query:req.form.data.query, wins: req.form.data.wins});
     }
     else
        next(new Error("invalid request"));
        //next(req.form.errors, 400);
  });

API

schema.create(schema)

schema for a simple object of one integer value

  schema =
  {
     // [string] value for acceppted parameters of the object you want to test
     "wins":
     {
        // [string (built in types) or function (custom types)] the type declaration for accepted values
        "type": "int",
  
        // [string (built in filters) or function (custom filters) or array (mix and match!)] 
        // OPTIONAL, filters to process and optionally modify values
        "filters": ["trim", "toInt", custom_filter],
  
        // [anything] 
        // OPTIONAL, the default value if none is supplied by the object
        "default": 0,
  
        // [boolean] 
        // OPTIONAL, if true, this parameter must exist to validate
        "required": true
  
        // [object] 
        // OPTIONAL, functions are custom property checks, else a built in property will be looked up
        "properties": {max:100, min:0, special:custom_property}
  
        // [string, object] OPTIONAL, if there is an error, you can override the message that is returned
        // use a string or the "default" key to use the default error message
        // keys can be any property key that was used as well as "filters", "required", "type"
        "error": {max: "too many wins", min: "too few wins", "default": "something is wrong with your wins value"}
     }
  };

schema with embedded schemas for object and array types

  schema =
  {
     "user":
     {
        "type":  "object",
        "schema":
        {
           "name":  { type: "string", properties: { max: 255 }, required: true},
           "email": { type: "email", error: "email is not a valid email address"}
        }
        "error": "user needs an email and a name"
     },
  
     "tags":
     {
        "type":  "array",
        "schema":
        {
           "type": "string"
        }
        "properties":  { max: 10, min: 3}
        "error": { max: "too many tags", min: "too few tags" }
     }
  };

schema.types

built in types

  [string+, string (empty string allowed), alpha, alphanum, email, object, array, date, number, int, boolean, url, zipcode]

to extend, add a function onto schema.types that accepts a value and returns a boolean if the type matches test is run AFTER schema.filters are run

  schema.types.awesome = function(value)
  {
     if(isAwesome(value))
        return true;
     else
        return false;
  }

schema.filters

built in filters:

  [toInt, toFloat, toString, toDate, toBoolean (converts on/off, true/false, 1/0, yes/no to bools), trim]

to extend, add a function onto schema.filters that takes in a value and returns the updated value

filters are run BEFORE schema.test is run

  schema.filters.surround = function(value)
  {
     if(value == needs_surrounding)
        return "----" + value + "----";
     else
        return value;
  }

schema.properties

built in properties

  [max, min, regex, in]

to extend, add a function onto schema.properties that takes in a value and any additional arguments

properties are run AFTER test and filters

  schema.properties.unique = function(value)
  {
     if(isArray(value) && allUnique(value))
        return true;
     else
        return false;
  }

  schema.properties.notIn = function(value, badwords)
  {
     if(badwords.indexOf(value) != -1)
        return false;
     else
        return true;
  }

ideas

  • make it work in the browser for client side validation
  • strict mode, dissallowing extra parameters from being passed in
  • dependency property making one parameters existance depend on another
  • more types (phone numbers, credit card, ip address)
  • more filters (camelcase, encode/unencode)
  • more properties