Ignore:
Timestamp:
03/05/14 22:44:48 (11 years ago)
Author:
hendrikvanantwerpen
Message:

Completed migration to API, without CouchDB proxy.

Move to API is now completed. The full API is password protected, a very
limited API is exposed for respondents, which works with secrets that
are passed in URLs.

Serverside the HTTPResult class was introduced, which is similar to
Promises, but specifically for HTTP. It carries a status code and
response and makes it easier to extract parts of async handling in
separate functions.

Fixed a bug in our schema (it seems optional attributes don't exist but
a required list does). Verification of our schema by grunt-tv4 didn't
work yet. Our schema is organized the wrong way (this is fixable),
but the json-schema schema has problems with simple types and $refs.

Location:
Dev/trunk/src/node_modules
Files:
32 edited

Legend:

Unmodified
Added
Removed
  • Dev/trunk/src/node_modules/express/node_modules/buffer-crc32/package.json

    r484 r487  
    2020  "main": "index.js",
    2121  "scripts": {
    22     "test": "./node_modules/.bin/tap tests/*.test.js"
     22    "test": "tap tests/*.test.js"
    2323  },
    2424  "dependencies": {},
     
    3636  },
    3737  "_id": "buffer-crc32@0.2.1",
    38   "_from": "buffer-crc32@0.2.1"
     38  "dist": {
     39    "shasum": "d4831cc88b961550a88d829efbc0b139caf22d8c"
     40  },
     41  "_from": "buffer-crc32@0.2.1",
     42  "_resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz"
    3943}
  • Dev/trunk/src/node_modules/express/node_modules/commander/package.json

    r484 r487  
    3434    "url": "https://github.com/visionmedia/commander.js/issues"
    3535  },
     36  "homepage": "https://github.com/visionmedia/commander.js",
    3637  "_id": "commander@0.6.1",
    37   "_from": "commander@0.6.1"
     38  "dist": {
     39    "shasum": "c725ed5e9b2bf532b3fe3cba4f81b552cecf0550"
     40  },
     41  "_from": "commander@0.6.1",
     42  "_resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz"
    3843}
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/bytes/package.json

    r484 r487  
    1717  "readmeFilename": "Readme.md",
    1818  "_id": "bytes@0.2.0",
    19   "_from": "bytes@0.2.0"
     19  "dist": {
     20    "shasum": "b4c569295d86a498a119945f1d8a26f76e4b5462"
     21  },
     22  "_from": "bytes@0.2.0",
     23  "_resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz"
    2024}
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/cookie/package.json

    r484 r487  
    3232    "url": "https://github.com/shtylman/node-cookie/issues"
    3333  },
     34  "homepage": "https://github.com/shtylman/node-cookie",
    3435  "_id": "cookie@0.0.5",
    35   "_from": "cookie@0.0.5"
     36  "dist": {
     37    "shasum": "2597397e06ec3eaf53c88851570e97949c1e4dcd"
     38  },
     39  "_from": "cookie@0.0.5",
     40  "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz"
    3641}
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/formidable/package.json

    r484 r487  
    3535  "dependencies": {},
    3636  "_id": "formidable@1.0.14",
    37   "_from": "formidable@1.0.14"
     37  "dist": {
     38    "shasum": "08be7c89a9ebffbe5b2fbd4df0ad3f5cd19c5147"
     39  },
     40  "_from": "formidable@1.0.14",
     41  "_resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz"
    3842}
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/pause/package.json

    r484 r487  
    1717  "readmeFilename": "Readme.md",
    1818  "_id": "pause@0.0.1",
    19   "_from": "pause@0.0.1"
     19  "dist": {
     20    "shasum": "dc3b2287742f3f6249f2d228e74cff5a3f9fe8da"
     21  },
     22  "_from": "pause@0.0.1",
     23  "_resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz"
    2024}
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/qs/package.json

    r484 r487  
    3333    "url": "https://github.com/visionmedia/node-querystring/issues"
    3434  },
     35  "homepage": "https://github.com/visionmedia/node-querystring",
    3536  "_id": "qs@0.6.5",
    36   "_from": "qs@0.6.5"
     37  "dist": {
     38    "shasum": "cdaafb6ed1dbcf48405f41ca92bf95361ad923dc"
     39  },
     40  "_from": "qs@0.6.5",
     41  "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz"
    3742}
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/send/node_modules/mime/README.md

    r484 r487  
    1212
    1313### mime.lookup(path)
    14 Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.').  E.g.
     14Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.').  E.g.
    1515
    1616    var mime = require('mime');
     
    2020    mime.lookup('.TXT');                      // => 'text/plain'
    2121    mime.lookup('htm');                       // => 'text/html'
     22
     23### mime.default_type
     24Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)
    2225
    2326### mime.extension(type)
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/send/node_modules/mime/mime.js

    r484 r487  
    7070 */
    7171Mime.prototype.lookup = function(path, fallback) {
    72   var ext = path.replace(/.*[\.\/]/, '').toLowerCase();
     72  var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase();
    7373
    7474  return this.types[ext] || fallback || this.default_type;
     
    7979 */
    8080Mime.prototype.extension = function(mimeType) {
    81   return this.extensions[mimeType];
     81  var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase();
     82  return this.extensions[type];
    8283};
    8384
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/send/node_modules/mime/package.json

    r484 r487  
    2525    "type": "git"
    2626  },
    27   "version": "1.2.9",
    28   "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n    npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.').  E.g.\n\n    var mime = require('mime');\n\n    mime.lookup('/path/to/file.txt');         // => 'text/plain'\n    mime.lookup('file.txt');                  // => 'text/plain'\n    mime.lookup('.TXT');                      // => 'text/plain'\n    mime.lookup('htm');                       // => 'text/html'\n\n### mime.extension(type)\nGet the default extension for `type`\n\n    mime.extension('text/html');                 // => 'html'\n    mime.extension('application/octet-stream');  // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n    mime.charsets.lookup('text/plain');        // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary.  Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project.  If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n    mime.define({\n        'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n        'application/x-my-type': ['x-mt', 'x-mtt'],\n        // etc ...\n    });\n\n    mime.lookup('x-sft');                 // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n    mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n    mime.load('./my_project.types');\n\nThe .types file format is simple -  See the `types` dir for examples.\n",
     27  "version": "1.2.11",
     28  "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n    npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.').  E.g.\n\n    var mime = require('mime');\n\n    mime.lookup('/path/to/file.txt');         // => 'text/plain'\n    mime.lookup('file.txt');                  // => 'text/plain'\n    mime.lookup('.TXT');                      // => 'text/plain'\n    mime.lookup('htm');                       // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n    mime.extension('text/html');                 // => 'html'\n    mime.extension('application/octet-stream');  // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n    mime.charsets.lookup('text/plain');        // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary.  Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project.  If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n    mime.define({\n        'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n        'application/x-my-type': ['x-mt', 'x-mtt'],\n        // etc ...\n    });\n\n    mime.lookup('x-sft');                 // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n    mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n    mime.load('./my_project.types');\n\nThe .types file format is simple -  See the `types` dir for examples.\n",
    2929  "readmeFilename": "README.md",
    3030  "bugs": {
    3131    "url": "https://github.com/broofa/node-mime/issues"
    3232  },
    33   "_id": "mime@1.2.9",
     33  "homepage": "https://github.com/broofa/node-mime",
     34  "_id": "mime@1.2.11",
    3435  "_from": "mime@~1.2.9"
    3536}
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/send/node_modules/mime/test.js

    r484 r487  
    55var mime = require('./mime');
    66var assert = require('assert');
     7var path = require('path');
    78
    89function eq(a, b) {
     
    1819//
    1920
    20 eq('text/plain', mime.lookup('text.txt'));
    21 eq('text/plain', mime.lookup('.text.txt'));
    22 eq('text/plain', mime.lookup('.txt'));
    23 eq('text/plain', mime.lookup('txt'));
    24 eq('application/octet-stream', mime.lookup('text.nope'));
    25 eq('fallback', mime.lookup('text.fallback', 'fallback'));
    26 eq('application/octet-stream', mime.lookup('constructor'));
    27 eq('text/plain', mime.lookup('TEXT.TXT'));
    28 eq('text/event-stream', mime.lookup('text/event-stream'));
    29 eq('application/x-web-app-manifest+json', mime.lookup('text.webapp'));
     21eq('text/plain', mime.lookup('text.txt'));     // normal file
     22eq('text/plain', mime.lookup('TEXT.TXT'));     // uppercase
     23eq('text/plain', mime.lookup('dir/text.txt')); // dir + file
     24eq('text/plain', mime.lookup('.text.txt'));    // hidden file
     25eq('text/plain', mime.lookup('.txt'));         // nameless
     26eq('text/plain', mime.lookup('txt'));          // extension-only
     27eq('text/plain', mime.lookup('/txt'));         // extension-less ()
     28eq('text/plain', mime.lookup('\\txt'));        // Windows, extension-less
     29eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized
     30eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default
    3031
    3132//
     
    3637eq('html', mime.extension(mime.types.htm));
    3738eq('bin', mime.extension('application/octet-stream'));
    38 eq(undefined, mime.extension('constructor'));
     39eq('bin', mime.extension('application/octet-stream '));
     40eq('html', mime.extension(' text/html; charset=UTF-8'));
     41eq('html', mime.extension('text/html; charset=UTF-8 '));
     42eq('html', mime.extension('text/html; charset=UTF-8'));
     43eq('html', mime.extension('text/html ; charset=UTF-8'));
     44eq('html', mime.extension('text/html;charset=UTF-8'));
     45eq('html', mime.extension('text/Html;charset=UTF-8'));
     46eq(undefined, mime.extension('unrecognized'));
    3947
    4048//
    41 // Test node types
     49// Test node.types lookups
    4250//
    4351
     52eq('application/font-woff', mime.lookup('file.woff'));
    4453eq('application/octet-stream', mime.lookup('file.buffer'));
    4554eq('audio/mp4', mime.lookup('file.m4a'));
     55eq('font/opentype', mime.lookup('file.otf'));
    4656
    4757//
     
    5363eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));
    5464
     65//
     66// Test for overlaps between mime.types and node.types
     67//
     68
     69var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime();
     70apacheTypes.load(path.join(__dirname, 'types/mime.types'));
     71nodeTypes.load(path.join(__dirname, 'types/node.types'));
     72
     73var keys = [].concat(Object.keys(apacheTypes.types))
     74             .concat(Object.keys(nodeTypes.types));
     75keys.sort();
     76for (var i = 1; i < keys.length; i++) {
     77  if (keys[i] == keys[i-1]) {
     78    console.warn('Warning: ' +
     79      'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] +
     80      ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]);
     81  }
     82}
     83
    5584console.log('\nOK');
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/send/node_modules/mime/types/mime.types

    r484 r487  
    10551055application/x-font-ttf                          ttf ttc
    10561056application/x-font-type1                        pfa pfb pfm afm
    1057 application/x-font-woff                         woff
     1057application/font-woff                           woff
    10581058# application/x-font-vfont
    10591059application/x-freearc                           arc
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/send/node_modules/mime/types/node.types

    r484 r487  
    1616text/x-component  htc
    1717
    18 # What: HTML5 application cache manifest
     18# What: HTML5 application cache manifes ('.manifest' extension)
    1919# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps
    2020# per https://developer.mozilla.org/en/offline_resources_in_firefox
    2121# Added by: louisremi
    22 text/cache-manifest  appcache manifest
     22text/cache-manifest  manifest
    2323
    2424# What: node binary buffer format
     
    5959# Added by: avoidwork
    6060text/x-markdown  markdown md mkd
     61
     62# What: ini files
     63# Why: because they're just text files
     64# Added by: Matthew Kastor
     65text/plain  ini
     66
     67# What: DASH Adaptive Streaming manifest
     68# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video
     69# Added by: eelcocramer
     70application/dash+xml mdp
     71
     72# What: OpenType font files - http://www.microsoft.com/typography/otspec/
     73# Why:  Browsers usually ignore the font MIME types and sniff the content,
     74#       but Chrome, shows a warning if OpenType fonts aren't served with
     75#       the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png.
     76# Added by: alrra
     77font/opentype  otf
  • Dev/trunk/src/node_modules/express/node_modules/connect/node_modules/send/package.json

    r484 r487  
    3737    "url": "https://github.com/visionmedia/send/issues"
    3838  },
     39  "homepage": "https://github.com/visionmedia/send",
    3940  "_id": "send@0.1.1",
    40   "_from": "send@0.1.1"
     41  "dist": {
     42    "shasum": "40ded726322604c29d7229683f9207bd6d76e217"
     43  },
     44  "_from": "send@0.1.1",
     45  "_resolved": "https://registry.npmjs.org/send/-/send-0.1.1.tgz"
    4146}
  • Dev/trunk/src/node_modules/express/node_modules/connect/package.json

    r484 r487  
    4949    "url": "https://github.com/senchalabs/connect/issues"
    5050  },
     51  "homepage": "https://github.com/senchalabs/connect",
    5152  "_id": "connect@2.7.11",
    52   "_from": "connect@2.7.11"
     53  "dist": {
     54    "shasum": "839e3928b727827db859a4b3a1d04ea9a06b6ab1"
     55  },
     56  "_from": "connect@2.7.11",
     57  "_resolved": "https://registry.npmjs.org/connect/-/connect-2.7.11.tgz"
    5358}
  • Dev/trunk/src/node_modules/express/node_modules/cookie-signature/package.json

    r484 r487  
    2121  "readmeFilename": "Readme.md",
    2222  "_id": "cookie-signature@1.0.1",
    23   "_from": "cookie-signature@1.0.1"
     23  "dist": {
     24    "shasum": "404efcace10fb30f3451483045d743463ae8602c"
     25  },
     26  "_from": "cookie-signature@1.0.1",
     27  "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz"
    2428}
  • Dev/trunk/src/node_modules/express/node_modules/cookie/package.json

    r484 r487  
    3232    "url": "https://github.com/shtylman/node-cookie/issues"
    3333  },
     34  "homepage": "https://github.com/shtylman/node-cookie",
    3435  "_id": "cookie@0.1.0",
    35   "_from": "cookie@0.1.0"
     36  "dist": {
     37    "shasum": "b56ac6108fcab9073208d405c4fa8aaa35f00810"
     38  },
     39  "_from": "cookie@0.1.0",
     40  "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.0.tgz"
    3641}
  • Dev/trunk/src/node_modules/express/node_modules/debug/Readme.md

    r484 r487  
    1 
    21# debug
    32
     
    5958  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
    6059
    61   When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
     60  When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
     61  _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_
    6262 
    6363  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
    64 
     64 
    6565## Conventions
    6666
  • Dev/trunk/src/node_modules/express/node_modules/debug/debug.js

    r484 r487  
    1818
    1919  return function(fmt){
     20    fmt = coerce(fmt);
     21
    2022    var curr = new Date;
    2123    var ms = curr - (debug[name] || curr);
     
    120122};
    121123
     124/**
     125 * Coerce `val`.
     126 */
     127
     128function coerce(val) {
     129  if (val instanceof Error) return val.stack || val.message;
     130  return val;
     131}
     132
    122133// persist
    123134
    124 if (window.localStorage) debug.enable(localStorage.debug);
     135try {
     136  if (window.localStorage) debug.enable(localStorage.debug);
     137} catch(e){}
  • Dev/trunk/src/node_modules/express/node_modules/debug/lib/debug.js

    r484 r487  
    109109
    110110  function colored(fmt) {
     111    fmt = coerce(fmt);
     112
    111113    var curr = new Date;
    112114    var ms = curr - (prev[name] || curr);
     
    122124
    123125  function plain(fmt) {
     126    fmt = coerce(fmt);
     127
    124128    fmt = new Date().toUTCString()
    125129      + ' ' + name + ' ' + fmt;
     
    133137    : plain;
    134138}
     139
     140/**
     141 * Coerce `val`.
     142 */
     143
     144function coerce(val) {
     145  if (val instanceof Error) return val.stack || val.message;
     146  return val;
     147}
  • Dev/trunk/src/node_modules/express/node_modules/debug/package.json

    r484 r487  
    11{
    22  "name": "debug",
    3   "version": "0.7.2",
     3  "version": "0.7.4",
    44  "repository": {
    55    "type": "git",
     
    2121  },
    2222  "main": "lib/debug.js",
    23   "browserify": "debug.js",
     23  "browser": "./debug.js",
    2424  "engines": {
    2525    "node": "*"
    2626  },
     27  "files": [
     28    "lib/debug.js",
     29    "debug.js",
     30    "index.js"
     31  ],
    2732  "component": {
    2833    "scripts": {
     
    3136    }
    3237  },
    33   "readme": "\n# debug\n\n  tiny node.js debugging utility modelled after node core's debugging technique.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Usage\n\n With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n  , http = require('http')\n  , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n  debug(req.method + ' ' + req.url);\n  res.end('hello\\n');\n}).listen(3000, function(){\n  debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n  debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the \"+NNNms\" will show you how much time was spent between calls.\n\n  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n  \n  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n\n## Conventions\n\n If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use \":\" to separate features. For example \"bodyParser\" from Connect would then be \"connect:bodyParser\". \n\n## Wildcards\n\n  The \"*\" character may be used as a wildcard. Suppose for example your library has debuggers named \"connect:bodyParser\", \"connect:compress\", \"connect:session\", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.\n\n  You can also exclude specific debuggers by prefixing them with a \"-\" character.  For example, `DEBUG=* -connect:*` would include all debuggers except those starting with \"connect:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n  a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n  a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
     38  "readme": "# debug\n\n  tiny node.js debugging utility modelled after node core's debugging technique.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Usage\n\n With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n  , http = require('http')\n  , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n  debug(req.method + ' ' + req.url);\n  res.end('hello\\n');\n}).listen(3000, function(){\n  debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n  debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the \"+NNNms\" will show you how much time was spent between calls.\n\n  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n  When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n  _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_\n  \n  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n  \n## Conventions\n\n If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use \":\" to separate features. For example \"bodyParser\" from Connect would then be \"connect:bodyParser\". \n\n## Wildcards\n\n  The \"*\" character may be used as a wildcard. Suppose for example your library has debuggers named \"connect:bodyParser\", \"connect:compress\", \"connect:session\", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.\n\n  You can also exclude specific debuggers by prefixing them with a \"-\" character.  For example, `DEBUG=* -connect:*` would include all debuggers except those starting with \"connect:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n  a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n  a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
    3439  "readmeFilename": "Readme.md",
    3540  "bugs": {
    3641    "url": "https://github.com/visionmedia/debug/issues"
    3742  },
    38   "_id": "debug@0.7.2",
    39   "_from": "debug@*",
    40   "scripts": {}
     43  "homepage": "https://github.com/visionmedia/debug",
     44  "_id": "debug@0.7.4",
     45  "_from": "debug@*"
    4146}
  • Dev/trunk/src/node_modules/express/node_modules/fresh/package.json

    r484 r487  
    1717  "readmeFilename": "Readme.md",
    1818  "_id": "fresh@0.1.0",
    19   "_from": "fresh@0.1.0"
     19  "dist": {
     20    "shasum": "97ce63fda273b033f866d3a29b9920d034aa2074"
     21  },
     22  "_from": "fresh@0.1.0",
     23  "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz"
    2024}
  • Dev/trunk/src/node_modules/express/node_modules/methods/package.json

    r484 r487  
    1717  "readme": "ERROR: No README data found!",
    1818  "_id": "methods@0.0.1",
    19   "_from": "methods@0.0.1"
     19  "dist": {
     20    "shasum": "c0a484b3e1f28764c5cfd234e1a156d47092ecca"
     21  },
     22  "_from": "methods@0.0.1",
     23  "_resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz"
    2024}
  • Dev/trunk/src/node_modules/express/node_modules/mkdirp/package.json

    r484 r487  
    3232    "url": "https://github.com/substack/node-mkdirp/issues"
    3333  },
     34  "homepage": "https://github.com/substack/node-mkdirp",
    3435  "_id": "mkdirp@0.3.4",
    35   "_from": "mkdirp@0.3.4"
     36  "dist": {
     37    "shasum": "8642eb45b73f5cd19824e94b572871013af8a305"
     38  },
     39  "_from": "mkdirp@0.3.4",
     40  "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.4.tgz"
    3641}
  • Dev/trunk/src/node_modules/express/node_modules/range-parser/package.json

    r484 r487  
    1717  "readmeFilename": "Readme.md",
    1818  "_id": "range-parser@0.0.4",
    19   "_from": "range-parser@0.0.4"
     19  "dist": {
     20    "shasum": "a91c03c737187765f0dcdbe32fa824e52b47a9a6"
     21  },
     22  "_from": "range-parser@0.0.4",
     23  "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz"
    2024}
  • Dev/trunk/src/node_modules/express/node_modules/send/node_modules/mime/package.json

    r484 r487  
    3131    "url": "https://github.com/broofa/node-mime/issues"
    3232  },
     33  "homepage": "https://github.com/broofa/node-mime",
    3334  "_id": "mime@1.2.6",
    34   "_from": "mime@1.2.6"
     35  "dist": {
     36    "shasum": "193c6817fabeefd6a5f29acabd0b6cebc2c0910f"
     37  },
     38  "_from": "mime@1.2.6",
     39  "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.6.tgz"
    3540}
  • Dev/trunk/src/node_modules/express/node_modules/send/package.json

    r484 r487  
    3131  "readmeFilename": "Readme.md",
    3232  "_id": "send@0.1.0",
    33   "_from": "send@0.1.0"
     33  "dist": {
     34    "shasum": "4ea2b3aca167b22699fdbe4eb5bce35fc57ca7d5"
     35  },
     36  "_from": "send@0.1.0",
     37  "_resolved": "https://registry.npmjs.org/send/-/send-0.1.0.tgz"
    3438}
  • Dev/trunk/src/node_modules/express/package.json

    r484 r487  
    8080    "url": "https://github.com/visionmedia/express/issues"
    8181  },
     82  "homepage": "https://github.com/visionmedia/express",
    8283  "_id": "express@3.2.6",
    83   "_from": "express@~3.2.3"
     84  "dist": {
     85    "shasum": "4e16430ceaf29ac1f185c6996d50ca6394ec6357"
     86  },
     87  "_from": "express@3.2.6",
     88  "_resolved": "https://registry.npmjs.org/express/-/express-3.2.6.tgz"
    8489}
  • Dev/trunk/src/node_modules/tv4/README.md

    r484 r487  
    8585## Cyclical JavaScript objects
    8686
    87 While they don't occur in proper JSON, JavaScript does support self-referencing objects. Any of the above calls support an optional final argument, checkRecursive. If true, tv4 will handle self-referencing objects properly - this slows down validation slightly, but that's better than a hanging script.
     87While they don't occur in proper JSON, JavaScript does support self-referencing objects. Any of the above calls support an optional third argument: `checkRecursive`. If true, tv4 will handle self-referencing objects properly - this slows down validation slightly, but that's better than a hanging script.
    8888
    8989Consider this data, notice how both `a` and `b` refer to each other:
     
    9999```
    100100
    101 If the final checkRecursive argument were missing, this would throw a "too much recursion" error.
    102 
    103 To enable supprot for this pass `true` as additional argument to any of the regular validation methods:
     101If the `checkRecursive` argument were missing, this would throw a "too much recursion" error.
     102
     103To enable support for this, pass `true` as additional argument to any of the regular validation methods:
    104104
    105105```javascript
    106106tv4.validate(a, aSchema, true);
    107 tv4.validate(a, schema, asynchronousFunction, true);
    108 
    109107tv4.validateResult(data, aSchema, true);
    110108tv4.validateMultiple(data, aSchema, true);
    111109```
    112110
     111## The `banUnknownProperties` flag
     112
     113Sometimes, it is desirable to flag all unknown properties as an error.  This is especially useful during development, to catch typos and the like, even when extra custom-defined properties are allowed.
     114
     115As such, tv4 implements ["ban unknown properties" mode](https://github.com/json-schema/json-schema/wiki/ban-unknown-properties-mode-\(v5-proposal\)), enabled by a fourth-argument flag:
     116
     117```javascript
     118tv4.validate(data, schema, checkRecursive, true);
     119tv4.validateResult(data, schema, checkRecursive, true);
     120tv4.validateMultiple(data, schema, checkRecursive, true);
     121```
     122
    113123## API
    114124
     
    229239##### addFormat(format, validationFunction)
    230240
    231 Add a custom format validator.
     241Add a custom format validator. (There are no built-in format validators.)
    232242
    233243* `format` is a string, corresponding to the `"format"` value in schemas.
  • Dev/trunk/src/node_modules/tv4/package.json

    r484 r487  
    11{
    22  "name": "tv4",
    3   "version": "1.0.11",
     3  "version": "1.0.16",
    44  "author": {
    55    "name": "Geraint Luff"
     
    5151    "grunt-markdown": "~0.3.0",
    5252    "grunt-component": "~0.1.4",
    53     "grunt-push-release": "~0.1.1"
     53    "grunt-push-release": "~0.1.1",
     54    "grunt-regex-replace": "~0.2.5"
    5455  },
    5556  "engines": {
     
    5758  },
    5859  "scripts": {
    59     "test": "grunt test"
     60    "test": "grunt test",
     61    "prepublish": "grunt prepublish"
    6062  },
    61   "readme": "# Tiny Validator (for v4 JSON Schema)\n\n[![Build Status](https://secure.travis-ci.org/geraintluff/tv4.png?branch=master)](http://travis-ci.org/geraintluff/tv4) [![Dependency Status](https://gemnasium.com/geraintluff/tv4.png)](https://gemnasium.com/geraintluff/tv4) [![NPM version](https://badge.fury.io/js/tv4.png)](http://badge.fury.io/js/tv4)\n\nUse [json-schema](http://json-schema.org/) [draft v4](http://json-schema.org/latest/json-schema-core.html) to validate simple values and complex objects using a rich [validation vocabulary](http://json-schema.org/latest/json-schema-validation.html) ([examples](http://json-schema.org/examples.html)).\n\nThere is support for `$ref` with JSON Pointer fragment paths (```other-schema.json#/properties/myKey```).\n\n## Usage 1: Simple validation\n\n```javascript\nvar valid = tv4.validate(data, schema);\n```\n\nIf validation returns ```false```, then an explanation of why validation failed can be found in ```tv4.error```.\n\nThe error object will look something like:\n```json\n{\n    \"code\": 0,\n    \"message\": \"Invalid type: string\",\n    \"dataPath\": \"/intKey\",\n    \"schemaKey\": \"/properties/intKey/type\"\n}\n```\n\nThe `\"code\"` property will refer to one of the values in `tv4.errorCodes` - in this case, `tv4.errorCodes.INVALID_TYPE`.\n\nTo enable external schema to be referenced, you use:\n```javascript\ntv4.addSchema(url, schema);\n```\n\nIf schemas are referenced (```$ref```) but not known, then validation will return ```true``` and the missing schema(s) will be listed in ```tv4.missing```. For more info see the API documentation below.\n\n## Usage 2: Multi-threaded validation\n\nStoring the error and missing schemas does not work well in multi-threaded environments, so there is an alternative syntax:\n\n```javascript\nvar result = tv4.validateResult(data, schema);\n```\n\nThe result will look something like:\n```json\n{\n    \"valid\": false,\n    \"error\": {...},\n    \"missing\": [...]\n}\n```\n\n## Usage 3: Multiple errors\n\nNormally, `tv4` stops when it encounters the first validation error.  However, you can collect an array of validation errors using:\n\n```javascript\nvar result = tv4.validateMultiple(data, schema);\n```\n\nThe result will look something like:\n```json\n{\n    \"valid\": false,\n    \"errors\": [\n        {...},\n        ...\n    ],\n    \"missing\": [...]\n}\n```\n\n## Asynchronous validation\n\nSupport for asynchronous validation (where missing schemas are fetched) can be added by including an extra JavaScript file.  Currently, the only version requires jQuery (`tv4.async-jquery.js`), but the code is very short and should be fairly easy to modify for other libraries (such as MooTools).\n\nUsage:\n\n```javascript\ntv4.validate(data, schema, function (isValid, validationError) { ... });\n```\n\n`validationFailure` is simply taken from `tv4.error`.\n\n## Cyclical JavaScript objects\n\nWhile they don't occur in proper JSON, JavaScript does support self-referencing objects. Any of the above calls support an optional final argument, checkRecursive. If true, tv4 will handle self-referencing objects properly - this slows down validation slightly, but that's better than a hanging script.\n\nConsider this data, notice how both `a` and `b` refer to each other:\n\n```javascript\nvar a = {};\nvar b = { a: a };\na.b = b;\nvar aSchema = { properties: { b: { $ref: 'bSchema' }}};\nvar bSchema = { properties: { a: { $ref: 'aSchema' }}};\ntv4.addSchema('aSchema', aSchema);\ntv4.addSchema('bSchema', bSchema);\n```\n\nIf the final checkRecursive argument were missing, this would throw a \"too much recursion\" error. \n\nTo enable supprot for this pass `true` as additional argument to any of the regular validation methods: \n\n```javascript\ntv4.validate(a, aSchema, true);\ntv4.validate(a, schema, asynchronousFunction, true);\n\ntv4.validateResult(data, aSchema, true); \ntv4.validateMultiple(data, aSchema, true);\n```\n\n## API\n\nThere are additional api commands available for more complex use-cases:\n\n##### addSchema(uri, schema)\nPre-register a schema for reference by other schema and synchronous validation.\n\n````js\ntv4.addSchema('http://example.com/schema', { ... });\n````\n\n* `uri` the uri to identify this schema.\n* `schema` the schema object.\n\nSchemas that have their `id` property set can be added directly.\n\n````js\ntv4.addSchema({ ... });\n````\n\n##### getSchema(uri)\n\nReturn a schema from the cache.\n\n* `uri` the uri of the schema (may contain a `#` fragment)\n\n````js\nvar schema = tv4.getSchema('http://example.com/schema');\n````\n\n##### getSchemaMap()\n\nReturn a shallow copy of the schema cache, mapping schema document URIs to schema objects.\n\n````\nvar map = tv4.getSchemaMap();\n\nvar schema = map[uri];\n````\n\n##### getSchemaUris(filter)\n\nReturn an Array with known schema document URIs.\n\n* `filter` optional RegExp to filter URIs\n\n````\nvar arr = tv4.getSchemaUris();\n\n// optional filter using a RegExp\nvar arr = tv4.getSchemaUris(/^https?://example.com/);\n````\n\n##### getMissingUris(filter)\n\nReturn an Array with schema document URIs that are used as `$ref` in known schemas but which currently have no associated schema data.\n\nUse this in combination with `tv4.addSchema(uri, schema)` to preload the cache for complete synchronous validation with.\n\n* `filter` optional RegExp to filter URIs\n\n````\nvar arr = tv4.getMissingUris();\n\n// optional filter using a RegExp\nvar arr = tv4.getMissingUris(/^https?://example.com/);\n````\n\n##### dropSchemas()\n\nDrop all known schema document URIs from the cache.\n\n````\ntv4.dropSchemas();\n````\n\n##### freshApi()\n\nReturn a new tv4 instance with no shared state.\n\n````\nvar otherTV4 = tv4.freshApi();\n````\n\n##### reset()\n\nManually reset validation status from the simple `tv4.validate(data, schema)`. Although tv4 will self reset on each validation there are some implementation scenarios where this is useful.\n\n````\ntv4.reset();\n````\n\n##### language(code)\n\nSelect the language map used for reporting.\n\n* `code` is a language code, like `'en'` or `'en-gb'`\n\n````\ntv4.language('en-gb');\n````\n\n##### addLanguage(code, map)\n\nAdd a new language map for selection by `tv4.language(code)`\n\n* `code` is new language code\n* `map` is an object mapping error IDs or constant names (e.g. `103` or `\"NUMBER_MAXIMUM\"`) to language strings.\n\n````\ntv4.addLanguage('fr', { ... });\n\n// select for use\ntv4.language('fr')\n````\n\n##### addFormat(format, validationFunction)\n\nAdd a custom format validator.\n\n* `format` is a string, corresponding to the `\"format\"` value in schemas.\n* `validationFunction` is a function that either returns:\n  * `null` (meaning no error)\n  * an error string (explaining the reason for failure)\n\n````\ntv4.addFormat('decimal-digits', function (data, schema) {\n\tif (typeof data === 'string' && !/^[0-9]+$/.test(data)) {\n\t\treturn null;\n\t}\n\treturn \"must be string of decimal digits\";\n});\n````\n\nAlternatively, multiple formats can be added at the same time using an object:\n````\ntv4.addFormat({\n\t'my-format': function () {...},\n\t'other-format': function () {...}\n});\n````\n\n## Demos\n\n### Basic usage\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo1\">\n<pre class=\"code\" id=\"demo1\">\nvar schema = {\n\t\"items\": {\n\t\t\"type\": \"boolean\"\n\t}\n};\nvar data1 = [true, false];\nvar data2 = [true, 123];\n\nalert(\"data 1: \" + tv4.validate(data1, schema)); // true\nalert(\"data 2: \" + tv4.validate(data2, schema)); // false\nalert(\"data 2 error: \" + JSON.stringify(tv4.error, null, 4));\n</pre>\n</div>\n\n### Use of <code>$ref</code>\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo2\">\n<pre class=\"code\" id=\"demo2\">\nvar schema = {\n\t\"type\": \"array\",\n\t\"items\": {\"$ref\": \"#\"}\n};\nvar data1 = [[], [[]]];\nvar data2 = [[], [true, []]];\n\nalert(\"data 1: \" + tv4.validate(data1, schema)); // true\nalert(\"data 2: \" + tv4.validate(data2, schema)); // false\n</pre>\n</div>\n\n### Missing schema\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo3\">\n<pre class=\"code\" id=\"demo3\">\nvar schema = {\n\t\"type\": \"array\",\n\t\"items\": {\"$ref\": \"http://example.com/schema\" }\n};\nvar data = [1, 2, 3];\n\nalert(\"Valid: \" + tv4.validate(data, schema)); // true\nalert(\"Missing schemas: \" + JSON.stringify(tv4.missing));\n</pre>\n</div>\n\n### Referencing remote schema\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo4\">\n<pre class=\"code\" id=\"demo4\">\ntv4.addSchema(\"http://example.com/schema\", {\n\t\"definitions\": {\n\t\t\"arrayItem\": {\"type\": \"boolean\"}\n\t}\n});\nvar schema = {\n\t\"type\": \"array\",\n\t\"items\": {\"$ref\": \"http://example.com/schema#/definitions/arrayItem\" }\n};\nvar data1 = [true, false, true];\nvar data2 = [1, 2, 3];\n\nalert(\"data 1: \" + tv4.validate(data1, schema)); // true\nalert(\"data 2: \" + tv4.validate(data2, schema)); // false\n</pre>\n</div>\n\n## Supported platforms\n\n* Node.js\n* All modern browsers\n* IE >= 7\n\n## Installation\n\nYou can manually download [`tv4.js`](https://raw.github.com/geraintluff/tv4/master/tv4.js) or the minified [`tv4.min.js`](https://raw.github.com/geraintluff/tv4/master/tv4.min.js) and include it in your html to create the global `tv4` variable.\n\nAlternately use it as a CommonJS module:\n\n````js\nvar tv4 = require('tv4');\n````\n\n#### npm\n\n````\n$ npm install tv4\n````\n\n#### bower\n\n````\n$ bower install tv4\n````\n\n#### component.io\n\n````\n$ component install geraintluff/tv4\n````\n\n## Build and test\n\nYou can rebuild and run the node and browser tests using node.js and [grunt](http://http://gruntjs.com/):\n\nMake sure you have the global grunt cli command:\n````\n$ npm install grunt-cli -g\n````\n\nClone the git repos, open a shell in the root folder and install the development dependencies:\n\n````\n$ npm install\n````\n\nRebuild and run the tests:\n````\n$ grunt\n````\n\nIt will run a build and display one Spec-style report for the node.js and two Dot-style reports for both the plain and minified browser tests (via phantomJS). You can also use your own browser to manually run the suites by opening [`test/index.html`](http://geraintluff.github.io/tv4/test/index.html) and [`test/index-min.html`](http://geraintluff.github.io/tv4/test/index-min.html).\n\n## Contributing\n\nPull-requests for fixes and expansions are welcome. Edit the partial files in `/source` and add your tests in a suitable suite or folder under `/test/tests` and run `grunt` to rebuild and run the test suite. Try to maintain an idiomatic coding style and add tests for any new features. It is recommend to discuss big changes in an Issue.\n\n## Packages using tv4\n\n* [chai-json-schema](http://chaijs.com/plugins/chai-json-schema) is a [Chai Assertion Library](http://chaijs.com) plugin to assert values against json-schema.\n* [grunt-tv4](http://www.github.com/Bartvds/grunt-tv4) is a plugin for [Grunt](http://http://gruntjs.com/) that uses tv4 to bulk validate json files.\n\n## License\n\nThe code is available as \"public domain\", meaning that it is completely free to use, without any restrictions at all.  Read the full license [here](http://geraintluff.github.com/tv4/LICENSE.txt).\n\nIt's also available under an [MIT license](http://jsonary.com/LICENSE.txt).\n",
     63  "readme": "# Tiny Validator (for v4 JSON Schema)\n\n[![Build Status](https://secure.travis-ci.org/geraintluff/tv4.png?branch=master)](http://travis-ci.org/geraintluff/tv4) [![Dependency Status](https://gemnasium.com/geraintluff/tv4.png)](https://gemnasium.com/geraintluff/tv4) [![NPM version](https://badge.fury.io/js/tv4.png)](http://badge.fury.io/js/tv4)\n\nUse [json-schema](http://json-schema.org/) [draft v4](http://json-schema.org/latest/json-schema-core.html) to validate simple values and complex objects using a rich [validation vocabulary](http://json-schema.org/latest/json-schema-validation.html) ([examples](http://json-schema.org/examples.html)).\n\nThere is support for `$ref` with JSON Pointer fragment paths (```other-schema.json#/properties/myKey```).\n\n## Usage 1: Simple validation\n\n```javascript\nvar valid = tv4.validate(data, schema);\n```\n\nIf validation returns ```false```, then an explanation of why validation failed can be found in ```tv4.error```.\n\nThe error object will look something like:\n```json\n{\n    \"code\": 0,\n    \"message\": \"Invalid type: string\",\n    \"dataPath\": \"/intKey\",\n    \"schemaKey\": \"/properties/intKey/type\"\n}\n```\n\nThe `\"code\"` property will refer to one of the values in `tv4.errorCodes` - in this case, `tv4.errorCodes.INVALID_TYPE`.\n\nTo enable external schema to be referenced, you use:\n```javascript\ntv4.addSchema(url, schema);\n```\n\nIf schemas are referenced (```$ref```) but not known, then validation will return ```true``` and the missing schema(s) will be listed in ```tv4.missing```. For more info see the API documentation below.\n\n## Usage 2: Multi-threaded validation\n\nStoring the error and missing schemas does not work well in multi-threaded environments, so there is an alternative syntax:\n\n```javascript\nvar result = tv4.validateResult(data, schema);\n```\n\nThe result will look something like:\n```json\n{\n    \"valid\": false,\n    \"error\": {...},\n    \"missing\": [...]\n}\n```\n\n## Usage 3: Multiple errors\n\nNormally, `tv4` stops when it encounters the first validation error.  However, you can collect an array of validation errors using:\n\n```javascript\nvar result = tv4.validateMultiple(data, schema);\n```\n\nThe result will look something like:\n```json\n{\n    \"valid\": false,\n    \"errors\": [\n        {...},\n        ...\n    ],\n    \"missing\": [...]\n}\n```\n\n## Asynchronous validation\n\nSupport for asynchronous validation (where missing schemas are fetched) can be added by including an extra JavaScript file.  Currently, the only version requires jQuery (`tv4.async-jquery.js`), but the code is very short and should be fairly easy to modify for other libraries (such as MooTools).\n\nUsage:\n\n```javascript\ntv4.validate(data, schema, function (isValid, validationError) { ... });\n```\n\n`validationFailure` is simply taken from `tv4.error`.\n\n## Cyclical JavaScript objects\n\nWhile they don't occur in proper JSON, JavaScript does support self-referencing objects. Any of the above calls support an optional third argument: `checkRecursive`. If true, tv4 will handle self-referencing objects properly - this slows down validation slightly, but that's better than a hanging script.\n\nConsider this data, notice how both `a` and `b` refer to each other:\n\n```javascript\nvar a = {};\nvar b = { a: a };\na.b = b;\nvar aSchema = { properties: { b: { $ref: 'bSchema' }}};\nvar bSchema = { properties: { a: { $ref: 'aSchema' }}};\ntv4.addSchema('aSchema', aSchema);\ntv4.addSchema('bSchema', bSchema);\n```\n\nIf the `checkRecursive` argument were missing, this would throw a \"too much recursion\" error. \n\nTo enable support for this, pass `true` as additional argument to any of the regular validation methods: \n\n```javascript\ntv4.validate(a, aSchema, true);\ntv4.validateResult(data, aSchema, true); \ntv4.validateMultiple(data, aSchema, true);\n```\n\n## The `banUnknownProperties` flag\n\nSometimes, it is desirable to flag all unknown properties as an error.  This is especially useful during development, to catch typos and the like, even when extra custom-defined properties are allowed.\n\nAs such, tv4 implements [\"ban unknown properties\" mode](https://github.com/json-schema/json-schema/wiki/ban-unknown-properties-mode-\\(v5-proposal\\)), enabled by a fourth-argument flag:\n\n```javascript\ntv4.validate(data, schema, checkRecursive, true);\ntv4.validateResult(data, schema, checkRecursive, true);\ntv4.validateMultiple(data, schema, checkRecursive, true);\n```\n\n## API\n\nThere are additional api commands available for more complex use-cases:\n\n##### addSchema(uri, schema)\nPre-register a schema for reference by other schema and synchronous validation.\n\n````js\ntv4.addSchema('http://example.com/schema', { ... });\n````\n\n* `uri` the uri to identify this schema.\n* `schema` the schema object.\n\nSchemas that have their `id` property set can be added directly.\n\n````js\ntv4.addSchema({ ... });\n````\n\n##### getSchema(uri)\n\nReturn a schema from the cache.\n\n* `uri` the uri of the schema (may contain a `#` fragment)\n\n````js\nvar schema = tv4.getSchema('http://example.com/schema');\n````\n\n##### getSchemaMap()\n\nReturn a shallow copy of the schema cache, mapping schema document URIs to schema objects.\n\n````\nvar map = tv4.getSchemaMap();\n\nvar schema = map[uri];\n````\n\n##### getSchemaUris(filter)\n\nReturn an Array with known schema document URIs.\n\n* `filter` optional RegExp to filter URIs\n\n````\nvar arr = tv4.getSchemaUris();\n\n// optional filter using a RegExp\nvar arr = tv4.getSchemaUris(/^https?://example.com/);\n````\n\n##### getMissingUris(filter)\n\nReturn an Array with schema document URIs that are used as `$ref` in known schemas but which currently have no associated schema data.\n\nUse this in combination with `tv4.addSchema(uri, schema)` to preload the cache for complete synchronous validation with.\n\n* `filter` optional RegExp to filter URIs\n\n````\nvar arr = tv4.getMissingUris();\n\n// optional filter using a RegExp\nvar arr = tv4.getMissingUris(/^https?://example.com/);\n````\n\n##### dropSchemas()\n\nDrop all known schema document URIs from the cache.\n\n````\ntv4.dropSchemas();\n````\n\n##### freshApi()\n\nReturn a new tv4 instance with no shared state.\n\n````\nvar otherTV4 = tv4.freshApi();\n````\n\n##### reset()\n\nManually reset validation status from the simple `tv4.validate(data, schema)`. Although tv4 will self reset on each validation there are some implementation scenarios where this is useful.\n\n````\ntv4.reset();\n````\n\n##### language(code)\n\nSelect the language map used for reporting.\n\n* `code` is a language code, like `'en'` or `'en-gb'`\n\n````\ntv4.language('en-gb');\n````\n\n##### addLanguage(code, map)\n\nAdd a new language map for selection by `tv4.language(code)`\n\n* `code` is new language code\n* `map` is an object mapping error IDs or constant names (e.g. `103` or `\"NUMBER_MAXIMUM\"`) to language strings.\n\n````\ntv4.addLanguage('fr', { ... });\n\n// select for use\ntv4.language('fr')\n````\n\n##### addFormat(format, validationFunction)\n\nAdd a custom format validator. (There are no built-in format validators.)\n\n* `format` is a string, corresponding to the `\"format\"` value in schemas.\n* `validationFunction` is a function that either returns:\n  * `null` (meaning no error)\n  * an error string (explaining the reason for failure)\n\n````\ntv4.addFormat('decimal-digits', function (data, schema) {\n\tif (typeof data === 'string' && !/^[0-9]+$/.test(data)) {\n\t\treturn null;\n\t}\n\treturn \"must be string of decimal digits\";\n});\n````\n\nAlternatively, multiple formats can be added at the same time using an object:\n````\ntv4.addFormat({\n\t'my-format': function () {...},\n\t'other-format': function () {...}\n});\n````\n\n## Demos\n\n### Basic usage\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo1\">\n<pre class=\"code\" id=\"demo1\">\nvar schema = {\n\t\"items\": {\n\t\t\"type\": \"boolean\"\n\t}\n};\nvar data1 = [true, false];\nvar data2 = [true, 123];\n\nalert(\"data 1: \" + tv4.validate(data1, schema)); // true\nalert(\"data 2: \" + tv4.validate(data2, schema)); // false\nalert(\"data 2 error: \" + JSON.stringify(tv4.error, null, 4));\n</pre>\n</div>\n\n### Use of <code>$ref</code>\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo2\">\n<pre class=\"code\" id=\"demo2\">\nvar schema = {\n\t\"type\": \"array\",\n\t\"items\": {\"$ref\": \"#\"}\n};\nvar data1 = [[], [[]]];\nvar data2 = [[], [true, []]];\n\nalert(\"data 1: \" + tv4.validate(data1, schema)); // true\nalert(\"data 2: \" + tv4.validate(data2, schema)); // false\n</pre>\n</div>\n\n### Missing schema\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo3\">\n<pre class=\"code\" id=\"demo3\">\nvar schema = {\n\t\"type\": \"array\",\n\t\"items\": {\"$ref\": \"http://example.com/schema\" }\n};\nvar data = [1, 2, 3];\n\nalert(\"Valid: \" + tv4.validate(data, schema)); // true\nalert(\"Missing schemas: \" + JSON.stringify(tv4.missing));\n</pre>\n</div>\n\n### Referencing remote schema\n<div class=\"content inline-demo\" markdown=\"1\" data-demo=\"demo4\">\n<pre class=\"code\" id=\"demo4\">\ntv4.addSchema(\"http://example.com/schema\", {\n\t\"definitions\": {\n\t\t\"arrayItem\": {\"type\": \"boolean\"}\n\t}\n});\nvar schema = {\n\t\"type\": \"array\",\n\t\"items\": {\"$ref\": \"http://example.com/schema#/definitions/arrayItem\" }\n};\nvar data1 = [true, false, true];\nvar data2 = [1, 2, 3];\n\nalert(\"data 1: \" + tv4.validate(data1, schema)); // true\nalert(\"data 2: \" + tv4.validate(data2, schema)); // false\n</pre>\n</div>\n\n## Supported platforms\n\n* Node.js\n* All modern browsers\n* IE >= 7\n\n## Installation\n\nYou can manually download [`tv4.js`](https://raw.github.com/geraintluff/tv4/master/tv4.js) or the minified [`tv4.min.js`](https://raw.github.com/geraintluff/tv4/master/tv4.min.js) and include it in your html to create the global `tv4` variable.\n\nAlternately use it as a CommonJS module:\n\n````js\nvar tv4 = require('tv4');\n````\n\n#### npm\n\n````\n$ npm install tv4\n````\n\n#### bower\n\n````\n$ bower install tv4\n````\n\n#### component.io\n\n````\n$ component install geraintluff/tv4\n````\n\n## Build and test\n\nYou can rebuild and run the node and browser tests using node.js and [grunt](http://http://gruntjs.com/):\n\nMake sure you have the global grunt cli command:\n````\n$ npm install grunt-cli -g\n````\n\nClone the git repos, open a shell in the root folder and install the development dependencies:\n\n````\n$ npm install\n````\n\nRebuild and run the tests:\n````\n$ grunt\n````\n\nIt will run a build and display one Spec-style report for the node.js and two Dot-style reports for both the plain and minified browser tests (via phantomJS). You can also use your own browser to manually run the suites by opening [`test/index.html`](http://geraintluff.github.io/tv4/test/index.html) and [`test/index-min.html`](http://geraintluff.github.io/tv4/test/index-min.html).\n\n## Contributing\n\nPull-requests for fixes and expansions are welcome. Edit the partial files in `/source` and add your tests in a suitable suite or folder under `/test/tests` and run `grunt` to rebuild and run the test suite. Try to maintain an idiomatic coding style and add tests for any new features. It is recommend to discuss big changes in an Issue.\n\n## Packages using tv4\n\n* [chai-json-schema](http://chaijs.com/plugins/chai-json-schema) is a [Chai Assertion Library](http://chaijs.com) plugin to assert values against json-schema.\n* [grunt-tv4](http://www.github.com/Bartvds/grunt-tv4) is a plugin for [Grunt](http://http://gruntjs.com/) that uses tv4 to bulk validate json files.\n\n## License\n\nThe code is available as \"public domain\", meaning that it is completely free to use, without any restrictions at all.  Read the full license [here](http://geraintluff.github.com/tv4/LICENSE.txt).\n\nIt's also available under an [MIT license](http://jsonary.com/LICENSE.txt).\n",
    6264  "readmeFilename": "README.md",
    6365  "bugs": {
     
    6567  },
    6668  "homepage": "https://github.com/geraintluff/tv4",
    67   "_id": "tv4@1.0.11",
    68   "_from": "tv4@"
     69  "_id": "tv4@1.0.16",
     70  "dist": {
     71    "shasum": "f35372c01e94355b7aaff5860455fd231e2d9802"
     72  },
     73  "_from": "tv4@1.0.16",
     74  "_resolved": "https://registry.npmjs.org/tv4/-/tv4-1.0.16.tgz"
    6975}
  • Dev/trunk/src/node_modules/tv4/tv4.async-jquery.js

    r484 r487  
    44if (typeof (tv4.asyncValidate) === 'undefined') {
    55        tv4.syncValidate = tv4.validate;
    6         tv4.validate = function (data, schema, callback, checkRecursive) {
     6        tv4.validate = function (data, schema, callback, checkRecursive, banUnknownProperties) {
    77                if (typeof (callback) === 'undefined') {
    8                         return this.syncValidate(data, schema, checkRecursive);
     8                        return this.syncValidate(data, schema, checkRecursive, banUnknownProperties);
    99                } else {
    10                         return this.asyncValidate(data, schema, callback, checkRecursive);
     10                        return this.asyncValidate(data, schema, callback, checkRecursive, banUnknownProperties);
    1111                }
    1212        };
    13         tv4.asyncValidate = function (data, schema, callback, checkRecursive) {
     13        tv4.asyncValidate = function (data, schema, callback, checkRecursive, banUnknownProperties) {
    1414                var $ = jQuery;
    15                 var result = tv4.validate(data, schema, checkRecursive);
     15                var result = tv4.validate(data, schema, checkRecursive, banUnknownProperties);
    1616                if (!tv4.missing.length) {
    1717                        callback(result, tv4.error);
     
    2828                        // When all requests done, try again
    2929                        $.when.apply($, missingSchemas).done(function () {
    30                                 var result = tv4.asyncValidate(data, schema, callback, checkRecursive);
     30                                var result = tv4.asyncValidate(data, schema, callback, checkRecursive, banUnknownProperties);
    3131                        });
    3232                }
  • Dev/trunk/src/node_modules/tv4/tv4.js

    r484 r487  
    133133                this.scannedFrozen = [];
    134134                this.scannedFrozenSchemas = [];
    135                 this.key = 'tv4_validation_id';
     135                this.scannedFrozenValidationErrors = [];
     136                this.validatedSchemasKey = 'tv4_validation_id';
     137                this.validationErrorsKey = 'tv4_validation_errors_id';
    136138        }
    137139        if (trackUnknownProperties) {
     
    240242};
    241243ValidatorContext.prototype.searchSchemas = function (schema, url) {
    242         if (typeof schema.id === "string") {
    243                 if (isTrustedUrl(url, schema.id)) {
    244                         if (this.schemas[schema.id] === undefined) {
    245                                 this.schemas[schema.id] = schema;
    246                         }
    247                 }
    248         }
    249         if (typeof schema === "object") {
     244        if (schema && typeof schema === "object") {
     245                if (typeof schema.id === "string") {
     246                        if (isTrustedUrl(url, schema.id)) {
     247                                if (this.schemas[schema.id] === undefined) {
     248                                        this.schemas[schema.id] = schema;
     249                                }
     250                        }
     251                }
    250252                for (var key in schema) {
    251253                        if (key !== "enum") {
     
    264266ValidatorContext.prototype.addSchema = function (url, schema) {
    265267        //overload
    266         if (typeof schema === 'undefined') {
     268        if (typeof url !== 'string' || typeof schema === 'undefined') {
    267269                if (typeof url === 'object' && typeof url.id === 'string') {
    268270                        schema = url;
     
    331333        }
    332334
    333         if (this.checkRecursive && (typeof data) === 'object') {
     335        var startErrorCount = this.errors.length;
     336        var frozenIndex, scannedFrozenSchemaIndex = null, scannedSchemasIndex = null;
     337        if (this.checkRecursive && data && typeof data === 'object') {
    334338                topLevel = !this.scanned.length;
    335                 if (data[this.key] && data[this.key].indexOf(schema) !== -1) { return null; }
    336                 var frozenIndex;
     339                if (data[this.validatedSchemasKey]) {
     340                        var schemaIndex = data[this.validatedSchemasKey].indexOf(schema);
     341                        if (schemaIndex !== -1) {
     342                                this.errors = this.errors.concat(data[this.validationErrorsKey][schemaIndex]);
     343                                return null;
     344                        }
     345                }
    337346                if (Object.isFrozen(data)) {
    338347                        frozenIndex = this.scannedFrozen.indexOf(data);
    339                         if (frozenIndex !== -1 && this.scannedFrozenSchemas[frozenIndex].indexOf(schema) !== -1) { return null; }
     348                        if (frozenIndex !== -1) {
     349                                var frozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].indexOf(schema);
     350                                if (frozenSchemaIndex !== -1) {
     351                                        this.errors = this.errors.concat(this.scannedFrozenValidationErrors[frozenIndex][frozenSchemaIndex]);
     352                                        return null;
     353                                }
     354                        }
    340355                }
    341356                this.scanned.push(data);
     
    346361                                this.scannedFrozenSchemas.push([]);
    347362                        }
    348                         this.scannedFrozenSchemas[frozenIndex].push(schema);
     363                        scannedFrozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].length;
     364                        this.scannedFrozenSchemas[frozenIndex][scannedFrozenSchemaIndex] = schema;
     365                        this.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = [];
    349366                } else {
    350                         if (!data[this.key]) {
     367                        if (!data[this.validatedSchemasKey]) {
    351368                                try {
    352                                         Object.defineProperty(data, this.key, {
     369                                        Object.defineProperty(data, this.validatedSchemasKey, {
     370                                                value: [],
     371                                                configurable: true
     372                                        });
     373                                        Object.defineProperty(data, this.validationErrorsKey, {
    353374                                                value: [],
    354375                                                configurable: true
     
    356377                                } catch (e) {
    357378                                        //IE 7/8 workaround
    358                                         data[this.key] = [];
    359                                 }
    360                         }
    361                         data[this.key].push(schema);
     379                                        data[this.validatedSchemasKey] = [];
     380                                        data[this.validationErrorsKey] = [];
     381                                }
     382                        }
     383                        scannedSchemasIndex = data[this.validatedSchemasKey].length;
     384                        data[this.validatedSchemasKey][scannedSchemasIndex] = schema;
     385                        data[this.validationErrorsKey][scannedSchemasIndex] = [];
    362386                }
    363387        }
     
    376400                while (this.scanned.length) {
    377401                        var item = this.scanned.pop();
    378                         delete item[this.key];
     402                        delete item[this.validatedSchemasKey];
    379403                }
    380404                this.scannedFrozen = [];
     
    391415                        this.prefixErrors(errorCount, dataPart, schemaPart);
    392416                }
     417        }
     418       
     419        if (scannedFrozenSchemaIndex !== null) {
     420                this.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = this.errors.slice(startErrorCount);
     421        } else if (scannedSchemasIndex !== null) {
     422                data[this.validationErrorsKey][scannedSchemasIndex] = this.errors.slice(startErrorCount);
    393423        }
    394424
     
    9961026}
    9971027function normSchema(schema, baseUri) {
    998         if (baseUri === undefined) {
    999                 baseUri = schema.id;
    1000         } else if (typeof schema.id === "string") {
    1001                 baseUri = resolveUrl(baseUri, schema.id);
    1002                 schema.id = baseUri;
    1003         }
    1004         if (typeof schema === "object") {
     1028        if (schema && typeof schema === "object") {
     1029                if (baseUri === undefined) {
     1030                        baseUri = schema.id;
     1031                } else if (typeof schema.id === "string") {
     1032                        baseUri = resolveUrl(baseUri, schema.id);
     1033                        schema.id = baseUri;
     1034                }
    10051035                if (Array.isArray(schema)) {
    10061036                        for (var i = 0; i < schema.length; i++) {
     
    10501080        FORMAT_CUSTOM: 500,
    10511081        // Schema structure
    1052         CIRCULAR_REFERENCE: 500,
     1082        CIRCULAR_REFERENCE: 600,
    10531083        // Non-standard validation options
    10541084        UNKNOWN_PROPERTY: 1000
     
    10911121
    10921122function ValidationError(code, message, dataPath, schemaPath, subErrors) {
     1123        Error.call(this);
    10931124        if (code === undefined) {
    10941125                throw new Error ("No code supplied for error: "+ message);
    10951126        }
     1127        this.message = message;
    10961128        this.code = code;
    1097         this.message = message;
    10981129        this.dataPath = dataPath || "";
    10991130        this.schemaPath = schemaPath || "";
    11001131        this.subErrors = subErrors || null;
    1101 }
    1102 ValidationError.prototype = new Error();
     1132
     1133        var err = new Error(this.message);
     1134        this.stack = err.stack || err.stacktrace;
     1135        if (!this.stack) {
     1136                try {
     1137                        throw err;
     1138                }
     1139                catch(err) {
     1140                        this.stack = err.stack || err.stacktrace;
     1141                }
     1142        }
     1143}
     1144ValidationError.prototype = Object.create(Error.prototype);
     1145ValidationError.prototype.constructor = ValidationError;
     1146ValidationError.prototype.name = 'ValidationError';
     1147
    11031148ValidationError.prototype.prefixWith = function (dataPrefix, schemaPrefix) {
    11041149        if (dataPrefix !== null) {
     
    12651310
    12661311})(this);
    1267 
    1268 //@ sourceMappingURL=tv4.js.map
Note: See TracChangeset for help on using the changeset viewer.