@@ -0,0 +1 @@ | |||
../mime/cli.js |
@@ -0,0 +1,224 @@ | |||
1.3.5 / 2018-02-28 | |||
================== | |||
* deps: mime-types@~2.1.18 | |||
- deps: mime-db@~1.33.0 | |||
1.3.4 / 2017-08-22 | |||
================== | |||
* deps: mime-types@~2.1.16 | |||
- deps: mime-db@~1.29.0 | |||
1.3.3 / 2016-05-02 | |||
================== | |||
* deps: mime-types@~2.1.11 | |||
- deps: mime-db@~1.23.0 | |||
* deps: negotiator@0.6.1 | |||
- perf: improve `Accept` parsing speed | |||
- perf: improve `Accept-Charset` parsing speed | |||
- perf: improve `Accept-Encoding` parsing speed | |||
- perf: improve `Accept-Language` parsing speed | |||
1.3.2 / 2016-03-08 | |||
================== | |||
* deps: mime-types@~2.1.10 | |||
- Fix extension of `application/dash+xml` | |||
- Update primary extension for `audio/mp4` | |||
- deps: mime-db@~1.22.0 | |||
1.3.1 / 2016-01-19 | |||
================== | |||
* deps: mime-types@~2.1.9 | |||
- deps: mime-db@~1.21.0 | |||
1.3.0 / 2015-09-29 | |||
================== | |||
* deps: mime-types@~2.1.7 | |||
- deps: mime-db@~1.19.0 | |||
* deps: negotiator@0.6.0 | |||
- Fix including type extensions in parameters in `Accept` parsing | |||
- Fix parsing `Accept` parameters with quoted equals | |||
- Fix parsing `Accept` parameters with quoted semicolons | |||
- Lazy-load modules from main entry point | |||
- perf: delay type concatenation until needed | |||
- perf: enable strict mode | |||
- perf: hoist regular expressions | |||
- perf: remove closures getting spec properties | |||
- perf: remove a closure from media type parsing | |||
- perf: remove property delete from media type parsing | |||
1.2.13 / 2015-09-06 | |||
=================== | |||
* deps: mime-types@~2.1.6 | |||
- deps: mime-db@~1.18.0 | |||
1.2.12 / 2015-07-30 | |||
=================== | |||
* deps: mime-types@~2.1.4 | |||
- deps: mime-db@~1.16.0 | |||
1.2.11 / 2015-07-16 | |||
=================== | |||
* deps: mime-types@~2.1.3 | |||
- deps: mime-db@~1.15.0 | |||
1.2.10 / 2015-07-01 | |||
=================== | |||
* deps: mime-types@~2.1.2 | |||
- deps: mime-db@~1.14.0 | |||
1.2.9 / 2015-06-08 | |||
================== | |||
* deps: mime-types@~2.1.1 | |||
- perf: fix deopt during mapping | |||
1.2.8 / 2015-06-07 | |||
================== | |||
* deps: mime-types@~2.1.0 | |||
- deps: mime-db@~1.13.0 | |||
* perf: avoid argument reassignment & argument slice | |||
* perf: avoid negotiator recursive construction | |||
* perf: enable strict mode | |||
* perf: remove unnecessary bitwise operator | |||
1.2.7 / 2015-05-10 | |||
================== | |||
* deps: negotiator@0.5.3 | |||
- Fix media type parameter matching to be case-insensitive | |||
1.2.6 / 2015-05-07 | |||
================== | |||
* deps: mime-types@~2.0.11 | |||
- deps: mime-db@~1.9.1 | |||
* deps: negotiator@0.5.2 | |||
- Fix comparing media types with quoted values | |||
- Fix splitting media types with quoted commas | |||
1.2.5 / 2015-03-13 | |||
================== | |||
* deps: mime-types@~2.0.10 | |||
- deps: mime-db@~1.8.0 | |||
1.2.4 / 2015-02-14 | |||
================== | |||
* Support Node.js 0.6 | |||
* deps: mime-types@~2.0.9 | |||
- deps: mime-db@~1.7.0 | |||
* deps: negotiator@0.5.1 | |||
- Fix preference sorting to be stable for long acceptable lists | |||
1.2.3 / 2015-01-31 | |||
================== | |||
* deps: mime-types@~2.0.8 | |||
- deps: mime-db@~1.6.0 | |||
1.2.2 / 2014-12-30 | |||
================== | |||
* deps: mime-types@~2.0.7 | |||
- deps: mime-db@~1.5.0 | |||
1.2.1 / 2014-12-30 | |||
================== | |||
* deps: mime-types@~2.0.5 | |||
- deps: mime-db@~1.3.1 | |||
1.2.0 / 2014-12-19 | |||
================== | |||
* deps: negotiator@0.5.0 | |||
- Fix list return order when large accepted list | |||
- Fix missing identity encoding when q=0 exists | |||
- Remove dynamic building of Negotiator class | |||
1.1.4 / 2014-12-10 | |||
================== | |||
* deps: mime-types@~2.0.4 | |||
- deps: mime-db@~1.3.0 | |||
1.1.3 / 2014-11-09 | |||
================== | |||
* deps: mime-types@~2.0.3 | |||
- deps: mime-db@~1.2.0 | |||
1.1.2 / 2014-10-14 | |||
================== | |||
* deps: negotiator@0.4.9 | |||
- Fix error when media type has invalid parameter | |||
1.1.1 / 2014-09-28 | |||
================== | |||
* deps: mime-types@~2.0.2 | |||
- deps: mime-db@~1.1.0 | |||
* deps: negotiator@0.4.8 | |||
- Fix all negotiations to be case-insensitive | |||
- Stable sort preferences of same quality according to client order | |||
1.1.0 / 2014-09-02 | |||
================== | |||
* update `mime-types` | |||
1.0.7 / 2014-07-04 | |||
================== | |||
* Fix wrong type returned from `type` when match after unknown extension | |||
1.0.6 / 2014-06-24 | |||
================== | |||
* deps: negotiator@0.4.7 | |||
1.0.5 / 2014-06-20 | |||
================== | |||
* fix crash when unknown extension given | |||
1.0.4 / 2014-06-19 | |||
================== | |||
* use `mime-types` | |||
1.0.3 / 2014-06-11 | |||
================== | |||
* deps: negotiator@0.4.6 | |||
- Order by specificity when quality is the same | |||
1.0.2 / 2014-05-29 | |||
================== | |||
* Fix interpretation when header not in request | |||
* deps: pin negotiator@0.4.5 | |||
1.0.1 / 2014-01-18 | |||
================== | |||
* Identity encoding isn't always acceptable | |||
* deps: negotiator@~0.4.0 | |||
1.0.0 / 2013-12-27 | |||
================== | |||
* Genesis |
@@ -0,0 +1,23 @@ | |||
(The MIT License) | |||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com> | |||
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com> | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,143 @@ | |||
# accepts | |||
[![NPM Version][npm-image]][npm-url] | |||
[![NPM Downloads][downloads-image]][downloads-url] | |||
[![Node.js Version][node-version-image]][node-version-url] | |||
[![Build Status][travis-image]][travis-url] | |||
[![Test Coverage][coveralls-image]][coveralls-url] | |||
Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). | |||
Extracted from [koa](https://www.npmjs.com/package/koa) for general use. | |||
In addition to negotiator, it allows: | |||
- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` | |||
as well as `('text/html', 'application/json')`. | |||
- Allows type shorthands such as `json`. | |||
- Returns `false` when no types match | |||
- Treats non-existent headers as `*` | |||
## Installation | |||
This is a [Node.js](https://nodejs.org/en/) module available through the | |||
[npm registry](https://www.npmjs.com/). Installation is done using the | |||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): | |||
```sh | |||
$ npm install accepts | |||
``` | |||
## API | |||
<!-- eslint-disable no-unused-vars --> | |||
```js | |||
var accepts = require('accepts') | |||
``` | |||
### accepts(req) | |||
Create a new `Accepts` object for the given `req`. | |||
#### .charset(charsets) | |||
Return the first accepted charset. If nothing in `charsets` is accepted, | |||
then `false` is returned. | |||
#### .charsets() | |||
Return the charsets that the request accepts, in the order of the client's | |||
preference (most preferred first). | |||
#### .encoding(encodings) | |||
Return the first accepted encoding. If nothing in `encodings` is accepted, | |||
then `false` is returned. | |||
#### .encodings() | |||
Return the encodings that the request accepts, in the order of the client's | |||
preference (most preferred first). | |||
#### .language(languages) | |||
Return the first accepted language. If nothing in `languages` is accepted, | |||
then `false` is returned. | |||
#### .languages() | |||
Return the languages that the request accepts, in the order of the client's | |||
preference (most preferred first). | |||
#### .type(types) | |||
Return the first accepted type (and it is returned as the same text as what | |||
appears in the `types` array). If nothing in `types` is accepted, then `false` | |||
is returned. | |||
The `types` array can contain full MIME types or file extensions. Any value | |||
that is not a full MIME types is passed to `require('mime-types').lookup`. | |||
#### .types() | |||
Return the types that the request accepts, in the order of the client's | |||
preference (most preferred first). | |||
## Examples | |||
### Simple type negotiation | |||
This simple example shows how to use `accepts` to return a different typed | |||
respond body based on what the client wants to accept. The server lists it's | |||
preferences in order and will get back the best match between the client and | |||
server. | |||
```js | |||
var accepts = require('accepts') | |||
var http = require('http') | |||
function app (req, res) { | |||
var accept = accepts(req) | |||
// the order of this list is significant; should be server preferred order | |||
switch (accept.type(['json', 'html'])) { | |||
case 'json': | |||
res.setHeader('Content-Type', 'application/json') | |||
res.write('{"hello":"world!"}') | |||
break | |||
case 'html': | |||
res.setHeader('Content-Type', 'text/html') | |||
res.write('<b>hello, world!</b>') | |||
break | |||
default: | |||
// the fallback is text/plain, so no need to specify it above | |||
res.setHeader('Content-Type', 'text/plain') | |||
res.write('hello, world!') | |||
break | |||
} | |||
res.end() | |||
} | |||
http.createServer(app).listen(3000) | |||
``` | |||
You can test this out with the cURL program: | |||
```sh | |||
curl -I -H'Accept: text/html' http://localhost:3000/ | |||
``` | |||
## License | |||
[MIT](LICENSE) | |||
[npm-image]: https://img.shields.io/npm/v/accepts.svg | |||
[npm-url]: https://npmjs.org/package/accepts | |||
[node-version-image]: https://img.shields.io/node/v/accepts.svg | |||
[node-version-url]: https://nodejs.org/en/download/ | |||
[travis-image]: https://img.shields.io/travis/jshttp/accepts/master.svg | |||
[travis-url]: https://travis-ci.org/jshttp/accepts | |||
[coveralls-image]: https://img.shields.io/coveralls/jshttp/accepts/master.svg | |||
[coveralls-url]: https://coveralls.io/r/jshttp/accepts | |||
[downloads-image]: https://img.shields.io/npm/dm/accepts.svg | |||
[downloads-url]: https://npmjs.org/package/accepts |
@@ -0,0 +1,238 @@ | |||
/*! | |||
* accepts | |||
* Copyright(c) 2014 Jonathan Ong | |||
* Copyright(c) 2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var Negotiator = require('negotiator') | |||
var mime = require('mime-types') | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
module.exports = Accepts | |||
/** | |||
* Create a new Accepts object for the given req. | |||
* | |||
* @param {object} req | |||
* @public | |||
*/ | |||
function Accepts (req) { | |||
if (!(this instanceof Accepts)) { | |||
return new Accepts(req) | |||
} | |||
this.headers = req.headers | |||
this.negotiator = new Negotiator(req) | |||
} | |||
/** | |||
* Check if the given `type(s)` is acceptable, returning | |||
* the best match when true, otherwise `undefined`, in which | |||
* case you should respond with 406 "Not Acceptable". | |||
* | |||
* The `type` value may be a single mime type string | |||
* such as "application/json", the extension name | |||
* such as "json" or an array `["json", "html", "text/plain"]`. When a list | |||
* or array is given the _best_ match, if any is returned. | |||
* | |||
* Examples: | |||
* | |||
* // Accept: text/html | |||
* this.types('html'); | |||
* // => "html" | |||
* | |||
* // Accept: text/*, application/json | |||
* this.types('html'); | |||
* // => "html" | |||
* this.types('text/html'); | |||
* // => "text/html" | |||
* this.types('json', 'text'); | |||
* // => "json" | |||
* this.types('application/json'); | |||
* // => "application/json" | |||
* | |||
* // Accept: text/*, application/json | |||
* this.types('image/png'); | |||
* this.types('png'); | |||
* // => undefined | |||
* | |||
* // Accept: text/*;q=.5, application/json | |||
* this.types(['html', 'json']); | |||
* this.types('html', 'json'); | |||
* // => "json" | |||
* | |||
* @param {String|Array} types... | |||
* @return {String|Array|Boolean} | |||
* @public | |||
*/ | |||
Accepts.prototype.type = | |||
Accepts.prototype.types = function (types_) { | |||
var types = types_ | |||
// support flattened arguments | |||
if (types && !Array.isArray(types)) { | |||
types = new Array(arguments.length) | |||
for (var i = 0; i < types.length; i++) { | |||
types[i] = arguments[i] | |||
} | |||
} | |||
// no types, return all requested types | |||
if (!types || types.length === 0) { | |||
return this.negotiator.mediaTypes() | |||
} | |||
// no accept header, return first given type | |||
if (!this.headers.accept) { | |||
return types[0] | |||
} | |||
var mimes = types.map(extToMime) | |||
var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)) | |||
var first = accepts[0] | |||
return first | |||
? types[mimes.indexOf(first)] | |||
: false | |||
} | |||
/** | |||
* Return accepted encodings or best fit based on `encodings`. | |||
* | |||
* Given `Accept-Encoding: gzip, deflate` | |||
* an array sorted by quality is returned: | |||
* | |||
* ['gzip', 'deflate'] | |||
* | |||
* @param {String|Array} encodings... | |||
* @return {String|Array} | |||
* @public | |||
*/ | |||
Accepts.prototype.encoding = | |||
Accepts.prototype.encodings = function (encodings_) { | |||
var encodings = encodings_ | |||
// support flattened arguments | |||
if (encodings && !Array.isArray(encodings)) { | |||
encodings = new Array(arguments.length) | |||
for (var i = 0; i < encodings.length; i++) { | |||
encodings[i] = arguments[i] | |||
} | |||
} | |||
// no encodings, return all requested encodings | |||
if (!encodings || encodings.length === 0) { | |||
return this.negotiator.encodings() | |||
} | |||
return this.negotiator.encodings(encodings)[0] || false | |||
} | |||
/** | |||
* Return accepted charsets or best fit based on `charsets`. | |||
* | |||
* Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` | |||
* an array sorted by quality is returned: | |||
* | |||
* ['utf-8', 'utf-7', 'iso-8859-1'] | |||
* | |||
* @param {String|Array} charsets... | |||
* @return {String|Array} | |||
* @public | |||
*/ | |||
Accepts.prototype.charset = | |||
Accepts.prototype.charsets = function (charsets_) { | |||
var charsets = charsets_ | |||
// support flattened arguments | |||
if (charsets && !Array.isArray(charsets)) { | |||
charsets = new Array(arguments.length) | |||
for (var i = 0; i < charsets.length; i++) { | |||
charsets[i] = arguments[i] | |||
} | |||
} | |||
// no charsets, return all requested charsets | |||
if (!charsets || charsets.length === 0) { | |||
return this.negotiator.charsets() | |||
} | |||
return this.negotiator.charsets(charsets)[0] || false | |||
} | |||
/** | |||
* Return accepted languages or best fit based on `langs`. | |||
* | |||
* Given `Accept-Language: en;q=0.8, es, pt` | |||
* an array sorted by quality is returned: | |||
* | |||
* ['es', 'pt', 'en'] | |||
* | |||
* @param {String|Array} langs... | |||
* @return {Array|String} | |||
* @public | |||
*/ | |||
Accepts.prototype.lang = | |||
Accepts.prototype.langs = | |||
Accepts.prototype.language = | |||
Accepts.prototype.languages = function (languages_) { | |||
var languages = languages_ | |||
// support flattened arguments | |||
if (languages && !Array.isArray(languages)) { | |||
languages = new Array(arguments.length) | |||
for (var i = 0; i < languages.length; i++) { | |||
languages[i] = arguments[i] | |||
} | |||
} | |||
// no languages, return all requested languages | |||
if (!languages || languages.length === 0) { | |||
return this.negotiator.languages() | |||
} | |||
return this.negotiator.languages(languages)[0] || false | |||
} | |||
/** | |||
* Convert extnames to mime. | |||
* | |||
* @param {String} type | |||
* @return {String} | |||
* @private | |||
*/ | |||
function extToMime (type) { | |||
return type.indexOf('/') === -1 | |||
? mime.lookup(type) | |||
: type | |||
} | |||
/** | |||
* Check if mime is valid. | |||
* | |||
* @param {String} type | |||
* @return {String} | |||
* @private | |||
*/ | |||
function validMime (type) { | |||
return typeof type === 'string' | |||
} |
@@ -0,0 +1,85 @@ | |||
{ | |||
"_from": "accepts@~1.3.5", | |||
"_id": "accepts@1.3.5", | |||
"_inBundle": false, | |||
"_integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", | |||
"_location": "/accepts", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "range", | |||
"registry": true, | |||
"raw": "accepts@~1.3.5", | |||
"name": "accepts", | |||
"escapedName": "accepts", | |||
"rawSpec": "~1.3.5", | |||
"saveSpec": null, | |||
"fetchSpec": "~1.3.5" | |||
}, | |||
"_requiredBy": [ | |||
"/express" | |||
], | |||
"_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", | |||
"_shasum": "eb777df6011723a3b14e8a72c0805c8e86746bd2", | |||
"_spec": "accepts@~1.3.5", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"bugs": { | |||
"url": "https://github.com/jshttp/accepts/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"contributors": [ | |||
{ | |||
"name": "Douglas Christopher Wilson", | |||
"email": "doug@somethingdoug.com" | |||
}, | |||
{ | |||
"name": "Jonathan Ong", | |||
"email": "me@jongleberry.com", | |||
"url": "http://jongleberry.com" | |||
} | |||
], | |||
"dependencies": { | |||
"mime-types": "~2.1.18", | |||
"negotiator": "0.6.1" | |||
}, | |||
"deprecated": false, | |||
"description": "Higher-level content negotiation", | |||
"devDependencies": { | |||
"eslint": "4.18.1", | |||
"eslint-config-standard": "11.0.0", | |||
"eslint-plugin-import": "2.9.0", | |||
"eslint-plugin-markdown": "1.0.0-beta.6", | |||
"eslint-plugin-node": "6.0.1", | |||
"eslint-plugin-promise": "3.6.0", | |||
"eslint-plugin-standard": "3.0.1", | |||
"istanbul": "0.4.5", | |||
"mocha": "~1.21.5" | |||
}, | |||
"engines": { | |||
"node": ">= 0.6" | |||
}, | |||
"files": [ | |||
"LICENSE", | |||
"HISTORY.md", | |||
"index.js" | |||
], | |||
"homepage": "https://github.com/jshttp/accepts#readme", | |||
"keywords": [ | |||
"content", | |||
"negotiation", | |||
"accept", | |||
"accepts" | |||
], | |||
"license": "MIT", | |||
"name": "accepts", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/jshttp/accepts.git" | |||
}, | |||
"scripts": { | |||
"lint": "eslint --plugin markdown --ext js,md .", | |||
"test": "mocha --reporter spec --check-leaks --bail test/", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", | |||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" | |||
}, | |||
"version": "1.3.5" | |||
} |
@@ -0,0 +1,21 @@ | |||
The MIT License (MIT) | |||
Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. |
@@ -0,0 +1,43 @@ | |||
# Array Flatten | |||
[![NPM version][npm-image]][npm-url] | |||
[![NPM downloads][downloads-image]][downloads-url] | |||
[![Build status][travis-image]][travis-url] | |||
[![Test coverage][coveralls-image]][coveralls-url] | |||
> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. | |||
## Installation | |||
``` | |||
npm install array-flatten --save | |||
``` | |||
## Usage | |||
```javascript | |||
var flatten = require('array-flatten') | |||
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) | |||
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] | |||
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) | |||
//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] | |||
(function () { | |||
flatten(arguments) //=> [1, 2, 3] | |||
})(1, [2, 3]) | |||
``` | |||
## License | |||
MIT | |||
[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat | |||
[npm-url]: https://npmjs.org/package/array-flatten | |||
[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat | |||
[downloads-url]: https://npmjs.org/package/array-flatten | |||
[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat | |||
[travis-url]: https://travis-ci.org/blakeembrey/array-flatten | |||
[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat | |||
[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master |
@@ -0,0 +1,64 @@ | |||
'use strict' | |||
/** | |||
* Expose `arrayFlatten`. | |||
*/ | |||
module.exports = arrayFlatten | |||
/** | |||
* Recursive flatten function with depth. | |||
* | |||
* @param {Array} array | |||
* @param {Array} result | |||
* @param {Number} depth | |||
* @return {Array} | |||
*/ | |||
function flattenWithDepth (array, result, depth) { | |||
for (var i = 0; i < array.length; i++) { | |||
var value = array[i] | |||
if (depth > 0 && Array.isArray(value)) { | |||
flattenWithDepth(value, result, depth - 1) | |||
} else { | |||
result.push(value) | |||
} | |||
} | |||
return result | |||
} | |||
/** | |||
* Recursive flatten function. Omitting depth is slightly faster. | |||
* | |||
* @param {Array} array | |||
* @param {Array} result | |||
* @return {Array} | |||
*/ | |||
function flattenForever (array, result) { | |||
for (var i = 0; i < array.length; i++) { | |||
var value = array[i] | |||
if (Array.isArray(value)) { | |||
flattenForever(value, result) | |||
} else { | |||
result.push(value) | |||
} | |||
} | |||
return result | |||
} | |||
/** | |||
* Flatten an array, with the ability to define a depth. | |||
* | |||
* @param {Array} array | |||
* @param {Number} depth | |||
* @return {Array} | |||
*/ | |||
function arrayFlatten (array, depth) { | |||
if (depth == null) { | |||
return flattenForever(array, []) | |||
} | |||
return flattenWithDepth(array, [], depth) | |||
} |
@@ -0,0 +1,64 @@ | |||
{ | |||
"_from": "array-flatten@1.1.1", | |||
"_id": "array-flatten@1.1.1", | |||
"_inBundle": false, | |||
"_integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", | |||
"_location": "/array-flatten", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "array-flatten@1.1.1", | |||
"name": "array-flatten", | |||
"escapedName": "array-flatten", | |||
"rawSpec": "1.1.1", | |||
"saveSpec": null, | |||
"fetchSpec": "1.1.1" | |||
}, | |||
"_requiredBy": [ | |||
"/express" | |||
], | |||
"_resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", | |||
"_shasum": "9a5f699051b1e7073328f2a008968b64ea2955d2", | |||
"_spec": "array-flatten@1.1.1", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"author": { | |||
"name": "Blake Embrey", | |||
"email": "hello@blakeembrey.com", | |||
"url": "http://blakeembrey.me" | |||
}, | |||
"bugs": { | |||
"url": "https://github.com/blakeembrey/array-flatten/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"deprecated": false, | |||
"description": "Flatten an array of nested arrays into a single flat array", | |||
"devDependencies": { | |||
"istanbul": "^0.3.13", | |||
"mocha": "^2.2.4", | |||
"pre-commit": "^1.0.7", | |||
"standard": "^3.7.3" | |||
}, | |||
"files": [ | |||
"array-flatten.js", | |||
"LICENSE" | |||
], | |||
"homepage": "https://github.com/blakeembrey/array-flatten", | |||
"keywords": [ | |||
"array", | |||
"flatten", | |||
"arguments", | |||
"depth" | |||
], | |||
"license": "MIT", | |||
"main": "array-flatten.js", | |||
"name": "array-flatten", | |||
"repository": { | |||
"type": "git", | |||
"url": "git://github.com/blakeembrey/array-flatten.git" | |||
}, | |||
"scripts": { | |||
"test": "istanbul cover _mocha -- -R spec" | |||
}, | |||
"version": "1.1.1" | |||
} |
@@ -0,0 +1,52 @@ | |||
2.0.1 / 2018-09-19 | |||
================== | |||
* deps: safe-buffer@5.1.2 | |||
2.0.0 / 2017-09-12 | |||
================== | |||
* Drop support for Node.js below 0.8 | |||
* Remove `auth(ctx)` signature -- pass in header or `auth(ctx.req)` | |||
* Use `safe-buffer` for improved Buffer API | |||
1.1.0 / 2016-11-18 | |||
================== | |||
* Add `auth.parse` for low-level string parsing | |||
1.0.4 / 2016-05-10 | |||
================== | |||
* Improve error message when `req` argument is not an object | |||
* Improve error message when `req` missing `headers` property | |||
1.0.3 / 2015-07-01 | |||
================== | |||
* Fix regression accepting a Koa context | |||
1.0.2 / 2015-06-12 | |||
================== | |||
* Improve error message when `req` argument missing | |||
* perf: enable strict mode | |||
* perf: hoist regular expression | |||
* perf: parse with regular expressions | |||
* perf: remove argument reassignment | |||
1.0.1 / 2015-05-04 | |||
================== | |||
* Update readme | |||
1.0.0 / 2014-07-01 | |||
================== | |||
* Support empty password | |||
* Support empty username | |||
0.0.1 / 2013-11-30 | |||
================== | |||
* Initial release |
@@ -0,0 +1,24 @@ | |||
(The MIT License) | |||
Copyright (c) 2013 TJ Holowaychuk | |||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com> | |||
Copyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.com> | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,113 @@ | |||
# basic-auth | |||
[![NPM Version][npm-image]][npm-url] | |||
[![NPM Downloads][downloads-image]][downloads-url] | |||
[![Node.js Version][node-version-image]][node-version-url] | |||
[![Build Status][travis-image]][travis-url] | |||
[![Test Coverage][coveralls-image]][coveralls-url] | |||
Generic basic auth Authorization header field parser for whatever. | |||
## Installation | |||
This is a [Node.js](https://nodejs.org/en/) module available through the | |||
[npm registry](https://www.npmjs.com/). Installation is done using the | |||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): | |||
``` | |||
$ npm install basic-auth | |||
``` | |||
## API | |||
<!-- eslint-disable no-unused-vars --> | |||
```js | |||
var auth = require('basic-auth') | |||
``` | |||
### auth(req) | |||
Get the basic auth credentials from the given request. The `Authorization` | |||
header is parsed and if the header is invalid, `undefined` is returned, | |||
otherwise an object with `name` and `pass` properties. | |||
### auth.parse(string) | |||
Parse a basic auth authorization header string. This will return an object | |||
with `name` and `pass` properties, or `undefined` if the string is invalid. | |||
## Example | |||
Pass a Node.js request object to the module export. If parsing fails | |||
`undefined` is returned, otherwise an object with `.name` and `.pass`. | |||
<!-- eslint-disable no-unused-vars, no-undef --> | |||
```js | |||
var auth = require('basic-auth') | |||
var user = auth(req) | |||
// => { name: 'something', pass: 'whatever' } | |||
``` | |||
A header string from any other location can also be parsed with | |||
`auth.parse`, for example a `Proxy-Authorization` header: | |||
<!-- eslint-disable no-unused-vars, no-undef --> | |||
```js | |||
var auth = require('basic-auth') | |||
var user = auth.parse(req.getHeader('Proxy-Authorization')) | |||
``` | |||
### With vanilla node.js http server | |||
```js | |||
var http = require('http') | |||
var auth = require('basic-auth') | |||
var compare = require('tsscmp') | |||
// Create server | |||
var server = http.createServer(function (req, res) { | |||
var credentials = auth(req) | |||
// Check credentials | |||
// The "check" function will typically be against your user store | |||
if (!credentials || !check(credentials.name, credentials.pass)) { | |||
res.statusCode = 401 | |||
res.setHeader('WWW-Authenticate', 'Basic realm="example"') | |||
res.end('Access denied') | |||
} else { | |||
res.end('Access granted') | |||
} | |||
}) | |||
// Basic function to validate credentials for example | |||
function check (name, pass) { | |||
var valid = true | |||
// Simple method to prevent short-circut and use timing-safe compare | |||
valid = compare(name, 'john') && valid | |||
valid = compare(pass, 'secret') && valid | |||
return valid | |||
} | |||
// Listen | |||
server.listen(3000) | |||
``` | |||
# License | |||
[MIT](LICENSE) | |||
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/basic-auth/master | |||
[coveralls-url]: https://coveralls.io/r/jshttp/basic-auth?branch=master | |||
[downloads-image]: https://badgen.net/npm/dm/basic-auth | |||
[downloads-url]: https://npmjs.org/package/basic-auth | |||
[node-version-image]: https://badgen.net/npm/node/basic-auth | |||
[node-version-url]: https://nodejs.org/en/download | |||
[npm-image]: https://badgen.net/npm/v/basic-auth | |||
[npm-url]: https://npmjs.org/package/basic-auth | |||
[travis-image]: https://badgen.net/travis/jshttp/basic-auth/master | |||
[travis-url]: https://travis-ci.org/jshttp/basic-auth |
@@ -0,0 +1,133 @@ | |||
/*! | |||
* basic-auth | |||
* Copyright(c) 2013 TJ Holowaychuk | |||
* Copyright(c) 2014 Jonathan Ong | |||
* Copyright(c) 2015-2016 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var Buffer = require('safe-buffer').Buffer | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
module.exports = auth | |||
module.exports.parse = parse | |||
/** | |||
* RegExp for basic auth credentials | |||
* | |||
* credentials = auth-scheme 1*SP token68 | |||
* auth-scheme = "Basic" ; case insensitive | |||
* token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"=" | |||
* @private | |||
*/ | |||
var CREDENTIALS_REGEXP = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9._~+/-]+=*) *$/ | |||
/** | |||
* RegExp for basic auth user/pass | |||
* | |||
* user-pass = userid ":" password | |||
* userid = *<TEXT excluding ":"> | |||
* password = *TEXT | |||
* @private | |||
*/ | |||
var USER_PASS_REGEXP = /^([^:]*):(.*)$/ | |||
/** | |||
* Parse the Authorization header field of a request. | |||
* | |||
* @param {object} req | |||
* @return {object} with .name and .pass | |||
* @public | |||
*/ | |||
function auth (req) { | |||
if (!req) { | |||
throw new TypeError('argument req is required') | |||
} | |||
if (typeof req !== 'object') { | |||
throw new TypeError('argument req is required to be an object') | |||
} | |||
// get header | |||
var header = getAuthorization(req) | |||
// parse header | |||
return parse(header) | |||
} | |||
/** | |||
* Decode base64 string. | |||
* @private | |||
*/ | |||
function decodeBase64 (str) { | |||
return Buffer.from(str, 'base64').toString() | |||
} | |||
/** | |||
* Get the Authorization header from request object. | |||
* @private | |||
*/ | |||
function getAuthorization (req) { | |||
if (!req.headers || typeof req.headers !== 'object') { | |||
throw new TypeError('argument req is required to have headers property') | |||
} | |||
return req.headers.authorization | |||
} | |||
/** | |||
* Parse basic auth to object. | |||
* | |||
* @param {string} string | |||
* @return {object} | |||
* @public | |||
*/ | |||
function parse (string) { | |||
if (typeof string !== 'string') { | |||
return undefined | |||
} | |||
// parse header | |||
var match = CREDENTIALS_REGEXP.exec(string) | |||
if (!match) { | |||
return undefined | |||
} | |||
// decode user pass | |||
var userPass = USER_PASS_REGEXP.exec(decodeBase64(match[1])) | |||
if (!userPass) { | |||
return undefined | |||
} | |||
// return credentials object | |||
return new Credentials(userPass[1], userPass[2]) | |||
} | |||
/** | |||
* Object to represent user credentials. | |||
* @private | |||
*/ | |||
function Credentials (name, pass) { | |||
this.name = name | |||
this.pass = pass | |||
} |
@@ -0,0 +1,73 @@ | |||
{ | |||
"_from": "basic-auth@~2.0.0", | |||
"_id": "basic-auth@2.0.1", | |||
"_inBundle": false, | |||
"_integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", | |||
"_location": "/basic-auth", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "range", | |||
"registry": true, | |||
"raw": "basic-auth@~2.0.0", | |||
"name": "basic-auth", | |||
"escapedName": "basic-auth", | |||
"rawSpec": "~2.0.0", | |||
"saveSpec": null, | |||
"fetchSpec": "~2.0.0" | |||
}, | |||
"_requiredBy": [ | |||
"/morgan" | |||
], | |||
"_resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", | |||
"_shasum": "b998279bf47ce38344b4f3cf916d4679bbf51e3a", | |||
"_spec": "basic-auth@~2.0.0", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/morgan", | |||
"bugs": { | |||
"url": "https://github.com/jshttp/basic-auth/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"dependencies": { | |||
"safe-buffer": "5.1.2" | |||
}, | |||
"deprecated": false, | |||
"description": "node.js basic auth parser", | |||
"devDependencies": { | |||
"eslint": "5.6.0", | |||
"eslint-config-standard": "12.0.0", | |||
"eslint-plugin-import": "2.14.0", | |||
"eslint-plugin-markdown": "1.0.0-beta.6", | |||
"eslint-plugin-node": "7.0.1", | |||
"eslint-plugin-promise": "4.0.1", | |||
"eslint-plugin-standard": "4.0.0", | |||
"istanbul": "0.4.5", | |||
"mocha": "5.2.0" | |||
}, | |||
"engines": { | |||
"node": ">= 0.8" | |||
}, | |||
"files": [ | |||
"HISTORY.md", | |||
"LICENSE", | |||
"index.js" | |||
], | |||
"homepage": "https://github.com/jshttp/basic-auth#readme", | |||
"keywords": [ | |||
"basic", | |||
"auth", | |||
"authorization", | |||
"basicauth" | |||
], | |||
"license": "MIT", | |||
"name": "basic-auth", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/jshttp/basic-auth.git" | |||
}, | |||
"scripts": { | |||
"lint": "eslint --plugin markdown --ext js,md .", | |||
"test": "mocha --check-leaks --reporter spec --bail", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", | |||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" | |||
}, | |||
"version": "2.0.1" | |||
} |
@@ -0,0 +1,588 @@ | |||
1.18.3 / 2018-05-14 | |||
=================== | |||
* Fix stack trace for strict json parse error | |||
* deps: depd@~1.1.2 | |||
- perf: remove argument reassignment | |||
* deps: http-errors@~1.6.3 | |||
- deps: depd@~1.1.2 | |||
- deps: setprototypeof@1.1.0 | |||
- deps: statuses@'>= 1.3.1 < 2' | |||
* deps: iconv-lite@0.4.23 | |||
- Fix loading encoding with year appended | |||
- Fix deprecation warnings on Node.js 10+ | |||
* deps: qs@6.5.2 | |||
* deps: raw-body@2.3.3 | |||
- deps: http-errors@1.6.3 | |||
- deps: iconv-lite@0.4.23 | |||
* deps: type-is@~1.6.16 | |||
- deps: mime-types@~2.1.18 | |||
1.18.2 / 2017-09-22 | |||
=================== | |||
* deps: debug@2.6.9 | |||
* perf: remove argument reassignment | |||
1.18.1 / 2017-09-12 | |||
=================== | |||
* deps: content-type@~1.0.4 | |||
- perf: remove argument reassignment | |||
- perf: skip parameter parsing when no parameters | |||
* deps: iconv-lite@0.4.19 | |||
- Fix ISO-8859-1 regression | |||
- Update Windows-1255 | |||
* deps: qs@6.5.1 | |||
- Fix parsing & compacting very deep objects | |||
* deps: raw-body@2.3.2 | |||
- deps: iconv-lite@0.4.19 | |||
1.18.0 / 2017-09-08 | |||
=================== | |||
* Fix JSON strict violation error to match native parse error | |||
* Include the `body` property on verify errors | |||
* Include the `type` property on all generated errors | |||
* Use `http-errors` to set status code on errors | |||
* deps: bytes@3.0.0 | |||
* deps: debug@2.6.8 | |||
* deps: depd@~1.1.1 | |||
- Remove unnecessary `Buffer` loading | |||
* deps: http-errors@~1.6.2 | |||
- deps: depd@1.1.1 | |||
* deps: iconv-lite@0.4.18 | |||
- Add support for React Native | |||
- Add a warning if not loaded as utf-8 | |||
- Fix CESU-8 decoding in Node.js 8 | |||
- Improve speed of ISO-8859-1 encoding | |||
* deps: qs@6.5.0 | |||
* deps: raw-body@2.3.1 | |||
- Use `http-errors` for standard emitted errors | |||
- deps: bytes@3.0.0 | |||
- deps: iconv-lite@0.4.18 | |||
- perf: skip buffer decoding on overage chunk | |||
* perf: prevent internal `throw` when missing charset | |||
1.17.2 / 2017-05-17 | |||
=================== | |||
* deps: debug@2.6.7 | |||
- Fix `DEBUG_MAX_ARRAY_LENGTH` | |||
- deps: ms@2.0.0 | |||
* deps: type-is@~1.6.15 | |||
- deps: mime-types@~2.1.15 | |||
1.17.1 / 2017-03-06 | |||
=================== | |||
* deps: qs@6.4.0 | |||
- Fix regression parsing keys starting with `[` | |||
1.17.0 / 2017-03-01 | |||
=================== | |||
* deps: http-errors@~1.6.1 | |||
- Make `message` property enumerable for `HttpError`s | |||
- deps: setprototypeof@1.0.3 | |||
* deps: qs@6.3.1 | |||
- Fix compacting nested arrays | |||
1.16.1 / 2017-02-10 | |||
=================== | |||
* deps: debug@2.6.1 | |||
- Fix deprecation messages in WebStorm and other editors | |||
- Undeprecate `DEBUG_FD` set to `1` or `2` | |||
1.16.0 / 2017-01-17 | |||
=================== | |||
* deps: debug@2.6.0 | |||
- Allow colors in workers | |||
- Deprecated `DEBUG_FD` environment variable | |||
- Fix error when running under React Native | |||
- Use same color for same namespace | |||
- deps: ms@0.7.2 | |||
* deps: http-errors@~1.5.1 | |||
- deps: inherits@2.0.3 | |||
- deps: setprototypeof@1.0.2 | |||
- deps: statuses@'>= 1.3.1 < 2' | |||
* deps: iconv-lite@0.4.15 | |||
- Added encoding MS-31J | |||
- Added encoding MS-932 | |||
- Added encoding MS-936 | |||
- Added encoding MS-949 | |||
- Added encoding MS-950 | |||
- Fix GBK/GB18030 handling of Euro character | |||
* deps: qs@6.2.1 | |||
- Fix array parsing from skipping empty values | |||
* deps: raw-body@~2.2.0 | |||
- deps: iconv-lite@0.4.15 | |||
* deps: type-is@~1.6.14 | |||
- deps: mime-types@~2.1.13 | |||
1.15.2 / 2016-06-19 | |||
=================== | |||
* deps: bytes@2.4.0 | |||
* deps: content-type@~1.0.2 | |||
- perf: enable strict mode | |||
* deps: http-errors@~1.5.0 | |||
- Use `setprototypeof` module to replace `__proto__` setting | |||
- deps: statuses@'>= 1.3.0 < 2' | |||
- perf: enable strict mode | |||
* deps: qs@6.2.0 | |||
* deps: raw-body@~2.1.7 | |||
- deps: bytes@2.4.0 | |||
- perf: remove double-cleanup on happy path | |||
* deps: type-is@~1.6.13 | |||
- deps: mime-types@~2.1.11 | |||
1.15.1 / 2016-05-05 | |||
=================== | |||
* deps: bytes@2.3.0 | |||
- Drop partial bytes on all parsed units | |||
- Fix parsing byte string that looks like hex | |||
* deps: raw-body@~2.1.6 | |||
- deps: bytes@2.3.0 | |||
* deps: type-is@~1.6.12 | |||
- deps: mime-types@~2.1.10 | |||
1.15.0 / 2016-02-10 | |||
=================== | |||
* deps: http-errors@~1.4.0 | |||
- Add `HttpError` export, for `err instanceof createError.HttpError` | |||
- deps: inherits@2.0.1 | |||
- deps: statuses@'>= 1.2.1 < 2' | |||
* deps: qs@6.1.0 | |||
* deps: type-is@~1.6.11 | |||
- deps: mime-types@~2.1.9 | |||
1.14.2 / 2015-12-16 | |||
=================== | |||
* deps: bytes@2.2.0 | |||
* deps: iconv-lite@0.4.13 | |||
* deps: qs@5.2.0 | |||
* deps: raw-body@~2.1.5 | |||
- deps: bytes@2.2.0 | |||
- deps: iconv-lite@0.4.13 | |||
* deps: type-is@~1.6.10 | |||
- deps: mime-types@~2.1.8 | |||
1.14.1 / 2015-09-27 | |||
=================== | |||
* Fix issue where invalid charset results in 400 when `verify` used | |||
* deps: iconv-lite@0.4.12 | |||
- Fix CESU-8 decoding in Node.js 4.x | |||
* deps: raw-body@~2.1.4 | |||
- Fix masking critical errors from `iconv-lite` | |||
- deps: iconv-lite@0.4.12 | |||
* deps: type-is@~1.6.9 | |||
- deps: mime-types@~2.1.7 | |||
1.14.0 / 2015-09-16 | |||
=================== | |||
* Fix JSON strict parse error to match syntax errors | |||
* Provide static `require` analysis in `urlencoded` parser | |||
* deps: depd@~1.1.0 | |||
- Support web browser loading | |||
* deps: qs@5.1.0 | |||
* deps: raw-body@~2.1.3 | |||
- Fix sync callback when attaching data listener causes sync read | |||
* deps: type-is@~1.6.8 | |||
- Fix type error when given invalid type to match against | |||
- deps: mime-types@~2.1.6 | |||
1.13.3 / 2015-07-31 | |||
=================== | |||
* deps: type-is@~1.6.6 | |||
- deps: mime-types@~2.1.4 | |||
1.13.2 / 2015-07-05 | |||
=================== | |||
* deps: iconv-lite@0.4.11 | |||
* deps: qs@4.0.0 | |||
- Fix dropping parameters like `hasOwnProperty` | |||
- Fix user-visible incompatibilities from 3.1.0 | |||
- Fix various parsing edge cases | |||
* deps: raw-body@~2.1.2 | |||
- Fix error stack traces to skip `makeError` | |||
- deps: iconv-lite@0.4.11 | |||
* deps: type-is@~1.6.4 | |||
- deps: mime-types@~2.1.2 | |||
- perf: enable strict mode | |||
- perf: remove argument reassignment | |||
1.13.1 / 2015-06-16 | |||
=================== | |||
* deps: qs@2.4.2 | |||
- Downgraded from 3.1.0 because of user-visible incompatibilities | |||
1.13.0 / 2015-06-14 | |||
=================== | |||
* Add `statusCode` property on `Error`s, in addition to `status` | |||
* Change `type` default to `application/json` for JSON parser | |||
* Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser | |||
* Provide static `require` analysis | |||
* Use the `http-errors` module to generate errors | |||
* deps: bytes@2.1.0 | |||
- Slight optimizations | |||
* deps: iconv-lite@0.4.10 | |||
- The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails | |||
- Leading BOM is now removed when decoding | |||
* deps: on-finished@~2.3.0 | |||
- Add defined behavior for HTTP `CONNECT` requests | |||
- Add defined behavior for HTTP `Upgrade` requests | |||
- deps: ee-first@1.1.1 | |||
* deps: qs@3.1.0 | |||
- Fix dropping parameters like `hasOwnProperty` | |||
- Fix various parsing edge cases | |||
- Parsed object now has `null` prototype | |||
* deps: raw-body@~2.1.1 | |||
- Use `unpipe` module for unpiping requests | |||
- deps: iconv-lite@0.4.10 | |||
* deps: type-is@~1.6.3 | |||
- deps: mime-types@~2.1.1 | |||
- perf: reduce try block size | |||
- perf: remove bitwise operations | |||
* perf: enable strict mode | |||
* perf: remove argument reassignment | |||
* perf: remove delete call | |||
1.12.4 / 2015-05-10 | |||
=================== | |||
* deps: debug@~2.2.0 | |||
* deps: qs@2.4.2 | |||
- Fix allowing parameters like `constructor` | |||
* deps: on-finished@~2.2.1 | |||
* deps: raw-body@~2.0.1 | |||
- Fix a false-positive when unpiping in Node.js 0.8 | |||
- deps: bytes@2.0.1 | |||
* deps: type-is@~1.6.2 | |||
- deps: mime-types@~2.0.11 | |||
1.12.3 / 2015-04-15 | |||
=================== | |||
* Slight efficiency improvement when not debugging | |||
* deps: depd@~1.0.1 | |||
* deps: iconv-lite@0.4.8 | |||
- Add encoding alias UNICODE-1-1-UTF-7 | |||
* deps: raw-body@1.3.4 | |||
- Fix hanging callback if request aborts during read | |||
- deps: iconv-lite@0.4.8 | |||
1.12.2 / 2015-03-16 | |||
=================== | |||
* deps: qs@2.4.1 | |||
- Fix error when parameter `hasOwnProperty` is present | |||
1.12.1 / 2015-03-15 | |||
=================== | |||
* deps: debug@~2.1.3 | |||
- Fix high intensity foreground color for bold | |||
- deps: ms@0.7.0 | |||
* deps: type-is@~1.6.1 | |||
- deps: mime-types@~2.0.10 | |||
1.12.0 / 2015-02-13 | |||
=================== | |||
* add `debug` messages | |||
* accept a function for the `type` option | |||
* use `content-type` to parse `Content-Type` headers | |||
* deps: iconv-lite@0.4.7 | |||
- Gracefully support enumerables on `Object.prototype` | |||
* deps: raw-body@1.3.3 | |||
- deps: iconv-lite@0.4.7 | |||
* deps: type-is@~1.6.0 | |||
- fix argument reassignment | |||
- fix false-positives in `hasBody` `Transfer-Encoding` check | |||
- support wildcard for both type and subtype (`*/*`) | |||
- deps: mime-types@~2.0.9 | |||
1.11.0 / 2015-01-30 | |||
=================== | |||
* make internal `extended: true` depth limit infinity | |||
* deps: type-is@~1.5.6 | |||
- deps: mime-types@~2.0.8 | |||
1.10.2 / 2015-01-20 | |||
=================== | |||
* deps: iconv-lite@0.4.6 | |||
- Fix rare aliases of single-byte encodings | |||
* deps: raw-body@1.3.2 | |||
- deps: iconv-lite@0.4.6 | |||
1.10.1 / 2015-01-01 | |||
=================== | |||
* deps: on-finished@~2.2.0 | |||
* deps: type-is@~1.5.5 | |||
- deps: mime-types@~2.0.7 | |||
1.10.0 / 2014-12-02 | |||
=================== | |||
* make internal `extended: true` array limit dynamic | |||
1.9.3 / 2014-11-21 | |||
================== | |||
* deps: iconv-lite@0.4.5 | |||
- Fix Windows-31J and X-SJIS encoding support | |||
* deps: qs@2.3.3 | |||
- Fix `arrayLimit` behavior | |||
* deps: raw-body@1.3.1 | |||
- deps: iconv-lite@0.4.5 | |||
* deps: type-is@~1.5.3 | |||
- deps: mime-types@~2.0.3 | |||
1.9.2 / 2014-10-27 | |||
================== | |||
* deps: qs@2.3.2 | |||
- Fix parsing of mixed objects and values | |||
1.9.1 / 2014-10-22 | |||
================== | |||
* deps: on-finished@~2.1.1 | |||
- Fix handling of pipelined requests | |||
* deps: qs@2.3.0 | |||
- Fix parsing of mixed implicit and explicit arrays | |||
* deps: type-is@~1.5.2 | |||
- deps: mime-types@~2.0.2 | |||
1.9.0 / 2014-09-24 | |||
================== | |||
* include the charset in "unsupported charset" error message | |||
* include the encoding in "unsupported content encoding" error message | |||
* deps: depd@~1.0.0 | |||
1.8.4 / 2014-09-23 | |||
================== | |||
* fix content encoding to be case-insensitive | |||
1.8.3 / 2014-09-19 | |||
================== | |||
* deps: qs@2.2.4 | |||
- Fix issue with object keys starting with numbers truncated | |||
1.8.2 / 2014-09-15 | |||
================== | |||
* deps: depd@0.4.5 | |||
1.8.1 / 2014-09-07 | |||
================== | |||
* deps: media-typer@0.3.0 | |||
* deps: type-is@~1.5.1 | |||
1.8.0 / 2014-09-05 | |||
================== | |||
* make empty-body-handling consistent between chunked requests | |||
- empty `json` produces `{}` | |||
- empty `raw` produces `new Buffer(0)` | |||
- empty `text` produces `''` | |||
- empty `urlencoded` produces `{}` | |||
* deps: qs@2.2.3 | |||
- Fix issue where first empty value in array is discarded | |||
* deps: type-is@~1.5.0 | |||
- fix `hasbody` to be true for `content-length: 0` | |||
1.7.0 / 2014-09-01 | |||
================== | |||
* add `parameterLimit` option to `urlencoded` parser | |||
* change `urlencoded` extended array limit to 100 | |||
* respond with 413 when over `parameterLimit` in `urlencoded` | |||
1.6.7 / 2014-08-29 | |||
================== | |||
* deps: qs@2.2.2 | |||
- Remove unnecessary cloning | |||
1.6.6 / 2014-08-27 | |||
================== | |||
* deps: qs@2.2.0 | |||
- Array parsing fix | |||
- Performance improvements | |||
1.6.5 / 2014-08-16 | |||
================== | |||
* deps: on-finished@2.1.0 | |||
1.6.4 / 2014-08-14 | |||
================== | |||
* deps: qs@1.2.2 | |||
1.6.3 / 2014-08-10 | |||
================== | |||
* deps: qs@1.2.1 | |||
1.6.2 / 2014-08-07 | |||
================== | |||
* deps: qs@1.2.0 | |||
- Fix parsing array of objects | |||
1.6.1 / 2014-08-06 | |||
================== | |||
* deps: qs@1.1.0 | |||
- Accept urlencoded square brackets | |||
- Accept empty values in implicit array notation | |||
1.6.0 / 2014-08-05 | |||
================== | |||
* deps: qs@1.0.2 | |||
- Complete rewrite | |||
- Limits array length to 20 | |||
- Limits object depth to 5 | |||
- Limits parameters to 1,000 | |||
1.5.2 / 2014-07-27 | |||
================== | |||
* deps: depd@0.4.4 | |||
- Work-around v8 generating empty stack traces | |||
1.5.1 / 2014-07-26 | |||
================== | |||
* deps: depd@0.4.3 | |||
- Fix exception when global `Error.stackTraceLimit` is too low | |||
1.5.0 / 2014-07-20 | |||
================== | |||
* deps: depd@0.4.2 | |||
- Add `TRACE_DEPRECATION` environment variable | |||
- Remove non-standard grey color from color output | |||
- Support `--no-deprecation` argument | |||
- Support `--trace-deprecation` argument | |||
* deps: iconv-lite@0.4.4 | |||
- Added encoding UTF-7 | |||
* deps: raw-body@1.3.0 | |||
- deps: iconv-lite@0.4.4 | |||
- Added encoding UTF-7 | |||
- Fix `Cannot switch to old mode now` error on Node.js 0.10+ | |||
* deps: type-is@~1.3.2 | |||
1.4.3 / 2014-06-19 | |||
================== | |||
* deps: type-is@1.3.1 | |||
- fix global variable leak | |||
1.4.2 / 2014-06-19 | |||
================== | |||
* deps: type-is@1.3.0 | |||
- improve type parsing | |||
1.4.1 / 2014-06-19 | |||
================== | |||
* fix urlencoded extended deprecation message | |||
1.4.0 / 2014-06-19 | |||
================== | |||
* add `text` parser | |||
* add `raw` parser | |||
* check accepted charset in content-type (accepts utf-8) | |||
* check accepted encoding in content-encoding (accepts identity) | |||
* deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed | |||
* deprecate `urlencoded()` without provided `extended` option | |||
* lazy-load urlencoded parsers | |||
* parsers split into files for reduced mem usage | |||
* support gzip and deflate bodies | |||
- set `inflate: false` to turn off | |||
* deps: raw-body@1.2.2 | |||
- Support all encodings from `iconv-lite` | |||
1.3.1 / 2014-06-11 | |||
================== | |||
* deps: type-is@1.2.1 | |||
- Switch dependency from mime to mime-types@1.0.0 | |||
1.3.0 / 2014-05-31 | |||
================== | |||
* add `extended` option to urlencoded parser | |||
1.2.2 / 2014-05-27 | |||
================== | |||
* deps: raw-body@1.1.6 | |||
- assert stream encoding on node.js 0.8 | |||
- assert stream encoding on node.js < 0.10.6 | |||
- deps: bytes@1 | |||
1.2.1 / 2014-05-26 | |||
================== | |||
* invoke `next(err)` after request fully read | |||
- prevents hung responses and socket hang ups | |||
1.2.0 / 2014-05-11 | |||
================== | |||
* add `verify` option | |||
* deps: type-is@1.2.0 | |||
- support suffix matching | |||
1.1.2 / 2014-05-11 | |||
================== | |||
* improve json parser speed | |||
1.1.1 / 2014-05-11 | |||
================== | |||
* fix repeated limit parsing with every request | |||
1.1.0 / 2014-05-10 | |||
================== | |||
* add `type` option | |||
* deps: pin for safety and consistency | |||
1.0.2 / 2014-04-14 | |||
================== | |||
* use `type-is` module | |||
1.0.1 / 2014-03-20 | |||
================== | |||
* lower default limits to 100kb |
@@ -0,0 +1,23 @@ | |||
(The MIT License) | |||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com> | |||
Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com> | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,445 @@ | |||
# body-parser | |||
[![NPM Version][npm-image]][npm-url] | |||
[![NPM Downloads][downloads-image]][downloads-url] | |||
[![Build Status][travis-image]][travis-url] | |||
[![Test Coverage][coveralls-image]][coveralls-url] | |||
Node.js body parsing middleware. | |||
Parse incoming request bodies in a middleware before your handlers, available | |||
under the `req.body` property. | |||
**Note** As `req.body`'s shape is based on user-controlled input, all | |||
properties and values in this object are untrusted and should be validated | |||
before trusting. For example, `req.body.foo.toString()` may fail in multiple | |||
ways, for example the `foo` property may not be there or may not be a string, | |||
and `toString` may not be a function and instead a string or other user input. | |||
[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/). | |||
_This does not handle multipart bodies_, due to their complex and typically | |||
large nature. For multipart bodies, you may be interested in the following | |||
modules: | |||
* [busboy](https://www.npmjs.org/package/busboy#readme) and | |||
[connect-busboy](https://www.npmjs.org/package/connect-busboy#readme) | |||
* [multiparty](https://www.npmjs.org/package/multiparty#readme) and | |||
[connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme) | |||
* [formidable](https://www.npmjs.org/package/formidable#readme) | |||
* [multer](https://www.npmjs.org/package/multer#readme) | |||
This module provides the following parsers: | |||
* [JSON body parser](#bodyparserjsonoptions) | |||
* [Raw body parser](#bodyparserrawoptions) | |||
* [Text body parser](#bodyparsertextoptions) | |||
* [URL-encoded form body parser](#bodyparserurlencodedoptions) | |||
Other body parsers you might be interested in: | |||
- [body](https://www.npmjs.org/package/body#readme) | |||
- [co-body](https://www.npmjs.org/package/co-body#readme) | |||
## Installation | |||
```sh | |||
$ npm install body-parser | |||
``` | |||
## API | |||
<!-- eslint-disable no-unused-vars --> | |||
```js | |||
var bodyParser = require('body-parser') | |||
``` | |||
The `bodyParser` object exposes various factories to create middlewares. All | |||
middlewares will populate the `req.body` property with the parsed body when | |||
the `Content-Type` request header matches the `type` option, or an empty | |||
object (`{}`) if there was no body to parse, the `Content-Type` was not matched, | |||
or an error occurred. | |||
The various errors returned by this module are described in the | |||
[errors section](#errors). | |||
### bodyParser.json([options]) | |||
Returns middleware that only parses `json` and only looks at requests where | |||
the `Content-Type` header matches the `type` option. This parser accepts any | |||
Unicode encoding of the body and supports automatic inflation of `gzip` and | |||
`deflate` encodings. | |||
A new `body` object containing the parsed data is populated on the `request` | |||
object after the middleware (i.e. `req.body`). | |||
#### Options | |||
The `json` function takes an optional `options` object that may contain any of | |||
the following keys: | |||
##### inflate | |||
When set to `true`, then deflated (compressed) bodies will be inflated; when | |||
`false`, deflated bodies are rejected. Defaults to `true`. | |||
##### limit | |||
Controls the maximum request body size. If this is a number, then the value | |||
specifies the number of bytes; if it is a string, the value is passed to the | |||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults | |||
to `'100kb'`. | |||
##### reviver | |||
The `reviver` option is passed directly to `JSON.parse` as the second | |||
argument. You can find more information on this argument | |||
[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter). | |||
##### strict | |||
When set to `true`, will only accept arrays and objects; when `false` will | |||
accept anything `JSON.parse` accepts. Defaults to `true`. | |||
##### type | |||
The `type` option is used to determine what media type the middleware will | |||
parse. This option can be a string, array of strings, or a function. If not a | |||
function, `type` option is passed directly to the | |||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can | |||
be an extension name (like `json`), a mime type (like `application/json`), or | |||
a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type` | |||
option is called as `fn(req)` and the request is parsed if it returns a truthy | |||
value. Defaults to `application/json`. | |||
##### verify | |||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, | |||
where `buf` is a `Buffer` of the raw request body and `encoding` is the | |||
encoding of the request. The parsing can be aborted by throwing an error. | |||
### bodyParser.raw([options]) | |||
Returns middleware that parses all bodies as a `Buffer` and only looks at | |||
requests where the `Content-Type` header matches the `type` option. This | |||
parser supports automatic inflation of `gzip` and `deflate` encodings. | |||
A new `body` object containing the parsed data is populated on the `request` | |||
object after the middleware (i.e. `req.body`). This will be a `Buffer` object | |||
of the body. | |||
#### Options | |||
The `raw` function takes an optional `options` object that may contain any of | |||
the following keys: | |||
##### inflate | |||
When set to `true`, then deflated (compressed) bodies will be inflated; when | |||
`false`, deflated bodies are rejected. Defaults to `true`. | |||
##### limit | |||
Controls the maximum request body size. If this is a number, then the value | |||
specifies the number of bytes; if it is a string, the value is passed to the | |||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults | |||
to `'100kb'`. | |||
##### type | |||
The `type` option is used to determine what media type the middleware will | |||
parse. This option can be a string, array of strings, or a function. | |||
If not a function, `type` option is passed directly to the | |||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this | |||
can be an extension name (like `bin`), a mime type (like | |||
`application/octet-stream`), or a mime type with a wildcard (like `*/*` or | |||
`application/*`). If a function, the `type` option is called as `fn(req)` | |||
and the request is parsed if it returns a truthy value. Defaults to | |||
`application/octet-stream`. | |||
##### verify | |||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, | |||
where `buf` is a `Buffer` of the raw request body and `encoding` is the | |||
encoding of the request. The parsing can be aborted by throwing an error. | |||
### bodyParser.text([options]) | |||
Returns middleware that parses all bodies as a string and only looks at | |||
requests where the `Content-Type` header matches the `type` option. This | |||
parser supports automatic inflation of `gzip` and `deflate` encodings. | |||
A new `body` string containing the parsed data is populated on the `request` | |||
object after the middleware (i.e. `req.body`). This will be a string of the | |||
body. | |||
#### Options | |||
The `text` function takes an optional `options` object that may contain any of | |||
the following keys: | |||
##### defaultCharset | |||
Specify the default character set for the text content if the charset is not | |||
specified in the `Content-Type` header of the request. Defaults to `utf-8`. | |||
##### inflate | |||
When set to `true`, then deflated (compressed) bodies will be inflated; when | |||
`false`, deflated bodies are rejected. Defaults to `true`. | |||
##### limit | |||
Controls the maximum request body size. If this is a number, then the value | |||
specifies the number of bytes; if it is a string, the value is passed to the | |||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults | |||
to `'100kb'`. | |||
##### type | |||
The `type` option is used to determine what media type the middleware will | |||
parse. This option can be a string, array of strings, or a function. If not | |||
a function, `type` option is passed directly to the | |||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can | |||
be an extension name (like `txt`), a mime type (like `text/plain`), or a mime | |||
type with a wildcard (like `*/*` or `text/*`). If a function, the `type` | |||
option is called as `fn(req)` and the request is parsed if it returns a | |||
truthy value. Defaults to `text/plain`. | |||
##### verify | |||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, | |||
where `buf` is a `Buffer` of the raw request body and `encoding` is the | |||
encoding of the request. The parsing can be aborted by throwing an error. | |||
### bodyParser.urlencoded([options]) | |||
Returns middleware that only parses `urlencoded` bodies and only looks at | |||
requests where the `Content-Type` header matches the `type` option. This | |||
parser accepts only UTF-8 encoding of the body and supports automatic | |||
inflation of `gzip` and `deflate` encodings. | |||
A new `body` object containing the parsed data is populated on the `request` | |||
object after the middleware (i.e. `req.body`). This object will contain | |||
key-value pairs, where the value can be a string or array (when `extended` is | |||
`false`), or any type (when `extended` is `true`). | |||
#### Options | |||
The `urlencoded` function takes an optional `options` object that may contain | |||
any of the following keys: | |||
##### extended | |||
The `extended` option allows to choose between parsing the URL-encoded data | |||
with the `querystring` library (when `false`) or the `qs` library (when | |||
`true`). The "extended" syntax allows for rich objects and arrays to be | |||
encoded into the URL-encoded format, allowing for a JSON-like experience | |||
with URL-encoded. For more information, please | |||
[see the qs library](https://www.npmjs.org/package/qs#readme). | |||
Defaults to `true`, but using the default has been deprecated. Please | |||
research into the difference between `qs` and `querystring` and choose the | |||
appropriate setting. | |||
##### inflate | |||
When set to `true`, then deflated (compressed) bodies will be inflated; when | |||
`false`, deflated bodies are rejected. Defaults to `true`. | |||
##### limit | |||
Controls the maximum request body size. If this is a number, then the value | |||
specifies the number of bytes; if it is a string, the value is passed to the | |||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults | |||
to `'100kb'`. | |||
##### parameterLimit | |||
The `parameterLimit` option controls the maximum number of parameters that | |||
are allowed in the URL-encoded data. If a request contains more parameters | |||
than this value, a 413 will be returned to the client. Defaults to `1000`. | |||
##### type | |||
The `type` option is used to determine what media type the middleware will | |||
parse. This option can be a string, array of strings, or a function. If not | |||
a function, `type` option is passed directly to the | |||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can | |||
be an extension name (like `urlencoded`), a mime type (like | |||
`application/x-www-form-urlencoded`), or a mime type with a wildcard (like | |||
`*/x-www-form-urlencoded`). If a function, the `type` option is called as | |||
`fn(req)` and the request is parsed if it returns a truthy value. Defaults | |||
to `application/x-www-form-urlencoded`. | |||
##### verify | |||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, | |||
where `buf` is a `Buffer` of the raw request body and `encoding` is the | |||
encoding of the request. The parsing can be aborted by throwing an error. | |||
## Errors | |||
The middlewares provided by this module create errors depending on the error | |||
condition during parsing. The errors will typically have a `status`/`statusCode` | |||
property that contains the suggested HTTP response code, an `expose` property | |||
to determine if the `message` property should be displayed to the client, a | |||
`type` property to determine the type of error without matching against the | |||
`message`, and a `body` property containing the read body, if available. | |||
The following are the common errors emitted, though any error can come through | |||
for various reasons. | |||
### content encoding unsupported | |||
This error will occur when the request had a `Content-Encoding` header that | |||
contained an encoding but the "inflation" option was set to `false`. The | |||
`status` property is set to `415`, the `type` property is set to | |||
`'encoding.unsupported'`, and the `charset` property will be set to the | |||
encoding that is unsupported. | |||
### request aborted | |||
This error will occur when the request is aborted by the client before reading | |||
the body has finished. The `received` property will be set to the number of | |||
bytes received before the request was aborted and the `expected` property is | |||
set to the number of expected bytes. The `status` property is set to `400` | |||
and `type` property is set to `'request.aborted'`. | |||
### request entity too large | |||
This error will occur when the request body's size is larger than the "limit" | |||
option. The `limit` property will be set to the byte limit and the `length` | |||
property will be set to the request body's length. The `status` property is | |||
set to `413` and the `type` property is set to `'entity.too.large'`. | |||
### request size did not match content length | |||
This error will occur when the request's length did not match the length from | |||
the `Content-Length` header. This typically occurs when the request is malformed, | |||
typically when the `Content-Length` header was calculated based on characters | |||
instead of bytes. The `status` property is set to `400` and the `type` property | |||
is set to `'request.size.invalid'`. | |||
### stream encoding should not be set | |||
This error will occur when something called the `req.setEncoding` method prior | |||
to this middleware. This module operates directly on bytes only and you cannot | |||
call `req.setEncoding` when using this module. The `status` property is set to | |||
`500` and the `type` property is set to `'stream.encoding.set'`. | |||
### too many parameters | |||
This error will occur when the content of the request exceeds the configured | |||
`parameterLimit` for the `urlencoded` parser. The `status` property is set to | |||
`413` and the `type` property is set to `'parameters.too.many'`. | |||
### unsupported charset "BOGUS" | |||
This error will occur when the request had a charset parameter in the | |||
`Content-Type` header, but the `iconv-lite` module does not support it OR the | |||
parser does not support it. The charset is contained in the message as well | |||
as in the `charset` property. The `status` property is set to `415`, the | |||
`type` property is set to `'charset.unsupported'`, and the `charset` property | |||
is set to the charset that is unsupported. | |||
### unsupported content encoding "bogus" | |||
This error will occur when the request had a `Content-Encoding` header that | |||
contained an unsupported encoding. The encoding is contained in the message | |||
as well as in the `encoding` property. The `status` property is set to `415`, | |||
the `type` property is set to `'encoding.unsupported'`, and the `encoding` | |||
property is set to the encoding that is unsupported. | |||
## Examples | |||
### Express/Connect top-level generic | |||
This example demonstrates adding a generic JSON and URL-encoded parser as a | |||
top-level middleware, which will parse the bodies of all incoming requests. | |||
This is the simplest setup. | |||
```js | |||
var express = require('express') | |||
var bodyParser = require('body-parser') | |||
var app = express() | |||
// parse application/x-www-form-urlencoded | |||
app.use(bodyParser.urlencoded({ extended: false })) | |||
// parse application/json | |||
app.use(bodyParser.json()) | |||
app.use(function (req, res) { | |||
res.setHeader('Content-Type', 'text/plain') | |||
res.write('you posted:\n') | |||
res.end(JSON.stringify(req.body, null, 2)) | |||
}) | |||
``` | |||
### Express route-specific | |||
This example demonstrates adding body parsers specifically to the routes that | |||
need them. In general, this is the most recommended way to use body-parser with | |||
Express. | |||
```js | |||
var express = require('express') | |||
var bodyParser = require('body-parser') | |||
var app = express() | |||
// create application/json parser | |||
var jsonParser = bodyParser.json() | |||
// create application/x-www-form-urlencoded parser | |||
var urlencodedParser = bodyParser.urlencoded({ extended: false }) | |||
// POST /login gets urlencoded bodies | |||
app.post('/login', urlencodedParser, function (req, res) { | |||
if (!req.body) return res.sendStatus(400) | |||
res.send('welcome, ' + req.body.username) | |||
}) | |||
// POST /api/users gets JSON bodies | |||
app.post('/api/users', jsonParser, function (req, res) { | |||
if (!req.body) return res.sendStatus(400) | |||
// create user in req.body | |||
}) | |||
``` | |||
### Change accepted type for parsers | |||
All the parsers accept a `type` option which allows you to change the | |||
`Content-Type` that the middleware will parse. | |||
```js | |||
var express = require('express') | |||
var bodyParser = require('body-parser') | |||
var app = express() | |||
// parse various different custom JSON types as JSON | |||
app.use(bodyParser.json({ type: 'application/*+json' })) | |||
// parse some custom thing into a Buffer | |||
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) | |||
// parse an HTML body into a string | |||
app.use(bodyParser.text({ type: 'text/html' })) | |||
``` | |||
## License | |||
[MIT](LICENSE) | |||
[npm-image]: https://img.shields.io/npm/v/body-parser.svg | |||
[npm-url]: https://npmjs.org/package/body-parser | |||
[travis-image]: https://img.shields.io/travis/expressjs/body-parser/master.svg | |||
[travis-url]: https://travis-ci.org/expressjs/body-parser | |||
[coveralls-image]: https://img.shields.io/coveralls/expressjs/body-parser/master.svg | |||
[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master | |||
[downloads-image]: https://img.shields.io/npm/dm/body-parser.svg | |||
[downloads-url]: https://npmjs.org/package/body-parser |
@@ -0,0 +1,157 @@ | |||
/*! | |||
* body-parser | |||
* Copyright(c) 2014-2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var deprecate = require('depd')('body-parser') | |||
/** | |||
* Cache of loaded parsers. | |||
* @private | |||
*/ | |||
var parsers = Object.create(null) | |||
/** | |||
* @typedef Parsers | |||
* @type {function} | |||
* @property {function} json | |||
* @property {function} raw | |||
* @property {function} text | |||
* @property {function} urlencoded | |||
*/ | |||
/** | |||
* Module exports. | |||
* @type {Parsers} | |||
*/ | |||
exports = module.exports = deprecate.function(bodyParser, | |||
'bodyParser: use individual json/urlencoded middlewares') | |||
/** | |||
* JSON parser. | |||
* @public | |||
*/ | |||
Object.defineProperty(exports, 'json', { | |||
configurable: true, | |||
enumerable: true, | |||
get: createParserGetter('json') | |||
}) | |||
/** | |||
* Raw parser. | |||
* @public | |||
*/ | |||
Object.defineProperty(exports, 'raw', { | |||
configurable: true, | |||
enumerable: true, | |||
get: createParserGetter('raw') | |||
}) | |||
/** | |||
* Text parser. | |||
* @public | |||
*/ | |||
Object.defineProperty(exports, 'text', { | |||
configurable: true, | |||
enumerable: true, | |||
get: createParserGetter('text') | |||
}) | |||
/** | |||
* URL-encoded parser. | |||
* @public | |||
*/ | |||
Object.defineProperty(exports, 'urlencoded', { | |||
configurable: true, | |||
enumerable: true, | |||
get: createParserGetter('urlencoded') | |||
}) | |||
/** | |||
* Create a middleware to parse json and urlencoded bodies. | |||
* | |||
* @param {object} [options] | |||
* @return {function} | |||
* @deprecated | |||
* @public | |||
*/ | |||
function bodyParser (options) { | |||
var opts = {} | |||
// exclude type option | |||
if (options) { | |||
for (var prop in options) { | |||
if (prop !== 'type') { | |||
opts[prop] = options[prop] | |||
} | |||
} | |||
} | |||
var _urlencoded = exports.urlencoded(opts) | |||
var _json = exports.json(opts) | |||
return function bodyParser (req, res, next) { | |||
_json(req, res, function (err) { | |||
if (err) return next(err) | |||
_urlencoded(req, res, next) | |||
}) | |||
} | |||
} | |||
/** | |||
* Create a getter for loading a parser. | |||
* @private | |||
*/ | |||
function createParserGetter (name) { | |||
return function get () { | |||
return loadParser(name) | |||
} | |||
} | |||
/** | |||
* Load a parser module. | |||
* @private | |||
*/ | |||
function loadParser (parserName) { | |||
var parser = parsers[parserName] | |||
if (parser !== undefined) { | |||
return parser | |||
} | |||
// this uses a switch for static require analysis | |||
switch (parserName) { | |||
case 'json': | |||
parser = require('./lib/types/json') | |||
break | |||
case 'raw': | |||
parser = require('./lib/types/raw') | |||
break | |||
case 'text': | |||
parser = require('./lib/types/text') | |||
break | |||
case 'urlencoded': | |||
parser = require('./lib/types/urlencoded') | |||
break | |||
} | |||
// store to prevent invoking require() | |||
return (parsers[parserName] = parser) | |||
} |
@@ -0,0 +1,181 @@ | |||
/*! | |||
* body-parser | |||
* Copyright(c) 2014-2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var createError = require('http-errors') | |||
var getBody = require('raw-body') | |||
var iconv = require('iconv-lite') | |||
var onFinished = require('on-finished') | |||
var zlib = require('zlib') | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = read | |||
/** | |||
* Read a request into a buffer and parse. | |||
* | |||
* @param {object} req | |||
* @param {object} res | |||
* @param {function} next | |||
* @param {function} parse | |||
* @param {function} debug | |||
* @param {object} options | |||
* @private | |||
*/ | |||
function read (req, res, next, parse, debug, options) { | |||
var length | |||
var opts = options | |||
var stream | |||
// flag as parsed | |||
req._body = true | |||
// read options | |||
var encoding = opts.encoding !== null | |||
? opts.encoding | |||
: null | |||
var verify = opts.verify | |||
try { | |||
// get the content stream | |||
stream = contentstream(req, debug, opts.inflate) | |||
length = stream.length | |||
stream.length = undefined | |||
} catch (err) { | |||
return next(err) | |||
} | |||
// set raw-body options | |||
opts.length = length | |||
opts.encoding = verify | |||
? null | |||
: encoding | |||
// assert charset is supported | |||
if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { | |||
return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { | |||
charset: encoding.toLowerCase(), | |||
type: 'charset.unsupported' | |||
})) | |||
} | |||
// read body | |||
debug('read body') | |||
getBody(stream, opts, function (error, body) { | |||
if (error) { | |||
var _error | |||
if (error.type === 'encoding.unsupported') { | |||
// echo back charset | |||
_error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { | |||
charset: encoding.toLowerCase(), | |||
type: 'charset.unsupported' | |||
}) | |||
} else { | |||
// set status code on error | |||
_error = createError(400, error) | |||
} | |||
// read off entire request | |||
stream.resume() | |||
onFinished(req, function onfinished () { | |||
next(createError(400, _error)) | |||
}) | |||
return | |||
} | |||
// verify | |||
if (verify) { | |||
try { | |||
debug('verify body') | |||
verify(req, res, body, encoding) | |||
} catch (err) { | |||
next(createError(403, err, { | |||
body: body, | |||
type: err.type || 'entity.verify.failed' | |||
})) | |||
return | |||
} | |||
} | |||
// parse | |||
var str = body | |||
try { | |||
debug('parse body') | |||
str = typeof body !== 'string' && encoding !== null | |||
? iconv.decode(body, encoding) | |||
: body | |||
req.body = parse(str) | |||
} catch (err) { | |||
next(createError(400, err, { | |||
body: str, | |||
type: err.type || 'entity.parse.failed' | |||
})) | |||
return | |||
} | |||
next() | |||
}) | |||
} | |||
/** | |||
* Get the content stream of the request. | |||
* | |||
* @param {object} req | |||
* @param {function} debug | |||
* @param {boolean} [inflate=true] | |||
* @return {object} | |||
* @api private | |||
*/ | |||
function contentstream (req, debug, inflate) { | |||
var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() | |||
var length = req.headers['content-length'] | |||
var stream | |||
debug('content-encoding "%s"', encoding) | |||
if (inflate === false && encoding !== 'identity') { | |||
throw createError(415, 'content encoding unsupported', { | |||
encoding: encoding, | |||
type: 'encoding.unsupported' | |||
}) | |||
} | |||
switch (encoding) { | |||
case 'deflate': | |||
stream = zlib.createInflate() | |||
debug('inflate body') | |||
req.pipe(stream) | |||
break | |||
case 'gzip': | |||
stream = zlib.createGunzip() | |||
debug('gunzip body') | |||
req.pipe(stream) | |||
break | |||
case 'identity': | |||
stream = req | |||
stream.length = length | |||
break | |||
default: | |||
throw createError(415, 'unsupported content encoding "' + encoding + '"', { | |||
encoding: encoding, | |||
type: 'encoding.unsupported' | |||
}) | |||
} | |||
return stream | |||
} |
@@ -0,0 +1,230 @@ | |||
/*! | |||
* body-parser | |||
* Copyright(c) 2014 Jonathan Ong | |||
* Copyright(c) 2014-2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var bytes = require('bytes') | |||
var contentType = require('content-type') | |||
var createError = require('http-errors') | |||
var debug = require('debug')('body-parser:json') | |||
var read = require('../read') | |||
var typeis = require('type-is') | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = json | |||
/** | |||
* RegExp to match the first non-space in a string. | |||
* | |||
* Allowed whitespace is defined in RFC 7159: | |||
* | |||
* ws = *( | |||
* %x20 / ; Space | |||
* %x09 / ; Horizontal tab | |||
* %x0A / ; Line feed or New line | |||
* %x0D ) ; Carriage return | |||
*/ | |||
var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*(.)/ // eslint-disable-line no-control-regex | |||
/** | |||
* Create a middleware to parse JSON bodies. | |||
* | |||
* @param {object} [options] | |||
* @return {function} | |||
* @public | |||
*/ | |||
function json (options) { | |||
var opts = options || {} | |||
var limit = typeof opts.limit !== 'number' | |||
? bytes.parse(opts.limit || '100kb') | |||
: opts.limit | |||
var inflate = opts.inflate !== false | |||
var reviver = opts.reviver | |||
var strict = opts.strict !== false | |||
var type = opts.type || 'application/json' | |||
var verify = opts.verify || false | |||
if (verify !== false && typeof verify !== 'function') { | |||
throw new TypeError('option verify must be function') | |||
} | |||
// create the appropriate type checking function | |||
var shouldParse = typeof type !== 'function' | |||
? typeChecker(type) | |||
: type | |||
function parse (body) { | |||
if (body.length === 0) { | |||
// special-case empty json body, as it's a common client-side mistake | |||
// TODO: maybe make this configurable or part of "strict" option | |||
return {} | |||
} | |||
if (strict) { | |||
var first = firstchar(body) | |||
if (first !== '{' && first !== '[') { | |||
debug('strict violation') | |||
throw createStrictSyntaxError(body, first) | |||
} | |||
} | |||
try { | |||
debug('parse json') | |||
return JSON.parse(body, reviver) | |||
} catch (e) { | |||
throw normalizeJsonSyntaxError(e, { | |||
message: e.message, | |||
stack: e.stack | |||
}) | |||
} | |||
} | |||
return function jsonParser (req, res, next) { | |||
if (req._body) { | |||
debug('body already parsed') | |||
next() | |||
return | |||
} | |||
req.body = req.body || {} | |||
// skip requests without bodies | |||
if (!typeis.hasBody(req)) { | |||
debug('skip empty body') | |||
next() | |||
return | |||
} | |||
debug('content-type %j', req.headers['content-type']) | |||
// determine if request should be parsed | |||
if (!shouldParse(req)) { | |||
debug('skip parsing') | |||
next() | |||
return | |||
} | |||
// assert charset per RFC 7159 sec 8.1 | |||
var charset = getCharset(req) || 'utf-8' | |||
if (charset.substr(0, 4) !== 'utf-') { | |||
debug('invalid charset') | |||
next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { | |||
charset: charset, | |||
type: 'charset.unsupported' | |||
})) | |||
return | |||
} | |||
// read | |||
read(req, res, next, parse, debug, { | |||
encoding: charset, | |||
inflate: inflate, | |||
limit: limit, | |||
verify: verify | |||
}) | |||
} | |||
} | |||
/** | |||
* Create strict violation syntax error matching native error. | |||
* | |||
* @param {string} str | |||
* @param {string} char | |||
* @return {Error} | |||
* @private | |||
*/ | |||
function createStrictSyntaxError (str, char) { | |||
var index = str.indexOf(char) | |||
var partial = str.substring(0, index) + '#' | |||
try { | |||
JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') | |||
} catch (e) { | |||
return normalizeJsonSyntaxError(e, { | |||
message: e.message.replace('#', char), | |||
stack: e.stack | |||
}) | |||
} | |||
} | |||
/** | |||
* Get the first non-whitespace character in a string. | |||
* | |||
* @param {string} str | |||
* @return {function} | |||
* @private | |||
*/ | |||
function firstchar (str) { | |||
return FIRST_CHAR_REGEXP.exec(str)[1] | |||
} | |||
/** | |||
* Get the charset of a request. | |||
* | |||
* @param {object} req | |||
* @api private | |||
*/ | |||
function getCharset (req) { | |||
try { | |||
return (contentType.parse(req).parameters.charset || '').toLowerCase() | |||
} catch (e) { | |||
return undefined | |||
} | |||
} | |||
/** | |||
* Normalize a SyntaxError for JSON.parse. | |||
* | |||
* @param {SyntaxError} error | |||
* @param {object} obj | |||
* @return {SyntaxError} | |||
*/ | |||
function normalizeJsonSyntaxError (error, obj) { | |||
var keys = Object.getOwnPropertyNames(error) | |||
for (var i = 0; i < keys.length; i++) { | |||
var key = keys[i] | |||
if (key !== 'stack' && key !== 'message') { | |||
delete error[key] | |||
} | |||
} | |||
// replace stack before message for Node.js 0.10 and below | |||
error.stack = obj.stack.replace(error.message, obj.message) | |||
error.message = obj.message | |||
return error | |||
} | |||
/** | |||
* Get the simple type checker. | |||
* | |||
* @param {string} type | |||
* @return {function} | |||
*/ | |||
function typeChecker (type) { | |||
return function checkType (req) { | |||
return Boolean(typeis(req, type)) | |||
} | |||
} |
@@ -0,0 +1,101 @@ | |||
/*! | |||
* body-parser | |||
* Copyright(c) 2014-2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
*/ | |||
var bytes = require('bytes') | |||
var debug = require('debug')('body-parser:raw') | |||
var read = require('../read') | |||
var typeis = require('type-is') | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = raw | |||
/** | |||
* Create a middleware to parse raw bodies. | |||
* | |||
* @param {object} [options] | |||
* @return {function} | |||
* @api public | |||
*/ | |||
function raw (options) { | |||
var opts = options || {} | |||
var inflate = opts.inflate !== false | |||
var limit = typeof opts.limit !== 'number' | |||
? bytes.parse(opts.limit || '100kb') | |||
: opts.limit | |||
var type = opts.type || 'application/octet-stream' | |||
var verify = opts.verify || false | |||
if (verify !== false && typeof verify !== 'function') { | |||
throw new TypeError('option verify must be function') | |||
} | |||
// create the appropriate type checking function | |||
var shouldParse = typeof type !== 'function' | |||
? typeChecker(type) | |||
: type | |||
function parse (buf) { | |||
return buf | |||
} | |||
return function rawParser (req, res, next) { | |||
if (req._body) { | |||
debug('body already parsed') | |||
next() | |||
return | |||
} | |||
req.body = req.body || {} | |||
// skip requests without bodies | |||
if (!typeis.hasBody(req)) { | |||
debug('skip empty body') | |||
next() | |||
return | |||
} | |||
debug('content-type %j', req.headers['content-type']) | |||
// determine if request should be parsed | |||
if (!shouldParse(req)) { | |||
debug('skip parsing') | |||
next() | |||
return | |||
} | |||
// read | |||
read(req, res, next, parse, debug, { | |||
encoding: null, | |||
inflate: inflate, | |||
limit: limit, | |||
verify: verify | |||
}) | |||
} | |||
} | |||
/** | |||
* Get the simple type checker. | |||
* | |||
* @param {string} type | |||
* @return {function} | |||
*/ | |||
function typeChecker (type) { | |||
return function checkType (req) { | |||
return Boolean(typeis(req, type)) | |||
} | |||
} |
@@ -0,0 +1,121 @@ | |||
/*! | |||
* body-parser | |||
* Copyright(c) 2014-2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
*/ | |||
var bytes = require('bytes') | |||
var contentType = require('content-type') | |||
var debug = require('debug')('body-parser:text') | |||
var read = require('../read') | |||
var typeis = require('type-is') | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = text | |||
/** | |||
* Create a middleware to parse text bodies. | |||
* | |||
* @param {object} [options] | |||
* @return {function} | |||
* @api public | |||
*/ | |||
function text (options) { | |||
var opts = options || {} | |||
var defaultCharset = opts.defaultCharset || 'utf-8' | |||
var inflate = opts.inflate !== false | |||
var limit = typeof opts.limit !== 'number' | |||
? bytes.parse(opts.limit || '100kb') | |||
: opts.limit | |||
var type = opts.type || 'text/plain' | |||
var verify = opts.verify || false | |||
if (verify !== false && typeof verify !== 'function') { | |||
throw new TypeError('option verify must be function') | |||
} | |||
// create the appropriate type checking function | |||
var shouldParse = typeof type !== 'function' | |||
? typeChecker(type) | |||
: type | |||
function parse (buf) { | |||
return buf | |||
} | |||
return function textParser (req, res, next) { | |||
if (req._body) { | |||
debug('body already parsed') | |||
next() | |||
return | |||
} | |||
req.body = req.body || {} | |||
// skip requests without bodies | |||
if (!typeis.hasBody(req)) { | |||
debug('skip empty body') | |||
next() | |||
return | |||
} | |||
debug('content-type %j', req.headers['content-type']) | |||
// determine if request should be parsed | |||
if (!shouldParse(req)) { | |||
debug('skip parsing') | |||
next() | |||
return | |||
} | |||
// get charset | |||
var charset = getCharset(req) || defaultCharset | |||
// read | |||
read(req, res, next, parse, debug, { | |||
encoding: charset, | |||
inflate: inflate, | |||
limit: limit, | |||
verify: verify | |||
}) | |||
} | |||
} | |||
/** | |||
* Get the charset of a request. | |||
* | |||
* @param {object} req | |||
* @api private | |||
*/ | |||
function getCharset (req) { | |||
try { | |||
return (contentType.parse(req).parameters.charset || '').toLowerCase() | |||
} catch (e) { | |||
return undefined | |||
} | |||
} | |||
/** | |||
* Get the simple type checker. | |||
* | |||
* @param {string} type | |||
* @return {function} | |||
*/ | |||
function typeChecker (type) { | |||
return function checkType (req) { | |||
return Boolean(typeis(req, type)) | |||
} | |||
} |
@@ -0,0 +1,284 @@ | |||
/*! | |||
* body-parser | |||
* Copyright(c) 2014 Jonathan Ong | |||
* Copyright(c) 2014-2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var bytes = require('bytes') | |||
var contentType = require('content-type') | |||
var createError = require('http-errors') | |||
var debug = require('debug')('body-parser:urlencoded') | |||
var deprecate = require('depd')('body-parser') | |||
var read = require('../read') | |||
var typeis = require('type-is') | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = urlencoded | |||
/** | |||
* Cache of parser modules. | |||
*/ | |||
var parsers = Object.create(null) | |||
/** | |||
* Create a middleware to parse urlencoded bodies. | |||
* | |||
* @param {object} [options] | |||
* @return {function} | |||
* @public | |||
*/ | |||
function urlencoded (options) { | |||
var opts = options || {} | |||
// notice because option default will flip in next major | |||
if (opts.extended === undefined) { | |||
deprecate('undefined extended: provide extended option') | |||
} | |||
var extended = opts.extended !== false | |||
var inflate = opts.inflate !== false | |||
var limit = typeof opts.limit !== 'number' | |||
? bytes.parse(opts.limit || '100kb') | |||
: opts.limit | |||
var type = opts.type || 'application/x-www-form-urlencoded' | |||
var verify = opts.verify || false | |||
if (verify !== false && typeof verify !== 'function') { | |||
throw new TypeError('option verify must be function') | |||
} | |||
// create the appropriate query parser | |||
var queryparse = extended | |||
? extendedparser(opts) | |||
: simpleparser(opts) | |||
// create the appropriate type checking function | |||
var shouldParse = typeof type !== 'function' | |||
? typeChecker(type) | |||
: type | |||
function parse (body) { | |||
return body.length | |||
? queryparse(body) | |||
: {} | |||
} | |||
return function urlencodedParser (req, res, next) { | |||
if (req._body) { | |||
debug('body already parsed') | |||
next() | |||
return | |||
} | |||
req.body = req.body || {} | |||
// skip requests without bodies | |||
if (!typeis.hasBody(req)) { | |||
debug('skip empty body') | |||
next() | |||
return | |||
} | |||
debug('content-type %j', req.headers['content-type']) | |||
// determine if request should be parsed | |||
if (!shouldParse(req)) { | |||
debug('skip parsing') | |||
next() | |||
return | |||
} | |||
// assert charset | |||
var charset = getCharset(req) || 'utf-8' | |||
if (charset !== 'utf-8') { | |||
debug('invalid charset') | |||
next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { | |||
charset: charset, | |||
type: 'charset.unsupported' | |||
})) | |||
return | |||
} | |||
// read | |||
read(req, res, next, parse, debug, { | |||
debug: debug, | |||
encoding: charset, | |||
inflate: inflate, | |||
limit: limit, | |||
verify: verify | |||
}) | |||
} | |||
} | |||
/** | |||
* Get the extended query parser. | |||
* | |||
* @param {object} options | |||
*/ | |||
function extendedparser (options) { | |||
var parameterLimit = options.parameterLimit !== undefined | |||
? options.parameterLimit | |||
: 1000 | |||
var parse = parser('qs') | |||
if (isNaN(parameterLimit) || parameterLimit < 1) { | |||
throw new TypeError('option parameterLimit must be a positive number') | |||
} | |||
if (isFinite(parameterLimit)) { | |||
parameterLimit = parameterLimit | 0 | |||
} | |||
return function queryparse (body) { | |||
var paramCount = parameterCount(body, parameterLimit) | |||
if (paramCount === undefined) { | |||
debug('too many parameters') | |||
throw createError(413, 'too many parameters', { | |||
type: 'parameters.too.many' | |||
}) | |||
} | |||
var arrayLimit = Math.max(100, paramCount) | |||
debug('parse extended urlencoding') | |||
return parse(body, { | |||
allowPrototypes: true, | |||
arrayLimit: arrayLimit, | |||
depth: Infinity, | |||
parameterLimit: parameterLimit | |||
}) | |||
} | |||
} | |||
/** | |||
* Get the charset of a request. | |||
* | |||
* @param {object} req | |||
* @api private | |||
*/ | |||
function getCharset (req) { | |||
try { | |||
return (contentType.parse(req).parameters.charset || '').toLowerCase() | |||
} catch (e) { | |||
return undefined | |||
} | |||
} | |||
/** | |||
* Count the number of parameters, stopping once limit reached | |||
* | |||
* @param {string} body | |||
* @param {number} limit | |||
* @api private | |||
*/ | |||
function parameterCount (body, limit) { | |||
var count = 0 | |||
var index = 0 | |||
while ((index = body.indexOf('&', index)) !== -1) { | |||
count++ | |||
index++ | |||
if (count === limit) { | |||
return undefined | |||
} | |||
} | |||
return count | |||
} | |||
/** | |||
* Get parser for module name dynamically. | |||
* | |||
* @param {string} name | |||
* @return {function} | |||
* @api private | |||
*/ | |||
function parser (name) { | |||
var mod = parsers[name] | |||
if (mod !== undefined) { | |||
return mod.parse | |||
} | |||
// this uses a switch for static require analysis | |||
switch (name) { | |||
case 'qs': | |||
mod = require('qs') | |||
break | |||
case 'querystring': | |||
mod = require('querystring') | |||
break | |||
} | |||
// store to prevent invoking require() | |||
parsers[name] = mod | |||
return mod.parse | |||
} | |||
/** | |||
* Get the simple query parser. | |||
* | |||
* @param {object} options | |||
*/ | |||
function simpleparser (options) { | |||
var parameterLimit = options.parameterLimit !== undefined | |||
? options.parameterLimit | |||
: 1000 | |||
var parse = parser('querystring') | |||
if (isNaN(parameterLimit) || parameterLimit < 1) { | |||
throw new TypeError('option parameterLimit must be a positive number') | |||
} | |||
if (isFinite(parameterLimit)) { | |||
parameterLimit = parameterLimit | 0 | |||
} | |||
return function queryparse (body) { | |||
var paramCount = parameterCount(body, parameterLimit) | |||
if (paramCount === undefined) { | |||
debug('too many parameters') | |||
throw createError(413, 'too many parameters', { | |||
type: 'parameters.too.many' | |||
}) | |||
} | |||
debug('parse urlencoding') | |||
return parse(body, undefined, undefined, {maxKeys: parameterLimit}) | |||
} | |||
} | |||
/** | |||
* Get the simple type checker. | |||
* | |||
* @param {string} type | |||
* @return {function} | |||
*/ | |||
function typeChecker (type) { | |||
return function checkType (req) { | |||
return Boolean(typeis(req, type)) | |||
} | |||
} |
@@ -0,0 +1,91 @@ | |||
{ | |||
"_from": "body-parser@1.18.3", | |||
"_id": "body-parser@1.18.3", | |||
"_inBundle": false, | |||
"_integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", | |||
"_location": "/body-parser", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "body-parser@1.18.3", | |||
"name": "body-parser", | |||
"escapedName": "body-parser", | |||
"rawSpec": "1.18.3", | |||
"saveSpec": null, | |||
"fetchSpec": "1.18.3" | |||
}, | |||
"_requiredBy": [ | |||
"/express" | |||
], | |||
"_resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", | |||
"_shasum": "5b292198ffdd553b3a0f20ded0592b956955c8b4", | |||
"_spec": "body-parser@1.18.3", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"bugs": { | |||
"url": "https://github.com/expressjs/body-parser/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"contributors": [ | |||
{ | |||
"name": "Douglas Christopher Wilson", | |||
"email": "doug@somethingdoug.com" | |||
}, | |||
{ | |||
"name": "Jonathan Ong", | |||
"email": "me@jongleberry.com", | |||
"url": "http://jongleberry.com" | |||
} | |||
], | |||
"dependencies": { | |||
"bytes": "3.0.0", | |||
"content-type": "~1.0.4", | |||
"debug": "2.6.9", | |||
"depd": "~1.1.2", | |||
"http-errors": "~1.6.3", | |||
"iconv-lite": "0.4.23", | |||
"on-finished": "~2.3.0", | |||
"qs": "6.5.2", | |||
"raw-body": "2.3.3", | |||
"type-is": "~1.6.16" | |||
}, | |||
"deprecated": false, | |||
"description": "Node.js body parsing middleware", | |||
"devDependencies": { | |||
"eslint": "4.19.1", | |||
"eslint-config-standard": "11.0.0", | |||
"eslint-plugin-import": "2.11.0", | |||
"eslint-plugin-markdown": "1.0.0-beta.6", | |||
"eslint-plugin-node": "6.0.1", | |||
"eslint-plugin-promise": "3.7.0", | |||
"eslint-plugin-standard": "3.1.0", | |||
"istanbul": "0.4.5", | |||
"methods": "1.1.2", | |||
"mocha": "2.5.3", | |||
"safe-buffer": "5.1.2", | |||
"supertest": "1.1.0" | |||
}, | |||
"engines": { | |||
"node": ">= 0.8" | |||
}, | |||
"files": [ | |||
"lib/", | |||
"LICENSE", | |||
"HISTORY.md", | |||
"index.js" | |||
], | |||
"homepage": "https://github.com/expressjs/body-parser#readme", | |||
"license": "MIT", | |||
"name": "body-parser", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/expressjs/body-parser.git" | |||
}, | |||
"scripts": { | |||
"lint": "eslint --plugin markdown --ext js,md .", | |||
"test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/", | |||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/" | |||
}, | |||
"version": "1.18.3" | |||
} |
@@ -0,0 +1,82 @@ | |||
3.0.0 / 2017-08-31 | |||
================== | |||
* Change "kB" to "KB" in format output | |||
* Remove support for Node.js 0.6 | |||
* Remove support for ComponentJS | |||
2.5.0 / 2017-03-24 | |||
================== | |||
* Add option "unit" | |||
2.4.0 / 2016-06-01 | |||
================== | |||
* Add option "unitSeparator" | |||
2.3.0 / 2016-02-15 | |||
================== | |||
* Drop partial bytes on all parsed units | |||
* Fix non-finite numbers to `.format` to return `null` | |||
* Fix parsing byte string that looks like hex | |||
* perf: hoist regular expressions | |||
2.2.0 / 2015-11-13 | |||
================== | |||
* add option "decimalPlaces" | |||
* add option "fixedDecimals" | |||
2.1.0 / 2015-05-21 | |||
================== | |||
* add `.format` export | |||
* add `.parse` export | |||
2.0.2 / 2015-05-20 | |||
================== | |||
* remove map recreation | |||
* remove unnecessary object construction | |||
2.0.1 / 2015-05-07 | |||
================== | |||
* fix browserify require | |||
* remove node.extend dependency | |||
2.0.0 / 2015-04-12 | |||
================== | |||
* add option "case" | |||
* add option "thousandsSeparator" | |||
* return "null" on invalid parse input | |||
* support proper round-trip: bytes(bytes(num)) === num | |||
* units no longer case sensitive when parsing | |||
1.0.0 / 2014-05-05 | |||
================== | |||
* add negative support. fixes #6 | |||
0.3.0 / 2014-03-19 | |||
================== | |||
* added terabyte support | |||
0.2.1 / 2013-04-01 | |||
================== | |||
* add .component | |||
0.2.0 / 2012-10-28 | |||
================== | |||
* bytes(200).should.eql('200b') | |||
0.1.0 / 2012-07-04 | |||
================== | |||
* add bytes to string conversion [yields] |
@@ -0,0 +1,23 @@ | |||
(The MIT License) | |||
Copyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca> | |||
Copyright (c) 2015 Jed Watson <jed.watson@me.com> | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,125 @@ | |||
# Bytes utility | |||
[![NPM Version][npm-image]][npm-url] | |||
[![NPM Downloads][downloads-image]][downloads-url] | |||
[![Build Status][travis-image]][travis-url] | |||
[![Test Coverage][coveralls-image]][coveralls-url] | |||
Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa. | |||
## Installation | |||
This is a [Node.js](https://nodejs.org/en/) module available through the | |||
[npm registry](https://www.npmjs.com/). Installation is done using the | |||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): | |||
```bash | |||
$ npm install bytes | |||
``` | |||
## Usage | |||
```js | |||
var bytes = require('bytes'); | |||
``` | |||
#### bytes.format(number value, [options]): string|null | |||
Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is | |||
rounded. | |||
**Arguments** | |||
| Name | Type | Description | | |||
|---------|----------|--------------------| | |||
| value | `number` | Value in bytes | | |||
| options | `Object` | Conversion options | | |||
**Options** | |||
| Property | Type | Description | | |||
|-------------------|--------|-----------------------------------------------------------------------------------------| | |||
| decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. | | |||
| fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` | | |||
| thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `.`... Default value to `''`. | | |||
| unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). | | |||
| unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. | | |||
**Returns** | |||
| Name | Type | Description | | |||
|---------|------------------|-------------------------------------------------| | |||
| results | `string`|`null` | Return null upon error. String value otherwise. | | |||
**Example** | |||
```js | |||
bytes(1024); | |||
// output: '1KB' | |||
bytes(1000); | |||
// output: '1000B' | |||
bytes(1000, {thousandsSeparator: ' '}); | |||
// output: '1 000B' | |||
bytes(1024 * 1.7, {decimalPlaces: 0}); | |||
// output: '2KB' | |||
bytes(1024, {unitSeparator: ' '}); | |||
// output: '1 KB' | |||
``` | |||
#### bytes.parse(string|number value): number|null | |||
Parse the string value into an integer in bytes. If no unit is given, or `value` | |||
is a number, it is assumed the value is in bytes. | |||
Supported units and abbreviations are as follows and are case-insensitive: | |||
* `b` for bytes | |||
* `kb` for kilobytes | |||
* `mb` for megabytes | |||
* `gb` for gigabytes | |||
* `tb` for terabytes | |||
The units are in powers of two, not ten. This means 1kb = 1024b according to this parser. | |||
**Arguments** | |||
| Name | Type | Description | | |||
|---------------|--------|--------------------| | |||
| value | `string`|`number` | String to parse, or number in bytes. | | |||
**Returns** | |||
| Name | Type | Description | | |||
|---------|-------------|-------------------------| | |||
| results | `number`|`null` | Return null upon error. Value in bytes otherwise. | | |||
**Example** | |||
```js | |||
bytes('1KB'); | |||
// output: 1024 | |||
bytes('1024'); | |||
// output: 1024 | |||
bytes(1024); | |||
// output: 1024 | |||
``` | |||
## License | |||
[MIT](LICENSE) | |||
[downloads-image]: https://img.shields.io/npm/dm/bytes.svg | |||
[downloads-url]: https://npmjs.org/package/bytes | |||
[npm-image]: https://img.shields.io/npm/v/bytes.svg | |||
[npm-url]: https://npmjs.org/package/bytes | |||
[travis-image]: https://img.shields.io/travis/visionmedia/bytes.js/master.svg | |||
[travis-url]: https://travis-ci.org/visionmedia/bytes.js | |||
[coveralls-image]: https://img.shields.io/coveralls/visionmedia/bytes.js/master.svg | |||
[coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master |
@@ -0,0 +1,159 @@ | |||
/*! | |||
* bytes | |||
* Copyright(c) 2012-2014 TJ Holowaychuk | |||
* Copyright(c) 2015 Jed Watson | |||
* MIT Licensed | |||
*/ | |||
'use strict'; | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
module.exports = bytes; | |||
module.exports.format = format; | |||
module.exports.parse = parse; | |||
/** | |||
* Module variables. | |||
* @private | |||
*/ | |||
var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g; | |||
var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/; | |||
var map = { | |||
b: 1, | |||
kb: 1 << 10, | |||
mb: 1 << 20, | |||
gb: 1 << 30, | |||
tb: ((1 << 30) * 1024) | |||
}; | |||
var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb)$/i; | |||
/** | |||
* Convert the given value in bytes into a string or parse to string to an integer in bytes. | |||
* | |||
* @param {string|number} value | |||
* @param {{ | |||
* case: [string], | |||
* decimalPlaces: [number] | |||
* fixedDecimals: [boolean] | |||
* thousandsSeparator: [string] | |||
* unitSeparator: [string] | |||
* }} [options] bytes options. | |||
* | |||
* @returns {string|number|null} | |||
*/ | |||
function bytes(value, options) { | |||
if (typeof value === 'string') { | |||
return parse(value); | |||
} | |||
if (typeof value === 'number') { | |||
return format(value, options); | |||
} | |||
return null; | |||
} | |||
/** | |||
* Format the given value in bytes into a string. | |||
* | |||
* If the value is negative, it is kept as such. If it is a float, | |||
* it is rounded. | |||
* | |||
* @param {number} value | |||
* @param {object} [options] | |||
* @param {number} [options.decimalPlaces=2] | |||
* @param {number} [options.fixedDecimals=false] | |||
* @param {string} [options.thousandsSeparator=] | |||
* @param {string} [options.unit=] | |||
* @param {string} [options.unitSeparator=] | |||
* | |||
* @returns {string|null} | |||
* @public | |||
*/ | |||
function format(value, options) { | |||
if (!Number.isFinite(value)) { | |||
return null; | |||
} | |||
var mag = Math.abs(value); | |||
var thousandsSeparator = (options && options.thousandsSeparator) || ''; | |||
var unitSeparator = (options && options.unitSeparator) || ''; | |||
var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2; | |||
var fixedDecimals = Boolean(options && options.fixedDecimals); | |||
var unit = (options && options.unit) || ''; | |||
if (!unit || !map[unit.toLowerCase()]) { | |||
if (mag >= map.tb) { | |||
unit = 'TB'; | |||
} else if (mag >= map.gb) { | |||
unit = 'GB'; | |||
} else if (mag >= map.mb) { | |||
unit = 'MB'; | |||
} else if (mag >= map.kb) { | |||
unit = 'KB'; | |||
} else { | |||
unit = 'B'; | |||
} | |||
} | |||
var val = value / map[unit.toLowerCase()]; | |||
var str = val.toFixed(decimalPlaces); | |||
if (!fixedDecimals) { | |||
str = str.replace(formatDecimalsRegExp, '$1'); | |||
} | |||
if (thousandsSeparator) { | |||
str = str.replace(formatThousandsRegExp, thousandsSeparator); | |||
} | |||
return str + unitSeparator + unit; | |||
} | |||
/** | |||
* Parse the string value into an integer in bytes. | |||
* | |||
* If no unit is given, it is assumed the value is in bytes. | |||
* | |||
* @param {number|string} val | |||
* | |||
* @returns {number|null} | |||
* @public | |||
*/ | |||
function parse(val) { | |||
if (typeof val === 'number' && !isNaN(val)) { | |||
return val; | |||
} | |||
if (typeof val !== 'string') { | |||
return null; | |||
} | |||
// Test if the string passed is valid | |||
var results = parseRegExp.exec(val); | |||
var floatValue; | |||
var unit = 'b'; | |||
if (!results) { | |||
// Nothing could be extracted from the given string | |||
floatValue = parseInt(val, 10); | |||
unit = 'b' | |||
} else { | |||
// Retrieve the value and the unit | |||
floatValue = parseFloat(results[1]); | |||
unit = results[4].toLowerCase(); | |||
} | |||
return Math.floor(map[unit] * floatValue); | |||
} |
@@ -0,0 +1,82 @@ | |||
{ | |||
"_from": "bytes@3.0.0", | |||
"_id": "bytes@3.0.0", | |||
"_inBundle": false, | |||
"_integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", | |||
"_location": "/bytes", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "bytes@3.0.0", | |||
"name": "bytes", | |||
"escapedName": "bytes", | |||
"rawSpec": "3.0.0", | |||
"saveSpec": null, | |||
"fetchSpec": "3.0.0" | |||
}, | |||
"_requiredBy": [ | |||
"/body-parser", | |||
"/raw-body" | |||
], | |||
"_resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", | |||
"_shasum": "d32815404d689699f85a4ea4fa8755dd13a96048", | |||
"_spec": "bytes@3.0.0", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/body-parser", | |||
"author": { | |||
"name": "TJ Holowaychuk", | |||
"email": "tj@vision-media.ca", | |||
"url": "http://tjholowaychuk.com" | |||
}, | |||
"bugs": { | |||
"url": "https://github.com/visionmedia/bytes.js/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"contributors": [ | |||
{ | |||
"name": "Jed Watson", | |||
"email": "jed.watson@me.com" | |||
}, | |||
{ | |||
"name": "Théo FIDRY", | |||
"email": "theo.fidry@gmail.com" | |||
} | |||
], | |||
"deprecated": false, | |||
"description": "Utility to parse a string bytes to bytes and vice-versa", | |||
"devDependencies": { | |||
"mocha": "2.5.3", | |||
"nyc": "10.3.2" | |||
}, | |||
"engines": { | |||
"node": ">= 0.8" | |||
}, | |||
"files": [ | |||
"History.md", | |||
"LICENSE", | |||
"Readme.md", | |||
"index.js" | |||
], | |||
"homepage": "https://github.com/visionmedia/bytes.js#readme", | |||
"keywords": [ | |||
"byte", | |||
"bytes", | |||
"utility", | |||
"parse", | |||
"parser", | |||
"convert", | |||
"converter" | |||
], | |||
"license": "MIT", | |||
"name": "bytes", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/visionmedia/bytes.js.git" | |||
}, | |||
"scripts": { | |||
"test": "mocha --check-leaks --reporter spec", | |||
"test-ci": "nyc --reporter=text npm test", | |||
"test-cov": "nyc --reporter=html --reporter=text npm test" | |||
}, | |||
"version": "3.0.0" | |||
} |
@@ -0,0 +1,50 @@ | |||
0.5.2 / 2016-12-08 | |||
================== | |||
* Fix `parse` to accept any linear whitespace character | |||
0.5.1 / 2016-01-17 | |||
================== | |||
* perf: enable strict mode | |||
0.5.0 / 2014-10-11 | |||
================== | |||
* Add `parse` function | |||
0.4.0 / 2014-09-21 | |||
================== | |||
* Expand non-Unicode `filename` to the full ISO-8859-1 charset | |||
0.3.0 / 2014-09-20 | |||
================== | |||
* Add `fallback` option | |||
* Add `type` option | |||
0.2.0 / 2014-09-19 | |||
================== | |||
* Reduce ambiguity of file names with hex escape in buggy browsers | |||
0.1.2 / 2014-09-19 | |||
================== | |||
* Fix periodic invalid Unicode filename header | |||
0.1.1 / 2014-09-19 | |||
================== | |||
* Fix invalid characters appearing in `filename*` parameter | |||
0.1.0 / 2014-09-18 | |||
================== | |||
* Make the `filename` argument optional | |||
0.0.0 / 2014-09-18 | |||
================== | |||
* Initial release |
@@ -0,0 +1,22 @@ | |||
(The MIT License) | |||
Copyright (c) 2014 Douglas Christopher Wilson | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,141 @@ | |||
# content-disposition | |||
[![NPM Version][npm-image]][npm-url] | |||
[![NPM Downloads][downloads-image]][downloads-url] | |||
[![Node.js Version][node-version-image]][node-version-url] | |||
[![Build Status][travis-image]][travis-url] | |||
[![Test Coverage][coveralls-image]][coveralls-url] | |||
Create and parse HTTP `Content-Disposition` header | |||
## Installation | |||
```sh | |||
$ npm install content-disposition | |||
``` | |||
## API | |||
```js | |||
var contentDisposition = require('content-disposition') | |||
``` | |||
### contentDisposition(filename, options) | |||
Create an attachment `Content-Disposition` header value using the given file name, | |||
if supplied. The `filename` is optional and if no file name is desired, but you | |||
want to specify `options`, set `filename` to `undefined`. | |||
```js | |||
res.setHeader('Content-Disposition', contentDisposition('∫ maths.pdf')) | |||
``` | |||
**note** HTTP headers are of the ISO-8859-1 character set. If you are writing this | |||
header through a means different from `setHeader` in Node.js, you'll want to specify | |||
the `'binary'` encoding in Node.js. | |||
#### Options | |||
`contentDisposition` accepts these properties in the options object. | |||
##### fallback | |||
If the `filename` option is outside ISO-8859-1, then the file name is actually | |||
stored in a supplemental field for clients that support Unicode file names and | |||
a ISO-8859-1 version of the file name is automatically generated. | |||
This specifies the ISO-8859-1 file name to override the automatic generation or | |||
disables the generation all together, defaults to `true`. | |||
- A string will specify the ISO-8859-1 file name to use in place of automatic | |||
generation. | |||
- `false` will disable including a ISO-8859-1 file name and only include the | |||
Unicode version (unless the file name is already ISO-8859-1). | |||
- `true` will enable automatic generation if the file name is outside ISO-8859-1. | |||
If the `filename` option is ISO-8859-1 and this option is specified and has a | |||
different value, then the `filename` option is encoded in the extended field | |||
and this set as the fallback field, even though they are both ISO-8859-1. | |||
##### type | |||
Specifies the disposition type, defaults to `"attachment"`. This can also be | |||
`"inline"`, or any other value (all values except inline are treated like | |||
`attachment`, but can convey additional information if both parties agree to | |||
it). The type is normalized to lower-case. | |||
### contentDisposition.parse(string) | |||
```js | |||
var disposition = contentDisposition.parse('attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'); | |||
``` | |||
Parse a `Content-Disposition` header string. This automatically handles extended | |||
("Unicode") parameters by decoding them and providing them under the standard | |||
parameter name. This will return an object with the following properties (examples | |||
are shown for the string `'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'`): | |||
- `type`: The disposition type (always lower case). Example: `'attachment'` | |||
- `parameters`: An object of the parameters in the disposition (name of parameter | |||
always lower case and extended versions replace non-extended versions). Example: | |||
`{filename: "€ rates.txt"}` | |||
## Examples | |||
### Send a file for download | |||
```js | |||
var contentDisposition = require('content-disposition') | |||
var destroy = require('destroy') | |||
var http = require('http') | |||
var onFinished = require('on-finished') | |||
var filePath = '/path/to/public/plans.pdf' | |||
http.createServer(function onRequest(req, res) { | |||
// set headers | |||
res.setHeader('Content-Type', 'application/pdf') | |||
res.setHeader('Content-Disposition', contentDisposition(filePath)) | |||
// send file | |||
var stream = fs.createReadStream(filePath) | |||
stream.pipe(res) | |||
onFinished(res, function (err) { | |||
destroy(stream) | |||
}) | |||
}) | |||
``` | |||
## Testing | |||
```sh | |||
$ npm test | |||
``` | |||
## References | |||
- [RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1][rfc-2616] | |||
- [RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters][rfc-5987] | |||
- [RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)][rfc-6266] | |||
- [Test Cases for HTTP Content-Disposition header field (RFC 6266) and the Encodings defined in RFCs 2047, 2231 and 5987][tc-2231] | |||
[rfc-2616]: https://tools.ietf.org/html/rfc2616 | |||
[rfc-5987]: https://tools.ietf.org/html/rfc5987 | |||
[rfc-6266]: https://tools.ietf.org/html/rfc6266 | |||
[tc-2231]: http://greenbytes.de/tech/tc2231/ | |||
## License | |||
[MIT](LICENSE) | |||
[npm-image]: https://img.shields.io/npm/v/content-disposition.svg?style=flat | |||
[npm-url]: https://npmjs.org/package/content-disposition | |||
[node-version-image]: https://img.shields.io/node/v/content-disposition.svg?style=flat | |||
[node-version-url]: https://nodejs.org/en/download | |||
[travis-image]: https://img.shields.io/travis/jshttp/content-disposition.svg?style=flat | |||
[travis-url]: https://travis-ci.org/jshttp/content-disposition | |||
[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-disposition.svg?style=flat | |||
[coveralls-url]: https://coveralls.io/r/jshttp/content-disposition?branch=master | |||
[downloads-image]: https://img.shields.io/npm/dm/content-disposition.svg?style=flat | |||
[downloads-url]: https://npmjs.org/package/content-disposition |
@@ -0,0 +1,445 @@ | |||
/*! | |||
* content-disposition | |||
* Copyright(c) 2014 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = contentDisposition | |||
module.exports.parse = parse | |||
/** | |||
* Module dependencies. | |||
*/ | |||
var basename = require('path').basename | |||
/** | |||
* RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%") | |||
*/ | |||
var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g // eslint-disable-line no-control-regex | |||
/** | |||
* RegExp to match percent encoding escape. | |||
*/ | |||
var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/ | |||
var HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g | |||
/** | |||
* RegExp to match non-latin1 characters. | |||
*/ | |||
var NON_LATIN1_REGEXP = /[^\x20-\x7e\xa0-\xff]/g | |||
/** | |||
* RegExp to match quoted-pair in RFC 2616 | |||
* | |||
* quoted-pair = "\" CHAR | |||
* CHAR = <any US-ASCII character (octets 0 - 127)> | |||
*/ | |||
var QESC_REGEXP = /\\([\u0000-\u007f])/g | |||
/** | |||
* RegExp to match chars that must be quoted-pair in RFC 2616 | |||
*/ | |||
var QUOTE_REGEXP = /([\\"])/g | |||
/** | |||
* RegExp for various RFC 2616 grammar | |||
* | |||
* parameter = token "=" ( token | quoted-string ) | |||
* token = 1*<any CHAR except CTLs or separators> | |||
* separators = "(" | ")" | "<" | ">" | "@" | |||
* | "," | ";" | ":" | "\" | <"> | |||
* | "/" | "[" | "]" | "?" | "=" | |||
* | "{" | "}" | SP | HT | |||
* quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) | |||
* qdtext = <any TEXT except <">> | |||
* quoted-pair = "\" CHAR | |||
* CHAR = <any US-ASCII character (octets 0 - 127)> | |||
* TEXT = <any OCTET except CTLs, but including LWS> | |||
* LWS = [CRLF] 1*( SP | HT ) | |||
* CRLF = CR LF | |||
* CR = <US-ASCII CR, carriage return (13)> | |||
* LF = <US-ASCII LF, linefeed (10)> | |||
* SP = <US-ASCII SP, space (32)> | |||
* HT = <US-ASCII HT, horizontal-tab (9)> | |||
* CTL = <any US-ASCII control character (octets 0 - 31) and DEL (127)> | |||
* OCTET = <any 8-bit sequence of data> | |||
*/ | |||
var PARAM_REGEXP = /;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g // eslint-disable-line no-control-regex | |||
var TEXT_REGEXP = /^[\x20-\x7e\x80-\xff]+$/ | |||
var TOKEN_REGEXP = /^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/ | |||
/** | |||
* RegExp for various RFC 5987 grammar | |||
* | |||
* ext-value = charset "'" [ language ] "'" value-chars | |||
* charset = "UTF-8" / "ISO-8859-1" / mime-charset | |||
* mime-charset = 1*mime-charsetc | |||
* mime-charsetc = ALPHA / DIGIT | |||
* / "!" / "#" / "$" / "%" / "&" | |||
* / "+" / "-" / "^" / "_" / "`" | |||
* / "{" / "}" / "~" | |||
* language = ( 2*3ALPHA [ extlang ] ) | |||
* / 4ALPHA | |||
* / 5*8ALPHA | |||
* extlang = *3( "-" 3ALPHA ) | |||
* value-chars = *( pct-encoded / attr-char ) | |||
* pct-encoded = "%" HEXDIG HEXDIG | |||
* attr-char = ALPHA / DIGIT | |||
* / "!" / "#" / "$" / "&" / "+" / "-" / "." | |||
* / "^" / "_" / "`" / "|" / "~" | |||
*/ | |||
var EXT_VALUE_REGEXP = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/ | |||
/** | |||
* RegExp for various RFC 6266 grammar | |||
* | |||
* disposition-type = "inline" | "attachment" | disp-ext-type | |||
* disp-ext-type = token | |||
* disposition-parm = filename-parm | disp-ext-parm | |||
* filename-parm = "filename" "=" value | |||
* | "filename*" "=" ext-value | |||
* disp-ext-parm = token "=" value | |||
* | ext-token "=" ext-value | |||
* ext-token = <the characters in token, followed by "*"> | |||
*/ | |||
var DISPOSITION_TYPE_REGEXP = /^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/ // eslint-disable-line no-control-regex | |||
/** | |||
* Create an attachment Content-Disposition header. | |||
* | |||
* @param {string} [filename] | |||
* @param {object} [options] | |||
* @param {string} [options.type=attachment] | |||
* @param {string|boolean} [options.fallback=true] | |||
* @return {string} | |||
* @api public | |||
*/ | |||
function contentDisposition (filename, options) { | |||
var opts = options || {} | |||
// get type | |||
var type = opts.type || 'attachment' | |||
// get parameters | |||
var params = createparams(filename, opts.fallback) | |||
// format into string | |||
return format(new ContentDisposition(type, params)) | |||
} | |||
/** | |||
* Create parameters object from filename and fallback. | |||
* | |||
* @param {string} [filename] | |||
* @param {string|boolean} [fallback=true] | |||
* @return {object} | |||
* @api private | |||
*/ | |||
function createparams (filename, fallback) { | |||
if (filename === undefined) { | |||
return | |||
} | |||
var params = {} | |||
if (typeof filename !== 'string') { | |||
throw new TypeError('filename must be a string') | |||
} | |||
// fallback defaults to true | |||
if (fallback === undefined) { | |||
fallback = true | |||
} | |||
if (typeof fallback !== 'string' && typeof fallback !== 'boolean') { | |||
throw new TypeError('fallback must be a string or boolean') | |||
} | |||
if (typeof fallback === 'string' && NON_LATIN1_REGEXP.test(fallback)) { | |||
throw new TypeError('fallback must be ISO-8859-1 string') | |||
} | |||
// restrict to file base name | |||
var name = basename(filename) | |||
// determine if name is suitable for quoted string | |||
var isQuotedString = TEXT_REGEXP.test(name) | |||
// generate fallback name | |||
var fallbackName = typeof fallback !== 'string' | |||
? fallback && getlatin1(name) | |||
: basename(fallback) | |||
var hasFallback = typeof fallbackName === 'string' && fallbackName !== name | |||
// set extended filename parameter | |||
if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) { | |||
params['filename*'] = name | |||
} | |||
// set filename parameter | |||
if (isQuotedString || hasFallback) { | |||
params.filename = hasFallback | |||
? fallbackName | |||
: name | |||
} | |||
return params | |||
} | |||
/** | |||
* Format object to Content-Disposition header. | |||
* | |||
* @param {object} obj | |||
* @param {string} obj.type | |||
* @param {object} [obj.parameters] | |||
* @return {string} | |||
* @api private | |||
*/ | |||
function format (obj) { | |||
var parameters = obj.parameters | |||
var type = obj.type | |||
if (!type || typeof type !== 'string' || !TOKEN_REGEXP.test(type)) { | |||
throw new TypeError('invalid type') | |||
} | |||
// start with normalized type | |||
var string = String(type).toLowerCase() | |||
// append parameters | |||
if (parameters && typeof parameters === 'object') { | |||
var param | |||
var params = Object.keys(parameters).sort() | |||
for (var i = 0; i < params.length; i++) { | |||
param = params[i] | |||
var val = param.substr(-1) === '*' | |||
? ustring(parameters[param]) | |||
: qstring(parameters[param]) | |||
string += '; ' + param + '=' + val | |||
} | |||
} | |||
return string | |||
} | |||
/** | |||
* Decode a RFC 6987 field value (gracefully). | |||
* | |||
* @param {string} str | |||
* @return {string} | |||
* @api private | |||
*/ | |||
function decodefield (str) { | |||
var match = EXT_VALUE_REGEXP.exec(str) | |||
if (!match) { | |||
throw new TypeError('invalid extended field value') | |||
} | |||
var charset = match[1].toLowerCase() | |||
var encoded = match[2] | |||
var value | |||
// to binary string | |||
var binary = encoded.replace(HEX_ESCAPE_REPLACE_REGEXP, pdecode) | |||
switch (charset) { | |||
case 'iso-8859-1': | |||
value = getlatin1(binary) | |||
break | |||
case 'utf-8': | |||
value = new Buffer(binary, 'binary').toString('utf8') | |||
break | |||
default: | |||
throw new TypeError('unsupported charset in extended field') | |||
} | |||
return value | |||
} | |||
/** | |||
* Get ISO-8859-1 version of string. | |||
* | |||
* @param {string} val | |||
* @return {string} | |||
* @api private | |||
*/ | |||
function getlatin1 (val) { | |||
// simple Unicode -> ISO-8859-1 transformation | |||
return String(val).replace(NON_LATIN1_REGEXP, '?') | |||
} | |||
/** | |||
* Parse Content-Disposition header string. | |||
* | |||
* @param {string} string | |||
* @return {object} | |||
* @api private | |||
*/ | |||
function parse (string) { | |||
if (!string || typeof string !== 'string') { | |||
throw new TypeError('argument string is required') | |||
} | |||
var match = DISPOSITION_TYPE_REGEXP.exec(string) | |||
if (!match) { | |||
throw new TypeError('invalid type format') | |||
} | |||
// normalize type | |||
var index = match[0].length | |||
var type = match[1].toLowerCase() | |||
var key | |||
var names = [] | |||
var params = {} | |||
var value | |||
// calculate index to start at | |||
index = PARAM_REGEXP.lastIndex = match[0].substr(-1) === ';' | |||
? index - 1 | |||
: index | |||
// match parameters | |||
while ((match = PARAM_REGEXP.exec(string))) { | |||
if (match.index !== index) { | |||
throw new TypeError('invalid parameter format') | |||
} | |||
index += match[0].length | |||
key = match[1].toLowerCase() | |||
value = match[2] | |||
if (names.indexOf(key) !== -1) { | |||
throw new TypeError('invalid duplicate parameter') | |||
} | |||
names.push(key) | |||
if (key.indexOf('*') + 1 === key.length) { | |||
// decode extended value | |||
key = key.slice(0, -1) | |||
value = decodefield(value) | |||
// overwrite existing value | |||
params[key] = value | |||
continue | |||
} | |||
if (typeof params[key] === 'string') { | |||
continue | |||
} | |||
if (value[0] === '"') { | |||
// remove quotes and escapes | |||
value = value | |||
.substr(1, value.length - 2) | |||
.replace(QESC_REGEXP, '$1') | |||
} | |||
params[key] = value | |||
} | |||
if (index !== -1 && index !== string.length) { | |||
throw new TypeError('invalid parameter format') | |||
} | |||
return new ContentDisposition(type, params) | |||
} | |||
/** | |||
* Percent decode a single character. | |||
* | |||
* @param {string} str | |||
* @param {string} hex | |||
* @return {string} | |||
* @api private | |||
*/ | |||
function pdecode (str, hex) { | |||
return String.fromCharCode(parseInt(hex, 16)) | |||
} | |||
/** | |||
* Percent encode a single character. | |||
* | |||
* @param {string} char | |||
* @return {string} | |||
* @api private | |||
*/ | |||
function pencode (char) { | |||
var hex = String(char) | |||
.charCodeAt(0) | |||
.toString(16) | |||
.toUpperCase() | |||
return hex.length === 1 | |||
? '%0' + hex | |||
: '%' + hex | |||
} | |||
/** | |||
* Quote a string for HTTP. | |||
* | |||
* @param {string} val | |||
* @return {string} | |||
* @api private | |||
*/ | |||
function qstring (val) { | |||
var str = String(val) | |||
return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' | |||
} | |||
/** | |||
* Encode a Unicode string for HTTP (RFC 5987). | |||
* | |||
* @param {string} val | |||
* @return {string} | |||
* @api private | |||
*/ | |||
function ustring (val) { | |||
var str = String(val) | |||
// percent encode as UTF-8 | |||
var encoded = encodeURIComponent(str) | |||
.replace(ENCODE_URL_ATTR_CHAR_REGEXP, pencode) | |||
return 'UTF-8\'\'' + encoded | |||
} | |||
/** | |||
* Class for parsed Content-Disposition header for v8 optimization | |||
*/ | |||
function ContentDisposition (type, parameters) { | |||
this.type = type | |||
this.parameters = parameters | |||
} |
@@ -0,0 +1,74 @@ | |||
{ | |||
"_from": "content-disposition@0.5.2", | |||
"_id": "content-disposition@0.5.2", | |||
"_inBundle": false, | |||
"_integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", | |||
"_location": "/content-disposition", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "content-disposition@0.5.2", | |||
"name": "content-disposition", | |||
"escapedName": "content-disposition", | |||
"rawSpec": "0.5.2", | |||
"saveSpec": null, | |||
"fetchSpec": "0.5.2" | |||
}, | |||
"_requiredBy": [ | |||
"/express" | |||
], | |||
"_resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", | |||
"_shasum": "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4", | |||
"_spec": "content-disposition@0.5.2", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"bugs": { | |||
"url": "https://github.com/jshttp/content-disposition/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"contributors": [ | |||
{ | |||
"name": "Douglas Christopher Wilson", | |||
"email": "doug@somethingdoug.com" | |||
} | |||
], | |||
"deprecated": false, | |||
"description": "Create and parse Content-Disposition header", | |||
"devDependencies": { | |||
"eslint": "3.11.1", | |||
"eslint-config-standard": "6.2.1", | |||
"eslint-plugin-promise": "3.3.0", | |||
"eslint-plugin-standard": "2.0.1", | |||
"istanbul": "0.4.5", | |||
"mocha": "1.21.5" | |||
}, | |||
"engines": { | |||
"node": ">= 0.6" | |||
}, | |||
"files": [ | |||
"LICENSE", | |||
"HISTORY.md", | |||
"README.md", | |||
"index.js" | |||
], | |||
"homepage": "https://github.com/jshttp/content-disposition#readme", | |||
"keywords": [ | |||
"content-disposition", | |||
"http", | |||
"rfc6266", | |||
"res" | |||
], | |||
"license": "MIT", | |||
"name": "content-disposition", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/jshttp/content-disposition.git" | |||
}, | |||
"scripts": { | |||
"lint": "eslint .", | |||
"test": "mocha --reporter spec --bail --check-leaks test/", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", | |||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" | |||
}, | |||
"version": "0.5.2" | |||
} |
@@ -0,0 +1,24 @@ | |||
1.0.4 / 2017-09-11 | |||
================== | |||
* perf: skip parameter parsing when no parameters | |||
1.0.3 / 2017-09-10 | |||
================== | |||
* perf: remove argument reassignment | |||
1.0.2 / 2016-05-09 | |||
================== | |||
* perf: enable strict mode | |||
1.0.1 / 2015-02-13 | |||
================== | |||
* Improve missing `Content-Type` header error message | |||
1.0.0 / 2015-02-01 | |||
================== | |||
* Initial implementation, derived from `media-typer@0.3.0` |
@@ -0,0 +1,22 @@ | |||
(The MIT License) | |||
Copyright (c) 2015 Douglas Christopher Wilson | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,92 @@ | |||
# content-type | |||
[![NPM Version][npm-image]][npm-url] | |||
[![NPM Downloads][downloads-image]][downloads-url] | |||
[![Node.js Version][node-version-image]][node-version-url] | |||
[![Build Status][travis-image]][travis-url] | |||
[![Test Coverage][coveralls-image]][coveralls-url] | |||
Create and parse HTTP Content-Type header according to RFC 7231 | |||
## Installation | |||
```sh | |||
$ npm install content-type | |||
``` | |||
## API | |||
```js | |||
var contentType = require('content-type') | |||
``` | |||
### contentType.parse(string) | |||
```js | |||
var obj = contentType.parse('image/svg+xml; charset=utf-8') | |||
``` | |||
Parse a content type string. This will return an object with the following | |||
properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): | |||
- `type`: The media type (the type and subtype, always lower case). | |||
Example: `'image/svg+xml'` | |||
- `parameters`: An object of the parameters in the media type (name of parameter | |||
always lower case). Example: `{charset: 'utf-8'}` | |||
Throws a `TypeError` if the string is missing or invalid. | |||
### contentType.parse(req) | |||
```js | |||
var obj = contentType.parse(req) | |||
``` | |||
Parse the `content-type` header from the given `req`. Short-cut for | |||
`contentType.parse(req.headers['content-type'])`. | |||
Throws a `TypeError` if the `Content-Type` header is missing or invalid. | |||
### contentType.parse(res) | |||
```js | |||
var obj = contentType.parse(res) | |||
``` | |||
Parse the `content-type` header set on the given `res`. Short-cut for | |||
`contentType.parse(res.getHeader('content-type'))`. | |||
Throws a `TypeError` if the `Content-Type` header is missing or invalid. | |||
### contentType.format(obj) | |||
```js | |||
var str = contentType.format({type: 'image/svg+xml'}) | |||
``` | |||
Format an object into a content type string. This will return a string of the | |||
content type for the given object with the following properties (examples are | |||
shown that produce the string `'image/svg+xml; charset=utf-8'`): | |||
- `type`: The media type (will be lower-cased). Example: `'image/svg+xml'` | |||
- `parameters`: An object of the parameters in the media type (name of the | |||
parameter will be lower-cased). Example: `{charset: 'utf-8'}` | |||
Throws a `TypeError` if the object contains an invalid type or parameter names. | |||
## License | |||
[MIT](LICENSE) | |||
[npm-image]: https://img.shields.io/npm/v/content-type.svg | |||
[npm-url]: https://npmjs.org/package/content-type | |||
[node-version-image]: https://img.shields.io/node/v/content-type.svg | |||
[node-version-url]: http://nodejs.org/download/ | |||
[travis-image]: https://img.shields.io/travis/jshttp/content-type/master.svg | |||
[travis-url]: https://travis-ci.org/jshttp/content-type | |||
[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-type/master.svg | |||
[coveralls-url]: https://coveralls.io/r/jshttp/content-type | |||
[downloads-image]: https://img.shields.io/npm/dm/content-type.svg | |||
[downloads-url]: https://npmjs.org/package/content-type |
@@ -0,0 +1,222 @@ | |||
/*! | |||
* content-type | |||
* Copyright(c) 2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1 | |||
* | |||
* parameter = token "=" ( token / quoted-string ) | |||
* token = 1*tchar | |||
* tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" | |||
* / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" | |||
* / DIGIT / ALPHA | |||
* ; any VCHAR, except delimiters | |||
* quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE | |||
* qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text | |||
* obs-text = %x80-FF | |||
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) | |||
*/ | |||
var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g | |||
var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ | |||
var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ | |||
/** | |||
* RegExp to match quoted-pair in RFC 7230 sec 3.2.6 | |||
* | |||
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) | |||
* obs-text = %x80-FF | |||
*/ | |||
var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g | |||
/** | |||
* RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6 | |||
*/ | |||
var QUOTE_REGEXP = /([\\"])/g | |||
/** | |||
* RegExp to match type in RFC 7231 sec 3.1.1.1 | |||
* | |||
* media-type = type "/" subtype | |||
* type = token | |||
* subtype = token | |||
*/ | |||
var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
exports.format = format | |||
exports.parse = parse | |||
/** | |||
* Format object to media type. | |||
* | |||
* @param {object} obj | |||
* @return {string} | |||
* @public | |||
*/ | |||
function format (obj) { | |||
if (!obj || typeof obj !== 'object') { | |||
throw new TypeError('argument obj is required') | |||
} | |||
var parameters = obj.parameters | |||
var type = obj.type | |||
if (!type || !TYPE_REGEXP.test(type)) { | |||
throw new TypeError('invalid type') | |||
} | |||
var string = type | |||
// append parameters | |||
if (parameters && typeof parameters === 'object') { | |||
var param | |||
var params = Object.keys(parameters).sort() | |||
for (var i = 0; i < params.length; i++) { | |||
param = params[i] | |||
if (!TOKEN_REGEXP.test(param)) { | |||
throw new TypeError('invalid parameter name') | |||
} | |||
string += '; ' + param + '=' + qstring(parameters[param]) | |||
} | |||
} | |||
return string | |||
} | |||
/** | |||
* Parse media type to object. | |||
* | |||
* @param {string|object} string | |||
* @return {Object} | |||
* @public | |||
*/ | |||
function parse (string) { | |||
if (!string) { | |||
throw new TypeError('argument string is required') | |||
} | |||
// support req/res-like objects as argument | |||
var header = typeof string === 'object' | |||
? getcontenttype(string) | |||
: string | |||
if (typeof header !== 'string') { | |||
throw new TypeError('argument string is required to be a string') | |||
} | |||
var index = header.indexOf(';') | |||
var type = index !== -1 | |||
? header.substr(0, index).trim() | |||
: header.trim() | |||
if (!TYPE_REGEXP.test(type)) { | |||
throw new TypeError('invalid media type') | |||
} | |||
var obj = new ContentType(type.toLowerCase()) | |||
// parse parameters | |||
if (index !== -1) { | |||
var key | |||
var match | |||
var value | |||
PARAM_REGEXP.lastIndex = index | |||
while ((match = PARAM_REGEXP.exec(header))) { | |||
if (match.index !== index) { | |||
throw new TypeError('invalid parameter format') | |||
} | |||
index += match[0].length | |||
key = match[1].toLowerCase() | |||
value = match[2] | |||
if (value[0] === '"') { | |||
// remove quotes and escapes | |||
value = value | |||
.substr(1, value.length - 2) | |||
.replace(QESC_REGEXP, '$1') | |||
} | |||
obj.parameters[key] = value | |||
} | |||
if (index !== header.length) { | |||
throw new TypeError('invalid parameter format') | |||
} | |||
} | |||
return obj | |||
} | |||
/** | |||
* Get content-type from req/res objects. | |||
* | |||
* @param {object} | |||
* @return {Object} | |||
* @private | |||
*/ | |||
function getcontenttype (obj) { | |||
var header | |||
if (typeof obj.getHeader === 'function') { | |||
// res-like | |||
header = obj.getHeader('content-type') | |||
} else if (typeof obj.headers === 'object') { | |||
// req-like | |||
header = obj.headers && obj.headers['content-type'] | |||
} | |||
if (typeof header !== 'string') { | |||
throw new TypeError('content-type header is missing from object') | |||
} | |||
return header | |||
} | |||
/** | |||
* Quote a string if necessary. | |||
* | |||
* @param {string} val | |||
* @return {string} | |||
* @private | |||
*/ | |||
function qstring (val) { | |||
var str = String(val) | |||
// no need to quote tokens | |||
if (TOKEN_REGEXP.test(str)) { | |||
return str | |||
} | |||
if (str.length > 0 && !TEXT_REGEXP.test(str)) { | |||
throw new TypeError('invalid parameter value') | |||
} | |||
return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' | |||
} | |||
/** | |||
* Class to represent a content type. | |||
* @private | |||
*/ | |||
function ContentType (type) { | |||
this.parameters = Object.create(null) | |||
this.type = type | |||
} |
@@ -0,0 +1,76 @@ | |||
{ | |||
"_from": "content-type@~1.0.4", | |||
"_id": "content-type@1.0.4", | |||
"_inBundle": false, | |||
"_integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", | |||
"_location": "/content-type", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "range", | |||
"registry": true, | |||
"raw": "content-type@~1.0.4", | |||
"name": "content-type", | |||
"escapedName": "content-type", | |||
"rawSpec": "~1.0.4", | |||
"saveSpec": null, | |||
"fetchSpec": "~1.0.4" | |||
}, | |||
"_requiredBy": [ | |||
"/body-parser", | |||
"/express" | |||
], | |||
"_resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", | |||
"_shasum": "e138cc75e040c727b1966fe5e5f8c9aee256fe3b", | |||
"_spec": "content-type@~1.0.4", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"author": { | |||
"name": "Douglas Christopher Wilson", | |||
"email": "doug@somethingdoug.com" | |||
}, | |||
"bugs": { | |||
"url": "https://github.com/jshttp/content-type/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"deprecated": false, | |||
"description": "Create and parse HTTP Content-Type header", | |||
"devDependencies": { | |||
"eslint": "3.19.0", | |||
"eslint-config-standard": "10.2.1", | |||
"eslint-plugin-import": "2.7.0", | |||
"eslint-plugin-node": "5.1.1", | |||
"eslint-plugin-promise": "3.5.0", | |||
"eslint-plugin-standard": "3.0.1", | |||
"istanbul": "0.4.5", | |||
"mocha": "~1.21.5" | |||
}, | |||
"engines": { | |||
"node": ">= 0.6" | |||
}, | |||
"files": [ | |||
"LICENSE", | |||
"HISTORY.md", | |||
"README.md", | |||
"index.js" | |||
], | |||
"homepage": "https://github.com/jshttp/content-type#readme", | |||
"keywords": [ | |||
"content-type", | |||
"http", | |||
"req", | |||
"res", | |||
"rfc7231" | |||
], | |||
"license": "MIT", | |||
"name": "content-type", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/jshttp/content-type.git" | |||
}, | |||
"scripts": { | |||
"lint": "eslint .", | |||
"test": "mocha --reporter spec --check-leaks --bail test/", | |||
"test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" | |||
}, | |||
"version": "1.0.4" | |||
} |
@@ -0,0 +1,4 @@ | |||
support | |||
test | |||
examples | |||
*.sock |
@@ -0,0 +1,38 @@ | |||
1.0.6 / 2015-02-03 | |||
================== | |||
* use `npm test` instead of `make test` to run tests | |||
* clearer assertion messages when checking input | |||
1.0.5 / 2014-09-05 | |||
================== | |||
* add license to package.json | |||
1.0.4 / 2014-06-25 | |||
================== | |||
* corrected avoidance of timing attacks (thanks @tenbits!) | |||
1.0.3 / 2014-01-28 | |||
================== | |||
* [incorrect] fix for timing attacks | |||
1.0.2 / 2014-01-28 | |||
================== | |||
* fix missing repository warning | |||
* fix typo in test | |||
1.0.1 / 2013-04-15 | |||
================== | |||
* Revert "Changed underlying HMAC algo. to sha512." | |||
* Revert "Fix for timing attacks on MAC verification." | |||
0.0.1 / 2010-01-03 | |||
================== | |||
* Initial release |
@@ -0,0 +1,42 @@ | |||
# cookie-signature | |||
Sign and unsign cookies. | |||
## Example | |||
```js | |||
var cookie = require('cookie-signature'); | |||
var val = cookie.sign('hello', 'tobiiscool'); | |||
val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); | |||
var val = cookie.sign('hello', 'tobiiscool'); | |||
cookie.unsign(val, 'tobiiscool').should.equal('hello'); | |||
cookie.unsign(val, 'luna').should.be.false; | |||
``` | |||
## License | |||
(The MIT License) | |||
Copyright (c) 2012 LearnBoost <tj@learnboost.com> | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,51 @@ | |||
/** | |||
* Module dependencies. | |||
*/ | |||
var crypto = require('crypto'); | |||
/** | |||
* Sign the given `val` with `secret`. | |||
* | |||
* @param {String} val | |||
* @param {String} secret | |||
* @return {String} | |||
* @api private | |||
*/ | |||
exports.sign = function(val, secret){ | |||
if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string."); | |||
if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); | |||
return val + '.' + crypto | |||
.createHmac('sha256', secret) | |||
.update(val) | |||
.digest('base64') | |||
.replace(/\=+$/, ''); | |||
}; | |||
/** | |||
* Unsign and decode the given `val` with `secret`, | |||
* returning `false` if the signature is invalid. | |||
* | |||
* @param {String} val | |||
* @param {String} secret | |||
* @return {String|Boolean} | |||
* @api private | |||
*/ | |||
exports.unsign = function(val, secret){ | |||
if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided."); | |||
if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); | |||
var str = val.slice(0, val.lastIndexOf('.')) | |||
, mac = exports.sign(str, secret); | |||
return sha1(mac) == sha1(val) ? str : false; | |||
}; | |||
/** | |||
* Private | |||
*/ | |||
function sha1(str){ | |||
return crypto.createHash('sha1').update(str).digest('hex'); | |||
} |
@@ -0,0 +1,57 @@ | |||
{ | |||
"_from": "cookie-signature@1.0.6", | |||
"_id": "cookie-signature@1.0.6", | |||
"_inBundle": false, | |||
"_integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", | |||
"_location": "/cookie-signature", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "cookie-signature@1.0.6", | |||
"name": "cookie-signature", | |||
"escapedName": "cookie-signature", | |||
"rawSpec": "1.0.6", | |||
"saveSpec": null, | |||
"fetchSpec": "1.0.6" | |||
}, | |||
"_requiredBy": [ | |||
"/express" | |||
], | |||
"_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", | |||
"_shasum": "e303a882b342cc3ee8ca513a79999734dab3ae2c", | |||
"_spec": "cookie-signature@1.0.6", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"author": { | |||
"name": "TJ Holowaychuk", | |||
"email": "tj@learnboost.com" | |||
}, | |||
"bugs": { | |||
"url": "https://github.com/visionmedia/node-cookie-signature/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"dependencies": {}, | |||
"deprecated": false, | |||
"description": "Sign and unsign cookies", | |||
"devDependencies": { | |||
"mocha": "*", | |||
"should": "*" | |||
}, | |||
"homepage": "https://github.com/visionmedia/node-cookie-signature#readme", | |||
"keywords": [ | |||
"cookie", | |||
"sign", | |||
"unsign" | |||
], | |||
"license": "MIT", | |||
"main": "index", | |||
"name": "cookie-signature", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/visionmedia/node-cookie-signature.git" | |||
}, | |||
"scripts": { | |||
"test": "mocha --require should --reporter spec" | |||
}, | |||
"version": "1.0.6" | |||
} |
@@ -0,0 +1,118 @@ | |||
0.3.1 / 2016-05-26 | |||
================== | |||
* Fix `sameSite: true` to work with draft-7 clients | |||
- `true` now sends `SameSite=Strict` instead of `SameSite` | |||
0.3.0 / 2016-05-26 | |||
================== | |||
* Add `sameSite` option | |||
- Replaces `firstPartyOnly` option, never implemented by browsers | |||
* Improve error message when `encode` is not a function | |||
* Improve error message when `expires` is not a `Date` | |||
0.2.4 / 2016-05-20 | |||
================== | |||
* perf: enable strict mode | |||
* perf: use for loop in parse | |||
* perf: use string concatination for serialization | |||
0.2.3 / 2015-10-25 | |||
================== | |||
* Fix cookie `Max-Age` to never be a floating point number | |||
0.2.2 / 2015-09-17 | |||
================== | |||
* Fix regression when setting empty cookie value | |||
- Ease the new restriction, which is just basic header-level validation | |||
* Fix typo in invalid value errors | |||
0.2.1 / 2015-09-17 | |||
================== | |||
* Throw on invalid values provided to `serialize` | |||
- Ensures the resulting string is a valid HTTP header value | |||
0.2.0 / 2015-08-13 | |||
================== | |||
* Add `firstPartyOnly` option | |||
* Throw better error for invalid argument to parse | |||
* perf: hoist regular expression | |||
0.1.5 / 2015-09-17 | |||
================== | |||
* Fix regression when setting empty cookie value | |||
- Ease the new restriction, which is just basic header-level validation | |||
* Fix typo in invalid value errors | |||
0.1.4 / 2015-09-17 | |||
================== | |||
* Throw better error for invalid argument to parse | |||
* Throw on invalid values provided to `serialize` | |||
- Ensures the resulting string is a valid HTTP header value | |||
0.1.3 / 2015-05-19 | |||
================== | |||
* Reduce the scope of try-catch deopt | |||
* Remove argument reassignments | |||
0.1.2 / 2014-04-16 | |||
================== | |||
* Remove unnecessary files from npm package | |||
0.1.1 / 2014-02-23 | |||
================== | |||
* Fix bad parse when cookie value contained a comma | |||
* Fix support for `maxAge` of `0` | |||
0.1.0 / 2013-05-01 | |||
================== | |||
* Add `decode` option | |||
* Add `encode` option | |||
0.0.6 / 2013-04-08 | |||
================== | |||
* Ignore cookie parts missing `=` | |||
0.0.5 / 2012-10-29 | |||
================== | |||
* Return raw cookie value if value unescape errors | |||
0.0.4 / 2012-06-21 | |||
================== | |||
* Use encode/decodeURIComponent for cookie encoding/decoding | |||
- Improve server/client interoperability | |||
0.0.3 / 2012-06-06 | |||
================== | |||
* Only escape special characters per the cookie RFC | |||
0.0.2 / 2012-06-01 | |||
================== | |||
* Fix `maxAge` option to not throw error | |||
0.0.1 / 2012-05-28 | |||
================== | |||
* Add more tests | |||
0.0.0 / 2012-05-28 | |||
================== | |||
* Initial release |
@@ -0,0 +1,24 @@ | |||
(The MIT License) | |||
Copyright (c) 2012-2014 Roman Shtylman <shtylman@gmail.com> | |||
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com> | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
@@ -0,0 +1,220 @@ | |||
# cookie | |||
[![NPM Version][npm-image]][npm-url] | |||
[![NPM Downloads][downloads-image]][downloads-url] | |||
[![Node.js Version][node-version-image]][node-version-url] | |||
[![Build Status][travis-image]][travis-url] | |||
[![Test Coverage][coveralls-image]][coveralls-url] | |||
Basic HTTP cookie parser and serializer for HTTP servers. | |||
## Installation | |||
```sh | |||
$ npm install cookie | |||
``` | |||
## API | |||
```js | |||
var cookie = require('cookie'); | |||
``` | |||
### cookie.parse(str, options) | |||
Parse an HTTP `Cookie` header string and returning an object of all cookie name-value pairs. | |||
The `str` argument is the string representing a `Cookie` header value and `options` is an | |||
optional object containing additional parsing options. | |||
```js | |||
var cookies = cookie.parse('foo=bar; equation=E%3Dmc%5E2'); | |||
// { foo: 'bar', equation: 'E=mc^2' } | |||
``` | |||
#### Options | |||
`cookie.parse` accepts these properties in the options object. | |||
##### decode | |||
Specifies a function that will be used to decode a cookie's value. Since the value of a cookie | |||
has a limited character set (and must be a simple string), this function can be used to decode | |||
a previously-encoded cookie value into a JavaScript string or other object. | |||
The default function is the global `decodeURIComponent`, which will decode any URL-encoded | |||
sequences into their byte representations. | |||
**note** if an error is thrown from this function, the original, non-decoded cookie value will | |||
be returned as the cookie's value. | |||
### cookie.serialize(name, value, options) | |||
Serialize a cookie name-value pair into a `Set-Cookie` header string. The `name` argument is the | |||
name for the cookie, the `value` argument is the value to set the cookie to, and the `options` | |||
argument is an optional object containing additional serialization options. | |||
```js | |||
var setCookie = cookie.serialize('foo', 'bar'); | |||
// foo=bar | |||
``` | |||
#### Options | |||
`cookie.serialize` accepts these properties in the options object. | |||
##### domain | |||
Specifies the value for the [`Domain` `Set-Cookie` attribute][rfc-6266-5.2.3]. By default, no | |||
domain is set, and most clients will consider the cookie to apply to only the current domain. | |||
##### encode | |||
Specifies a function that will be used to encode a cookie's value. Since value of a cookie | |||
has a limited character set (and must be a simple string), this function can be used to encode | |||
a value into a string suited for a cookie's value. | |||
The default function is the global `ecodeURIComponent`, which will encode a JavaScript string | |||
into UTF-8 byte sequences and then URL-encode any that fall outside of the cookie range. | |||
##### expires | |||
Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute][rfc-6266-5.2.1]. | |||
By default, no expiration is set, and most clients will consider this a "non-persistent cookie" and | |||
will delete it on a condition like exiting a web browser application. | |||
**note** the [cookie storage model specification][rfc-6266-5.3] states that if both `expires` and | |||
`magAge` are set, then `maxAge` takes precedence, but it is possiblke not all clients by obey this, | |||
so if both are set, they should point to the same date and time. | |||
##### httpOnly | |||
Specifies the `boolean` value for the [`HttpOnly` `Set-Cookie` attribute][rfc-6266-5.2.6]. When truthy, | |||
the `HttpOnly` attribute is set, otherwise it is not. By default, the `HttpOnly` attribute is not set. | |||
**note** be careful when setting this to `true`, as compliant clients will not allow client-side | |||
JavaScript to see the cookie in `document.cookie`. | |||
##### maxAge | |||
Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute][rfc-6266-5.2.2]. | |||
The given number will be converted to an integer by rounding down. By default, no maximum age is set. | |||
**note** the [cookie storage model specification][rfc-6266-5.3] states that if both `expires` and | |||
`magAge` are set, then `maxAge` takes precedence, but it is possiblke not all clients by obey this, | |||
so if both are set, they should point to the same date and time. | |||
##### path | |||
Specifies the value for the [`Path` `Set-Cookie` attribute][rfc-6266-5.2.4]. By default, the path | |||
is considered the ["default path"][rfc-6266-5.1.4]. By default, no maximum age is set, and most | |||
clients will consider this a "non-persistent cookie" and will delete it on a condition like exiting | |||
a web browser application. | |||
##### sameSite | |||
Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Cookie` attribute][draft-west-first-party-cookies-07]. | |||
- `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement. | |||
- `false` will not set the `SameSite` attribute. | |||
- `'lax'` will set the `SameSite` attribute to `Lax` for lax same site enforcement. | |||
- `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement. | |||
More information about the different enforcement levels can be found in the specification | |||
https://tools.ietf.org/html/draft-west-first-party-cookies-07#section-4.1.1 | |||
**note** This is an attribute that has not yet been fully standardized, and may change in the future. | |||
This also means many clients may ignore this attribute until they understand it. | |||
##### secure | |||
Specifies the `boolean` value for the [`Secure` `Set-Cookie` attribute][rfc-6266-5.2.5]. When truthy, | |||
the `Secure` attribute is set, otherwise it is not. By default, the `Secure` attribute is not set. | |||
**note** be careful when setting this to `true`, as compliant clients will not send the cookie back to | |||
the server in the future if the browser does not have an HTTPS connection. | |||
## Example | |||
The following example uses this module in conjunction with the Node.js core HTTP server | |||
to prompt a user for their name and display it back on future visits. | |||
```js | |||
var cookie = require('cookie'); | |||
var escapeHtml = require('escape-html'); | |||
var http = require('http'); | |||
var url = require('url'); | |||
function onRequest(req, res) { | |||
// Parse the query string | |||
var query = url.parse(req.url, true, true).query; | |||
if (query && query.name) { | |||
// Set a new cookie with the name | |||
res.setHeader('Set-Cookie', cookie.serialize('name', String(query.name), { | |||
httpOnly: true, | |||
maxAge: 60 * 60 * 24 * 7 // 1 week | |||
})); | |||
// Redirect back after setting cookie | |||
res.statusCode = 302; | |||
res.setHeader('Location', req.headers.referer || '/'); | |||
res.end(); | |||
return; | |||
} | |||
// Parse the cookies on the request | |||
var cookies = cookie.parse(req.headers.cookie || ''); | |||
// Get the visitor name set in the cookie | |||
var name = cookies.name; | |||
res.setHeader('Content-Type', 'text/html; charset=UTF-8'); | |||
if (name) { | |||
res.write('<p>Welcome back, <b>' + escapeHtml(name) + '</b>!</p>'); | |||
} else { | |||
res.write('<p>Hello, new visitor!</p>'); | |||
} | |||
res.write('<form method="GET">'); | |||
res.write('<input placeholder="enter your name" name="name"> <input type="submit" value="Set Name">'); | |||
res.end('</form'); | |||
} | |||
http.createServer(onRequest).listen(3000); | |||
``` | |||
## Testing | |||
```sh | |||
$ npm test | |||
``` | |||
## References | |||
- [RFC 6266: HTTP State Management Mechanism][rfc-6266] | |||
- [Same-site Cookies][draft-west-first-party-cookies-07] | |||
[draft-west-first-party-cookies-07]: https://tools.ietf.org/html/draft-west-first-party-cookies-07 | |||
[rfc-6266]: https://tools.ietf.org/html/rfc6266 | |||
[rfc-6266-5.1.4]: https://tools.ietf.org/html/rfc6266#section-5.1.4 | |||
[rfc-6266-5.2.1]: https://tools.ietf.org/html/rfc6266#section-5.2.1 | |||
[rfc-6266-5.2.2]: https://tools.ietf.org/html/rfc6266#section-5.2.2 | |||
[rfc-6266-5.2.3]: https://tools.ietf.org/html/rfc6266#section-5.2.3 | |||
[rfc-6266-5.2.4]: https://tools.ietf.org/html/rfc6266#section-5.2.4 | |||
[rfc-6266-5.3]: https://tools.ietf.org/html/rfc6266#section-5.3 | |||
## License | |||
[MIT](LICENSE) | |||
[npm-image]: https://img.shields.io/npm/v/cookie.svg | |||
[npm-url]: https://npmjs.org/package/cookie | |||
[node-version-image]: https://img.shields.io/node/v/cookie.svg | |||
[node-version-url]: https://nodejs.org/en/download | |||
[travis-image]: https://img.shields.io/travis/jshttp/cookie/master.svg | |||
[travis-url]: https://travis-ci.org/jshttp/cookie | |||
[coveralls-image]: https://img.shields.io/coveralls/jshttp/cookie/master.svg | |||
[coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master | |||
[downloads-image]: https://img.shields.io/npm/dm/cookie.svg | |||
[downloads-url]: https://npmjs.org/package/cookie |
@@ -0,0 +1,195 @@ | |||
/*! | |||
* cookie | |||
* Copyright(c) 2012-2014 Roman Shtylman | |||
* Copyright(c) 2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict'; | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
exports.parse = parse; | |||
exports.serialize = serialize; | |||
/** | |||
* Module variables. | |||
* @private | |||
*/ | |||
var decode = decodeURIComponent; | |||
var encode = encodeURIComponent; | |||
var pairSplitRegExp = /; */; | |||
/** | |||
* RegExp to match field-content in RFC 7230 sec 3.2 | |||
* | |||
* field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] | |||
* field-vchar = VCHAR / obs-text | |||
* obs-text = %x80-FF | |||
*/ | |||
var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; | |||
/** | |||
* Parse a cookie header. | |||
* | |||
* Parse the given cookie header string into an object | |||
* The object has the various cookies as keys(names) => values | |||
* | |||
* @param {string} str | |||
* @param {object} [options] | |||
* @return {object} | |||
* @public | |||
*/ | |||
function parse(str, options) { | |||
if (typeof str !== 'string') { | |||
throw new TypeError('argument str must be a string'); | |||
} | |||
var obj = {} | |||
var opt = options || {}; | |||
var pairs = str.split(pairSplitRegExp); | |||
var dec = opt.decode || decode; | |||
for (var i = 0; i < pairs.length; i++) { | |||
var pair = pairs[i]; | |||
var eq_idx = pair.indexOf('='); | |||
// skip things that don't look like key=value | |||
if (eq_idx < 0) { | |||
continue; | |||
} | |||
var key = pair.substr(0, eq_idx).trim() | |||
var val = pair.substr(++eq_idx, pair.length).trim(); | |||
// quoted values | |||
if ('"' == val[0]) { | |||
val = val.slice(1, -1); | |||
} | |||
// only assign once | |||
if (undefined == obj[key]) { | |||
obj[key] = tryDecode(val, dec); | |||
} | |||
} | |||
return obj; | |||
} | |||
/** | |||
* Serialize data into a cookie header. | |||
* | |||
* Serialize the a name value pair into a cookie string suitable for | |||
* http headers. An optional options object specified cookie parameters. | |||
* | |||
* serialize('foo', 'bar', { httpOnly: true }) | |||
* => "foo=bar; httpOnly" | |||
* | |||
* @param {string} name | |||
* @param {string} val | |||
* @param {object} [options] | |||
* @return {string} | |||
* @public | |||
*/ | |||
function serialize(name, val, options) { | |||
var opt = options || {}; | |||
var enc = opt.encode || encode; | |||
if (typeof enc !== 'function') { | |||
throw new TypeError('option encode is invalid'); | |||
} | |||
if (!fieldContentRegExp.test(name)) { | |||
throw new TypeError('argument name is invalid'); | |||
} | |||
var value = enc(val); | |||
if (value && !fieldContentRegExp.test(value)) { | |||
throw new TypeError('argument val is invalid'); | |||
} | |||
var str = name + '=' + value; | |||
if (null != opt.maxAge) { | |||
var maxAge = opt.maxAge - 0; | |||
if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); | |||
str += '; Max-Age=' + Math.floor(maxAge); | |||
} | |||
if (opt.domain) { | |||
if (!fieldContentRegExp.test(opt.domain)) { | |||
throw new TypeError('option domain is invalid'); | |||
} | |||
str += '; Domain=' + opt.domain; | |||
} | |||
if (opt.path) { | |||
if (!fieldContentRegExp.test(opt.path)) { | |||
throw new TypeError('option path is invalid'); | |||
} | |||
str += '; Path=' + opt.path; | |||
} | |||
if (opt.expires) { | |||
if (typeof opt.expires.toUTCString !== 'function') { | |||
throw new TypeError('option expires is invalid'); | |||
} | |||
str += '; Expires=' + opt.expires.toUTCString(); | |||
} | |||
if (opt.httpOnly) { | |||
str += '; HttpOnly'; | |||
} | |||
if (opt.secure) { | |||
str += '; Secure'; | |||
} | |||
if (opt.sameSite) { | |||
var sameSite = typeof opt.sameSite === 'string' | |||
? opt.sameSite.toLowerCase() : opt.sameSite; | |||
switch (sameSite) { | |||
case true: | |||
str += '; SameSite=Strict'; | |||
break; | |||
case 'lax': | |||
str += '; SameSite=Lax'; | |||
break; | |||
case 'strict': | |||
str += '; SameSite=Strict'; | |||
break; | |||
default: | |||
throw new TypeError('option sameSite is invalid'); | |||
} | |||
} | |||
return str; | |||
} | |||
/** | |||
* Try decoding a string using a decoding function. | |||
* | |||
* @param {string} str | |||
* @param {function} decode | |||
* @private | |||
*/ | |||
function tryDecode(str, decode) { | |||
try { | |||
return decode(str); | |||
} catch (e) { | |||
return str; | |||
} | |||
} |
@@ -0,0 +1,71 @@ | |||
{ | |||
"_from": "cookie@0.3.1", | |||
"_id": "cookie@0.3.1", | |||
"_inBundle": false, | |||
"_integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", | |||
"_location": "/cookie", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "cookie@0.3.1", | |||
"name": "cookie", | |||
"escapedName": "cookie", | |||
"rawSpec": "0.3.1", | |||
"saveSpec": null, | |||
"fetchSpec": "0.3.1" | |||
}, | |||
"_requiredBy": [ | |||
"/express" | |||
], | |||
"_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", | |||
"_shasum": "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb", | |||
"_spec": "cookie@0.3.1", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"author": { | |||
"name": "Roman Shtylman", | |||
"email": "shtylman@gmail.com" | |||
}, | |||
"bugs": { | |||
"url": "https://github.com/jshttp/cookie/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"contributors": [ | |||
{ | |||
"name": "Douglas Christopher Wilson", | |||
"email": "doug@somethingdoug.com" | |||
} | |||
], | |||
"deprecated": false, | |||
"description": "HTTP server cookie parsing and serialization", | |||
"devDependencies": { | |||
"istanbul": "0.4.3", | |||
"mocha": "1.21.5" | |||
}, | |||
"engines": { | |||
"node": ">= 0.6" | |||
}, | |||
"files": [ | |||
"HISTORY.md", | |||
"LICENSE", | |||
"README.md", | |||
"index.js" | |||
], | |||
"homepage": "https://github.com/jshttp/cookie#readme", | |||
"keywords": [ | |||
"cookie", | |||
"cookies" | |||
], | |||
"license": "MIT", | |||
"name": "cookie", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/jshttp/cookie.git" | |||
}, | |||
"scripts": { | |||
"test": "mocha --reporter spec --bail --check-leaks test/", | |||
"test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" | |||
}, | |||
"version": "0.3.1" | |||
} |
@@ -0,0 +1,22 @@ | |||
The MIT License (MIT) | |||
Copyright 2014 Alex Gorbatchev | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
"Software"), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,106 @@ | |||
# crc | |||
[![GitTip](http://img.shields.io/gittip/alexgorbatchev.svg?style=flat)](https://www.gittip.com/alexgorbatchev/) | |||
[![Dependency status](http://img.shields.io/david/alexgorbatchev/node-crc.svg?style=flat)](https://david-dm.org/alexgorbatchev/node-crc) | |||
[![devDependency Status](http://img.shields.io/david/dev/alexgorbatchev/node-crc.svg?style=flat)](https://david-dm.org/alexgorbatchev/node-crc?type=dev) | |||
[![Build Status](http://img.shields.io/travis/alexgorbatchev/node-crc.svg?style=flat&branch=master)](https://travis-ci.org/alexgorbatchev/node-crc) | |||
[![NPM](https://nodei.co/npm/crc.svg?style=flat)](https://npmjs.org/package/crc) | |||
Module for calculating Cyclic Redundancy Check (CRC) for Node.js and the Browser. | |||
# Important: Node >= 6.3.0 < 6.9.2 | |||
There's was a bug in Node [#9342](https://github.com/nodejs/node/issues/9342) that affected CRC calculation if `Buffer.split()` is used (see issue discussion for details). This affected all version starting from `6.3.0` up to but not including `6.9.2`. The patch [#9341](https://github.com/nodejs/node/pull/9341) was released in `6.9.2`. If you are upgrading and seeing odd CRC calculation mismatches, this might be the reason. | |||
## Features | |||
* Full test suite comparing values against reference `pycrc` implementation. | |||
* Pure JavaScript implementation, no dependencies. | |||
* Provides CRC tables for optimized calculations. | |||
* Provides support for the following CRC algorithms: | |||
* CRC1 `crc.crc1(…)` | |||
* CRC8 `crc.crc8(…)` | |||
* CRC8 1-Wire `crc.crc81wire(…)` | |||
* CRC16 `crc.crc16(…)` | |||
* CRC16 CCITT `crc.crc16ccitt(…)` | |||
* CRC16 Modbus `crc.crc16modbus(…)` | |||
* CRC16 Kermit `crc.crc16kermit(…)` | |||
* CRC16 XModem `crc.crc16xmodem(…)` | |||
* CRC24 `crc.crc24(…)` | |||
* CRC32 `crc.crc32(…)` | |||
## Installation | |||
``` | |||
npm install crc | |||
``` | |||
## Usage | |||
Calculate a CRC32: | |||
```js | |||
var crc = require('crc'); | |||
crc.crc32('hello').toString(16); | |||
// "3610a686" | |||
``` | |||
Calculate a CRC32 of a file: | |||
```js | |||
crc.crc32(fs.readFileSync('README.md', 'utf8')).toString(16); | |||
// "127ad531" | |||
``` | |||
Or using a `Buffer`: | |||
```js | |||
crc.crc32(fs.readFileSync('README.md')).toString(16); | |||
// "127ad531" | |||
``` | |||
Incrementally calculate a CRC32: | |||
```js | |||
value = crc.crc32('one'); | |||
value = crc.crc32('two', value); | |||
value = crc.crc32('three', value); | |||
value.toString(16); | |||
// "9e1c092" | |||
``` | |||
## Running tests | |||
``` | |||
npm test | |||
``` | |||
## Thanks! | |||
[pycrc](http://www.tty1.net/pycrc/) library is which the source of all of the CRC tables. | |||
# License | |||
The MIT License (MIT) | |||
Copyright (c) 2014 Alex Gorbatchev | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. |
@@ -0,0 +1,28 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
module.exports = (0, _define_crc2.default)('crc1', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = ~~previous; | |||
var accum = 0; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
accum += byte; | |||
} | |||
crc += accum % 256; | |||
return crc % 256; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-driven --model=crc-16 --generate=c` | |||
var TABLE = [0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('crc-16', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = ~~previous; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = (TABLE[(crc ^ byte) & 0xff] ^ crc >> 8) & 0xffff; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-driven --model=ccitt --generate=c` | |||
var TABLE = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('ccitt', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = typeof previous !== 'undefined' ? ~~previous : 0xffff; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = (TABLE[(crc >> 8 ^ byte) & 0xff] ^ crc << 8) & 0xffff; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-driven --model=kermit --generate=c` | |||
var TABLE = [0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('kermit', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = typeof previous !== 'undefined' ? ~~previous : 0x0000; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = (TABLE[(crc ^ byte) & 0xff] ^ crc >> 8) & 0xffff; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-driven --model=crc-16-modbus --generate=c` | |||
var TABLE = [0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('crc-16-modbus', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = typeof previous !== 'undefined' ? ~~previous : 0xffff; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = (TABLE[(crc ^ byte) & 0xff] ^ crc >> 8) & 0xffff; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,35 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
module.exports = (0, _define_crc2.default)('xmodem', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = typeof previous !== 'undefined' ? ~~previous : 0x0; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
var code = crc >>> 8 & 0xFF; | |||
code ^= byte & 0xFF; | |||
code ^= code >>> 4; | |||
crc = crc << 8 & 0xFFFF; | |||
crc ^= code; | |||
code = code << 5 & 0xFFFF; | |||
crc ^= code; | |||
code = code << 7 & 0xFFFF; | |||
crc ^= code; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-drive --model=crc-24 --generate=c` | |||
var TABLE = [0x000000, 0x864cfb, 0x8ad50d, 0x0c99f6, 0x93e6e1, 0x15aa1a, 0x1933ec, 0x9f7f17, 0xa18139, 0x27cdc2, 0x2b5434, 0xad18cf, 0x3267d8, 0xb42b23, 0xb8b2d5, 0x3efe2e, 0xc54e89, 0x430272, 0x4f9b84, 0xc9d77f, 0x56a868, 0xd0e493, 0xdc7d65, 0x5a319e, 0x64cfb0, 0xe2834b, 0xee1abd, 0x685646, 0xf72951, 0x7165aa, 0x7dfc5c, 0xfbb0a7, 0x0cd1e9, 0x8a9d12, 0x8604e4, 0x00481f, 0x9f3708, 0x197bf3, 0x15e205, 0x93aefe, 0xad50d0, 0x2b1c2b, 0x2785dd, 0xa1c926, 0x3eb631, 0xb8faca, 0xb4633c, 0x322fc7, 0xc99f60, 0x4fd39b, 0x434a6d, 0xc50696, 0x5a7981, 0xdc357a, 0xd0ac8c, 0x56e077, 0x681e59, 0xee52a2, 0xe2cb54, 0x6487af, 0xfbf8b8, 0x7db443, 0x712db5, 0xf7614e, 0x19a3d2, 0x9fef29, 0x9376df, 0x153a24, 0x8a4533, 0x0c09c8, 0x00903e, 0x86dcc5, 0xb822eb, 0x3e6e10, 0x32f7e6, 0xb4bb1d, 0x2bc40a, 0xad88f1, 0xa11107, 0x275dfc, 0xdced5b, 0x5aa1a0, 0x563856, 0xd074ad, 0x4f0bba, 0xc94741, 0xc5deb7, 0x43924c, 0x7d6c62, 0xfb2099, 0xf7b96f, 0x71f594, 0xee8a83, 0x68c678, 0x645f8e, 0xe21375, 0x15723b, 0x933ec0, 0x9fa736, 0x19ebcd, 0x8694da, 0x00d821, 0x0c41d7, 0x8a0d2c, 0xb4f302, 0x32bff9, 0x3e260f, 0xb86af4, 0x2715e3, 0xa15918, 0xadc0ee, 0x2b8c15, 0xd03cb2, 0x567049, 0x5ae9bf, 0xdca544, 0x43da53, 0xc596a8, 0xc90f5e, 0x4f43a5, 0x71bd8b, 0xf7f170, 0xfb6886, 0x7d247d, 0xe25b6a, 0x641791, 0x688e67, 0xeec29c, 0x3347a4, 0xb50b5f, 0xb992a9, 0x3fde52, 0xa0a145, 0x26edbe, 0x2a7448, 0xac38b3, 0x92c69d, 0x148a66, 0x181390, 0x9e5f6b, 0x01207c, 0x876c87, 0x8bf571, 0x0db98a, 0xf6092d, 0x7045d6, 0x7cdc20, 0xfa90db, 0x65efcc, 0xe3a337, 0xef3ac1, 0x69763a, 0x578814, 0xd1c4ef, 0xdd5d19, 0x5b11e2, 0xc46ef5, 0x42220e, 0x4ebbf8, 0xc8f703, 0x3f964d, 0xb9dab6, 0xb54340, 0x330fbb, 0xac70ac, 0x2a3c57, 0x26a5a1, 0xa0e95a, 0x9e1774, 0x185b8f, 0x14c279, 0x928e82, 0x0df195, 0x8bbd6e, 0x872498, 0x016863, 0xfad8c4, 0x7c943f, 0x700dc9, 0xf64132, 0x693e25, 0xef72de, 0xe3eb28, 0x65a7d3, 0x5b59fd, 0xdd1506, 0xd18cf0, 0x57c00b, 0xc8bf1c, 0x4ef3e7, 0x426a11, 0xc426ea, 0x2ae476, 0xaca88d, 0xa0317b, 0x267d80, 0xb90297, 0x3f4e6c, 0x33d79a, 0xb59b61, 0x8b654f, 0x0d29b4, 0x01b042, 0x87fcb9, 0x1883ae, 0x9ecf55, 0x9256a3, 0x141a58, 0xefaaff, 0x69e604, 0x657ff2, 0xe33309, 0x7c4c1e, 0xfa00e5, 0xf69913, 0x70d5e8, 0x4e2bc6, 0xc8673d, 0xc4fecb, 0x42b230, 0xddcd27, 0x5b81dc, 0x57182a, 0xd154d1, 0x26359f, 0xa07964, 0xace092, 0x2aac69, 0xb5d37e, 0x339f85, 0x3f0673, 0xb94a88, 0x87b4a6, 0x01f85d, 0x0d61ab, 0x8b2d50, 0x145247, 0x921ebc, 0x9e874a, 0x18cbb1, 0xe37b16, 0x6537ed, 0x69ae1b, 0xefe2e0, 0x709df7, 0xf6d10c, 0xfa48fa, 0x7c0401, 0x42fa2f, 0xc4b6d4, 0xc82f22, 0x4e63d9, 0xd11cce, 0x575035, 0x5bc9c3, 0xdd8538]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('crc-24', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = typeof previous !== 'undefined' ? ~~previous : 0xb704ce; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = (TABLE[(crc >> 16 ^ byte) & 0xff] ^ crc << 8) & 0xffffff; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-driven --model=crc-32 --generate=c` | |||
var TABLE = [0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('crc-32', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = previous === 0 ? 0 : ~~previous ^ -1; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = TABLE[(crc ^ byte) & 0xff] ^ crc >>> 8; | |||
} | |||
return crc ^ -1; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-driven --model=crc-8 --generate=c` | |||
var TABLE = [0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a, 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a, 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42, 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4, 0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4, 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34, 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63, 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83, 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('crc-8', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = ~~previous; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = TABLE[(crc ^ byte) & 0xff] & 0xff; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,31 @@ | |||
'use strict'; | |||
var _buffer = require('buffer'); | |||
var _create_buffer = require('./create_buffer'); | |||
var _create_buffer2 = _interopRequireDefault(_create_buffer); | |||
var _define_crc = require('./define_crc'); | |||
var _define_crc2 = _interopRequireDefault(_define_crc); | |||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |||
// Generated by `./pycrc.py --algorithm=table-driven --model=dallas-1-wire --generate=c` | |||
var TABLE = [0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83, 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41, 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e, 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc, 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0, 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62, 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d, 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff, 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5, 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07, 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58, 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a, 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6, 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24, 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b, 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9, 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f, 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd, 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92, 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50, 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c, 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee, 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1, 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73, 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49, 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b, 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4, 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16, 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a, 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8, 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7, 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35]; | |||
if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE); | |||
module.exports = (0, _define_crc2.default)('dallas-1-wire', function (buf, previous) { | |||
if (!_buffer.Buffer.isBuffer(buf)) buf = (0, _create_buffer2.default)(buf); | |||
var crc = ~~previous; | |||
for (var index = 0; index < buf.length; index++) { | |||
var byte = buf[index]; | |||
crc = TABLE[(crc ^ byte) & 0xff] & 0xff; | |||
} | |||
return crc; | |||
}); |
@@ -0,0 +1,16 @@ | |||
'use strict'; | |||
Object.defineProperty(exports, "__esModule", { | |||
value: true | |||
}); | |||
var _buffer = require('buffer'); | |||
var createBuffer = _buffer.Buffer.from && _buffer.Buffer.alloc && _buffer.Buffer.allocUnsafe && _buffer.Buffer.allocUnsafeSlow ? _buffer.Buffer.from | |||
// support for Node < 5.10 | |||
: function (val) { | |||
return new _buffer.Buffer(val); | |||
}; | |||
exports.default = createBuffer; |
@@ -0,0 +1,16 @@ | |||
"use strict"; | |||
Object.defineProperty(exports, "__esModule", { | |||
value: true | |||
}); | |||
exports.default = function (model, calc) { | |||
var fn = function fn(buf, previous) { | |||
return calc(buf, previous) >>> 0; | |||
}; | |||
fn.signed = calc; | |||
fn.unsigned = fn; | |||
fn.model = model; | |||
return fn; | |||
}; |
@@ -0,0 +1,14 @@ | |||
'use strict'; | |||
module.exports = { | |||
crc1: require('./crc1'), | |||
crc8: require('./crc8'), | |||
crc81wire: require('./crc8_1wire'), | |||
crc16: require('./crc16'), | |||
crc16ccitt: require('./crc16_ccitt'), | |||
crc16modbus: require('./crc16_modbus'), | |||
crc16xmodem: require('./crc16_xmodem'), | |||
crc16kermit: require('./crc16_kermit'), | |||
crc24: require('./crc24'), | |||
crc32: require('./crc32') | |||
}; |
@@ -0,0 +1,65 @@ | |||
{ | |||
"_from": "crc@3.4.4", | |||
"_id": "crc@3.4.4", | |||
"_inBundle": false, | |||
"_integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=", | |||
"_location": "/crc", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "crc@3.4.4", | |||
"name": "crc", | |||
"escapedName": "crc", | |||
"rawSpec": "3.4.4", | |||
"saveSpec": null, | |||
"fetchSpec": "3.4.4" | |||
}, | |||
"_requiredBy": [ | |||
"/express-session" | |||
], | |||
"_resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", | |||
"_shasum": "9da1e980e3bd44fc5c93bf5ab3da3378d85e466b", | |||
"_spec": "crc@3.4.4", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express-session", | |||
"author": { | |||
"name": "Alex Gorbatchev", | |||
"url": "https://github.com/alexgorbatchev" | |||
}, | |||
"bugs": { | |||
"url": "https://github.com/alexgorbatchev/node-crc/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"deprecated": false, | |||
"description": "Module for calculating Cyclic Redundancy Check (CRC) for Node.js and the Browser.", | |||
"devDependencies": { | |||
"babel-cli": "^6.3.15", | |||
"babel-core": "^6.1.21", | |||
"babel-preset-es2015": "^6.1.18", | |||
"beautify-benchmark": "^0.2.4", | |||
"benchmark": "^1.0.0", | |||
"buffer-crc32": "^0.2.3", | |||
"chai": "^3.4.1", | |||
"mocha": "*", | |||
"seedrandom": "^2.3.6" | |||
}, | |||
"files": [ | |||
"lib" | |||
], | |||
"homepage": "https://github.com/alexgorbatchev/node-crc", | |||
"keywords": [ | |||
"crc" | |||
], | |||
"license": "MIT", | |||
"main": "./lib/index.js", | |||
"name": "crc", | |||
"repository": { | |||
"type": "git", | |||
"url": "git://github.com/alexgorbatchev/node-crc.git" | |||
}, | |||
"scripts": { | |||
"pretest": "cd src && babel --out-dir ../lib *.js", | |||
"test": "mocha test/*.test.js" | |||
}, | |||
"version": "3.4.4" | |||
} |
@@ -0,0 +1 @@ | |||
repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve |
@@ -0,0 +1,11 @@ | |||
{ | |||
"env": { | |||
"browser": true, | |||
"node": true | |||
}, | |||
"rules": { | |||
"no-console": 0, | |||
"no-empty": [1, { "allowEmptyCatch": true }] | |||
}, | |||
"extends": "eslint:recommended" | |||
} |
@@ -0,0 +1,9 @@ | |||
support | |||
test | |||
examples | |||
example | |||
*.sock | |||
dist | |||
yarn.lock | |||
coverage | |||
bower.json |
@@ -0,0 +1,14 @@ | |||
language: node_js | |||
node_js: | |||
- "6" | |||
- "5" | |||
- "4" | |||
install: | |||
- make node_modules | |||
script: | |||
- make lint | |||
- make test | |||
- make coveralls |
@@ -0,0 +1,362 @@ | |||
2.6.9 / 2017-09-22 | |||
================== | |||
* remove ReDoS regexp in %o formatter (#504) | |||
2.6.8 / 2017-05-18 | |||
================== | |||
* Fix: Check for undefined on browser globals (#462, @marbemac) | |||
2.6.7 / 2017-05-16 | |||
================== | |||
* Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) | |||
* Fix: Inline extend function in node implementation (#452, @dougwilson) | |||
* Docs: Fix typo (#455, @msasad) | |||
2.6.5 / 2017-04-27 | |||
================== | |||
* Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) | |||
* Misc: clean up browser reference checks (#447, @thebigredgeek) | |||
* Misc: add npm-debug.log to .gitignore (@thebigredgeek) | |||
2.6.4 / 2017-04-20 | |||
================== | |||
* Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) | |||
* Chore: ignore bower.json in npm installations. (#437, @joaovieira) | |||
* Misc: update "ms" to v0.7.3 (@tootallnate) | |||
2.6.3 / 2017-03-13 | |||
================== | |||
* Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) | |||
* Docs: Changelog fix (@thebigredgeek) | |||
2.6.2 / 2017-03-10 | |||
================== | |||
* Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) | |||
* Docs: Add backers and sponsors from Open Collective (#422, @piamancini) | |||
* Docs: Add Slackin invite badge (@tootallnate) | |||
2.6.1 / 2017-02-10 | |||
================== | |||
* Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error | |||
* Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) | |||
* Fix: IE8 "Expected identifier" error (#414, @vgoma) | |||
* Fix: Namespaces would not disable once enabled (#409, @musikov) | |||
2.6.0 / 2016-12-28 | |||
================== | |||
* Fix: added better null pointer checks for browser useColors (@thebigredgeek) | |||
* Improvement: removed explicit `window.debug` export (#404, @tootallnate) | |||
* Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) | |||
2.5.2 / 2016-12-25 | |||
================== | |||
* Fix: reference error on window within webworkers (#393, @KlausTrainer) | |||
* Docs: fixed README typo (#391, @lurch) | |||
* Docs: added notice about v3 api discussion (@thebigredgeek) | |||
2.5.1 / 2016-12-20 | |||
================== | |||
* Fix: babel-core compatibility | |||
2.5.0 / 2016-12-20 | |||
================== | |||
* Fix: wrong reference in bower file (@thebigredgeek) | |||
* Fix: webworker compatibility (@thebigredgeek) | |||
* Fix: output formatting issue (#388, @kribblo) | |||
* Fix: babel-loader compatibility (#383, @escwald) | |||
* Misc: removed built asset from repo and publications (@thebigredgeek) | |||
* Misc: moved source files to /src (#378, @yamikuronue) | |||
* Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) | |||
* Test: coveralls integration (#378, @yamikuronue) | |||
* Docs: simplified language in the opening paragraph (#373, @yamikuronue) | |||
2.4.5 / 2016-12-17 | |||
================== | |||
* Fix: `navigator` undefined in Rhino (#376, @jochenberger) | |||
* Fix: custom log function (#379, @hsiliev) | |||
* Improvement: bit of cleanup + linting fixes (@thebigredgeek) | |||
* Improvement: rm non-maintainted `dist/` dir (#375, @freewil) | |||
* Docs: simplified language in the opening paragraph. (#373, @yamikuronue) | |||
2.4.4 / 2016-12-14 | |||
================== | |||
* Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) | |||
2.4.3 / 2016-12-14 | |||
================== | |||
* Fix: navigation.userAgent error for react native (#364, @escwald) | |||
2.4.2 / 2016-12-14 | |||
================== | |||
* Fix: browser colors (#367, @tootallnate) | |||
* Misc: travis ci integration (@thebigredgeek) | |||
* Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) | |||
2.4.1 / 2016-12-13 | |||
================== | |||
* Fix: typo that broke the package (#356) | |||
2.4.0 / 2016-12-13 | |||
================== | |||
* Fix: bower.json references unbuilt src entry point (#342, @justmatt) | |||
* Fix: revert "handle regex special characters" (@tootallnate) | |||
* Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) | |||
* Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) | |||
* Improvement: allow colors in workers (#335, @botverse) | |||
* Improvement: use same color for same namespace. (#338, @lchenay) | |||
2.3.3 / 2016-11-09 | |||
================== | |||
* Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) | |||
* Fix: Returning `localStorage` saved values (#331, Levi Thomason) | |||
* Improvement: Don't create an empty object when no `process` (Nathan Rajlich) | |||
2.3.2 / 2016-11-09 | |||
================== | |||
* Fix: be super-safe in index.js as well (@TooTallNate) | |||
* Fix: should check whether process exists (Tom Newby) | |||
2.3.1 / 2016-11-09 | |||
================== | |||
* Fix: Added electron compatibility (#324, @paulcbetts) | |||
* Improvement: Added performance optimizations (@tootallnate) | |||
* Readme: Corrected PowerShell environment variable example (#252, @gimre) | |||
* Misc: Removed yarn lock file from source control (#321, @fengmk2) | |||
2.3.0 / 2016-11-07 | |||
================== | |||
* Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) | |||
* Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) | |||
* Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) | |||
* Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) | |||
* Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) | |||
* Package: Update "ms" to 0.7.2 (#315, @DevSide) | |||
* Package: removed superfluous version property from bower.json (#207 @kkirsche) | |||
* Readme: fix USE_COLORS to DEBUG_COLORS | |||
* Readme: Doc fixes for format string sugar (#269, @mlucool) | |||
* Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) | |||
* Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) | |||
* Readme: better docs for browser support (#224, @matthewmueller) | |||
* Tooling: Added yarn integration for development (#317, @thebigredgeek) | |||
* Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) | |||
* Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) | |||
* Misc: Updated contributors (@thebigredgeek) | |||
2.2.0 / 2015-05-09 | |||
================== | |||
* package: update "ms" to v0.7.1 (#202, @dougwilson) | |||
* README: add logging to file example (#193, @DanielOchoa) | |||
* README: fixed a typo (#191, @amir-s) | |||
* browser: expose `storage` (#190, @stephenmathieson) | |||
* Makefile: add a `distclean` target (#189, @stephenmathieson) | |||
2.1.3 / 2015-03-13 | |||
================== | |||
* Updated stdout/stderr example (#186) | |||
* Updated example/stdout.js to match debug current behaviour | |||
* Renamed example/stderr.js to stdout.js | |||
* Update Readme.md (#184) | |||
* replace high intensity foreground color for bold (#182, #183) | |||
2.1.2 / 2015-03-01 | |||
================== | |||
* dist: recompile | |||
* update "ms" to v0.7.0 | |||
* package: update "browserify" to v9.0.3 | |||
* component: fix "ms.js" repo location | |||
* changed bower package name | |||
* updated documentation about using debug in a browser | |||
* fix: security error on safari (#167, #168, @yields) | |||
2.1.1 / 2014-12-29 | |||
================== | |||
* browser: use `typeof` to check for `console` existence | |||
* browser: check for `console.log` truthiness (fix IE 8/9) | |||
* browser: add support for Chrome apps | |||
* Readme: added Windows usage remarks | |||
* Add `bower.json` to properly support bower install | |||
2.1.0 / 2014-10-15 | |||
================== | |||
* node: implement `DEBUG_FD` env variable support | |||
* package: update "browserify" to v6.1.0 | |||
* package: add "license" field to package.json (#135, @panuhorsmalahti) | |||
2.0.0 / 2014-09-01 | |||
================== | |||
* package: update "browserify" to v5.11.0 | |||
* node: use stderr rather than stdout for logging (#29, @stephenmathieson) | |||
1.0.4 / 2014-07-15 | |||
================== | |||
* dist: recompile | |||
* example: remove `console.info()` log usage | |||
* example: add "Content-Type" UTF-8 header to browser example | |||
* browser: place %c marker after the space character | |||
* browser: reset the "content" color via `color: inherit` | |||
* browser: add colors support for Firefox >= v31 | |||
* debug: prefer an instance `log()` function over the global one (#119) | |||
* Readme: update documentation about styled console logs for FF v31 (#116, @wryk) | |||
1.0.3 / 2014-07-09 | |||
================== | |||
* Add support for multiple wildcards in namespaces (#122, @seegno) | |||
* browser: fix lint | |||
1.0.2 / 2014-06-10 | |||
================== | |||
* browser: update color palette (#113, @gscottolson) | |||
* common: make console logging function configurable (#108, @timoxley) | |||
* node: fix %o colors on old node <= 0.8.x | |||
* Makefile: find node path using shell/which (#109, @timoxley) | |||
1.0.1 / 2014-06-06 | |||
================== | |||
* browser: use `removeItem()` to clear localStorage | |||
* browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) | |||
* package: add "contributors" section | |||
* node: fix comment typo | |||
* README: list authors | |||
1.0.0 / 2014-06-04 | |||
================== | |||
* make ms diff be global, not be scope | |||
* debug: ignore empty strings in enable() | |||
* node: make DEBUG_COLORS able to disable coloring | |||
* *: export the `colors` array | |||
* npmignore: don't publish the `dist` dir | |||
* Makefile: refactor to use browserify | |||
* package: add "browserify" as a dev dependency | |||
* Readme: add Web Inspector Colors section | |||
* node: reset terminal color for the debug content | |||
* node: map "%o" to `util.inspect()` | |||
* browser: map "%j" to `JSON.stringify()` | |||
* debug: add custom "formatters" | |||
* debug: use "ms" module for humanizing the diff | |||
* Readme: add "bash" syntax highlighting | |||
* browser: add Firebug color support | |||
* browser: add colors for WebKit browsers | |||
* node: apply log to `console` | |||
* rewrite: abstract common logic for Node & browsers | |||
* add .jshintrc file | |||
0.8.1 / 2014-04-14 | |||
================== | |||
* package: re-add the "component" section | |||
0.8.0 / 2014-03-30 | |||
================== | |||
* add `enable()` method for nodejs. Closes #27 | |||
* change from stderr to stdout | |||
* remove unnecessary index.js file | |||
0.7.4 / 2013-11-13 | |||
================== | |||
* remove "browserify" key from package.json (fixes something in browserify) | |||
0.7.3 / 2013-10-30 | |||
================== | |||
* fix: catch localStorage security error when cookies are blocked (Chrome) | |||
* add debug(err) support. Closes #46 | |||
* add .browser prop to package.json. Closes #42 | |||
0.7.2 / 2013-02-06 | |||
================== | |||
* fix package.json | |||
* fix: Mobile Safari (private mode) is broken with debug | |||
* fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript | |||
0.7.1 / 2013-02-05 | |||
================== | |||
* add repository URL to package.json | |||
* add DEBUG_COLORED to force colored output | |||
* add browserify support | |||
* fix component. Closes #24 | |||
0.7.0 / 2012-05-04 | |||
================== | |||
* Added .component to package.json | |||
* Added debug.component.js build | |||
0.6.0 / 2012-03-16 | |||
================== | |||
* Added support for "-" prefix in DEBUG [Vinay Pulim] | |||
* Added `.enabled` flag to the node version [TooTallNate] | |||
0.5.0 / 2012-02-02 | |||
================== | |||
* Added: humanize diffs. Closes #8 | |||
* Added `debug.disable()` to the CS variant | |||
* Removed padding. Closes #10 | |||
* Fixed: persist client-side variant again. Closes #9 | |||
0.4.0 / 2012-02-01 | |||
================== | |||
* Added browser variant support for older browsers [TooTallNate] | |||
* Added `debug.enable('project:*')` to browser variant [TooTallNate] | |||
* Added padding to diff (moved it to the right) | |||
0.3.0 / 2012-01-26 | |||
================== | |||
* Added millisecond diff when isatty, otherwise UTC string | |||
0.2.0 / 2012-01-22 | |||
================== | |||
* Added wildcard support | |||
0.1.0 / 2011-12-02 | |||
================== | |||
* Added: remove colors unless stderr isatty [TooTallNate] | |||
0.0.1 / 2010-01-03 | |||
================== | |||
* Initial release |
@@ -0,0 +1,19 @@ | |||
(The MIT License) | |||
Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> | |||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software | |||
and associated documentation files (the 'Software'), to deal in the Software without restriction, | |||
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, | |||
subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in all copies or substantial | |||
portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT | |||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
@@ -0,0 +1,50 @@ | |||
# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 | |||
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) | |||
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) | |||
# BIN directory | |||
BIN := $(THIS_DIR)/node_modules/.bin | |||
# Path | |||
PATH := node_modules/.bin:$(PATH) | |||
SHELL := /bin/bash | |||
# applications | |||
NODE ?= $(shell which node) | |||
YARN ?= $(shell which yarn) | |||
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) | |||
BROWSERIFY ?= $(NODE) $(BIN)/browserify | |||
.FORCE: | |||
install: node_modules | |||
node_modules: package.json | |||
@NODE_ENV= $(PKG) install | |||
@touch node_modules | |||
lint: .FORCE | |||
eslint browser.js debug.js index.js node.js | |||
test-node: .FORCE | |||
istanbul cover node_modules/mocha/bin/_mocha -- test/**.js | |||
test-browser: .FORCE | |||
mkdir -p dist | |||
@$(BROWSERIFY) \ | |||
--standalone debug \ | |||
. > dist/debug.js | |||
karma start --single-run | |||
rimraf dist | |||
test: .FORCE | |||
concurrently \ | |||
"make test-node" \ | |||
"make test-browser" | |||
coveralls: | |||
cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js | |||
.PHONY: all install clean distclean |
@@ -0,0 +1,312 @@ | |||
# debug | |||
[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) | |||
[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) | |||
A tiny node.js debugging utility modelled after node core's debugging technique. | |||
**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)** | |||
## Installation | |||
```bash | |||
$ npm install debug | |||
``` | |||
## Usage | |||
`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. | |||
Example _app.js_: | |||
```js | |||
var debug = require('debug')('http') | |||
, http = require('http') | |||
, name = 'My App'; | |||
// fake app | |||
debug('booting %s', name); | |||
http.createServer(function(req, res){ | |||
debug(req.method + ' ' + req.url); | |||
res.end('hello\n'); | |||
}).listen(3000, function(){ | |||
debug('listening'); | |||
}); | |||
// fake worker of some kind | |||
require('./worker'); | |||
``` | |||
Example _worker.js_: | |||
```js | |||
var debug = require('debug')('worker'); | |||
setInterval(function(){ | |||
debug('doing some work'); | |||
}, 1000); | |||
``` | |||
The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: | |||
![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) | |||
![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) | |||
#### Windows note | |||
On Windows the environment variable is set using the `set` command. | |||
```cmd | |||
set DEBUG=*,-not_this | |||
``` | |||
Note that PowerShell uses different syntax to set environment variables. | |||
```cmd | |||
$env:DEBUG = "*,-not_this" | |||
``` | |||
Then, run the program to be debugged as usual. | |||
## Millisecond diff | |||
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. | |||
![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) | |||
When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: | |||
![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) | |||
## Conventions | |||
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". | |||
## Wildcards | |||
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=*`. | |||
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:". | |||
## Environment Variables | |||
When running through Node.js, you can set a few environment variables that will | |||
change the behavior of the debug logging: | |||
| Name | Purpose | | |||
|-----------|-------------------------------------------------| | |||
| `DEBUG` | Enables/disables specific debugging namespaces. | | |||
| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | | |||
| `DEBUG_DEPTH` | Object inspection depth. | | |||
| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | | |||
__Note:__ The environment variables beginning with `DEBUG_` end up being | |||
converted into an Options object that gets used with `%o`/`%O` formatters. | |||
See the Node.js documentation for | |||
[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) | |||
for the complete list. | |||
## Formatters | |||
Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters: | |||
| Formatter | Representation | | |||
|-----------|----------------| | |||
| `%O` | Pretty-print an Object on multiple lines. | | |||
| `%o` | Pretty-print an Object all on a single line. | | |||
| `%s` | String. | | |||
| `%d` | Number (both integer and float). | | |||
| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | | |||
| `%%` | Single percent sign ('%'). This does not consume an argument. | | |||
### Custom formatters | |||
You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like: | |||
```js | |||
const createDebug = require('debug') | |||
createDebug.formatters.h = (v) => { | |||
return v.toString('hex') | |||
} | |||
// …elsewhere | |||
const debug = createDebug('foo') | |||
debug('this is hex: %h', new Buffer('hello world')) | |||
// foo this is hex: 68656c6c6f20776f726c6421 +0ms | |||
``` | |||
## Browser support | |||
You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), | |||
or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), | |||
if you don't want to build it yourself. | |||
Debug's enable state is currently persisted by `localStorage`. | |||
Consider the situation shown below where you have `worker:a` and `worker:b`, | |||
and wish to debug both. You can enable this using `localStorage.debug`: | |||
```js | |||
localStorage.debug = 'worker:*' | |||
``` | |||
And then refresh the page. | |||
```js | |||
a = debug('worker:a'); | |||
b = debug('worker:b'); | |||
setInterval(function(){ | |||
a('doing some work'); | |||
}, 1000); | |||
setInterval(function(){ | |||
b('doing some work'); | |||
}, 1200); | |||
``` | |||
#### Web Inspector Colors | |||
Colors are also enabled on "Web Inspectors" that understand the `%c` formatting | |||
option. These are WebKit web inspectors, Firefox ([since version | |||
31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) | |||
and the Firebug plugin for Firefox (any version). | |||
Colored output looks something like: | |||
![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) | |||
## Output streams | |||
By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: | |||
Example _stdout.js_: | |||
```js | |||
var debug = require('debug'); | |||
var error = debug('app:error'); | |||
// by default stderr is used | |||
error('goes to stderr!'); | |||
var log = debug('app:log'); | |||
// set this namespace to log via console.log | |||
log.log = console.log.bind(console); // don't forget to bind to console! | |||
log('goes to stdout'); | |||
error('still goes to stderr!'); | |||
// set all output to go via console.info | |||
// overrides all per-namespace log settings | |||
debug.log = console.info.bind(console); | |||
error('now goes to stdout via console.info'); | |||
log('still goes to stdout, but via console.info now'); | |||
``` | |||
## Authors | |||
- TJ Holowaychuk | |||
- Nathan Rajlich | |||
- Andrew Rhyne | |||
## Backers | |||
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] | |||
<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a> | |||
## Sponsors | |||
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] | |||
<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a> | |||
<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a> | |||
## License | |||
(The MIT License) | |||
Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca> | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,19 @@ | |||
{ | |||
"name": "debug", | |||
"repo": "visionmedia/debug", | |||
"description": "small debugging utility", | |||
"version": "2.6.9", | |||
"keywords": [ | |||
"debug", | |||
"log", | |||
"debugger" | |||
], | |||
"main": "src/browser.js", | |||
"scripts": [ | |||
"src/browser.js", | |||
"src/debug.js" | |||
], | |||
"dependencies": { | |||
"rauchg/ms.js": "0.7.1" | |||
} | |||
} |
@@ -0,0 +1,70 @@ | |||
// Karma configuration | |||
// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) | |||
module.exports = function(config) { | |||
config.set({ | |||
// base path that will be used to resolve all patterns (eg. files, exclude) | |||
basePath: '', | |||
// frameworks to use | |||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter | |||
frameworks: ['mocha', 'chai', 'sinon'], | |||
// list of files / patterns to load in the browser | |||
files: [ | |||
'dist/debug.js', | |||
'test/*spec.js' | |||
], | |||
// list of files to exclude | |||
exclude: [ | |||
'src/node.js' | |||
], | |||
// preprocess matching files before serving them to the browser | |||
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor | |||
preprocessors: { | |||
}, | |||
// test results reporter to use | |||
// possible values: 'dots', 'progress' | |||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter | |||
reporters: ['progress'], | |||
// web server port | |||
port: 9876, | |||
// enable / disable colors in the output (reporters and logs) | |||
colors: true, | |||
// level of logging | |||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG | |||
logLevel: config.LOG_INFO, | |||
// enable / disable watching file and executing tests whenever any file changes | |||
autoWatch: true, | |||
// start these browsers | |||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher | |||
browsers: ['PhantomJS'], | |||
// Continuous Integration mode | |||
// if true, Karma captures browsers, runs the tests and exits | |||
singleRun: false, | |||
// Concurrency level | |||
// how many browser should be started simultaneous | |||
concurrency: Infinity | |||
}) | |||
} |
@@ -0,0 +1 @@ | |||
module.exports = require('./src/node'); |
@@ -0,0 +1,91 @@ | |||
{ | |||
"_from": "debug@2.6.9", | |||
"_id": "debug@2.6.9", | |||
"_inBundle": false, | |||
"_integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | |||
"_location": "/debug", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "version", | |||
"registry": true, | |||
"raw": "debug@2.6.9", | |||
"name": "debug", | |||
"escapedName": "debug", | |||
"rawSpec": "2.6.9", | |||
"saveSpec": null, | |||
"fetchSpec": "2.6.9" | |||
}, | |||
"_requiredBy": [ | |||
"/body-parser", | |||
"/express", | |||
"/finalhandler", | |||
"/send" | |||
], | |||
"_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | |||
"_shasum": "5d128515df134ff327e90a4c93f4e077a536341f", | |||
"_spec": "debug@2.6.9", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"author": { | |||
"name": "TJ Holowaychuk", | |||
"email": "tj@vision-media.ca" | |||
}, | |||
"browser": "./src/browser.js", | |||
"bugs": { | |||
"url": "https://github.com/visionmedia/debug/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"component": { | |||
"scripts": { | |||
"debug/index.js": "browser.js", | |||
"debug/debug.js": "debug.js" | |||
} | |||
}, | |||
"contributors": [ | |||
{ | |||
"name": "Nathan Rajlich", | |||
"email": "nathan@tootallnate.net", | |||
"url": "http://n8.io" | |||
}, | |||
{ | |||
"name": "Andrew Rhyne", | |||
"email": "rhyneandrew@gmail.com" | |||
} | |||
], | |||
"dependencies": { | |||
"ms": "2.0.0" | |||
}, | |||
"deprecated": false, | |||
"description": "small debugging utility", | |||
"devDependencies": { | |||
"browserify": "9.0.3", | |||
"chai": "^3.5.0", | |||
"concurrently": "^3.1.0", | |||
"coveralls": "^2.11.15", | |||
"eslint": "^3.12.1", | |||
"istanbul": "^0.4.5", | |||
"karma": "^1.3.0", | |||
"karma-chai": "^0.1.0", | |||
"karma-mocha": "^1.3.0", | |||
"karma-phantomjs-launcher": "^1.0.2", | |||
"karma-sinon": "^1.0.5", | |||
"mocha": "^3.2.0", | |||
"mocha-lcov-reporter": "^1.2.0", | |||
"rimraf": "^2.5.4", | |||
"sinon": "^1.17.6", | |||
"sinon-chai": "^2.8.0" | |||
}, | |||
"homepage": "https://github.com/visionmedia/debug#readme", | |||
"keywords": [ | |||
"debug", | |||
"log", | |||
"debugger" | |||
], | |||
"license": "MIT", | |||
"main": "./src/index.js", | |||
"name": "debug", | |||
"repository": { | |||
"type": "git", | |||
"url": "git://github.com/visionmedia/debug.git" | |||
}, | |||
"version": "2.6.9" | |||
} |
@@ -0,0 +1,185 @@ | |||
/** | |||
* This is the web browser implementation of `debug()`. | |||
* | |||
* Expose `debug()` as the module. | |||
*/ | |||
exports = module.exports = require('./debug'); | |||
exports.log = log; | |||
exports.formatArgs = formatArgs; | |||
exports.save = save; | |||
exports.load = load; | |||
exports.useColors = useColors; | |||
exports.storage = 'undefined' != typeof chrome | |||
&& 'undefined' != typeof chrome.storage | |||
? chrome.storage.local | |||
: localstorage(); | |||
/** | |||
* Colors. | |||
*/ | |||
exports.colors = [ | |||
'lightseagreen', | |||
'forestgreen', | |||
'goldenrod', | |||
'dodgerblue', | |||
'darkorchid', | |||
'crimson' | |||
]; | |||
/** | |||
* Currently only WebKit-based Web Inspectors, Firefox >= v31, | |||
* and the Firebug extension (any Firefox version) are known | |||
* to support "%c" CSS customizations. | |||
* | |||
* TODO: add a `localStorage` variable to explicitly enable/disable colors | |||
*/ | |||
function useColors() { | |||
// NB: In an Electron preload script, document will be defined but not fully | |||
// initialized. Since we know we're in Chrome, we'll just detect this case | |||
// explicitly | |||
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { | |||
return true; | |||
} | |||
// is webkit? http://stackoverflow.com/a/16459606/376773 | |||
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 | |||
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || | |||
// is firebug? http://stackoverflow.com/a/398120/376773 | |||
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || | |||
// is firefox >= v31? | |||
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages | |||
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || | |||
// double check webkit in userAgent just in case we are in a worker | |||
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); | |||
} | |||
/** | |||
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. | |||
*/ | |||
exports.formatters.j = function(v) { | |||
try { | |||
return JSON.stringify(v); | |||
} catch (err) { | |||
return '[UnexpectedJSONParseError]: ' + err.message; | |||
} | |||
}; | |||
/** | |||
* Colorize log arguments if enabled. | |||
* | |||
* @api public | |||
*/ | |||
function formatArgs(args) { | |||
var useColors = this.useColors; | |||
args[0] = (useColors ? '%c' : '') | |||
+ this.namespace | |||
+ (useColors ? ' %c' : ' ') | |||
+ args[0] | |||
+ (useColors ? '%c ' : ' ') | |||
+ '+' + exports.humanize(this.diff); | |||
if (!useColors) return; | |||
var c = 'color: ' + this.color; | |||
args.splice(1, 0, c, 'color: inherit') | |||
// the final "%c" is somewhat tricky, because there could be other | |||
// arguments passed either before or after the %c, so we need to | |||
// figure out the correct index to insert the CSS into | |||
var index = 0; | |||
var lastC = 0; | |||
args[0].replace(/%[a-zA-Z%]/g, function(match) { | |||
if ('%%' === match) return; | |||
index++; | |||
if ('%c' === match) { | |||
// we only are interested in the *last* %c | |||
// (the user may have provided their own) | |||
lastC = index; | |||
} | |||
}); | |||
args.splice(lastC, 0, c); | |||
} | |||
/** | |||
* Invokes `console.log()` when available. | |||
* No-op when `console.log` is not a "function". | |||
* | |||
* @api public | |||
*/ | |||
function log() { | |||
// this hackery is required for IE8/9, where | |||
// the `console.log` function doesn't have 'apply' | |||
return 'object' === typeof console | |||
&& console.log | |||
&& Function.prototype.apply.call(console.log, console, arguments); | |||
} | |||
/** | |||
* Save `namespaces`. | |||
* | |||
* @param {String} namespaces | |||
* @api private | |||
*/ | |||
function save(namespaces) { | |||
try { | |||
if (null == namespaces) { | |||
exports.storage.removeItem('debug'); | |||
} else { | |||
exports.storage.debug = namespaces; | |||
} | |||
} catch(e) {} | |||
} | |||
/** | |||
* Load `namespaces`. | |||
* | |||
* @return {String} returns the previously persisted debug modes | |||
* @api private | |||
*/ | |||
function load() { | |||
var r; | |||
try { | |||
r = exports.storage.debug; | |||
} catch(e) {} | |||
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG | |||
if (!r && typeof process !== 'undefined' && 'env' in process) { | |||
r = process.env.DEBUG; | |||
} | |||
return r; | |||
} | |||
/** | |||
* Enable namespaces listed in `localStorage.debug` initially. | |||
*/ | |||
exports.enable(load()); | |||
/** | |||
* Localstorage attempts to return the localstorage. | |||
* | |||
* This is necessary because safari throws | |||
* when a user disables cookies/localstorage | |||
* and you attempt to access it. | |||
* | |||
* @return {LocalStorage} | |||
* @api private | |||
*/ | |||
function localstorage() { | |||
try { | |||
return window.localStorage; | |||
} catch (e) {} | |||
} |
@@ -0,0 +1,202 @@ | |||
/** | |||
* This is the common logic for both the Node.js and web browser | |||
* implementations of `debug()`. | |||
* | |||
* Expose `debug()` as the module. | |||
*/ | |||
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; | |||
exports.coerce = coerce; | |||
exports.disable = disable; | |||
exports.enable = enable; | |||
exports.enabled = enabled; | |||
exports.humanize = require('ms'); | |||
/** | |||
* The currently active debug mode names, and names to skip. | |||
*/ | |||
exports.names = []; | |||
exports.skips = []; | |||
/** | |||
* Map of special "%n" handling functions, for the debug "format" argument. | |||
* | |||
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". | |||
*/ | |||
exports.formatters = {}; | |||
/** | |||
* Previous log timestamp. | |||
*/ | |||
var prevTime; | |||
/** | |||
* Select a color. | |||
* @param {String} namespace | |||
* @return {Number} | |||
* @api private | |||
*/ | |||
function selectColor(namespace) { | |||
var hash = 0, i; | |||
for (i in namespace) { | |||
hash = ((hash << 5) - hash) + namespace.charCodeAt(i); | |||
hash |= 0; // Convert to 32bit integer | |||
} | |||
return exports.colors[Math.abs(hash) % exports.colors.length]; | |||
} | |||
/** | |||
* Create a debugger with the given `namespace`. | |||
* | |||
* @param {String} namespace | |||
* @return {Function} | |||
* @api public | |||
*/ | |||
function createDebug(namespace) { | |||
function debug() { | |||
// disabled? | |||
if (!debug.enabled) return; | |||
var self = debug; | |||
// set `diff` timestamp | |||
var curr = +new Date(); | |||
var ms = curr - (prevTime || curr); | |||
self.diff = ms; | |||
self.prev = prevTime; | |||
self.curr = curr; | |||
prevTime = curr; | |||
// turn the `arguments` into a proper Array | |||
var args = new Array(arguments.length); | |||
for (var i = 0; i < args.length; i++) { | |||
args[i] = arguments[i]; | |||
} | |||
args[0] = exports.coerce(args[0]); | |||
if ('string' !== typeof args[0]) { | |||
// anything else let's inspect with %O | |||
args.unshift('%O'); | |||
} | |||
// apply any `formatters` transformations | |||
var index = 0; | |||
args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { | |||
// if we encounter an escaped % then don't increase the array index | |||
if (match === '%%') return match; | |||
index++; | |||
var formatter = exports.formatters[format]; | |||
if ('function' === typeof formatter) { | |||
var val = args[index]; | |||
match = formatter.call(self, val); | |||
// now we need to remove `args[index]` since it's inlined in the `format` | |||
args.splice(index, 1); | |||
index--; | |||
} | |||
return match; | |||
}); | |||
// apply env-specific formatting (colors, etc.) | |||
exports.formatArgs.call(self, args); | |||
var logFn = debug.log || exports.log || console.log.bind(console); | |||
logFn.apply(self, args); | |||
} | |||
debug.namespace = namespace; | |||
debug.enabled = exports.enabled(namespace); | |||
debug.useColors = exports.useColors(); | |||
debug.color = selectColor(namespace); | |||
// env-specific initialization logic for debug instances | |||
if ('function' === typeof exports.init) { | |||
exports.init(debug); | |||
} | |||
return debug; | |||
} | |||
/** | |||
* Enables a debug mode by namespaces. This can include modes | |||
* separated by a colon and wildcards. | |||
* | |||
* @param {String} namespaces | |||
* @api public | |||
*/ | |||
function enable(namespaces) { | |||
exports.save(namespaces); | |||
exports.names = []; | |||
exports.skips = []; | |||
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); | |||
var len = split.length; | |||
for (var i = 0; i < len; i++) { | |||
if (!split[i]) continue; // ignore empty strings | |||
namespaces = split[i].replace(/\*/g, '.*?'); | |||
if (namespaces[0] === '-') { | |||
exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); | |||
} else { | |||
exports.names.push(new RegExp('^' + namespaces + '$')); | |||
} | |||
} | |||
} | |||
/** | |||
* Disable debug output. | |||
* | |||
* @api public | |||
*/ | |||
function disable() { | |||
exports.enable(''); | |||
} | |||
/** | |||
* Returns true if the given mode name is enabled, false otherwise. | |||
* | |||
* @param {String} name | |||
* @return {Boolean} | |||
* @api public | |||
*/ | |||
function enabled(name) { | |||
var i, len; | |||
for (i = 0, len = exports.skips.length; i < len; i++) { | |||
if (exports.skips[i].test(name)) { | |||
return false; | |||
} | |||
} | |||
for (i = 0, len = exports.names.length; i < len; i++) { | |||
if (exports.names[i].test(name)) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
/** | |||
* Coerce `val`. | |||
* | |||
* @param {Mixed} val | |||
* @return {Mixed} | |||
* @api private | |||
*/ | |||
function coerce(val) { | |||
if (val instanceof Error) return val.stack || val.message; | |||
return val; | |||
} |
@@ -0,0 +1,10 @@ | |||
/** | |||
* Detect Electron renderer process, which is node, but we should | |||
* treat as a browser. | |||
*/ | |||
if (typeof process !== 'undefined' && process.type === 'renderer') { | |||
module.exports = require('./browser.js'); | |||
} else { | |||
module.exports = require('./node.js'); | |||
} |
@@ -0,0 +1,15 @@ | |||
module.exports = inspectorLog; | |||
// black hole | |||
const nullStream = new (require('stream').Writable)(); | |||
nullStream._write = () => {}; | |||
/** | |||
* Outputs a `console.log()` to the Node.js Inspector console *only*. | |||
*/ | |||
function inspectorLog() { | |||
const stdout = console._stdout; | |||
console._stdout = nullStream; | |||
console.log.apply(console, arguments); | |||
console._stdout = stdout; | |||
} |
@@ -0,0 +1,248 @@ | |||
/** | |||
* Module dependencies. | |||
*/ | |||
var tty = require('tty'); | |||
var util = require('util'); | |||
/** | |||
* This is the Node.js implementation of `debug()`. | |||
* | |||
* Expose `debug()` as the module. | |||
*/ | |||
exports = module.exports = require('./debug'); | |||
exports.init = init; | |||
exports.log = log; | |||
exports.formatArgs = formatArgs; | |||
exports.save = save; | |||
exports.load = load; | |||
exports.useColors = useColors; | |||
/** | |||
* Colors. | |||
*/ | |||
exports.colors = [6, 2, 3, 4, 5, 1]; | |||
/** | |||
* Build up the default `inspectOpts` object from the environment variables. | |||
* | |||
* $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js | |||
*/ | |||
exports.inspectOpts = Object.keys(process.env).filter(function (key) { | |||
return /^debug_/i.test(key); | |||
}).reduce(function (obj, key) { | |||
// camel-case | |||
var prop = key | |||
.substring(6) | |||
.toLowerCase() | |||
.replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); | |||
// coerce string value into JS value | |||
var val = process.env[key]; | |||
if (/^(yes|on|true|enabled)$/i.test(val)) val = true; | |||
else if (/^(no|off|false|disabled)$/i.test(val)) val = false; | |||
else if (val === 'null') val = null; | |||
else val = Number(val); | |||
obj[prop] = val; | |||
return obj; | |||
}, {}); | |||
/** | |||
* The file descriptor to write the `debug()` calls to. | |||
* Set the `DEBUG_FD` env variable to override with another value. i.e.: | |||
* | |||
* $ DEBUG_FD=3 node script.js 3>debug.log | |||
*/ | |||
var fd = parseInt(process.env.DEBUG_FD, 10) || 2; | |||
if (1 !== fd && 2 !== fd) { | |||
util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() | |||
} | |||
var stream = 1 === fd ? process.stdout : | |||
2 === fd ? process.stderr : | |||
createWritableStdioStream(fd); | |||
/** | |||
* Is stdout a TTY? Colored output is enabled when `true`. | |||
*/ | |||
function useColors() { | |||
return 'colors' in exports.inspectOpts | |||
? Boolean(exports.inspectOpts.colors) | |||
: tty.isatty(fd); | |||
} | |||
/** | |||
* Map %o to `util.inspect()`, all on a single line. | |||
*/ | |||
exports.formatters.o = function(v) { | |||
this.inspectOpts.colors = this.useColors; | |||
return util.inspect(v, this.inspectOpts) | |||
.split('\n').map(function(str) { | |||
return str.trim() | |||
}).join(' '); | |||
}; | |||
/** | |||
* Map %o to `util.inspect()`, allowing multiple lines if needed. | |||
*/ | |||
exports.formatters.O = function(v) { | |||
this.inspectOpts.colors = this.useColors; | |||
return util.inspect(v, this.inspectOpts); | |||
}; | |||
/** | |||
* Adds ANSI color escape codes if enabled. | |||
* | |||
* @api public | |||
*/ | |||
function formatArgs(args) { | |||
var name = this.namespace; | |||
var useColors = this.useColors; | |||
if (useColors) { | |||
var c = this.color; | |||
var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; | |||
args[0] = prefix + args[0].split('\n').join('\n' + prefix); | |||
args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); | |||
} else { | |||
args[0] = new Date().toUTCString() | |||
+ ' ' + name + ' ' + args[0]; | |||
} | |||
} | |||
/** | |||
* Invokes `util.format()` with the specified arguments and writes to `stream`. | |||
*/ | |||
function log() { | |||
return stream.write(util.format.apply(util, arguments) + '\n'); | |||
} | |||
/** | |||
* Save `namespaces`. | |||
* | |||
* @param {String} namespaces | |||
* @api private | |||
*/ | |||
function save(namespaces) { | |||
if (null == namespaces) { | |||
// If you set a process.env field to null or undefined, it gets cast to the | |||
// string 'null' or 'undefined'. Just delete instead. | |||
delete process.env.DEBUG; | |||
} else { | |||
process.env.DEBUG = namespaces; | |||
} | |||
} | |||
/** | |||
* Load `namespaces`. | |||
* | |||
* @return {String} returns the previously persisted debug modes | |||
* @api private | |||
*/ | |||
function load() { | |||
return process.env.DEBUG; | |||
} | |||
/** | |||
* Copied from `node/src/node.js`. | |||
* | |||
* XXX: It's lame that node doesn't expose this API out-of-the-box. It also | |||
* relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. | |||
*/ | |||
function createWritableStdioStream (fd) { | |||
var stream; | |||
var tty_wrap = process.binding('tty_wrap'); | |||
// Note stream._type is used for test-module-load-list.js | |||
switch (tty_wrap.guessHandleType(fd)) { | |||
case 'TTY': | |||
stream = new tty.WriteStream(fd); | |||
stream._type = 'tty'; | |||
// Hack to have stream not keep the event loop alive. | |||
// See https://github.com/joyent/node/issues/1726 | |||
if (stream._handle && stream._handle.unref) { | |||
stream._handle.unref(); | |||
} | |||
break; | |||
case 'FILE': | |||
var fs = require('fs'); | |||
stream = new fs.SyncWriteStream(fd, { autoClose: false }); | |||
stream._type = 'fs'; | |||
break; | |||
case 'PIPE': | |||
case 'TCP': | |||
var net = require('net'); | |||
stream = new net.Socket({ | |||
fd: fd, | |||
readable: false, | |||
writable: true | |||
}); | |||
// FIXME Should probably have an option in net.Socket to create a | |||
// stream from an existing fd which is writable only. But for now | |||
// we'll just add this hack and set the `readable` member to false. | |||
// Test: ./node test/fixtures/echo.js < /etc/passwd | |||
stream.readable = false; | |||
stream.read = null; | |||
stream._type = 'pipe'; | |||
// FIXME Hack to have stream not keep the event loop alive. | |||
// See https://github.com/joyent/node/issues/1726 | |||
if (stream._handle && stream._handle.unref) { | |||
stream._handle.unref(); | |||
} | |||
break; | |||
default: | |||
// Probably an error on in uv_guess_handle() | |||
throw new Error('Implement me. Unknown stream file type!'); | |||
} | |||
// For supporting legacy API we put the FD here. | |||
stream.fd = fd; | |||
stream._isStdio = true; | |||
return stream; | |||
} | |||
/** | |||
* Init logic for `debug` instances. | |||
* | |||
* Create a new `inspectOpts` object in case `useColors` is set | |||
* differently for a particular `debug` instance. | |||
*/ | |||
function init (debug) { | |||
debug.inspectOpts = {}; | |||
var keys = Object.keys(exports.inspectOpts); | |||
for (var i = 0; i < keys.length; i++) { | |||
debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; | |||
} | |||
} | |||
/** | |||
* Enable namespaces listed in `process.env.DEBUG` initially. | |||
*/ | |||
exports.enable(load()); |
@@ -0,0 +1,96 @@ | |||
1.1.2 / 2018-01-11 | |||
================== | |||
* perf: remove argument reassignment | |||
* Support Node.js 0.6 to 9.x | |||
1.1.1 / 2017-07-27 | |||
================== | |||
* Remove unnecessary `Buffer` loading | |||
* Support Node.js 0.6 to 8.x | |||
1.1.0 / 2015-09-14 | |||
================== | |||
* Enable strict mode in more places | |||
* Support io.js 3.x | |||
* Support io.js 2.x | |||
* Support web browser loading | |||
- Requires bundler like Browserify or webpack | |||
1.0.1 / 2015-04-07 | |||
================== | |||
* Fix `TypeError`s when under `'use strict'` code | |||
* Fix useless type name on auto-generated messages | |||
* Support io.js 1.x | |||
* Support Node.js 0.12 | |||
1.0.0 / 2014-09-17 | |||
================== | |||
* No changes | |||
0.4.5 / 2014-09-09 | |||
================== | |||
* Improve call speed to functions using the function wrapper | |||
* Support Node.js 0.6 | |||
0.4.4 / 2014-07-27 | |||
================== | |||
* Work-around v8 generating empty stack traces | |||
0.4.3 / 2014-07-26 | |||
================== | |||
* Fix exception when global `Error.stackTraceLimit` is too low | |||
0.4.2 / 2014-07-19 | |||
================== | |||
* Correct call site for wrapped functions and properties | |||
0.4.1 / 2014-07-19 | |||
================== | |||
* Improve automatic message generation for function properties | |||
0.4.0 / 2014-07-19 | |||
================== | |||
* Add `TRACE_DEPRECATION` environment variable | |||
* Remove non-standard grey color from color output | |||
* Support `--no-deprecation` argument | |||
* Support `--trace-deprecation` argument | |||
* Support `deprecate.property(fn, prop, message)` | |||
0.3.0 / 2014-06-16 | |||
================== | |||
* Add `NO_DEPRECATION` environment variable | |||
0.2.0 / 2014-06-15 | |||
================== | |||
* Add `deprecate.property(obj, prop, message)` | |||
* Remove `supports-color` dependency for node.js 0.8 | |||
0.1.0 / 2014-06-15 | |||
================== | |||
* Add `deprecate.function(fn, message)` | |||
* Add `process.on('deprecation', fn)` emitter | |||
* Automatically generate message when omitted from `deprecate()` | |||
0.0.1 / 2014-06-15 | |||
================== | |||
* Fix warning for dynamic calls at singe call site | |||
0.0.0 / 2014-06-15 | |||
================== | |||
* Initial implementation |
@@ -0,0 +1,22 @@ | |||
(The MIT License) | |||
Copyright (c) 2014-2017 Douglas Christopher Wilson | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
'Software'), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@@ -0,0 +1,280 @@ | |||
# depd | |||
[![NPM Version][npm-version-image]][npm-url] | |||
[![NPM Downloads][npm-downloads-image]][npm-url] | |||
[![Node.js Version][node-image]][node-url] | |||
[![Linux Build][travis-image]][travis-url] | |||
[![Windows Build][appveyor-image]][appveyor-url] | |||
[![Coverage Status][coveralls-image]][coveralls-url] | |||
Deprecate all the things | |||
> With great modules comes great responsibility; mark things deprecated! | |||
## Install | |||
This module is installed directly using `npm`: | |||
```sh | |||
$ npm install depd | |||
``` | |||
This module can also be bundled with systems like | |||
[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/), | |||
though by default this module will alter it's API to no longer display or | |||
track deprecations. | |||
## API | |||
<!-- eslint-disable no-unused-vars --> | |||
```js | |||
var deprecate = require('depd')('my-module') | |||
``` | |||
This library allows you to display deprecation messages to your users. | |||
This library goes above and beyond with deprecation warnings by | |||
introspection of the call stack (but only the bits that it is interested | |||
in). | |||
Instead of just warning on the first invocation of a deprecated | |||
function and never again, this module will warn on the first invocation | |||
of a deprecated function per unique call site, making it ideal to alert | |||
users of all deprecated uses across the code base, rather than just | |||
whatever happens to execute first. | |||
The deprecation warnings from this module also include the file and line | |||
information for the call into the module that the deprecated function was | |||
in. | |||
**NOTE** this library has a similar interface to the `debug` module, and | |||
this module uses the calling file to get the boundary for the call stacks, | |||
so you should always create a new `deprecate` object in each file and not | |||
within some central file. | |||
### depd(namespace) | |||
Create a new deprecate function that uses the given namespace name in the | |||
messages and will display the call site prior to the stack entering the | |||
file this function was called from. It is highly suggested you use the | |||
name of your module as the namespace. | |||
### deprecate(message) | |||
Call this function from deprecated code to display a deprecation message. | |||
This message will appear once per unique caller site. Caller site is the | |||
first call site in the stack in a different file from the caller of this | |||
function. | |||
If the message is omitted, a message is generated for you based on the site | |||
of the `deprecate()` call and will display the name of the function called, | |||
similar to the name displayed in a stack trace. | |||
### deprecate.function(fn, message) | |||
Call this function to wrap a given function in a deprecation message on any | |||
call to the function. An optional message can be supplied to provide a custom | |||
message. | |||
### deprecate.property(obj, prop, message) | |||
Call this function to wrap a given property on object in a deprecation message | |||
on any accessing or setting of the property. An optional message can be supplied | |||
to provide a custom message. | |||
The method must be called on the object where the property belongs (not | |||
inherited from the prototype). | |||
If the property is a data descriptor, it will be converted to an accessor | |||
descriptor in order to display the deprecation message. | |||
### process.on('deprecation', fn) | |||
This module will allow easy capturing of deprecation errors by emitting the | |||
errors as the type "deprecation" on the global `process`. If there are no | |||
listeners for this type, the errors are written to STDERR as normal, but if | |||
there are any listeners, nothing will be written to STDERR and instead only | |||
emitted. From there, you can write the errors in a different format or to a | |||
logging source. | |||
The error represents the deprecation and is emitted only once with the same | |||
rules as writing to STDERR. The error has the following properties: | |||
- `message` - This is the message given by the library | |||
- `name` - This is always `'DeprecationError'` | |||
- `namespace` - This is the namespace the deprecation came from | |||
- `stack` - This is the stack of the call to the deprecated thing | |||
Example `error.stack` output: | |||
``` | |||
DeprecationError: my-cool-module deprecated oldfunction | |||
at Object.<anonymous> ([eval]-wrapper:6:22) | |||
at Module._compile (module.js:456:26) | |||
at evalScript (node.js:532:25) | |||
at startup (node.js:80:7) | |||
at node.js:902:3 | |||
``` | |||
### process.env.NO_DEPRECATION | |||
As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` | |||
is provided as a quick solution to silencing deprecation warnings from being | |||
output. The format of this is similar to that of `DEBUG`: | |||
```sh | |||
$ NO_DEPRECATION=my-module,othermod node app.js | |||
``` | |||
This will suppress deprecations from being output for "my-module" and "othermod". | |||
The value is a list of comma-separated namespaces. To suppress every warning | |||
across all namespaces, use the value `*` for a namespace. | |||
Providing the argument `--no-deprecation` to the `node` executable will suppress | |||
all deprecations (only available in Node.js 0.8 or higher). | |||
**NOTE** This will not suppress the deperecations given to any "deprecation" | |||
event listeners, just the output to STDERR. | |||
### process.env.TRACE_DEPRECATION | |||
As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` | |||
is provided as a solution to getting more detailed location information in deprecation | |||
warnings by including the entire stack trace. The format of this is the same as | |||
`NO_DEPRECATION`: | |||
```sh | |||
$ TRACE_DEPRECATION=my-module,othermod node app.js | |||
``` | |||
This will include stack traces for deprecations being output for "my-module" and | |||
"othermod". The value is a list of comma-separated namespaces. To trace every | |||
warning across all namespaces, use the value `*` for a namespace. | |||
Providing the argument `--trace-deprecation` to the `node` executable will trace | |||
all deprecations (only available in Node.js 0.8 or higher). | |||
**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. | |||
## Display | |||
![message](files/message.png) | |||
When a user calls a function in your library that you mark deprecated, they | |||
will see the following written to STDERR (in the given colors, similar colors | |||
and layout to the `debug` module): | |||
``` | |||
bright cyan bright yellow | |||
| | reset cyan | |||
| | | | | |||
▼ ▼ ▼ ▼ | |||
my-cool-module deprecated oldfunction [eval]-wrapper:6:22 | |||
▲ ▲ ▲ ▲ | |||
| | | | | |||
namespace | | location of mycoolmod.oldfunction() call | |||
| deprecation message | |||
the word "deprecated" | |||
``` | |||
If the user redirects their STDERR to a file or somewhere that does not support | |||
colors, they see (similar layout to the `debug` module): | |||
``` | |||
Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 | |||
▲ ▲ ▲ ▲ ▲ | |||
| | | | | | |||
timestamp of message namespace | | location of mycoolmod.oldfunction() call | |||
| deprecation message | |||
the word "deprecated" | |||
``` | |||
## Examples | |||
### Deprecating all calls to a function | |||
This will display a deprecated message about "oldfunction" being deprecated | |||
from "my-module" on STDERR. | |||
```js | |||
var deprecate = require('depd')('my-cool-module') | |||
// message automatically derived from function name | |||
// Object.oldfunction | |||
exports.oldfunction = deprecate.function(function oldfunction () { | |||
// all calls to function are deprecated | |||
}) | |||
// specific message | |||
exports.oldfunction = deprecate.function(function () { | |||
// all calls to function are deprecated | |||
}, 'oldfunction') | |||
``` | |||
### Conditionally deprecating a function call | |||
This will display a deprecated message about "weirdfunction" being deprecated | |||
from "my-module" on STDERR when called with less than 2 arguments. | |||
```js | |||
var deprecate = require('depd')('my-cool-module') | |||
exports.weirdfunction = function () { | |||
if (arguments.length < 2) { | |||
// calls with 0 or 1 args are deprecated | |||
deprecate('weirdfunction args < 2') | |||
} | |||
} | |||
``` | |||
When calling `deprecate` as a function, the warning is counted per call site | |||
within your own module, so you can display different deprecations depending | |||
on different situations and the users will still get all the warnings: | |||
```js | |||
var deprecate = require('depd')('my-cool-module') | |||
exports.weirdfunction = function () { | |||
if (arguments.length < 2) { | |||
// calls with 0 or 1 args are deprecated | |||
deprecate('weirdfunction args < 2') | |||
} else if (typeof arguments[0] !== 'string') { | |||
// calls with non-string first argument are deprecated | |||
deprecate('weirdfunction non-string first arg') | |||
} | |||
} | |||
``` | |||
### Deprecating property access | |||
This will display a deprecated message about "oldprop" being deprecated | |||
from "my-module" on STDERR when accessed. A deprecation will be displayed | |||
when setting the value and when getting the value. | |||
```js | |||
var deprecate = require('depd')('my-cool-module') | |||
exports.oldprop = 'something' | |||
// message automatically derives from property name | |||
deprecate.property(exports, 'oldprop') | |||
// explicit message | |||
deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') | |||
``` | |||
## License | |||
[MIT](LICENSE) | |||
[npm-version-image]: https://img.shields.io/npm/v/depd.svg | |||
[npm-downloads-image]: https://img.shields.io/npm/dm/depd.svg | |||
[npm-url]: https://npmjs.org/package/depd | |||
[travis-image]: https://img.shields.io/travis/dougwilson/nodejs-depd/master.svg?label=linux | |||
[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd | |||
[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/nodejs-depd/master.svg?label=windows | |||
[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd | |||
[coveralls-image]: https://img.shields.io/coveralls/dougwilson/nodejs-depd/master.svg | |||
[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master | |||
[node-image]: https://img.shields.io/node/v/depd.svg | |||
[node-url]: https://nodejs.org/en/download/ |
@@ -0,0 +1,522 @@ | |||
/*! | |||
* depd | |||
* Copyright(c) 2014-2017 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
/** | |||
* Module dependencies. | |||
*/ | |||
var callSiteToString = require('./lib/compat').callSiteToString | |||
var eventListenerCount = require('./lib/compat').eventListenerCount | |||
var relative = require('path').relative | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = depd | |||
/** | |||
* Get the path to base files on. | |||
*/ | |||
var basePath = process.cwd() | |||
/** | |||
* Determine if namespace is contained in the string. | |||
*/ | |||
function containsNamespace (str, namespace) { | |||
var vals = str.split(/[ ,]+/) | |||
var ns = String(namespace).toLowerCase() | |||
for (var i = 0; i < vals.length; i++) { | |||
var val = vals[i] | |||
// namespace contained | |||
if (val && (val === '*' || val.toLowerCase() === ns)) { | |||
return true | |||
} | |||
} | |||
return false | |||
} | |||
/** | |||
* Convert a data descriptor to accessor descriptor. | |||
*/ | |||
function convertDataDescriptorToAccessor (obj, prop, message) { | |||
var descriptor = Object.getOwnPropertyDescriptor(obj, prop) | |||
var value = descriptor.value | |||
descriptor.get = function getter () { return value } | |||
if (descriptor.writable) { | |||
descriptor.set = function setter (val) { return (value = val) } | |||
} | |||
delete descriptor.value | |||
delete descriptor.writable | |||
Object.defineProperty(obj, prop, descriptor) | |||
return descriptor | |||
} | |||
/** | |||
* Create arguments string to keep arity. | |||
*/ | |||
function createArgumentsString (arity) { | |||
var str = '' | |||
for (var i = 0; i < arity; i++) { | |||
str += ', arg' + i | |||
} | |||
return str.substr(2) | |||
} | |||
/** | |||
* Create stack string from stack. | |||
*/ | |||
function createStackString (stack) { | |||
var str = this.name + ': ' + this.namespace | |||
if (this.message) { | |||
str += ' deprecated ' + this.message | |||
} | |||
for (var i = 0; i < stack.length; i++) { | |||
str += '\n at ' + callSiteToString(stack[i]) | |||
} | |||
return str | |||
} | |||
/** | |||
* Create deprecate for namespace in caller. | |||
*/ | |||
function depd (namespace) { | |||
if (!namespace) { | |||
throw new TypeError('argument namespace is required') | |||
} | |||
var stack = getStack() | |||
var site = callSiteLocation(stack[1]) | |||
var file = site[0] | |||
function deprecate (message) { | |||
// call to self as log | |||
log.call(deprecate, message) | |||
} | |||
deprecate._file = file | |||
deprecate._ignored = isignored(namespace) | |||
deprecate._namespace = namespace | |||
deprecate._traced = istraced(namespace) | |||
deprecate._warned = Object.create(null) | |||
deprecate.function = wrapfunction | |||
deprecate.property = wrapproperty | |||
return deprecate | |||
} | |||
/** | |||
* Determine if namespace is ignored. | |||
*/ | |||
function isignored (namespace) { | |||
/* istanbul ignore next: tested in a child processs */ | |||
if (process.noDeprecation) { | |||
// --no-deprecation support | |||
return true | |||
} | |||
var str = process.env.NO_DEPRECATION || '' | |||
// namespace ignored | |||
return containsNamespace(str, namespace) | |||
} | |||
/** | |||
* Determine if namespace is traced. | |||
*/ | |||
function istraced (namespace) { | |||
/* istanbul ignore next: tested in a child processs */ | |||
if (process.traceDeprecation) { | |||
// --trace-deprecation support | |||
return true | |||
} | |||
var str = process.env.TRACE_DEPRECATION || '' | |||
// namespace traced | |||
return containsNamespace(str, namespace) | |||
} | |||
/** | |||
* Display deprecation message. | |||
*/ | |||
function log (message, site) { | |||
var haslisteners = eventListenerCount(process, 'deprecation') !== 0 | |||
// abort early if no destination | |||
if (!haslisteners && this._ignored) { | |||
return | |||
} | |||
var caller | |||
var callFile | |||
var callSite | |||
var depSite | |||
var i = 0 | |||
var seen = false | |||
var stack = getStack() | |||
var file = this._file | |||
if (site) { | |||
// provided site | |||
depSite = site | |||
callSite = callSiteLocation(stack[1]) | |||
callSite.name = depSite.name | |||
file = callSite[0] | |||
} else { | |||
// get call site | |||
i = 2 | |||
depSite = callSiteLocation(stack[i]) | |||
callSite = depSite | |||
} | |||
// get caller of deprecated thing in relation to file | |||
for (; i < stack.length; i++) { | |||
caller = callSiteLocation(stack[i]) | |||
callFile = caller[0] | |||
if (callFile === file) { | |||
seen = true | |||
} else if (callFile === this._file) { | |||
file = this._file | |||
} else if (seen) { | |||
break | |||
} | |||
} | |||
var key = caller | |||
? depSite.join(':') + '__' + caller.join(':') | |||
: undefined | |||
if (key !== undefined && key in this._warned) { | |||
// already warned | |||
return | |||
} | |||
this._warned[key] = true | |||
// generate automatic message from call site | |||
var msg = message | |||
if (!msg) { | |||
msg = callSite === depSite || !callSite.name | |||
? defaultMessage(depSite) | |||
: defaultMessage(callSite) | |||
} | |||
// emit deprecation if listeners exist | |||
if (haslisteners) { | |||
var err = DeprecationError(this._namespace, msg, stack.slice(i)) | |||
process.emit('deprecation', err) | |||
return | |||
} | |||
// format and write message | |||
var format = process.stderr.isTTY | |||
? formatColor | |||
: formatPlain | |||
var output = format.call(this, msg, caller, stack.slice(i)) | |||
process.stderr.write(output + '\n', 'utf8') | |||
} | |||
/** | |||
* Get call site location as array. | |||
*/ | |||
function callSiteLocation (callSite) { | |||
var file = callSite.getFileName() || '<anonymous>' | |||
var line = callSite.getLineNumber() | |||
var colm = callSite.getColumnNumber() | |||
if (callSite.isEval()) { | |||
file = callSite.getEvalOrigin() + ', ' + file | |||
} | |||
var site = [file, line, colm] | |||
site.callSite = callSite | |||
site.name = callSite.getFunctionName() | |||
return site | |||
} | |||
/** | |||
* Generate a default message from the site. | |||
*/ | |||
function defaultMessage (site) { | |||
var callSite = site.callSite | |||
var funcName = site.name | |||
// make useful anonymous name | |||
if (!funcName) { | |||
funcName = '<anonymous@' + formatLocation(site) + '>' | |||
} | |||
var context = callSite.getThis() | |||
var typeName = context && callSite.getTypeName() | |||
// ignore useless type name | |||
if (typeName === 'Object') { | |||
typeName = undefined | |||
} | |||
// make useful type name | |||
if (typeName === 'Function') { | |||
typeName = context.name || typeName | |||
} | |||
return typeName && callSite.getMethodName() | |||
? typeName + '.' + funcName | |||
: funcName | |||
} | |||
/** | |||
* Format deprecation message without color. | |||
*/ | |||
function formatPlain (msg, caller, stack) { | |||
var timestamp = new Date().toUTCString() | |||
var formatted = timestamp + | |||
' ' + this._namespace + | |||
' deprecated ' + msg | |||
// add stack trace | |||
if (this._traced) { | |||
for (var i = 0; i < stack.length; i++) { | |||
formatted += '\n at ' + callSiteToString(stack[i]) | |||
} | |||
return formatted | |||
} | |||
if (caller) { | |||
formatted += ' at ' + formatLocation(caller) | |||
} | |||
return formatted | |||
} | |||
/** | |||
* Format deprecation message with color. | |||
*/ | |||
function formatColor (msg, caller, stack) { | |||
var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan | |||
' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow | |||
' \x1b[0m' + msg + '\x1b[39m' // reset | |||
// add stack trace | |||
if (this._traced) { | |||
for (var i = 0; i < stack.length; i++) { | |||
formatted += '\n \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan | |||
} | |||
return formatted | |||
} | |||
if (caller) { | |||
formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan | |||
} | |||
return formatted | |||
} | |||
/** | |||
* Format call site location. | |||
*/ | |||
function formatLocation (callSite) { | |||
return relative(basePath, callSite[0]) + | |||
':' + callSite[1] + | |||
':' + callSite[2] | |||
} | |||
/** | |||
* Get the stack as array of call sites. | |||
*/ | |||
function getStack () { | |||
var limit = Error.stackTraceLimit | |||
var obj = {} | |||
var prep = Error.prepareStackTrace | |||
Error.prepareStackTrace = prepareObjectStackTrace | |||
Error.stackTraceLimit = Math.max(10, limit) | |||
// capture the stack | |||
Error.captureStackTrace(obj) | |||
// slice this function off the top | |||
var stack = obj.stack.slice(1) | |||
Error.prepareStackTrace = prep | |||
Error.stackTraceLimit = limit | |||
return stack | |||
} | |||
/** | |||
* Capture call site stack from v8. | |||
*/ | |||
function prepareObjectStackTrace (obj, stack) { | |||
return stack | |||
} | |||
/** | |||
* Return a wrapped function in a deprecation message. | |||
*/ | |||
function wrapfunction (fn, message) { | |||
if (typeof fn !== 'function') { | |||
throw new TypeError('argument fn must be a function') | |||
} | |||
var args = createArgumentsString(fn.length) | |||
var deprecate = this // eslint-disable-line no-unused-vars | |||
var stack = getStack() | |||
var site = callSiteLocation(stack[1]) | |||
site.name = fn.name | |||
// eslint-disable-next-line no-eval | |||
var deprecatedfn = eval('(function (' + args + ') {\n' + | |||
'"use strict"\n' + | |||
'log.call(deprecate, message, site)\n' + | |||
'return fn.apply(this, arguments)\n' + | |||
'})') | |||
return deprecatedfn | |||
} | |||
/** | |||
* Wrap property in a deprecation message. | |||
*/ | |||
function wrapproperty (obj, prop, message) { | |||
if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { | |||
throw new TypeError('argument obj must be object') | |||
} | |||
var descriptor = Object.getOwnPropertyDescriptor(obj, prop) | |||
if (!descriptor) { | |||
throw new TypeError('must call property on owner object') | |||
} | |||
if (!descriptor.configurable) { | |||
throw new TypeError('property must be configurable') | |||
} | |||
var deprecate = this | |||
var stack = getStack() | |||
var site = callSiteLocation(stack[1]) | |||
// set site name | |||
site.name = prop | |||
// convert data descriptor | |||
if ('value' in descriptor) { | |||
descriptor = convertDataDescriptorToAccessor(obj, prop, message) | |||
} | |||
var get = descriptor.get | |||
var set = descriptor.set | |||
// wrap getter | |||
if (typeof get === 'function') { | |||
descriptor.get = function getter () { | |||
log.call(deprecate, message, site) | |||
return get.apply(this, arguments) | |||
} | |||
} | |||
// wrap setter | |||
if (typeof set === 'function') { | |||
descriptor.set = function setter () { | |||
log.call(deprecate, message, site) | |||
return set.apply(this, arguments) | |||
} | |||
} | |||
Object.defineProperty(obj, prop, descriptor) | |||
} | |||
/** | |||
* Create DeprecationError for deprecation | |||
*/ | |||
function DeprecationError (namespace, message, stack) { | |||
var error = new Error() | |||
var stackString | |||
Object.defineProperty(error, 'constructor', { | |||
value: DeprecationError | |||
}) | |||
Object.defineProperty(error, 'message', { | |||
configurable: true, | |||
enumerable: false, | |||
value: message, | |||
writable: true | |||
}) | |||
Object.defineProperty(error, 'name', { | |||
enumerable: false, | |||
configurable: true, | |||
value: 'DeprecationError', | |||
writable: true | |||
}) | |||
Object.defineProperty(error, 'namespace', { | |||
configurable: true, | |||
enumerable: false, | |||
value: namespace, | |||
writable: true | |||
}) | |||
Object.defineProperty(error, 'stack', { | |||
configurable: true, | |||
enumerable: false, | |||
get: function () { | |||
if (stackString !== undefined) { | |||
return stackString | |||
} | |||
// prepare stack trace | |||
return (stackString = createStackString.call(this, stack)) | |||
}, | |||
set: function setter (val) { | |||
stackString = val | |||
} | |||
}) | |||
return error | |||
} |
@@ -0,0 +1,77 @@ | |||
/*! | |||
* depd | |||
* Copyright(c) 2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
module.exports = depd | |||
/** | |||
* Create deprecate for namespace in caller. | |||
*/ | |||
function depd (namespace) { | |||
if (!namespace) { | |||
throw new TypeError('argument namespace is required') | |||
} | |||
function deprecate (message) { | |||
// no-op in browser | |||
} | |||
deprecate._file = undefined | |||
deprecate._ignored = true | |||
deprecate._namespace = namespace | |||
deprecate._traced = false | |||
deprecate._warned = Object.create(null) | |||
deprecate.function = wrapfunction | |||
deprecate.property = wrapproperty | |||
return deprecate | |||
} | |||
/** | |||
* Return a wrapped function in a deprecation message. | |||
* | |||
* This is a no-op version of the wrapper, which does nothing but call | |||
* validation. | |||
*/ | |||
function wrapfunction (fn, message) { | |||
if (typeof fn !== 'function') { | |||
throw new TypeError('argument fn must be a function') | |||
} | |||
return fn | |||
} | |||
/** | |||
* Wrap property in a deprecation message. | |||
* | |||
* This is a no-op version of the wrapper, which does nothing but call | |||
* validation. | |||
*/ | |||
function wrapproperty (obj, prop, message) { | |||
if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { | |||
throw new TypeError('argument obj must be object') | |||
} | |||
var descriptor = Object.getOwnPropertyDescriptor(obj, prop) | |||
if (!descriptor) { | |||
throw new TypeError('must call property on owner object') | |||
} | |||
if (!descriptor.configurable) { | |||
throw new TypeError('property must be configurable') | |||
} | |||
} |
@@ -0,0 +1,103 @@ | |||
/*! | |||
* depd | |||
* Copyright(c) 2014 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module exports. | |||
*/ | |||
module.exports = callSiteToString | |||
/** | |||
* Format a CallSite file location to a string. | |||
*/ | |||
function callSiteFileLocation (callSite) { | |||
var fileName | |||
var fileLocation = '' | |||
if (callSite.isNative()) { | |||
fileLocation = 'native' | |||
} else if (callSite.isEval()) { | |||
fileName = callSite.getScriptNameOrSourceURL() | |||
if (!fileName) { | |||
fileLocation = callSite.getEvalOrigin() | |||
} | |||
} else { | |||
fileName = callSite.getFileName() | |||
} | |||
if (fileName) { | |||
fileLocation += fileName | |||
var lineNumber = callSite.getLineNumber() | |||
if (lineNumber != null) { | |||
fileLocation += ':' + lineNumber | |||
var columnNumber = callSite.getColumnNumber() | |||
if (columnNumber) { | |||
fileLocation += ':' + columnNumber | |||
} | |||
} | |||
} | |||
return fileLocation || 'unknown source' | |||
} | |||
/** | |||
* Format a CallSite to a string. | |||
*/ | |||
function callSiteToString (callSite) { | |||
var addSuffix = true | |||
var fileLocation = callSiteFileLocation(callSite) | |||
var functionName = callSite.getFunctionName() | |||
var isConstructor = callSite.isConstructor() | |||
var isMethodCall = !(callSite.isToplevel() || isConstructor) | |||
var line = '' | |||
if (isMethodCall) { | |||
var methodName = callSite.getMethodName() | |||
var typeName = getConstructorName(callSite) | |||
if (functionName) { | |||
if (typeName && functionName.indexOf(typeName) !== 0) { | |||
line += typeName + '.' | |||
} | |||
line += functionName | |||
if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) { | |||
line += ' [as ' + methodName + ']' | |||
} | |||
} else { | |||
line += typeName + '.' + (methodName || '<anonymous>') | |||
} | |||
} else if (isConstructor) { | |||
line += 'new ' + (functionName || '<anonymous>') | |||
} else if (functionName) { | |||
line += functionName | |||
} else { | |||
addSuffix = false | |||
line += fileLocation | |||
} | |||
if (addSuffix) { | |||
line += ' (' + fileLocation + ')' | |||
} | |||
return line | |||
} | |||
/** | |||
* Get constructor name of reviver. | |||
*/ | |||
function getConstructorName (obj) { | |||
var receiver = obj.receiver | |||
return (receiver.constructor && receiver.constructor.name) || null | |||
} |
@@ -0,0 +1,22 @@ | |||
/*! | |||
* depd | |||
* Copyright(c) 2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
module.exports = eventListenerCount | |||
/** | |||
* Get the count of listeners on an event emitter of a specific type. | |||
*/ | |||
function eventListenerCount (emitter, type) { | |||
return emitter.listeners(type).length | |||
} |
@@ -0,0 +1,79 @@ | |||
/*! | |||
* depd | |||
* Copyright(c) 2014-2015 Douglas Christopher Wilson | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var EventEmitter = require('events').EventEmitter | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
lazyProperty(module.exports, 'callSiteToString', function callSiteToString () { | |||
var limit = Error.stackTraceLimit | |||
var obj = {} | |||
var prep = Error.prepareStackTrace | |||
function prepareObjectStackTrace (obj, stack) { | |||
return stack | |||
} | |||
Error.prepareStackTrace = prepareObjectStackTrace | |||
Error.stackTraceLimit = 2 | |||
// capture the stack | |||
Error.captureStackTrace(obj) | |||
// slice the stack | |||
var stack = obj.stack.slice() | |||
Error.prepareStackTrace = prep | |||
Error.stackTraceLimit = limit | |||
return stack[0].toString ? toString : require('./callsite-tostring') | |||
}) | |||
lazyProperty(module.exports, 'eventListenerCount', function eventListenerCount () { | |||
return EventEmitter.listenerCount || require('./event-listener-count') | |||
}) | |||
/** | |||
* Define a lazy property. | |||
*/ | |||
function lazyProperty (obj, prop, getter) { | |||
function get () { | |||
var val = getter() | |||
Object.defineProperty(obj, prop, { | |||
configurable: true, | |||
enumerable: true, | |||
value: val | |||
}) | |||
return val | |||
} | |||
Object.defineProperty(obj, prop, { | |||
configurable: true, | |||
enumerable: true, | |||
get: get | |||
}) | |||
} | |||
/** | |||
* Call toString() on the obj | |||
*/ | |||
function toString (obj) { | |||
return obj.toString() | |||
} |
@@ -0,0 +1,79 @@ | |||
{ | |||
"_from": "depd@~1.1.2", | |||
"_id": "depd@1.1.2", | |||
"_inBundle": false, | |||
"_integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", | |||
"_location": "/depd", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "range", | |||
"registry": true, | |||
"raw": "depd@~1.1.2", | |||
"name": "depd", | |||
"escapedName": "depd", | |||
"rawSpec": "~1.1.2", | |||
"saveSpec": null, | |||
"fetchSpec": "~1.1.2" | |||
}, | |||
"_requiredBy": [ | |||
"/body-parser", | |||
"/express", | |||
"/http-errors", | |||
"/send" | |||
], | |||
"_resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", | |||
"_shasum": "9bcd52e14c097763e749b274c4346ed2e560b5a9", | |||
"_spec": "depd@~1.1.2", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express", | |||
"author": { | |||
"name": "Douglas Christopher Wilson", | |||
"email": "doug@somethingdoug.com" | |||
}, | |||
"browser": "lib/browser/index.js", | |||
"bugs": { | |||
"url": "https://github.com/dougwilson/nodejs-depd/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"deprecated": false, | |||
"description": "Deprecate all the things", | |||
"devDependencies": { | |||
"beautify-benchmark": "0.2.4", | |||
"benchmark": "2.1.4", | |||
"eslint": "3.19.0", | |||
"eslint-config-standard": "7.1.0", | |||
"eslint-plugin-markdown": "1.0.0-beta.7", | |||
"eslint-plugin-promise": "3.6.0", | |||
"eslint-plugin-standard": "3.0.1", | |||
"istanbul": "0.4.5", | |||
"mocha": "~1.21.5" | |||
}, | |||
"engines": { | |||
"node": ">= 0.6" | |||
}, | |||
"files": [ | |||
"lib/", | |||
"History.md", | |||
"LICENSE", | |||
"index.js", | |||
"Readme.md" | |||
], | |||
"homepage": "https://github.com/dougwilson/nodejs-depd#readme", | |||
"keywords": [ | |||
"deprecate", | |||
"deprecated" | |||
], | |||
"license": "MIT", | |||
"name": "depd", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/dougwilson/nodejs-depd.git" | |||
}, | |||
"scripts": { | |||
"bench": "node benchmark/index.js", | |||
"lint": "eslint --plugin markdown --ext js,md .", | |||
"test": "mocha --reporter spec --bail test/", | |||
"test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --no-exit test/", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/" | |||
}, | |||
"version": "1.1.2" | |||
} |
@@ -0,0 +1,22 @@ | |||
The MIT License (MIT) | |||
Copyright (c) 2014 Jonathan Ong me@jongleberry.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. |
@@ -0,0 +1,60 @@ | |||
# Destroy | |||
[![NPM version][npm-image]][npm-url] | |||
[![Build status][travis-image]][travis-url] | |||
[![Test coverage][coveralls-image]][coveralls-url] | |||
[![License][license-image]][license-url] | |||
[![Downloads][downloads-image]][downloads-url] | |||
[![Gittip][gittip-image]][gittip-url] | |||
Destroy a stream. | |||
This module is meant to ensure a stream gets destroyed, handling different APIs | |||
and Node.js bugs. | |||
## API | |||
```js | |||
var destroy = require('destroy') | |||
``` | |||
### destroy(stream) | |||
Destroy the given stream. In most cases, this is identical to a simple | |||
`stream.destroy()` call. The rules are as follows for a given stream: | |||
1. If the `stream` is an instance of `ReadStream`, then call `stream.destroy()` | |||
and add a listener to the `open` event to call `stream.close()` if it is | |||
fired. This is for a Node.js bug that will leak a file descriptor if | |||
`.destroy()` is called before `open`. | |||
2. If the `stream` is not an instance of `Stream`, then nothing happens. | |||
3. If the `stream` has a `.destroy()` method, then call it. | |||
The function returns the `stream` passed in as the argument. | |||
## Example | |||
```js | |||
var destroy = require('destroy') | |||
var fs = require('fs') | |||
var stream = fs.createReadStream('package.json') | |||
// ... and later | |||
destroy(stream) | |||
``` | |||
[npm-image]: https://img.shields.io/npm/v/destroy.svg?style=flat-square | |||
[npm-url]: https://npmjs.org/package/destroy | |||
[github-tag]: http://img.shields.io/github/tag/stream-utils/destroy.svg?style=flat-square | |||
[github-url]: https://github.com/stream-utils/destroy/tags | |||
[travis-image]: https://img.shields.io/travis/stream-utils/destroy.svg?style=flat-square | |||
[travis-url]: https://travis-ci.org/stream-utils/destroy | |||
[coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square | |||
[coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master | |||
[license-image]: http://img.shields.io/npm/l/destroy.svg?style=flat-square | |||
[license-url]: LICENSE.md | |||
[downloads-image]: http://img.shields.io/npm/dm/destroy.svg?style=flat-square | |||
[downloads-url]: https://npmjs.org/package/destroy | |||
[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square | |||
[gittip-url]: https://www.gittip.com/jonathanong/ |
@@ -0,0 +1,75 @@ | |||
/*! | |||
* destroy | |||
* Copyright(c) 2014 Jonathan Ong | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module dependencies. | |||
* @private | |||
*/ | |||
var ReadStream = require('fs').ReadStream | |||
var Stream = require('stream') | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
module.exports = destroy | |||
/** | |||
* Destroy a stream. | |||
* | |||
* @param {object} stream | |||
* @public | |||
*/ | |||
function destroy(stream) { | |||
if (stream instanceof ReadStream) { | |||
return destroyReadStream(stream) | |||
} | |||
if (!(stream instanceof Stream)) { | |||
return stream | |||
} | |||
if (typeof stream.destroy === 'function') { | |||
stream.destroy() | |||
} | |||
return stream | |||
} | |||
/** | |||
* Destroy a ReadStream. | |||
* | |||
* @param {object} stream | |||
* @private | |||
*/ | |||
function destroyReadStream(stream) { | |||
stream.destroy() | |||
if (typeof stream.close === 'function') { | |||
// node.js core bug work-around | |||
stream.on('open', onOpenClose) | |||
} | |||
return stream | |||
} | |||
/** | |||
* On open handler to close stream. | |||
* @private | |||
*/ | |||
function onOpenClose() { | |||
if (typeof this.fd === 'number') { | |||
// actually close down the fd | |||
this.close() | |||
} | |||
} |
@@ -0,0 +1,71 @@ | |||
{ | |||
"_from": "destroy@~1.0.4", | |||
"_id": "destroy@1.0.4", | |||
"_inBundle": false, | |||
"_integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", | |||
"_location": "/destroy", | |||
"_phantomChildren": {}, | |||
"_requested": { | |||
"type": "range", | |||
"registry": true, | |||
"raw": "destroy@~1.0.4", | |||
"name": "destroy", | |||
"escapedName": "destroy", | |||
"rawSpec": "~1.0.4", | |||
"saveSpec": null, | |||
"fetchSpec": "~1.0.4" | |||
}, | |||
"_requiredBy": [ | |||
"/send" | |||
], | |||
"_resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", | |||
"_shasum": "978857442c44749e4206613e37946205826abd80", | |||
"_spec": "destroy@~1.0.4", | |||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/send", | |||
"author": { | |||
"name": "Jonathan Ong", | |||
"email": "me@jongleberry.com", | |||
"url": "http://jongleberry.com" | |||
}, | |||
"bugs": { | |||
"url": "https://github.com/stream-utils/destroy/issues" | |||
}, | |||
"bundleDependencies": false, | |||
"contributors": [ | |||
{ | |||
"name": "Douglas Christopher Wilson", | |||
"email": "doug@somethingdoug.com" | |||
} | |||
], | |||
"deprecated": false, | |||
"description": "destroy a stream if possible", | |||
"devDependencies": { | |||
"istanbul": "0.4.2", | |||
"mocha": "2.3.4" | |||
}, | |||
"files": [ | |||
"index.js", | |||
"LICENSE" | |||
], | |||
"homepage": "https://github.com/stream-utils/destroy#readme", | |||
"keywords": [ | |||
"stream", | |||
"streams", | |||
"destroy", | |||
"cleanup", | |||
"leak", | |||
"fd" | |||
], | |||
"license": "MIT", | |||
"name": "destroy", | |||
"repository": { | |||
"type": "git", | |||
"url": "git+https://github.com/stream-utils/destroy.git" | |||
}, | |||
"scripts": { | |||
"test": "mocha --reporter spec", | |||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", | |||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" | |||
}, | |||
"version": "1.0.4" | |||
} |
@@ -0,0 +1,22 @@ | |||
The MIT License (MIT) | |||
Copyright (c) 2014 Jonathan Ong me@jongleberry.com | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. |
@@ -0,0 +1,80 @@ | |||
# EE First | |||
[![NPM version][npm-image]][npm-url] | |||
[![Build status][travis-image]][travis-url] | |||
[![Test coverage][coveralls-image]][coveralls-url] | |||
[![License][license-image]][license-url] | |||
[![Downloads][downloads-image]][downloads-url] | |||
[![Gittip][gittip-image]][gittip-url] | |||
Get the first event in a set of event emitters and event pairs, | |||
then clean up after itself. | |||
## Install | |||
```sh | |||
$ npm install ee-first | |||
``` | |||
## API | |||
```js | |||
var first = require('ee-first') | |||
``` | |||
### first(arr, listener) | |||
Invoke `listener` on the first event from the list specified in `arr`. `arr` is | |||
an array of arrays, with each array in the format `[ee, ...event]`. `listener` | |||
will be called only once, the first time any of the given events are emitted. If | |||
`error` is one of the listened events, then if that fires first, the `listener` | |||
will be given the `err` argument. | |||
The `listener` is invoked as `listener(err, ee, event, args)`, where `err` is the | |||
first argument emitted from an `error` event, if applicable; `ee` is the event | |||
emitter that fired; `event` is the string event name that fired; and `args` is an | |||
array of the arguments that were emitted on the event. | |||
```js | |||
var ee1 = new EventEmitter() | |||
var ee2 = new EventEmitter() | |||
first([ | |||
[ee1, 'close', 'end', 'error'], | |||
[ee2, 'error'] | |||
], function (err, ee, event, args) { | |||
// listener invoked | |||
}) | |||
``` | |||
#### .cancel() | |||
The group of listeners can be cancelled before being invoked and have all the event | |||
listeners removed from the underlying event emitters. | |||
```js | |||
var thunk = first([ | |||
[ee1, 'close', 'end', 'error'], | |||
[ee2, 'error'] | |||
], function (err, ee, event, args) { | |||
// listener invoked | |||
}) | |||
// cancel and clean up | |||
thunk.cancel() | |||
``` | |||
[npm-image]: https://img.shields.io/npm/v/ee-first.svg?style=flat-square | |||
[npm-url]: https://npmjs.org/package/ee-first | |||
[github-tag]: http://img.shields.io/github/tag/jonathanong/ee-first.svg?style=flat-square | |||
[github-url]: https://github.com/jonathanong/ee-first/tags | |||
[travis-image]: https://img.shields.io/travis/jonathanong/ee-first.svg?style=flat-square | |||
[travis-url]: https://travis-ci.org/jonathanong/ee-first | |||
[coveralls-image]: https://img.shields.io/coveralls/jonathanong/ee-first.svg?style=flat-square | |||
[coveralls-url]: https://coveralls.io/r/jonathanong/ee-first?branch=master | |||
[license-image]: http://img.shields.io/npm/l/ee-first.svg?style=flat-square | |||
[license-url]: LICENSE.md | |||
[downloads-image]: http://img.shields.io/npm/dm/ee-first.svg?style=flat-square | |||
[downloads-url]: https://npmjs.org/package/ee-first | |||
[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square | |||
[gittip-url]: https://www.gittip.com/jonathanong/ |
@@ -0,0 +1,95 @@ | |||
/*! | |||
* ee-first | |||
* Copyright(c) 2014 Jonathan Ong | |||
* MIT Licensed | |||
*/ | |||
'use strict' | |||
/** | |||
* Module exports. | |||
* @public | |||
*/ | |||
module.exports = first | |||
/** | |||
* Get the first event in a set of event emitters and event pairs. | |||
* | |||
* @param {array} stuff | |||
* @param {function} done | |||
* @public | |||
*/ | |||
function first(stuff, done) { | |||
if (!Array.isArray(stuff)) | |||
throw new TypeError('arg must be an array of [ee, events...] arrays') | |||
var cleanups = [] | |||
for (var i = 0; i < stuff.length; i++) { | |||
var arr = stuff[i] | |||
if (!Array.isArray(arr) || arr.length < 2) | |||
throw new TypeError('each array member must be [ee, events...]') | |||
var ee = arr[0] | |||
for (var j = 1; j < arr.length; j++) { | |||
var event = arr[j] | |||
var fn = listener(event, callback) | |||
// listen to the event | |||
ee.on(event, fn) | |||
// push this listener to the list of cleanups | |||
cleanups.push({ | |||
ee: ee, | |||
event: event, | |||
fn: fn, | |||
}) | |||
} | |||
} | |||
function callback() { | |||
cleanup() | |||
done.apply(null, arguments) | |||
} | |||
function cleanup() { | |||
var x | |||
for (var i = 0; i < cleanups.length; i++) { | |||
x = cleanups[i] | |||
x.ee.removeListener(x.event, x.fn) | |||
} | |||
} | |||
function thunk(fn) { | |||
done = fn | |||
} | |||
thunk.cancel = cleanup | |||
return thunk | |||
} | |||
/** | |||
* Create the event listener. | |||
* @private | |||
*/ | |||
function listener(event, done) { | |||
return function onevent(arg1) { | |||
var args = new Array(arguments.length) | |||
var ee = this | |||
var err = event === 'error' | |||
? arg1 | |||
: null | |||
// copy args to prevent arguments escaping scope | |||
for (var i = 0; i < args.length; i++) { | |||
args[i] = arguments[i] | |||
} | |||
done(err, ee, event, args) | |||
} | |||
} |