diff options
| author | Sean Fridman <fridman@mail.sfsu.edu> | 2015-04-08 21:50:59 -0400 |
|---|---|---|
| committer | Sean Fridman <fridman@mail.sfsu.edu> | 2015-04-08 21:50:59 -0400 |
| commit | ee5a0ec0c43f673ee79a2fdcf16ea368ea385532 (patch) | |
| tree | 8d808d90188e8a487681648059e904a5e8be3274 /app/node_modules/okschema/index.js | |
| parent | 06ef2f2337dd349af160e2c50dbef76f68f406d5 (diff) | |
Add support for textarea data types
Diffstat (limited to 'app/node_modules/okschema/index.js')
| -rw-r--r-- | app/node_modules/okschema/index.js | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/app/node_modules/okschema/index.js b/app/node_modules/okschema/index.js index d63f5db..51783a1 100644 --- a/app/node_modules/okschema/index.js +++ b/app/node_modules/okschema/index.js @@ -1,4 +1,27 @@ +var assign = require('object-assign'); var mschema = require('mschema'); +var v = require('validator'); + +/** + * Custom types. + * To add a custom type, add a key with the type name and a value + * in the form {parent: {...}, assertValid: function(d) {...}} + * where parent is the base mschema spec and validate is a function + * accepting one data point and throwing an array of errors if invalid. + * + * Error array format is derived from mschema and is in the form + * [{property: x, constraint: x, actual: x, expected: x, message: x} ... ] + */ +var types = { + /** + * Larger text inputs. Currently just proxies to string type. + */ + 'text': { + parent: {type: 'string'}, + // Let parent handle validation + assertValid: function(s) {} + } +} /** * OKSchema! @@ -9,6 +32,20 @@ function OKSchema(spec) { if (!(this instanceof OKSchema)) return new OKSchema(spec); if (!spec) throw new Error('No spec provided to OKSchema'); + spec = assign({}, spec); + // Cache the mschema version of our spec + this._mschemaSpec = Object.keys(spec).reduce(function(cache, prop) { + // If custom type, return its parent spec + var type = spec[prop].type; + if (types[type]) { + cache[prop] = types[type].parent; + // Otherwise, it's already in mschema format + } else { + cache[prop] = spec[prop]; + } + return cache; + }, {}); + Object.defineProperty(this, 'spec', { value: spec, writable: false @@ -16,17 +53,25 @@ function OKSchema(spec) { } OKSchema.prototype.assertValid = function(data) { + data = data || {}; + var spec = this.spec; + // Run through custom validators, they'll throw if invalid + Object.keys(data).forEach(function(prop) { + var type = spec[prop].type; + if (types[type]) { + types[type].assertValid(data[prop]); + } + }); var result = mschema.validate(data, this.toMschema()); if (!result.valid) throw result.errors; }; /** - * Return schema as an mschema object. - * Currently no difference between the two. + * Return our custom spec as an mschema spec */ OKSchema.prototype.toMschema = function() { - return this.spec; + return this._mschemaSpec; }; module.exports = OKSchema; |
