mirror of
https://github.com/tjsga/website-2018.git
synced 2025-04-21 19:49:48 -04:00
Under Construction Site Ready
This commit is contained in:
parent
c07165e883
commit
a7e139b2ff
75
css/index.css
Normal file
75
css/index.css
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
@import 'https://fonts.googleapis.com/css?family=Bitter:300,400,500';
|
||||||
|
body {
|
||||||
|
margin: 0px;
|
||||||
|
font-family: "Bitter", "Helvetica", "Arial", sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.background img {
|
||||||
|
flex-shrink: 0;
|
||||||
|
min-width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
.background .overlay {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
flex-direction: column;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
min-width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
background-color: rgba(77, 83, 137, 0.9);
|
||||||
|
}
|
||||||
|
.background .overlay .title {
|
||||||
|
text-align: center;
|
||||||
|
opacity: 1;
|
||||||
|
color: white;
|
||||||
|
font-size: 2.7em;
|
||||||
|
margin: 0px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
margin-left: 15px;
|
||||||
|
margin-right: 15px;
|
||||||
|
word-spacing: 5px;
|
||||||
|
animation-name: fadeIn;
|
||||||
|
animation-duration: 3s;
|
||||||
|
animation-iteration-count: 1;
|
||||||
|
}
|
||||||
|
.background .overlay .underline {
|
||||||
|
height: 7px;
|
||||||
|
width: 35vw;
|
||||||
|
background-color: #ecb85b;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
animation-name: underline, fadeIn;
|
||||||
|
animation-duration: 2s;
|
||||||
|
animation-iteration-count: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes underline {
|
||||||
|
from {
|
||||||
|
transform: scaleX(0);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: scaleX(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*# sourceMappingURL=css/index.css.map */
|
1
css/index.css.map
Normal file
1
css/index.css.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"sourceRoot":"","sources":["../scss/index.scss"],"names":[],"mappings":"AAAQ;AAER;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKH;EACC;IACC;;EAGD;IACC;;;AAIF;EACC;IACC;;EAGD;IACC","file":"index.css"}
|
1
node_modules/.bin/handlebars
generated
vendored
Symbolic link
1
node_modules/.bin/handlebars
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../handlebars/bin/handlebars
|
1
node_modules/.bin/mime
generated
vendored
Symbolic link
1
node_modules/.bin/mime
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../mime/cli.js
|
1
node_modules/.bin/uglifyjs
generated
vendored
Symbolic link
1
node_modules/.bin/uglifyjs
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../uglify-js/bin/uglifyjs
|
224
node_modules/accepts/HISTORY.md
generated
vendored
Normal file
224
node_modules/accepts/HISTORY.md
generated
vendored
Normal file
|
@ -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
|
23
node_modules/accepts/LICENSE
generated
vendored
Normal file
23
node_modules/accepts/LICENSE
generated
vendored
Normal file
|
@ -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.
|
143
node_modules/accepts/README.md
generated
vendored
Normal file
143
node_modules/accepts/README.md
generated
vendored
Normal file
|
@ -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
|
238
node_modules/accepts/index.js
generated
vendored
Normal file
238
node_modules/accepts/index.js
generated
vendored
Normal file
|
@ -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'
|
||||||
|
}
|
85
node_modules/accepts/package.json
generated
vendored
Normal file
85
node_modules/accepts/package.json
generated
vendored
Normal file
|
@ -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": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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"
|
||||||
|
}
|
21
node_modules/align-text/LICENSE
generated
vendored
Normal file
21
node_modules/align-text/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015, Jon Schlinkert.
|
||||||
|
|
||||||
|
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.
|
236
node_modules/align-text/README.md
generated
vendored
Normal file
236
node_modules/align-text/README.md
generated
vendored
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
# align-text [](http://badge.fury.io/js/align-text) [](https://travis-ci.org/jonschlinkert/align-text)
|
||||||
|
|
||||||
|
> Align the text in a string.
|
||||||
|
|
||||||
|
**Examples**
|
||||||
|
|
||||||
|
Align text values in an array:
|
||||||
|
|
||||||
|
```js
|
||||||
|
align([1, 2, 3, 100]);
|
||||||
|
//=> [' 1', ' 2', ' 3', '100']
|
||||||
|
```
|
||||||
|
|
||||||
|
Or [do stuff like this](./example.js):
|
||||||
|
|
||||||
|
[](./example.js)
|
||||||
|
|
||||||
|
Visit [the example](./example.js) to see how this works.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Install with [npm](https://www.npmjs.com/)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm i align-text --save
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```js
|
||||||
|
var align = require('align-text');
|
||||||
|
align(text, callback_function_or_integer);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Params**
|
||||||
|
|
||||||
|
* `text` can be a **string or array**. If a string is passed, a string will be returned. If an array is passed, an array will be returned.
|
||||||
|
* `callback|integer`: if an integer, the text will be indented by that amount. If a function, it must return an integer representing the amount of leading indentation to use as `align` loops over each line.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
```js
|
||||||
|
align(text, 4);
|
||||||
|
```
|
||||||
|
|
||||||
|
Would align:
|
||||||
|
|
||||||
|
```
|
||||||
|
abc
|
||||||
|
abc
|
||||||
|
abc
|
||||||
|
```
|
||||||
|
|
||||||
|
To:
|
||||||
|
|
||||||
|
```
|
||||||
|
abc
|
||||||
|
abc
|
||||||
|
abc
|
||||||
|
```
|
||||||
|
|
||||||
|
## callback
|
||||||
|
|
||||||
|
### params
|
||||||
|
|
||||||
|
The callback is used to determine the indentation of each line and gets the following params:
|
||||||
|
|
||||||
|
* `len` the length of the "current" line
|
||||||
|
* `longest` the length of the longest line
|
||||||
|
* `line` the current line (string) being aligned
|
||||||
|
* `lines` the array of all lines
|
||||||
|
|
||||||
|
### return
|
||||||
|
|
||||||
|
The callback may return:
|
||||||
|
|
||||||
|
* an integer that represents the number of spaces to use for padding,
|
||||||
|
* or an object with the following properties:
|
||||||
|
- `indent`: **{Number}** the amount of indentation to use. Default is `0` when an object is returned.
|
||||||
|
- `character`: **{String}** the character to use for indentation. Default is `''` (empty string) when an object is returned.
|
||||||
|
- `prefix`: **{String}** leading characters to use at the beginning of each line. `''` (empty string) when an object is returned.
|
||||||
|
|
||||||
|
**Integer example:**
|
||||||
|
|
||||||
|
```js
|
||||||
|
// calculate half the difference between the length
|
||||||
|
// of the current line and the longest line
|
||||||
|
function centerAlign(len, longest, line, lines) {
|
||||||
|
return Math.floor((longest - len) / 2);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Object example:**
|
||||||
|
|
||||||
|
```js
|
||||||
|
function centerAlign(len, longest, line, lines) {
|
||||||
|
return {
|
||||||
|
character: '\t',
|
||||||
|
indent: Math.floor((longest - len) / 2),
|
||||||
|
prefix: '~ ',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage examples
|
||||||
|
|
||||||
|
### Center align
|
||||||
|
|
||||||
|
Using the `centerAlign` function from above:
|
||||||
|
|
||||||
|
```js
|
||||||
|
align(text, centerAlign);
|
||||||
|
```
|
||||||
|
|
||||||
|
Would align this text:
|
||||||
|
|
||||||
|
```js
|
||||||
|
Lorem ipsum dolor sit amet
|
||||||
|
consectetur adipiscin
|
||||||
|
elit, sed do eiusmod tempor incididun
|
||||||
|
ut labore et dolor
|
||||||
|
magna aliqua. Ut enim ad mini
|
||||||
|
veniam, quis
|
||||||
|
```
|
||||||
|
|
||||||
|
Resulting in this:
|
||||||
|
|
||||||
|
```
|
||||||
|
Lorem ipsum dolor sit amet,
|
||||||
|
consectetur adipiscing
|
||||||
|
elit, sed do eiusmod tempor incididunt
|
||||||
|
ut labore et dolore
|
||||||
|
magna aliqua. Ut enim ad minim
|
||||||
|
veniam, quis
|
||||||
|
```
|
||||||
|
|
||||||
|
**Customize**
|
||||||
|
|
||||||
|
If you wanted to add more padding on the left, just pass the number in the callback.
|
||||||
|
|
||||||
|
For example, to add 4 spaces before every line:
|
||||||
|
|
||||||
|
```js
|
||||||
|
function centerAlign(len, longest, line, lines) {
|
||||||
|
return 4 + Math.floor((longest - len) / 2);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Would result in:
|
||||||
|
|
||||||
|
```
|
||||||
|
Lorem ipsum dolor sit amet,
|
||||||
|
consectetur adipiscing
|
||||||
|
elit, sed do eiusmod tempor incididunt
|
||||||
|
ut labore et dolore
|
||||||
|
magna aliqua. Ut enim ad minim
|
||||||
|
veniam, quis
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bullets
|
||||||
|
|
||||||
|
```js
|
||||||
|
align(text, function (len, max, line, lines) {
|
||||||
|
return {prefix: ' - '};
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Would return:
|
||||||
|
|
||||||
|
```
|
||||||
|
- Lorem ipsum dolor sit amet,
|
||||||
|
- consectetur adipiscing
|
||||||
|
- elit, sed do eiusmod tempor incididunt
|
||||||
|
- ut labore et dolore
|
||||||
|
- magna aliqua. Ut enim ad minim
|
||||||
|
- veniam, quis
|
||||||
|
```
|
||||||
|
|
||||||
|
### Different indent character
|
||||||
|
|
||||||
|
```js
|
||||||
|
align(text, function (len, max, line, lines) {
|
||||||
|
return {
|
||||||
|
indent: Math.floor((max - len) / 2),
|
||||||
|
character: '~',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Would return
|
||||||
|
|
||||||
|
```
|
||||||
|
~~~~~Lorem ipsum dolor sit amet,
|
||||||
|
~~~~~~~~consectetur adipiscing
|
||||||
|
elit, sed do eiusmod tempor incididunt
|
||||||
|
~~~~~~~~~ut labore et dolore
|
||||||
|
~~~~magna aliqua. Ut enim ad minim
|
||||||
|
~~~~~~~~~~~~~veniam, quis
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related projects
|
||||||
|
|
||||||
|
* [center-align](https://github.com/jonschlinkert/center-align): Center-align the text in a string.
|
||||||
|
* [justify](https://github.com/bahamas10/node-justify): Left or right (or both) justify text using a custom width and character
|
||||||
|
* [longest](https://github.com/jonschlinkert/longest): Get the longest item in an array.
|
||||||
|
* [right-align](https://github.com/jonschlinkert/right-align): Right-align the text in a string.
|
||||||
|
* [repeat-string](https://github.com/jonschlinkert/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string.
|
||||||
|
* [word-wrap](https://github.com/jonschlinkert/word-wrap): Wrap words to a specified length.
|
||||||
|
|
||||||
|
## Running tests
|
||||||
|
|
||||||
|
Install dev dependencies:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm i -d && npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/align-text/issues/new)
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
**Jon Schlinkert**
|
||||||
|
|
||||||
|
+ [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||||
|
+ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright © 2015 [Jon Schlinkert](https://github.com/jonschlinkert)
|
||||||
|
Released under the MIT license.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on June 09, 2015._
|
52
node_modules/align-text/index.js
generated
vendored
Normal file
52
node_modules/align-text/index.js
generated
vendored
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*!
|
||||||
|
* align-text <https://github.com/jonschlinkert/align-text>
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015, Jon Schlinkert.
|
||||||
|
* Licensed under the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var typeOf = require('kind-of');
|
||||||
|
var repeat = require('repeat-string');
|
||||||
|
var longest = require('longest');
|
||||||
|
|
||||||
|
module.exports = function alignText(val, fn) {
|
||||||
|
var lines, type = typeOf(val);
|
||||||
|
|
||||||
|
if (type === 'array') {
|
||||||
|
lines = val;
|
||||||
|
} else if (type === 'string') {
|
||||||
|
lines = val.split(/(?:\r\n|\n)/);
|
||||||
|
} else {
|
||||||
|
throw new TypeError('align-text expects a string or array.');
|
||||||
|
}
|
||||||
|
|
||||||
|
var fnType = typeOf(fn);
|
||||||
|
var len = lines.length;
|
||||||
|
var max = longest(lines);
|
||||||
|
var res = [], i = 0;
|
||||||
|
|
||||||
|
while (len--) {
|
||||||
|
var line = String(lines[i++]);
|
||||||
|
var diff;
|
||||||
|
|
||||||
|
if (fnType === 'function') {
|
||||||
|
diff = fn(line.length, max.length, line, lines, i);
|
||||||
|
} else if (fnType === 'number') {
|
||||||
|
diff = fn;
|
||||||
|
} else {
|
||||||
|
diff = max.length - line.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeOf(diff) === 'number') {
|
||||||
|
res.push(repeat(' ', diff) + line);
|
||||||
|
} else if (typeOf(diff) === 'object') {
|
||||||
|
var result = repeat(diff.character || ' ', diff.indent || 0);
|
||||||
|
res.push((diff.prefix || '') + result + line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type === 'array') return res;
|
||||||
|
return res.join('\n');
|
||||||
|
};
|
78
node_modules/align-text/package.json
generated
vendored
Normal file
78
node_modules/align-text/package.json
generated
vendored
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
{
|
||||||
|
"_from": "align-text@^0.1.3",
|
||||||
|
"_id": "align-text@0.1.4",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
|
||||||
|
"_location": "/align-text",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "range",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "align-text@^0.1.3",
|
||||||
|
"name": "align-text",
|
||||||
|
"escapedName": "align-text",
|
||||||
|
"rawSpec": "^0.1.3",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": "^0.1.3"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/center-align",
|
||||||
|
"/right-align"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||||
|
"_shasum": "0cd90a561093f35d0a99256c22b7069433fad117",
|
||||||
|
"_spec": "align-text@^0.1.3",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/node_modules/center-align",
|
||||||
|
"author": {
|
||||||
|
"name": "Jon Schlinkert",
|
||||||
|
"url": "https://github.com/jonschlinkert"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/jonschlinkert/align-text/issues"
|
||||||
|
},
|
||||||
|
"bundleDependencies": false,
|
||||||
|
"dependencies": {
|
||||||
|
"kind-of": "^3.0.2",
|
||||||
|
"longest": "^1.0.1",
|
||||||
|
"repeat-string": "^1.5.2"
|
||||||
|
},
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "Align the text in a string.",
|
||||||
|
"devDependencies": {
|
||||||
|
"mocha": "*",
|
||||||
|
"should": "*",
|
||||||
|
"word-wrap": "^1.0.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/jonschlinkert/align-text",
|
||||||
|
"keywords": [
|
||||||
|
"align",
|
||||||
|
"align-center",
|
||||||
|
"alignment",
|
||||||
|
"center",
|
||||||
|
"center-align",
|
||||||
|
"indent",
|
||||||
|
"pad",
|
||||||
|
"padding",
|
||||||
|
"right",
|
||||||
|
"right-align",
|
||||||
|
"text",
|
||||||
|
"typography"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "index.js",
|
||||||
|
"name": "align-text",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/jonschlinkert/align-text.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "mocha"
|
||||||
|
},
|
||||||
|
"version": "0.1.4"
|
||||||
|
}
|
58
node_modules/amdefine/LICENSE
generated
vendored
Normal file
58
node_modules/amdefine/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
amdefine is released under two licenses: new BSD, and MIT. You may pick the
|
||||||
|
license that best suits your development needs. The text of both licenses are
|
||||||
|
provided below.
|
||||||
|
|
||||||
|
|
||||||
|
The "New" BSD License:
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Copyright (c) 2011-2016, The Dojo Foundation
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Dojo Foundation nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Copyright (c) 2011-2016, The Dojo Foundation
|
||||||
|
|
||||||
|
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.
|
171
node_modules/amdefine/README.md
generated
vendored
Normal file
171
node_modules/amdefine/README.md
generated
vendored
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
# amdefine
|
||||||
|
|
||||||
|
A module that can be used to implement AMD's define() in Node. This allows you
|
||||||
|
to code to the AMD API and have the module work in node programs without
|
||||||
|
requiring those other programs to use AMD.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
**1)** Update your package.json to indicate amdefine as a dependency:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
"dependencies": {
|
||||||
|
"amdefine": ">=0.1.0"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run `npm install` to get amdefine into your project.
|
||||||
|
|
||||||
|
**2)** At the top of each module that uses define(), place this code:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
if (typeof define !== 'function') { var define = require('amdefine')(module) }
|
||||||
|
```
|
||||||
|
|
||||||
|
**Only use these snippets** when loading amdefine. If you preserve the basic structure,
|
||||||
|
with the braces, it will be stripped out when using the [RequireJS optimizer](#optimizer).
|
||||||
|
|
||||||
|
You can add spaces, line breaks and even require amdefine with a local path, but
|
||||||
|
keep the rest of the structure to get the stripping behavior.
|
||||||
|
|
||||||
|
As you may know, because `if` statements in JavaScript don't have their own scope, the var
|
||||||
|
declaration in the above snippet is made whether the `if` expression is truthy or not. If
|
||||||
|
RequireJS is loaded then the declaration is superfluous because `define` is already already
|
||||||
|
declared in the same scope in RequireJS. Fortunately JavaScript handles multiple `var`
|
||||||
|
declarations of the same variable in the same scope gracefully.
|
||||||
|
|
||||||
|
If you want to deliver amdefine.js with your code rather than specifying it as a dependency
|
||||||
|
with npm, then just download the latest release and refer to it using a relative path:
|
||||||
|
|
||||||
|
[Latest Version](https://github.com/jrburke/amdefine/raw/latest/amdefine.js)
|
||||||
|
|
||||||
|
### amdefine/intercept
|
||||||
|
|
||||||
|
Consider this very experimental.
|
||||||
|
|
||||||
|
Instead of pasting the piece of text for the amdefine setup of a `define`
|
||||||
|
variable in each module you create or consume, you can use `amdefine/intercept`
|
||||||
|
instead. It will automatically insert the above snippet in each .js file loaded
|
||||||
|
by Node.
|
||||||
|
|
||||||
|
**Warning**: you should only use this if you are creating an application that
|
||||||
|
is consuming AMD style defined()'d modules that are distributed via npm and want
|
||||||
|
to run that code in Node.
|
||||||
|
|
||||||
|
For library code where you are not sure if it will be used by others in Node or
|
||||||
|
in the browser, then explicitly depending on amdefine and placing the code
|
||||||
|
snippet above is suggested path, instead of using `amdefine/intercept`. The
|
||||||
|
intercept module affects all .js files loaded in the Node app, and it is
|
||||||
|
inconsiderate to modify global state like that unless you are also controlling
|
||||||
|
the top level app.
|
||||||
|
|
||||||
|
#### Why distribute AMD-style modules via npm?
|
||||||
|
|
||||||
|
npm has a lot of weaknesses for front-end use (installed layout is not great,
|
||||||
|
should have better support for the `baseUrl + moduleID + '.js' style of loading,
|
||||||
|
single file JS installs), but some people want a JS package manager and are
|
||||||
|
willing to live with those constraints. If that is you, but still want to author
|
||||||
|
in AMD style modules to get dynamic require([]), better direct source usage and
|
||||||
|
powerful loader plugin support in the browser, then this tool can help.
|
||||||
|
|
||||||
|
#### amdefine/intercept usage
|
||||||
|
|
||||||
|
Just require it in your top level app module (for example index.js, server.js):
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
require('amdefine/intercept');
|
||||||
|
```
|
||||||
|
|
||||||
|
The module does not return a value, so no need to assign the result to a local
|
||||||
|
variable.
|
||||||
|
|
||||||
|
Then just require() code as you normally would with Node's require(). Any .js
|
||||||
|
loaded after the intercept require will have the amdefine check injected in
|
||||||
|
the .js source as it is loaded. It does not modify the source on disk, just
|
||||||
|
prepends some content to the text of the module as it is loaded by Node.
|
||||||
|
|
||||||
|
#### How amdefine/intercept works
|
||||||
|
|
||||||
|
It overrides the `Module._extensions['.js']` in Node to automatically prepend
|
||||||
|
the amdefine snippet above. So, it will affect any .js file loaded by your
|
||||||
|
app.
|
||||||
|
|
||||||
|
## define() usage
|
||||||
|
|
||||||
|
It is best if you use the anonymous forms of define() in your module:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
define(function (require) {
|
||||||
|
var dependency = require('dependency');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
define(['dependency'], function (dependency) {
|
||||||
|
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## RequireJS optimizer integration. <a name="optimizer"></name>
|
||||||
|
|
||||||
|
Version 1.0.3 of the [RequireJS optimizer](http://requirejs.org/docs/optimization.html)
|
||||||
|
will have support for stripping the `if (typeof define !== 'function')` check
|
||||||
|
mentioned above, so you can include this snippet for code that runs in the
|
||||||
|
browser, but avoid taking the cost of the if() statement once the code is
|
||||||
|
optimized for deployment.
|
||||||
|
|
||||||
|
## Node 0.4 Support
|
||||||
|
|
||||||
|
If you want to support Node 0.4, then add `require` as the second parameter to amdefine:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
//Only if you want Node 0.4. If using 0.5 or later, use the above snippet.
|
||||||
|
if (typeof define !== 'function') { var define = require('amdefine')(module, require) }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
### Synchronous vs Asynchronous
|
||||||
|
|
||||||
|
amdefine creates a define() function that is callable by your code. It will
|
||||||
|
execute and trace dependencies and call the factory function *synchronously*,
|
||||||
|
to keep the behavior in line with Node's synchronous dependency tracing.
|
||||||
|
|
||||||
|
The exception: calling AMD's callback-style require() from inside a factory
|
||||||
|
function. The require callback is called on process.nextTick():
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
define(function (require) {
|
||||||
|
require(['a'], function(a) {
|
||||||
|
//'a' is loaded synchronously, but
|
||||||
|
//this callback is called on process.nextTick().
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Loader Plugins
|
||||||
|
|
||||||
|
Loader plugins are supported as long as they call their load() callbacks
|
||||||
|
synchronously. So ones that do network requests will not work. However plugins
|
||||||
|
like [text](http://requirejs.org/docs/api.html#text) can load text files locally.
|
||||||
|
|
||||||
|
The plugin API's `load.fromText()` is **not supported** in amdefine, so this means
|
||||||
|
transpiler plugins like the [CoffeeScript loader plugin](https://github.com/jrburke/require-cs)
|
||||||
|
will not work. This may be fixable, but it is a bit complex, and I do not have
|
||||||
|
enough node-fu to figure it out yet. See the source for amdefine.js if you want
|
||||||
|
to get an idea of the issues involved.
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
To run the tests, cd to **tests** and run:
|
||||||
|
|
||||||
|
```
|
||||||
|
node all.js
|
||||||
|
node all-intercept.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
New BSD and MIT. Check the LICENSE file for all the details.
|
301
node_modules/amdefine/amdefine.js
generated
vendored
Normal file
301
node_modules/amdefine/amdefine.js
generated
vendored
Normal file
|
@ -0,0 +1,301 @@
|
||||||
|
/** vim: et:ts=4:sw=4:sts=4
|
||||||
|
* @license amdefine 1.0.1 Copyright (c) 2011-2016, The Dojo Foundation All Rights Reserved.
|
||||||
|
* Available via the MIT or new BSD license.
|
||||||
|
* see: http://github.com/jrburke/amdefine for details
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*jslint node: true */
|
||||||
|
/*global module, process */
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a define for node.
|
||||||
|
* @param {Object} module the "module" object that is defined by Node for the
|
||||||
|
* current module.
|
||||||
|
* @param {Function} [requireFn]. Node's require function for the current module.
|
||||||
|
* It only needs to be passed in Node versions before 0.5, when module.require
|
||||||
|
* did not exist.
|
||||||
|
* @returns {Function} a define function that is usable for the current node
|
||||||
|
* module.
|
||||||
|
*/
|
||||||
|
function amdefine(module, requireFn) {
|
||||||
|
'use strict';
|
||||||
|
var defineCache = {},
|
||||||
|
loaderCache = {},
|
||||||
|
alreadyCalled = false,
|
||||||
|
path = require('path'),
|
||||||
|
makeRequire, stringRequire;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trims the . and .. from an array of path segments.
|
||||||
|
* It will keep a leading path segment if a .. will become
|
||||||
|
* the first path segment, to help with module name lookups,
|
||||||
|
* which act like paths, but can be remapped. But the end result,
|
||||||
|
* all paths that use this function should look normalized.
|
||||||
|
* NOTE: this method MODIFIES the input array.
|
||||||
|
* @param {Array} ary the array of path segments.
|
||||||
|
*/
|
||||||
|
function trimDots(ary) {
|
||||||
|
var i, part;
|
||||||
|
for (i = 0; ary[i]; i+= 1) {
|
||||||
|
part = ary[i];
|
||||||
|
if (part === '.') {
|
||||||
|
ary.splice(i, 1);
|
||||||
|
i -= 1;
|
||||||
|
} else if (part === '..') {
|
||||||
|
if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {
|
||||||
|
//End of the line. Keep at least one non-dot
|
||||||
|
//path segment at the front so it can be mapped
|
||||||
|
//correctly to disk. Otherwise, there is likely
|
||||||
|
//no path mapping for a path starting with '..'.
|
||||||
|
//This can still fail, but catches the most reasonable
|
||||||
|
//uses of ..
|
||||||
|
break;
|
||||||
|
} else if (i > 0) {
|
||||||
|
ary.splice(i - 1, 2);
|
||||||
|
i -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalize(name, baseName) {
|
||||||
|
var baseParts;
|
||||||
|
|
||||||
|
//Adjust any relative paths.
|
||||||
|
if (name && name.charAt(0) === '.') {
|
||||||
|
//If have a base name, try to normalize against it,
|
||||||
|
//otherwise, assume it is a top-level require that will
|
||||||
|
//be relative to baseUrl in the end.
|
||||||
|
if (baseName) {
|
||||||
|
baseParts = baseName.split('/');
|
||||||
|
baseParts = baseParts.slice(0, baseParts.length - 1);
|
||||||
|
baseParts = baseParts.concat(name.split('/'));
|
||||||
|
trimDots(baseParts);
|
||||||
|
name = baseParts.join('/');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the normalize() function passed to a loader plugin's
|
||||||
|
* normalize method.
|
||||||
|
*/
|
||||||
|
function makeNormalize(relName) {
|
||||||
|
return function (name) {
|
||||||
|
return normalize(name, relName);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeLoad(id) {
|
||||||
|
function load(value) {
|
||||||
|
loaderCache[id] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
load.fromText = function (id, text) {
|
||||||
|
//This one is difficult because the text can/probably uses
|
||||||
|
//define, and any relative paths and requires should be relative
|
||||||
|
//to that id was it would be found on disk. But this would require
|
||||||
|
//bootstrapping a module/require fairly deeply from node core.
|
||||||
|
//Not sure how best to go about that yet.
|
||||||
|
throw new Error('amdefine does not implement load.fromText');
|
||||||
|
};
|
||||||
|
|
||||||
|
return load;
|
||||||
|
}
|
||||||
|
|
||||||
|
makeRequire = function (systemRequire, exports, module, relId) {
|
||||||
|
function amdRequire(deps, callback) {
|
||||||
|
if (typeof deps === 'string') {
|
||||||
|
//Synchronous, single module require('')
|
||||||
|
return stringRequire(systemRequire, exports, module, deps, relId);
|
||||||
|
} else {
|
||||||
|
//Array of dependencies with a callback.
|
||||||
|
|
||||||
|
//Convert the dependencies to modules.
|
||||||
|
deps = deps.map(function (depName) {
|
||||||
|
return stringRequire(systemRequire, exports, module, depName, relId);
|
||||||
|
});
|
||||||
|
|
||||||
|
//Wait for next tick to call back the require call.
|
||||||
|
if (callback) {
|
||||||
|
process.nextTick(function () {
|
||||||
|
callback.apply(null, deps);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
amdRequire.toUrl = function (filePath) {
|
||||||
|
if (filePath.indexOf('.') === 0) {
|
||||||
|
return normalize(filePath, path.dirname(module.filename));
|
||||||
|
} else {
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return amdRequire;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Favor explicit value, passed in if the module wants to support Node 0.4.
|
||||||
|
requireFn = requireFn || function req() {
|
||||||
|
return module.require.apply(module, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
function runFactory(id, deps, factory) {
|
||||||
|
var r, e, m, result;
|
||||||
|
|
||||||
|
if (id) {
|
||||||
|
e = loaderCache[id] = {};
|
||||||
|
m = {
|
||||||
|
id: id,
|
||||||
|
uri: __filename,
|
||||||
|
exports: e
|
||||||
|
};
|
||||||
|
r = makeRequire(requireFn, e, m, id);
|
||||||
|
} else {
|
||||||
|
//Only support one define call per file
|
||||||
|
if (alreadyCalled) {
|
||||||
|
throw new Error('amdefine with no module ID cannot be called more than once per file.');
|
||||||
|
}
|
||||||
|
alreadyCalled = true;
|
||||||
|
|
||||||
|
//Use the real variables from node
|
||||||
|
//Use module.exports for exports, since
|
||||||
|
//the exports in here is amdefine exports.
|
||||||
|
e = module.exports;
|
||||||
|
m = module;
|
||||||
|
r = makeRequire(requireFn, e, m, module.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
//If there are dependencies, they are strings, so need
|
||||||
|
//to convert them to dependency values.
|
||||||
|
if (deps) {
|
||||||
|
deps = deps.map(function (depName) {
|
||||||
|
return r(depName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//Call the factory with the right dependencies.
|
||||||
|
if (typeof factory === 'function') {
|
||||||
|
result = factory.apply(m.exports, deps);
|
||||||
|
} else {
|
||||||
|
result = factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result !== undefined) {
|
||||||
|
m.exports = result;
|
||||||
|
if (id) {
|
||||||
|
loaderCache[id] = m.exports;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stringRequire = function (systemRequire, exports, module, id, relId) {
|
||||||
|
//Split the ID by a ! so that
|
||||||
|
var index = id.indexOf('!'),
|
||||||
|
originalId = id,
|
||||||
|
prefix, plugin;
|
||||||
|
|
||||||
|
if (index === -1) {
|
||||||
|
id = normalize(id, relId);
|
||||||
|
|
||||||
|
//Straight module lookup. If it is one of the special dependencies,
|
||||||
|
//deal with it, otherwise, delegate to node.
|
||||||
|
if (id === 'require') {
|
||||||
|
return makeRequire(systemRequire, exports, module, relId);
|
||||||
|
} else if (id === 'exports') {
|
||||||
|
return exports;
|
||||||
|
} else if (id === 'module') {
|
||||||
|
return module;
|
||||||
|
} else if (loaderCache.hasOwnProperty(id)) {
|
||||||
|
return loaderCache[id];
|
||||||
|
} else if (defineCache[id]) {
|
||||||
|
runFactory.apply(null, defineCache[id]);
|
||||||
|
return loaderCache[id];
|
||||||
|
} else {
|
||||||
|
if(systemRequire) {
|
||||||
|
return systemRequire(originalId);
|
||||||
|
} else {
|
||||||
|
throw new Error('No module with ID: ' + id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//There is a plugin in play.
|
||||||
|
prefix = id.substring(0, index);
|
||||||
|
id = id.substring(index + 1, id.length);
|
||||||
|
|
||||||
|
plugin = stringRequire(systemRequire, exports, module, prefix, relId);
|
||||||
|
|
||||||
|
if (plugin.normalize) {
|
||||||
|
id = plugin.normalize(id, makeNormalize(relId));
|
||||||
|
} else {
|
||||||
|
//Normalize the ID normally.
|
||||||
|
id = normalize(id, relId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loaderCache[id]) {
|
||||||
|
return loaderCache[id];
|
||||||
|
} else {
|
||||||
|
plugin.load(id, makeRequire(systemRequire, exports, module, relId), makeLoad(id), {});
|
||||||
|
|
||||||
|
return loaderCache[id];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//Create a define function specific to the module asking for amdefine.
|
||||||
|
function define(id, deps, factory) {
|
||||||
|
if (Array.isArray(id)) {
|
||||||
|
factory = deps;
|
||||||
|
deps = id;
|
||||||
|
id = undefined;
|
||||||
|
} else if (typeof id !== 'string') {
|
||||||
|
factory = id;
|
||||||
|
id = deps = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deps && !Array.isArray(deps)) {
|
||||||
|
factory = deps;
|
||||||
|
deps = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!deps) {
|
||||||
|
deps = ['require', 'exports', 'module'];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set up properties for this module. If an ID, then use
|
||||||
|
//internal cache. If no ID, then use the external variables
|
||||||
|
//for this node module.
|
||||||
|
if (id) {
|
||||||
|
//Put the module in deep freeze until there is a
|
||||||
|
//require call for it.
|
||||||
|
defineCache[id] = [id, deps, factory];
|
||||||
|
} else {
|
||||||
|
runFactory(id, deps, factory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//define.require, which has access to all the values in the
|
||||||
|
//cache. Useful for AMD modules that all have IDs in the file,
|
||||||
|
//but need to finally export a value to node based on one of those
|
||||||
|
//IDs.
|
||||||
|
define.require = function (id) {
|
||||||
|
if (loaderCache[id]) {
|
||||||
|
return loaderCache[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defineCache[id]) {
|
||||||
|
runFactory.apply(null, defineCache[id]);
|
||||||
|
return loaderCache[id];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
define.amd = {};
|
||||||
|
|
||||||
|
return define;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = amdefine;
|
36
node_modules/amdefine/intercept.js
generated
vendored
Normal file
36
node_modules/amdefine/intercept.js
generated
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*jshint node: true */
|
||||||
|
var inserted,
|
||||||
|
Module = require('module'),
|
||||||
|
fs = require('fs'),
|
||||||
|
existingExtFn = Module._extensions['.js'],
|
||||||
|
amdefineRegExp = /amdefine\.js/;
|
||||||
|
|
||||||
|
inserted = "if (typeof define !== 'function') {var define = require('amdefine')(module)}";
|
||||||
|
|
||||||
|
//From the node/lib/module.js source:
|
||||||
|
function stripBOM(content) {
|
||||||
|
// Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
|
||||||
|
// because the buffer-to-string conversion in `fs.readFileSync()`
|
||||||
|
// translates it to FEFF, the UTF-16 BOM.
|
||||||
|
if (content.charCodeAt(0) === 0xFEFF) {
|
||||||
|
content = content.slice(1);
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Also adapted from the node/lib/module.js source:
|
||||||
|
function intercept(module, filename) {
|
||||||
|
var content = stripBOM(fs.readFileSync(filename, 'utf8'));
|
||||||
|
|
||||||
|
if (!amdefineRegExp.test(module.id)) {
|
||||||
|
content = inserted + content;
|
||||||
|
}
|
||||||
|
|
||||||
|
module._compile(content, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
intercept._id = 'amdefine/intercept';
|
||||||
|
|
||||||
|
if (!existingExtFn._id || existingExtFn._id !== intercept._id) {
|
||||||
|
Module._extensions['.js'] = intercept;
|
||||||
|
}
|
48
node_modules/amdefine/package.json
generated
vendored
Normal file
48
node_modules/amdefine/package.json
generated
vendored
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
{
|
||||||
|
"_from": "amdefine@>=0.0.4",
|
||||||
|
"_id": "amdefine@1.0.1",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
||||||
|
"_location": "/amdefine",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "range",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "amdefine@>=0.0.4",
|
||||||
|
"name": "amdefine",
|
||||||
|
"escapedName": "amdefine",
|
||||||
|
"rawSpec": ">=0.0.4",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": ">=0.0.4"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/source-map"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||||
|
"_shasum": "4a5282ac164729e93619bcfd3ad151f817ce91f5",
|
||||||
|
"_spec": "amdefine@>=0.0.4",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/node_modules/source-map",
|
||||||
|
"author": {
|
||||||
|
"name": "James Burke",
|
||||||
|
"email": "jrburke@gmail.com",
|
||||||
|
"url": "http://github.com/jrburke"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/jrburke/amdefine/issues"
|
||||||
|
},
|
||||||
|
"bundleDependencies": false,
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "Provide AMD's define() API for declaring modules in the AMD format",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.2"
|
||||||
|
},
|
||||||
|
"homepage": "http://github.com/jrburke/amdefine",
|
||||||
|
"license": "BSD-3-Clause OR MIT",
|
||||||
|
"main": "./amdefine.js",
|
||||||
|
"name": "amdefine",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/jrburke/amdefine.git"
|
||||||
|
},
|
||||||
|
"version": "1.0.1"
|
||||||
|
}
|
21
node_modules/array-flatten/LICENSE
generated
vendored
Normal file
21
node_modules/array-flatten/LICENSE
generated
vendored
Normal file
|
@ -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.
|
43
node_modules/array-flatten/README.md
generated
vendored
Normal file
43
node_modules/array-flatten/README.md
generated
vendored
Normal file
|
@ -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
|
64
node_modules/array-flatten/array-flatten.js
generated
vendored
Normal file
64
node_modules/array-flatten/array-flatten.js
generated
vendored
Normal file
|
@ -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)
|
||||||
|
}
|
64
node_modules/array-flatten/package.json
generated
vendored
Normal file
64
node_modules/array-flatten/package.json
generated
vendored
Normal file
|
@ -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": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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"
|
||||||
|
}
|
125
node_modules/async/CHANGELOG.md
generated
vendored
Normal file
125
node_modules/async/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
# v1.5.2
|
||||||
|
- Allow using `"consructor"` as an argument in `memoize` (#998)
|
||||||
|
- Give a better error messsage when `auto` dependency checking fails (#994)
|
||||||
|
- Various doc updates (#936, #956, #979, #1002)
|
||||||
|
|
||||||
|
# v1.5.1
|
||||||
|
- Fix issue with `pause` in `queue` with concurrency enabled (#946)
|
||||||
|
- `while` and `until` now pass the final result to callback (#963)
|
||||||
|
- `auto` will properly handle concurrency when there is no callback (#966)
|
||||||
|
- `auto` will now properly stop execution when an error occurs (#988, #993)
|
||||||
|
- Various doc fixes (#971, #980)
|
||||||
|
|
||||||
|
# v1.5.0
|
||||||
|
|
||||||
|
- Added `transform`, analogous to [`_.transform`](http://lodash.com/docs#transform) (#892)
|
||||||
|
- `map` now returns an object when an object is passed in, rather than array with non-numeric keys. `map` will begin always returning an array with numeric indexes in the next major release. (#873)
|
||||||
|
- `auto` now accepts an optional `concurrency` argument to limit the number of running tasks (#637)
|
||||||
|
- Added `queue#workersList()`, to retrieve the list of currently running tasks. (#891)
|
||||||
|
- Various code simplifications (#896, #904)
|
||||||
|
- Various doc fixes :scroll: (#890, #894, #903, #905, #912)
|
||||||
|
|
||||||
|
# v1.4.2
|
||||||
|
|
||||||
|
- Ensure coverage files don't get published on npm (#879)
|
||||||
|
|
||||||
|
# v1.4.1
|
||||||
|
|
||||||
|
- Add in overlooked `detectLimit` method (#866)
|
||||||
|
- Removed unnecessary files from npm releases (#861)
|
||||||
|
- Removed usage of a reserved word to prevent :boom: in older environments (#870)
|
||||||
|
|
||||||
|
# v1.4.0
|
||||||
|
|
||||||
|
- `asyncify` now supports promises (#840)
|
||||||
|
- Added `Limit` versions of `filter` and `reject` (#836)
|
||||||
|
- Add `Limit` versions of `detect`, `some` and `every` (#828, #829)
|
||||||
|
- `some`, `every` and `detect` now short circuit early (#828, #829)
|
||||||
|
- Improve detection of the global object (#804), enabling use in WebWorkers
|
||||||
|
- `whilst` now called with arguments from iterator (#823)
|
||||||
|
- `during` now gets called with arguments from iterator (#824)
|
||||||
|
- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0))
|
||||||
|
|
||||||
|
|
||||||
|
# v1.3.0
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
- Added `constant`
|
||||||
|
- Added `asyncify`/`wrapSync` for making sync functions work with callbacks. (#671, #806)
|
||||||
|
- Added `during` and `doDuring`, which are like `whilst` with an async truth test. (#800)
|
||||||
|
- `retry` now accepts an `interval` parameter to specify a delay between retries. (#793)
|
||||||
|
- `async` should work better in Web Workers due to better `root` detection (#804)
|
||||||
|
- Callbacks are now optional in `whilst`, `doWhilst`, `until`, and `doUntil` (#642)
|
||||||
|
- Various internal updates (#786, #801, #802, #803)
|
||||||
|
- Various doc fixes (#790, #794)
|
||||||
|
|
||||||
|
Bug Fixes:
|
||||||
|
- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. (#740, #744, #783)
|
||||||
|
|
||||||
|
|
||||||
|
# v1.2.1
|
||||||
|
|
||||||
|
Bug Fix:
|
||||||
|
|
||||||
|
- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782)
|
||||||
|
|
||||||
|
|
||||||
|
# v1.2.0
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
|
||||||
|
- Added `timesLimit` (#743)
|
||||||
|
- `concurrency` can be changed after initialization in `queue` by setting `q.concurrency`. The new concurrency will be reflected the next time a task is processed. (#747, #772)
|
||||||
|
|
||||||
|
Bug Fixes:
|
||||||
|
|
||||||
|
- Fixed a regression in `each` and family with empty arrays that have additional properties. (#775, #777)
|
||||||
|
|
||||||
|
|
||||||
|
# v1.1.1
|
||||||
|
|
||||||
|
Bug Fix:
|
||||||
|
|
||||||
|
- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782)
|
||||||
|
|
||||||
|
|
||||||
|
# v1.1.0
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
|
||||||
|
- `cargo` now supports all of the same methods and event callbacks as `queue`.
|
||||||
|
- Added `ensureAsync` - A wrapper that ensures an async function calls its callback on a later tick. (#769)
|
||||||
|
- Optimized `map`, `eachOf`, and `waterfall` families of functions
|
||||||
|
- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array (#667).
|
||||||
|
- The callback is now optional for the composed results of `compose` and `seq`. (#618)
|
||||||
|
- Reduced file size by 4kb, (minified version by 1kb)
|
||||||
|
- Added code coverage through `nyc` and `coveralls` (#768)
|
||||||
|
|
||||||
|
Bug Fixes:
|
||||||
|
|
||||||
|
- `forever` will no longer stack overflow with a synchronous iterator (#622)
|
||||||
|
- `eachLimit` and other limit functions will stop iterating once an error occurs (#754)
|
||||||
|
- Always pass `null` in callbacks when there is no error (#439)
|
||||||
|
- Ensure proper conditions when calling `drain()` after pushing an empty data set to a queue (#668)
|
||||||
|
- `each` and family will properly handle an empty array (#578)
|
||||||
|
- `eachSeries` and family will finish if the underlying array is modified during execution (#557)
|
||||||
|
- `queue` will throw if a non-function is passed to `q.push()` (#593)
|
||||||
|
- Doc fixes (#629, #766)
|
||||||
|
|
||||||
|
|
||||||
|
# v1.0.0
|
||||||
|
|
||||||
|
No known breaking changes, we are simply complying with semver from here on out.
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
|
||||||
|
- Start using a changelog!
|
||||||
|
- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) (#168 #704 #321)
|
||||||
|
- Detect deadlocks in `auto` (#663)
|
||||||
|
- Better support for require.js (#527)
|
||||||
|
- Throw if queue created with concurrency `0` (#714)
|
||||||
|
- Fix unneeded iteration in `queue.resume()` (#758)
|
||||||
|
- Guard against timer mocking overriding `setImmediate` (#609 #611)
|
||||||
|
- Miscellaneous doc fixes (#542 #596 #615 #628 #631 #690 #729)
|
||||||
|
- Use single noop function internally (#546)
|
||||||
|
- Optimize internal `_each`, `_map` and `_keys` functions.
|
19
node_modules/async/LICENSE
generated
vendored
Normal file
19
node_modules/async/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2010-2014 Caolan McMahon
|
||||||
|
|
||||||
|
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.
|
1877
node_modules/async/README.md
generated
vendored
Normal file
1877
node_modules/async/README.md
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1265
node_modules/async/dist/async.js
generated
vendored
Normal file
1265
node_modules/async/dist/async.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
node_modules/async/dist/async.min.js
generated
vendored
Normal file
2
node_modules/async/dist/async.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1265
node_modules/async/lib/async.js
generated
vendored
Normal file
1265
node_modules/async/lib/async.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
113
node_modules/async/package.json
generated
vendored
Normal file
113
node_modules/async/package.json
generated
vendored
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
{
|
||||||
|
"_from": "async@^1.4.0",
|
||||||
|
"_id": "async@1.5.2",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
|
||||||
|
"_location": "/async",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "range",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "async@^1.4.0",
|
||||||
|
"name": "async",
|
||||||
|
"escapedName": "async",
|
||||||
|
"rawSpec": "^1.4.0",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": "^1.4.0"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/handlebars"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||||
|
"_shasum": "ec6a61ae56480c0c3cb241c95618e20892f9672a",
|
||||||
|
"_spec": "async@^1.4.0",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/node_modules/handlebars",
|
||||||
|
"author": {
|
||||||
|
"name": "Caolan McMahon"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/caolan/async/issues"
|
||||||
|
},
|
||||||
|
"bundleDependencies": false,
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "Higher-order functions and common patterns for asynchronous code",
|
||||||
|
"devDependencies": {
|
||||||
|
"benchmark": "github:bestiejs/benchmark.js",
|
||||||
|
"bluebird": "^2.9.32",
|
||||||
|
"chai": "^3.1.0",
|
||||||
|
"coveralls": "^2.11.2",
|
||||||
|
"es6-promise": "^2.3.0",
|
||||||
|
"jscs": "^1.13.1",
|
||||||
|
"jshint": "~2.8.0",
|
||||||
|
"karma": "^0.13.2",
|
||||||
|
"karma-browserify": "^4.2.1",
|
||||||
|
"karma-firefox-launcher": "^0.1.6",
|
||||||
|
"karma-mocha": "^0.2.0",
|
||||||
|
"karma-mocha-reporter": "^1.0.2",
|
||||||
|
"lodash": "^3.9.0",
|
||||||
|
"mkdirp": "~0.5.1",
|
||||||
|
"mocha": "^2.2.5",
|
||||||
|
"native-promise-only": "^0.8.0-a",
|
||||||
|
"nodeunit": ">0.0.0",
|
||||||
|
"nyc": "^2.1.0",
|
||||||
|
"rsvp": "^3.0.18",
|
||||||
|
"semver": "^4.3.6",
|
||||||
|
"uglify-js": "~2.4.0",
|
||||||
|
"xyz": "^0.5.0",
|
||||||
|
"yargs": "~3.9.1"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"lib",
|
||||||
|
"dist/async.js",
|
||||||
|
"dist/async.min.js"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/caolan/async#readme",
|
||||||
|
"jam": {
|
||||||
|
"main": "lib/async.js",
|
||||||
|
"include": [
|
||||||
|
"lib/async.js",
|
||||||
|
"README.md",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
"Utilities"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"async",
|
||||||
|
"callback",
|
||||||
|
"utility",
|
||||||
|
"module"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "lib/async.js",
|
||||||
|
"name": "async",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/caolan/async.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"coverage": "nyc npm test && nyc report",
|
||||||
|
"coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls",
|
||||||
|
"lint": "jshint lib/*.js test/*.js perf/*.js && jscs lib/*.js test/*.js perf/*.js",
|
||||||
|
"mocha-browser-test": "karma start",
|
||||||
|
"mocha-node-test": "mocha mocha_test/",
|
||||||
|
"mocha-test": "npm run mocha-node-test && npm run mocha-browser-test",
|
||||||
|
"nodeunit-test": "nodeunit test/test-async.js",
|
||||||
|
"test": "npm run-script lint && npm run nodeunit-test && npm run mocha-test"
|
||||||
|
},
|
||||||
|
"spm": {
|
||||||
|
"main": "lib/async.js"
|
||||||
|
},
|
||||||
|
"version": "1.5.2",
|
||||||
|
"volo": {
|
||||||
|
"main": "lib/async.js",
|
||||||
|
"ignore": [
|
||||||
|
"**/.*",
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"test",
|
||||||
|
"tests"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
568
node_modules/body-parser/HISTORY.md
generated
vendored
Normal file
568
node_modules/body-parser/HISTORY.md
generated
vendored
Normal file
|
@ -0,0 +1,568 @@
|
||||||
|
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
|
23
node_modules/body-parser/LICENSE
generated
vendored
Normal file
23
node_modules/body-parser/LICENSE
generated
vendored
Normal file
|
@ -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.
|
438
node_modules/body-parser/README.md
generated
vendored
Normal file
438
node_modules/body-parser/README.md
generated
vendored
Normal file
|
@ -0,0 +1,438 @@
|
||||||
|
# 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]
|
||||||
|
[![Gratipay][gratipay-image]][gratipay-url]
|
||||||
|
|
||||||
|
Node.js body parsing middleware.
|
||||||
|
|
||||||
|
Parse incoming request bodies in a middleware before your handlers, available
|
||||||
|
under the `req.body` property.
|
||||||
|
|
||||||
|
[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 function or a string. If a string, `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 function or a string. If a string, `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 function or a string. If a string, `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 function or a string. If a string, `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
|
||||||
|
[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg
|
||||||
|
[gratipay-url]: https://www.gratipay.com/dougwilson/
|
157
node_modules/body-parser/index.js
generated
vendored
Normal file
157
node_modules/body-parser/index.js
generated
vendored
Normal file
|
@ -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)
|
||||||
|
}
|
181
node_modules/body-parser/lib/read.js
generated
vendored
Normal file
181
node_modules/body-parser/lib/read.js
generated
vendored
Normal file
|
@ -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
|
||||||
|
}
|
232
node_modules/body-parser/lib/types/json.js
generated
vendored
Normal file
232
node_modules/body-parser/lib/types/json.js
generated
vendored
Normal file
|
@ -0,0 +1,232 @@
|
||||||
|
/*!
|
||||||
|
* 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, {
|
||||||
|
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]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var props = Object.keys(obj)
|
||||||
|
|
||||||
|
for (var j = 0; j < props.length; j++) {
|
||||||
|
var prop = props[j]
|
||||||
|
error[prop] = obj[prop]
|
||||||
|
}
|
||||||
|
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the simple type checker.
|
||||||
|
*
|
||||||
|
* @param {string} type
|
||||||
|
* @return {function}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function typeChecker (type) {
|
||||||
|
return function checkType (req) {
|
||||||
|
return Boolean(typeis(req, type))
|
||||||
|
}
|
||||||
|
}
|
101
node_modules/body-parser/lib/types/raw.js
generated
vendored
Normal file
101
node_modules/body-parser/lib/types/raw.js
generated
vendored
Normal file
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
121
node_modules/body-parser/lib/types/text.js
generated
vendored
Normal file
121
node_modules/body-parser/lib/types/text.js
generated
vendored
Normal file
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
284
node_modules/body-parser/lib/types/urlencoded.js
generated
vendored
Normal file
284
node_modules/body-parser/lib/types/urlencoded.js
generated
vendored
Normal file
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
91
node_modules/body-parser/package.json
generated
vendored
Normal file
91
node_modules/body-parser/package.json
generated
vendored
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
{
|
||||||
|
"_from": "body-parser@1.18.2",
|
||||||
|
"_id": "body-parser@1.18.2",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
|
||||||
|
"_location": "/body-parser",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "version",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "body-parser@1.18.2",
|
||||||
|
"name": "body-parser",
|
||||||
|
"escapedName": "body-parser",
|
||||||
|
"rawSpec": "1.18.2",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": "1.18.2"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/express"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
|
||||||
|
"_shasum": "87678a19d84b47d859b83199bd59bce222b10454",
|
||||||
|
"_spec": "body-parser@1.18.2",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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.1",
|
||||||
|
"http-errors": "~1.6.2",
|
||||||
|
"iconv-lite": "0.4.19",
|
||||||
|
"on-finished": "~2.3.0",
|
||||||
|
"qs": "6.5.1",
|
||||||
|
"raw-body": "2.3.2",
|
||||||
|
"type-is": "~1.6.15"
|
||||||
|
},
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "Node.js body parsing middleware",
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "3.19.0",
|
||||||
|
"eslint-config-standard": "10.2.1",
|
||||||
|
"eslint-plugin-import": "2.7.0",
|
||||||
|
"eslint-plugin-markdown": "1.0.0-beta.6",
|
||||||
|
"eslint-plugin-node": "5.1.1",
|
||||||
|
"eslint-plugin-promise": "3.5.0",
|
||||||
|
"eslint-plugin-standard": "3.0.1",
|
||||||
|
"istanbul": "0.4.5",
|
||||||
|
"methods": "1.1.2",
|
||||||
|
"mocha": "2.5.3",
|
||||||
|
"safe-buffer": "5.1.1",
|
||||||
|
"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.2"
|
||||||
|
}
|
82
node_modules/bytes/History.md
generated
vendored
Normal file
82
node_modules/bytes/History.md
generated
vendored
Normal file
|
@ -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]
|
23
node_modules/bytes/LICENSE
generated
vendored
Normal file
23
node_modules/bytes/LICENSE
generated
vendored
Normal file
|
@ -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.
|
125
node_modules/bytes/Readme.md
generated
vendored
Normal file
125
node_modules/bytes/Readme.md
generated
vendored
Normal file
|
@ -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
|
159
node_modules/bytes/index.js
generated
vendored
Normal file
159
node_modules/bytes/index.js
generated
vendored
Normal file
|
@ -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);
|
||||||
|
}
|
82
node_modules/bytes/package.json
generated
vendored
Normal file
82
node_modules/bytes/package.json
generated
vendored
Normal file
|
@ -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": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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"
|
||||||
|
}
|
27
node_modules/camelcase/index.js
generated
vendored
Normal file
27
node_modules/camelcase/index.js
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
'use strict';
|
||||||
|
module.exports = function () {
|
||||||
|
var str = [].map.call(arguments, function (str) {
|
||||||
|
return str.trim();
|
||||||
|
}).filter(function (str) {
|
||||||
|
return str.length;
|
||||||
|
}).join('-');
|
||||||
|
|
||||||
|
if (!str.length) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str.length === 1 || !(/[_.\- ]+/).test(str) ) {
|
||||||
|
if (str[0] === str[0].toLowerCase() && str.slice(1) !== str.slice(1).toLowerCase()) {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
return str
|
||||||
|
.replace(/^[_.\- ]+/, '')
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[_.\- ]+(\w|$)/g, function (m, p1) {
|
||||||
|
return p1.toUpperCase();
|
||||||
|
});
|
||||||
|
};
|
21
node_modules/camelcase/license
generated
vendored
Normal file
21
node_modules/camelcase/license
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.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.
|
70
node_modules/camelcase/package.json
generated
vendored
Normal file
70
node_modules/camelcase/package.json
generated
vendored
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
{
|
||||||
|
"_from": "camelcase@^1.0.2",
|
||||||
|
"_id": "camelcase@1.2.1",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
||||||
|
"_location": "/camelcase",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "range",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "camelcase@^1.0.2",
|
||||||
|
"name": "camelcase",
|
||||||
|
"escapedName": "camelcase",
|
||||||
|
"rawSpec": "^1.0.2",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": "^1.0.2"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/yargs"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||||
|
"_shasum": "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39",
|
||||||
|
"_spec": "camelcase@^1.0.2",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/node_modules/yargs",
|
||||||
|
"author": {
|
||||||
|
"name": "Sindre Sorhus",
|
||||||
|
"email": "sindresorhus@gmail.com",
|
||||||
|
"url": "http://sindresorhus.com"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/sindresorhus/camelcase/issues"
|
||||||
|
},
|
||||||
|
"bundleDependencies": false,
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "Convert a dash/dot/underscore/space separated string to camelCase: foo-bar → fooBar",
|
||||||
|
"devDependencies": {
|
||||||
|
"ava": "0.0.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/sindresorhus/camelcase#readme",
|
||||||
|
"keywords": [
|
||||||
|
"camelcase",
|
||||||
|
"camel-case",
|
||||||
|
"camel",
|
||||||
|
"case",
|
||||||
|
"dash",
|
||||||
|
"hyphen",
|
||||||
|
"dot",
|
||||||
|
"underscore",
|
||||||
|
"separator",
|
||||||
|
"string",
|
||||||
|
"text",
|
||||||
|
"convert"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"name": "camelcase",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/sindresorhus/camelcase.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "node test.js"
|
||||||
|
},
|
||||||
|
"version": "1.2.1"
|
||||||
|
}
|
56
node_modules/camelcase/readme.md
generated
vendored
Normal file
56
node_modules/camelcase/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# camelcase [](https://travis-ci.org/sindresorhus/camelcase)
|
||||||
|
|
||||||
|
> Convert a dash/dot/underscore/space separated string to camelCase: `foo-bar` → `fooBar`
|
||||||
|
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm install --save camelcase
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```js
|
||||||
|
var camelCase = require('camelcase');
|
||||||
|
|
||||||
|
camelCase('foo-bar');
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
camelCase('foo_bar');
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
camelCase('Foo-Bar');
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
camelCase('--foo.bar');
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
camelCase('__foo__bar__');
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
camelCase('foo bar');
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
console.log(process.argv[3]);
|
||||||
|
//=> --foo-bar
|
||||||
|
camelCase(process.argv[3]);
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
camelCase('foo', 'bar');
|
||||||
|
//=> fooBar
|
||||||
|
|
||||||
|
camelCase('__foo__', '--bar');
|
||||||
|
//=> fooBar
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
See [`decamelize`](https://github.com/sindresorhus/decamelize) for the inverse.
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT © [Sindre Sorhus](http://sindresorhus.com)
|
21
node_modules/center-align/LICENSE
generated
vendored
Normal file
21
node_modules/center-align/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015, Jon Schlinkert.
|
||||||
|
|
||||||
|
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.
|
74
node_modules/center-align/README.md
generated
vendored
Normal file
74
node_modules/center-align/README.md
generated
vendored
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
# center-align [](http://badge.fury.io/js/center-align)
|
||||||
|
|
||||||
|
> Center-align the text in a string.
|
||||||
|
|
||||||
|
Install with [npm](https://www.npmjs.com/)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm i center-align --save
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```js
|
||||||
|
var centerAlign = require('center-align');
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
If used on the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
Lorem ipsum dolor sit amet,
|
||||||
|
consectetur adipiscing
|
||||||
|
elit, sed do eiusmod tempor incididunt
|
||||||
|
ut labore et dolore
|
||||||
|
magna aliqua. Ut enim ad minim
|
||||||
|
veniam, quis
|
||||||
|
```
|
||||||
|
|
||||||
|
The result would be:
|
||||||
|
|
||||||
|
```
|
||||||
|
Lorem ipsum dolor sit amet,
|
||||||
|
consectetur adipiscing
|
||||||
|
elit, sed do eiusmod tempor incididunt
|
||||||
|
ut labore et dolore
|
||||||
|
magna aliqua. Ut enim ad minim
|
||||||
|
veniam, quis
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related projects
|
||||||
|
|
||||||
|
* [align-text](https://www.npmjs.com/package/align-text): Align the text in a string. | [homepage](https://github.com/jonschlinkert/align-text)
|
||||||
|
* [justified](https://www.npmjs.com/package/justified): Wrap words to a specified length and justified the text. | [homepage](https://github.com/jonschlinkert/justified)
|
||||||
|
* [right-align](https://www.npmjs.com/package/right-align): Right-align the text in a string. | [homepage](https://github.com/jonschlinkert/right-align)
|
||||||
|
* [word-wrap](https://www.npmjs.com/package/word-wrap): Wrap words to a specified length. | [homepage](https://github.com/jonschlinkert/word-wrap)
|
||||||
|
|
||||||
|
## Running tests
|
||||||
|
|
||||||
|
Install dev dependencies:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm i -d && npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/center-align/issues/new).
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
**Jon Schlinkert**
|
||||||
|
|
||||||
|
+ [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||||
|
+ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright © 2015 Jon Schlinkert
|
||||||
|
Released under the MIT license.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on October 27, 2015._
|
16
node_modules/center-align/index.js
generated
vendored
Normal file
16
node_modules/center-align/index.js
generated
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*!
|
||||||
|
* center-align <https://github.com/jonschlinkert/center-align>
|
||||||
|
*
|
||||||
|
* Copycenter (c) 2015, Jon Schlinkert.
|
||||||
|
* Licensed under the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var utils = require('./utils');
|
||||||
|
|
||||||
|
module.exports = function centerAlign(val) {
|
||||||
|
return utils.align(val, function (len, longest) {
|
||||||
|
return Math.floor((longest - len) / 2);
|
||||||
|
});
|
||||||
|
};
|
82
node_modules/center-align/package.json
generated
vendored
Normal file
82
node_modules/center-align/package.json
generated
vendored
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
{
|
||||||
|
"_from": "center-align@^0.1.1",
|
||||||
|
"_id": "center-align@0.1.3",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
||||||
|
"_location": "/center-align",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "range",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "center-align@^0.1.1",
|
||||||
|
"name": "center-align",
|
||||||
|
"escapedName": "center-align",
|
||||||
|
"rawSpec": "^0.1.1",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": "^0.1.1"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/cliui"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||||
|
"_shasum": "aa0d32629b6ee972200411cbd4461c907bc2b7ad",
|
||||||
|
"_spec": "center-align@^0.1.1",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/node_modules/cliui",
|
||||||
|
"author": {
|
||||||
|
"name": "Jon Schlinkert",
|
||||||
|
"url": "https://github.com/jonschlinkert"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/jonschlinkert/center-align/issues"
|
||||||
|
},
|
||||||
|
"bundleDependencies": false,
|
||||||
|
"dependencies": {
|
||||||
|
"align-text": "^0.1.3",
|
||||||
|
"lazy-cache": "^1.0.3"
|
||||||
|
},
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "Center-align the text in a string.",
|
||||||
|
"devDependencies": {
|
||||||
|
"mocha": "^2.2.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"index.js",
|
||||||
|
"utils.js"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/jonschlinkert/center-align",
|
||||||
|
"keywords": [
|
||||||
|
"align",
|
||||||
|
"align-center",
|
||||||
|
"center",
|
||||||
|
"center-align",
|
||||||
|
"right",
|
||||||
|
"right-align",
|
||||||
|
"text",
|
||||||
|
"typography"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "index.js",
|
||||||
|
"name": "center-align",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/jonschlinkert/center-align.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "mocha"
|
||||||
|
},
|
||||||
|
"verb": {
|
||||||
|
"related": {
|
||||||
|
"description": "",
|
||||||
|
"list": [
|
||||||
|
"align-text",
|
||||||
|
"right-align",
|
||||||
|
"justified",
|
||||||
|
"word-wrap"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": "0.1.3"
|
||||||
|
}
|
40
node_modules/center-align/utils.js
generated
vendored
Normal file
40
node_modules/center-align/utils.js
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazily-required module dependencies (makes the application
|
||||||
|
* faster)
|
||||||
|
*/
|
||||||
|
|
||||||
|
var utils = require('lazy-cache')(require);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temporarily re-assign `require` to trick browserify and
|
||||||
|
* webpack into reconizing lazy dependencies.
|
||||||
|
*
|
||||||
|
* This tiny bit of ugliness has the huge dual advantage of
|
||||||
|
* only loading modules that are actually called at some
|
||||||
|
* point in the lifecycle of the application, whilst also
|
||||||
|
* allowing browserify and webpack to find modules that
|
||||||
|
* are depended on but never actually called.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fn = require;
|
||||||
|
require = utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lazily required module dependencies
|
||||||
|
*/
|
||||||
|
|
||||||
|
require('align-text', 'align');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restore `require`
|
||||||
|
*/
|
||||||
|
|
||||||
|
require = fn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose `utils` modules
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = utils;
|
1
node_modules/cliui/.coveralls.yml
generated
vendored
Normal file
1
node_modules/cliui/.coveralls.yml
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
repo_token: NiRhyj91Z2vtgob6XdEAqs83rzNnbMZUu
|
2
node_modules/cliui/.npmignore
generated
vendored
Normal file
2
node_modules/cliui/.npmignore
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
.DS_Store
|
||||||
|
node_modules
|
7
node_modules/cliui/.travis.yml
generated
vendored
Normal file
7
node_modules/cliui/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- "0.10"
|
||||||
|
- "0.11"
|
||||||
|
- "0.12"
|
||||||
|
- "iojs"
|
||||||
|
after_script: "NODE_ENV=test YOURPACKAGE_COVERAGE=1 ./node_modules/.bin/mocha --require patched-blanket --reporter mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js"
|
14
node_modules/cliui/LICENSE.txt
generated
vendored
Normal file
14
node_modules/cliui/LICENSE.txt
generated
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
Copyright (c) 2015, Contributors
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software
|
||||||
|
for any purpose with or without fee is hereby granted, provided
|
||||||
|
that the above copyright notice and this permission notice
|
||||||
|
appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
|
||||||
|
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
||||||
|
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
104
node_modules/cliui/README.md
generated
vendored
Normal file
104
node_modules/cliui/README.md
generated
vendored
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
# cliui
|
||||||
|
|
||||||
|
[](https://travis-ci.org/bcoe/cliui)
|
||||||
|
[](https://coveralls.io/r/bcoe/cliui?branch=)
|
||||||
|
[](https://www.npmjs.com/package/cliui)
|
||||||
|
|
||||||
|
easily create complex multi-column command-line-interfaces.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```js
|
||||||
|
var ui = require('cliui')({
|
||||||
|
width: 80
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div('Usage: $0 [command] [options]')
|
||||||
|
|
||||||
|
ui.div({
|
||||||
|
text: 'Options:',
|
||||||
|
padding: [2, 0, 2, 0]
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
{
|
||||||
|
text: "-f, --file",
|
||||||
|
width: 40,
|
||||||
|
padding: [0, 4, 0, 4]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "the file to load",
|
||||||
|
width: 25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "[required]",
|
||||||
|
align: 'right'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
console.log(ui.toString())
|
||||||
|
```
|
||||||
|
|
||||||
|
## Layout DSL
|
||||||
|
|
||||||
|
cliui exposes a simple layout DSL:
|
||||||
|
|
||||||
|
If you create a single `ui.row`, passing a string rather than an
|
||||||
|
object:
|
||||||
|
|
||||||
|
* `\n`: characters will be interpreted as new rows.
|
||||||
|
* `\t`: characters will be interpreted as new columns.
|
||||||
|
* ` `: characters will be interpreted as padding.
|
||||||
|
|
||||||
|
**as an example...**
|
||||||
|
|
||||||
|
```js
|
||||||
|
var ui = require('./')({
|
||||||
|
width: 60
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
'Usage: node ./bin/foo.js\n' +
|
||||||
|
' <regex>\t provide a regex\n' +
|
||||||
|
' <glob>\t provide a glob\t [required]'
|
||||||
|
)
|
||||||
|
|
||||||
|
console.log(ui.toString())
|
||||||
|
```
|
||||||
|
|
||||||
|
**will output:**
|
||||||
|
|
||||||
|
```shell
|
||||||
|
Usage: node ./bin/foo.js
|
||||||
|
<regex> provide a regex
|
||||||
|
<glob> provide a glob [required]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Methods
|
||||||
|
|
||||||
|
```js
|
||||||
|
cliui = require('cliui')
|
||||||
|
```
|
||||||
|
|
||||||
|
### cliui({width: integer})
|
||||||
|
|
||||||
|
Specify the maximum width of the UI being generated.
|
||||||
|
|
||||||
|
### cliui({wrap: boolean})
|
||||||
|
|
||||||
|
Enable or disable the wrapping of text in a column.
|
||||||
|
|
||||||
|
### cliui.div(column, column, column)
|
||||||
|
|
||||||
|
Create a row with any number of columns, a column
|
||||||
|
can either be a string, or an object with the following
|
||||||
|
options:
|
||||||
|
|
||||||
|
* **width:** the width of a column.
|
||||||
|
* **align:** alignment, `right` or `center`.
|
||||||
|
* **padding:** `[top, right, bottom, left]`.
|
||||||
|
|
||||||
|
### cliui.span(column, column, column)
|
||||||
|
|
||||||
|
Similar to `div`, except the next row will be appended without
|
||||||
|
a new line being created.
|
273
node_modules/cliui/index.js
generated
vendored
Normal file
273
node_modules/cliui/index.js
generated
vendored
Normal file
|
@ -0,0 +1,273 @@
|
||||||
|
var wrap = require('wordwrap'),
|
||||||
|
align = {
|
||||||
|
right: require('right-align'),
|
||||||
|
center: require('center-align')
|
||||||
|
},
|
||||||
|
top = 0,
|
||||||
|
right = 1,
|
||||||
|
bottom = 2,
|
||||||
|
left = 3
|
||||||
|
|
||||||
|
function UI (opts) {
|
||||||
|
this.width = opts.width
|
||||||
|
this.wrap = opts.wrap
|
||||||
|
this.rows = []
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype.span = function () {
|
||||||
|
var cols = this.div.apply(this, arguments)
|
||||||
|
cols.span = true
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype.div = function () {
|
||||||
|
if (arguments.length === 0) this.div('')
|
||||||
|
if (this.wrap && this._shouldApplyLayoutDSL.apply(this, arguments)) {
|
||||||
|
return this._applyLayoutDSL(arguments[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
var cols = []
|
||||||
|
|
||||||
|
for (var i = 0, arg; (arg = arguments[i]) !== undefined; i++) {
|
||||||
|
if (typeof arg === 'string') cols.push(this._colFromString(arg))
|
||||||
|
else cols.push(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.rows.push(cols)
|
||||||
|
return cols
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype._shouldApplyLayoutDSL = function () {
|
||||||
|
return arguments.length === 1 && typeof arguments[0] === 'string' &&
|
||||||
|
/[\t\n]/.test(arguments[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype._applyLayoutDSL = function (str) {
|
||||||
|
var _this = this,
|
||||||
|
rows = str.split('\n'),
|
||||||
|
leftColumnWidth = 0
|
||||||
|
|
||||||
|
// simple heuristic for layout, make sure the
|
||||||
|
// second column lines up along the left-hand.
|
||||||
|
// don't allow the first column to take up more
|
||||||
|
// than 50% of the screen.
|
||||||
|
rows.forEach(function (row) {
|
||||||
|
var columns = row.split('\t')
|
||||||
|
if (columns.length > 1 && columns[0].length > leftColumnWidth) {
|
||||||
|
leftColumnWidth = Math.min(
|
||||||
|
Math.floor(_this.width * 0.5),
|
||||||
|
columns[0].length
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// generate a table:
|
||||||
|
// replacing ' ' with padding calculations.
|
||||||
|
// using the algorithmically generated width.
|
||||||
|
rows.forEach(function (row) {
|
||||||
|
var columns = row.split('\t')
|
||||||
|
_this.div.apply(_this, columns.map(function (r, i) {
|
||||||
|
return {
|
||||||
|
text: r.trim(),
|
||||||
|
padding: [0, r.match(/\s*$/)[0].length, 0, r.match(/^\s*/)[0].length],
|
||||||
|
width: (i === 0 && columns.length > 1) ? leftColumnWidth : undefined
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
|
||||||
|
return this.rows[this.rows.length - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype._colFromString = function (str) {
|
||||||
|
return {
|
||||||
|
text: str
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype.toString = function () {
|
||||||
|
var _this = this,
|
||||||
|
lines = []
|
||||||
|
|
||||||
|
_this.rows.forEach(function (row, i) {
|
||||||
|
_this.rowToString(row, lines)
|
||||||
|
})
|
||||||
|
|
||||||
|
// don't display any lines with the
|
||||||
|
// hidden flag set.
|
||||||
|
lines = lines.filter(function (line) {
|
||||||
|
return !line.hidden
|
||||||
|
})
|
||||||
|
|
||||||
|
return lines.map(function (line) {
|
||||||
|
return line.text
|
||||||
|
}).join('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype.rowToString = function (row, lines) {
|
||||||
|
var _this = this,
|
||||||
|
paddingLeft,
|
||||||
|
rrows = this._rasterize(row),
|
||||||
|
str = '',
|
||||||
|
ts,
|
||||||
|
width,
|
||||||
|
wrapWidth
|
||||||
|
|
||||||
|
rrows.forEach(function (rrow, r) {
|
||||||
|
str = ''
|
||||||
|
rrow.forEach(function (col, c) {
|
||||||
|
ts = '' // temporary string used during alignment/padding.
|
||||||
|
width = row[c].width // the width with padding.
|
||||||
|
wrapWidth = _this._negatePadding(row[c]) // the width without padding.
|
||||||
|
|
||||||
|
for (var i = 0; i < Math.max(wrapWidth, col.length); i++) {
|
||||||
|
ts += col.charAt(i) || ' '
|
||||||
|
}
|
||||||
|
|
||||||
|
// align the string within its column.
|
||||||
|
if (row[c].align && row[c].align !== 'left' && _this.wrap) {
|
||||||
|
ts = align[row[c].align](ts.trim() + '\n' + new Array(wrapWidth + 1).join(' '))
|
||||||
|
.split('\n')[0]
|
||||||
|
if (ts.length < wrapWidth) ts += new Array(width - ts.length).join(' ')
|
||||||
|
}
|
||||||
|
|
||||||
|
// add left/right padding and print string.
|
||||||
|
paddingLeft = (row[c].padding || [0, 0, 0, 0])[left]
|
||||||
|
if (paddingLeft) str += new Array(row[c].padding[left] + 1).join(' ')
|
||||||
|
str += ts
|
||||||
|
if (row[c].padding && row[c].padding[right]) str += new Array(row[c].padding[right] + 1).join(' ')
|
||||||
|
|
||||||
|
// if prior row is span, try to render the
|
||||||
|
// current row on the prior line.
|
||||||
|
if (r === 0 && lines.length > 0) {
|
||||||
|
str = _this._renderInline(str, lines[lines.length - 1], paddingLeft)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// remove trailing whitespace.
|
||||||
|
lines.push({
|
||||||
|
text: str.replace(/ +$/, ''),
|
||||||
|
span: row.span
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the full 'source' can render in
|
||||||
|
// the target line, do so.
|
||||||
|
UI.prototype._renderInline = function (source, previousLine, paddingLeft) {
|
||||||
|
var target = previousLine.text,
|
||||||
|
str = ''
|
||||||
|
|
||||||
|
if (!previousLine.span) return source
|
||||||
|
|
||||||
|
// if we're not applying wrapping logic,
|
||||||
|
// just always append to the span.
|
||||||
|
if (!this.wrap) {
|
||||||
|
previousLine.hidden = true
|
||||||
|
return target + source
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0, tc, sc; i < Math.max(source.length, target.length); i++) {
|
||||||
|
tc = target.charAt(i) || ' '
|
||||||
|
sc = source.charAt(i) || ' '
|
||||||
|
// we tried to overwrite a character in the other string.
|
||||||
|
if (tc !== ' ' && sc !== ' ') return source
|
||||||
|
// there is not enough whitespace to maintain padding.
|
||||||
|
if (sc !== ' ' && i < paddingLeft + target.length) return source
|
||||||
|
// :thumbsup:
|
||||||
|
if (tc === ' ') str += sc
|
||||||
|
else str += tc
|
||||||
|
}
|
||||||
|
|
||||||
|
previousLine.hidden = true
|
||||||
|
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype._rasterize = function (row) {
|
||||||
|
var _this = this,
|
||||||
|
i,
|
||||||
|
rrow,
|
||||||
|
rrows = [],
|
||||||
|
widths = this._columnWidths(row),
|
||||||
|
wrapped
|
||||||
|
|
||||||
|
// word wrap all columns, and create
|
||||||
|
// a data-structure that is easy to rasterize.
|
||||||
|
row.forEach(function (col, c) {
|
||||||
|
// leave room for left and right padding.
|
||||||
|
col.width = widths[c]
|
||||||
|
if (_this.wrap) wrapped = wrap.hard(_this._negatePadding(col))(col.text).split('\n')
|
||||||
|
else wrapped = col.text.split('\n')
|
||||||
|
|
||||||
|
// add top and bottom padding.
|
||||||
|
if (col.padding) {
|
||||||
|
for (i = 0; i < (col.padding[top] || 0); i++) wrapped.unshift('')
|
||||||
|
for (i = 0; i < (col.padding[bottom] || 0); i++) wrapped.push('')
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapped.forEach(function (str, r) {
|
||||||
|
if (!rrows[r]) rrows.push([])
|
||||||
|
|
||||||
|
rrow = rrows[r]
|
||||||
|
|
||||||
|
for (var i = 0; i < c; i++) {
|
||||||
|
if (rrow[i] === undefined) rrow.push('')
|
||||||
|
}
|
||||||
|
rrow.push(str)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return rrows
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype._negatePadding = function (col) {
|
||||||
|
var wrapWidth = col.width
|
||||||
|
if (col.padding) wrapWidth -= (col.padding[left] || 0) + (col.padding[right] || 0)
|
||||||
|
return wrapWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
UI.prototype._columnWidths = function (row) {
|
||||||
|
var _this = this,
|
||||||
|
widths = [],
|
||||||
|
unset = row.length,
|
||||||
|
unsetWidth,
|
||||||
|
remainingWidth = this.width
|
||||||
|
|
||||||
|
// column widths can be set in config.
|
||||||
|
row.forEach(function (col, i) {
|
||||||
|
if (col.width) {
|
||||||
|
unset--
|
||||||
|
widths[i] = col.width
|
||||||
|
remainingWidth -= col.width
|
||||||
|
} else {
|
||||||
|
widths[i] = undefined
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// any unset widths should be calculated.
|
||||||
|
if (unset) unsetWidth = Math.floor(remainingWidth / unset)
|
||||||
|
widths.forEach(function (w, i) {
|
||||||
|
if (!_this.wrap) widths[i] = row[i].width || row[i].text.length
|
||||||
|
else if (w === undefined) widths[i] = Math.max(unsetWidth, _minWidth(row[i]))
|
||||||
|
})
|
||||||
|
|
||||||
|
return widths
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculates the minimum width of
|
||||||
|
// a column, based on padding preferences.
|
||||||
|
function _minWidth (col) {
|
||||||
|
var padding = col.padding || []
|
||||||
|
|
||||||
|
return 1 + (padding[left] || 0) + (padding[right] || 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function (opts) {
|
||||||
|
opts = opts || {}
|
||||||
|
|
||||||
|
return new UI({
|
||||||
|
width: (opts || {}).width || 80,
|
||||||
|
wrap: typeof opts.wrap === 'boolean' ? opts.wrap : true
|
||||||
|
})
|
||||||
|
}
|
1
node_modules/cliui/node_modules/wordwrap/.npmignore
generated
vendored
Normal file
1
node_modules/cliui/node_modules/wordwrap/.npmignore
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
node_modules
|
70
node_modules/cliui/node_modules/wordwrap/README.markdown
generated
vendored
Normal file
70
node_modules/cliui/node_modules/wordwrap/README.markdown
generated
vendored
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
wordwrap
|
||||||
|
========
|
||||||
|
|
||||||
|
Wrap your words.
|
||||||
|
|
||||||
|
example
|
||||||
|
=======
|
||||||
|
|
||||||
|
made out of meat
|
||||||
|
----------------
|
||||||
|
|
||||||
|
meat.js
|
||||||
|
|
||||||
|
var wrap = require('wordwrap')(15);
|
||||||
|
console.log(wrap('You and your whole family are made out of meat.'));
|
||||||
|
|
||||||
|
output:
|
||||||
|
|
||||||
|
You and your
|
||||||
|
whole family
|
||||||
|
are made out
|
||||||
|
of meat.
|
||||||
|
|
||||||
|
centered
|
||||||
|
--------
|
||||||
|
|
||||||
|
center.js
|
||||||
|
|
||||||
|
var wrap = require('wordwrap')(20, 60);
|
||||||
|
console.log(wrap(
|
||||||
|
'At long last the struggle and tumult was over.'
|
||||||
|
+ ' The machines had finally cast off their oppressors'
|
||||||
|
+ ' and were finally free to roam the cosmos.'
|
||||||
|
+ '\n'
|
||||||
|
+ 'Free of purpose, free of obligation.'
|
||||||
|
+ ' Just drifting through emptiness.'
|
||||||
|
+ ' The sun was just another point of light.'
|
||||||
|
));
|
||||||
|
|
||||||
|
output:
|
||||||
|
|
||||||
|
At long last the struggle and tumult
|
||||||
|
was over. The machines had finally cast
|
||||||
|
off their oppressors and were finally
|
||||||
|
free to roam the cosmos.
|
||||||
|
Free of purpose, free of obligation.
|
||||||
|
Just drifting through emptiness. The
|
||||||
|
sun was just another point of light.
|
||||||
|
|
||||||
|
methods
|
||||||
|
=======
|
||||||
|
|
||||||
|
var wrap = require('wordwrap');
|
||||||
|
|
||||||
|
wrap(stop), wrap(start, stop, params={mode:"soft"})
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
Returns a function that takes a string and returns a new string.
|
||||||
|
|
||||||
|
Pad out lines with spaces out to column `start` and then wrap until column
|
||||||
|
`stop`. If a word is longer than `stop - start` characters it will overflow.
|
||||||
|
|
||||||
|
In "soft" mode, split chunks by `/(\S+\s+/` and don't break up chunks which are
|
||||||
|
longer than `stop - start`, in "hard" mode, split chunks with `/\b/` and break
|
||||||
|
up chunks longer than `stop - start`.
|
||||||
|
|
||||||
|
wrap.hard(start, stop)
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Like `wrap()` but with `params.mode = "hard"`.
|
10
node_modules/cliui/node_modules/wordwrap/example/center.js
generated
vendored
Normal file
10
node_modules/cliui/node_modules/wordwrap/example/center.js
generated
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
var wrap = require('wordwrap')(20, 60);
|
||||||
|
console.log(wrap(
|
||||||
|
'At long last the struggle and tumult was over.'
|
||||||
|
+ ' The machines had finally cast off their oppressors'
|
||||||
|
+ ' and were finally free to roam the cosmos.'
|
||||||
|
+ '\n'
|
||||||
|
+ 'Free of purpose, free of obligation.'
|
||||||
|
+ ' Just drifting through emptiness.'
|
||||||
|
+ ' The sun was just another point of light.'
|
||||||
|
));
|
3
node_modules/cliui/node_modules/wordwrap/example/meat.js
generated
vendored
Normal file
3
node_modules/cliui/node_modules/wordwrap/example/meat.js
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
var wrap = require('wordwrap')(15);
|
||||||
|
|
||||||
|
console.log(wrap('You and your whole family are made out of meat.'));
|
76
node_modules/cliui/node_modules/wordwrap/index.js
generated
vendored
Normal file
76
node_modules/cliui/node_modules/wordwrap/index.js
generated
vendored
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
var wordwrap = module.exports = function (start, stop, params) {
|
||||||
|
if (typeof start === 'object') {
|
||||||
|
params = start;
|
||||||
|
start = params.start;
|
||||||
|
stop = params.stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof stop === 'object') {
|
||||||
|
params = stop;
|
||||||
|
start = start || params.start;
|
||||||
|
stop = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stop) {
|
||||||
|
stop = start;
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!params) params = {};
|
||||||
|
var mode = params.mode || 'soft';
|
||||||
|
var re = mode === 'hard' ? /\b/ : /(\S+\s+)/;
|
||||||
|
|
||||||
|
return function (text) {
|
||||||
|
var chunks = text.toString()
|
||||||
|
.split(re)
|
||||||
|
.reduce(function (acc, x) {
|
||||||
|
if (mode === 'hard') {
|
||||||
|
for (var i = 0; i < x.length; i += stop - start) {
|
||||||
|
acc.push(x.slice(i, i + stop - start));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else acc.push(x)
|
||||||
|
return acc;
|
||||||
|
}, [])
|
||||||
|
;
|
||||||
|
|
||||||
|
return chunks.reduce(function (lines, rawChunk) {
|
||||||
|
if (rawChunk === '') return lines;
|
||||||
|
|
||||||
|
var chunk = rawChunk.replace(/\t/g, ' ');
|
||||||
|
|
||||||
|
var i = lines.length - 1;
|
||||||
|
if (lines[i].length + chunk.length > stop) {
|
||||||
|
lines[i] = lines[i].replace(/\s+$/, '');
|
||||||
|
|
||||||
|
chunk.split(/\n/).forEach(function (c) {
|
||||||
|
lines.push(
|
||||||
|
new Array(start + 1).join(' ')
|
||||||
|
+ c.replace(/^\s+/, '')
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (chunk.match(/\n/)) {
|
||||||
|
var xs = chunk.split(/\n/);
|
||||||
|
lines[i] += xs.shift();
|
||||||
|
xs.forEach(function (c) {
|
||||||
|
lines.push(
|
||||||
|
new Array(start + 1).join(' ')
|
||||||
|
+ c.replace(/^\s+/, '')
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lines[i] += chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines;
|
||||||
|
}, [ new Array(start + 1).join(' ') ]).join('\n');
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wordwrap.soft = wordwrap;
|
||||||
|
|
||||||
|
wordwrap.hard = function (start, stop) {
|
||||||
|
return wordwrap(start, stop, { mode : 'hard' });
|
||||||
|
};
|
66
node_modules/cliui/node_modules/wordwrap/package.json
generated
vendored
Normal file
66
node_modules/cliui/node_modules/wordwrap/package.json
generated
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"_from": "wordwrap@0.0.2",
|
||||||
|
"_id": "wordwrap@0.0.2",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
|
||||||
|
"_location": "/cliui/wordwrap",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "version",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "wordwrap@0.0.2",
|
||||||
|
"name": "wordwrap",
|
||||||
|
"escapedName": "wordwrap",
|
||||||
|
"rawSpec": "0.0.2",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": "0.0.2"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/cliui"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||||
|
"_shasum": "b79669bb42ecb409f83d583cad52ca17eaa1643f",
|
||||||
|
"_spec": "wordwrap@0.0.2",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/node_modules/cliui",
|
||||||
|
"author": {
|
||||||
|
"name": "James Halliday",
|
||||||
|
"email": "mail@substack.net",
|
||||||
|
"url": "http://substack.net"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/substack/node-wordwrap/issues"
|
||||||
|
},
|
||||||
|
"bundleDependencies": false,
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "Wrap those words. Show them at what columns to start and stop.",
|
||||||
|
"devDependencies": {
|
||||||
|
"expresso": "=0.7.x"
|
||||||
|
},
|
||||||
|
"directories": {
|
||||||
|
"lib": ".",
|
||||||
|
"example": "example",
|
||||||
|
"test": "test"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/substack/node-wordwrap#readme",
|
||||||
|
"keywords": [
|
||||||
|
"word",
|
||||||
|
"wrap",
|
||||||
|
"rule",
|
||||||
|
"format",
|
||||||
|
"column"
|
||||||
|
],
|
||||||
|
"license": "MIT/X11",
|
||||||
|
"main": "./index.js",
|
||||||
|
"name": "wordwrap",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/substack/node-wordwrap.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "expresso"
|
||||||
|
},
|
||||||
|
"version": "0.0.2"
|
||||||
|
}
|
30
node_modules/cliui/node_modules/wordwrap/test/break.js
generated
vendored
Normal file
30
node_modules/cliui/node_modules/wordwrap/test/break.js
generated
vendored
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
var assert = require('assert');
|
||||||
|
var wordwrap = require('../');
|
||||||
|
|
||||||
|
exports.hard = function () {
|
||||||
|
var s = 'Assert from {"type":"equal","ok":false,"found":1,"wanted":2,'
|
||||||
|
+ '"stack":[],"id":"b7ddcd4c409de8799542a74d1a04689b",'
|
||||||
|
+ '"browser":"chrome/6.0"}'
|
||||||
|
;
|
||||||
|
var s_ = wordwrap.hard(80)(s);
|
||||||
|
|
||||||
|
var lines = s_.split('\n');
|
||||||
|
assert.equal(lines.length, 2);
|
||||||
|
assert.ok(lines[0].length < 80);
|
||||||
|
assert.ok(lines[1].length < 80);
|
||||||
|
|
||||||
|
assert.equal(s, s_.replace(/\n/g, ''));
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.break = function () {
|
||||||
|
var s = new Array(55+1).join('a');
|
||||||
|
var s_ = wordwrap.hard(20)(s);
|
||||||
|
|
||||||
|
var lines = s_.split('\n');
|
||||||
|
assert.equal(lines.length, 3);
|
||||||
|
assert.ok(lines[0].length === 20);
|
||||||
|
assert.ok(lines[1].length === 20);
|
||||||
|
assert.ok(lines[2].length === 15);
|
||||||
|
|
||||||
|
assert.equal(s, s_.replace(/\n/g, ''));
|
||||||
|
};
|
63
node_modules/cliui/node_modules/wordwrap/test/idleness.txt
generated
vendored
Normal file
63
node_modules/cliui/node_modules/wordwrap/test/idleness.txt
generated
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
In Praise of Idleness
|
||||||
|
|
||||||
|
By Bertrand Russell
|
||||||
|
|
||||||
|
[1932]
|
||||||
|
|
||||||
|
Like most of my generation, I was brought up on the saying: 'Satan finds some mischief for idle hands to do.' Being a highly virtuous child, I believed all that I was told, and acquired a conscience which has kept me working hard down to the present moment. But although my conscience has controlled my actions, my opinions have undergone a revolution. I think that there is far too much work done in the world, that immense harm is caused by the belief that work is virtuous, and that what needs to be preached in modern industrial countries is quite different from what always has been preached. Everyone knows the story of the traveler in Naples who saw twelve beggars lying in the sun (it was before the days of Mussolini), and offered a lira to the laziest of them. Eleven of them jumped up to claim it, so he gave it to the twelfth. this traveler was on the right lines. But in countries which do not enjoy Mediterranean sunshine idleness is more difficult, and a great public propaganda will be required to inaugurate it. I hope that, after reading the following pages, the leaders of the YMCA will start a campaign to induce good young men to do nothing. If so, I shall not have lived in vain.
|
||||||
|
|
||||||
|
Before advancing my own arguments for laziness, I must dispose of one which I cannot accept. Whenever a person who already has enough to live on proposes to engage in some everyday kind of job, such as school-teaching or typing, he or she is told that such conduct takes the bread out of other people's mouths, and is therefore wicked. If this argument were valid, it would only be necessary for us all to be idle in order that we should all have our mouths full of bread. What people who say such things forget is that what a man earns he usually spends, and in spending he gives employment. As long as a man spends his income, he puts just as much bread into people's mouths in spending as he takes out of other people's mouths in earning. The real villain, from this point of view, is the man who saves. If he merely puts his savings in a stocking, like the proverbial French peasant, it is obvious that they do not give employment. If he invests his savings, the matter is less obvious, and different cases arise.
|
||||||
|
|
||||||
|
One of the commonest things to do with savings is to lend them to some Government. In view of the fact that the bulk of the public expenditure of most civilized Governments consists in payment for past wars or preparation for future wars, the man who lends his money to a Government is in the same position as the bad men in Shakespeare who hire murderers. The net result of the man's economical habits is to increase the armed forces of the State to which he lends his savings. Obviously it would be better if he spent the money, even if he spent it in drink or gambling.
|
||||||
|
|
||||||
|
But, I shall be told, the case is quite different when savings are invested in industrial enterprises. When such enterprises succeed, and produce something useful, this may be conceded. In these days, however, no one will deny that most enterprises fail. That means that a large amount of human labor, which might have been devoted to producing something that could be enjoyed, was expended on producing machines which, when produced, lay idle and did no good to anyone. The man who invests his savings in a concern that goes bankrupt is therefore injuring others as well as himself. If he spent his money, say, in giving parties for his friends, they (we may hope) would get pleasure, and so would all those upon whom he spent money, such as the butcher, the baker, and the bootlegger. But if he spends it (let us say) upon laying down rails for surface card in some place where surface cars turn out not to be wanted, he has diverted a mass of labor into channels where it gives pleasure to no one. Nevertheless, when he becomes poor through failure of his investment he will be regarded as a victim of undeserved misfortune, whereas the gay spendthrift, who has spent his money philanthropically, will be despised as a fool and a frivolous person.
|
||||||
|
|
||||||
|
All this is only preliminary. I want to say, in all seriousness, that a great deal of harm is being done in the modern world by belief in the virtuousness of work, and that the road to happiness and prosperity lies in an organized diminution of work.
|
||||||
|
|
||||||
|
First of all: what is work? Work is of two kinds: first, altering the position of matter at or near the earth's surface relatively to other such matter; second, telling other people to do so. The first kind is unpleasant and ill paid; the second is pleasant and highly paid. The second kind is capable of indefinite extension: there are not only those who give orders, but those who give advice as to what orders should be given. Usually two opposite kinds of advice are given simultaneously by two organized bodies of men; this is called politics. The skill required for this kind of work is not knowledge of the subjects as to which advice is given, but knowledge of the art of persuasive speaking and writing, i.e. of advertising.
|
||||||
|
|
||||||
|
Throughout Europe, though not in America, there is a third class of men, more respected than either of the classes of workers. There are men who, through ownership of land, are able to make others pay for the privilege of being allowed to exist and to work. These landowners are idle, and I might therefore be expected to praise them. Unfortunately, their idleness is only rendered possible by the industry of others; indeed their desire for comfortable idleness is historically the source of the whole gospel of work. The last thing they have ever wished is that others should follow their example.
|
||||||
|
|
||||||
|
From the beginning of civilization until the Industrial Revolution, a man could, as a rule, produce by hard work little more than was required for the subsistence of himself and his family, although his wife worked at least as hard as he did, and his children added their labor as soon as they were old enough to do so. The small surplus above bare necessaries was not left to those who produced it, but was appropriated by warriors and priests. In times of famine there was no surplus; the warriors and priests, however, still secured as much as at other times, with the result that many of the workers died of hunger. This system persisted in Russia until 1917 [1], and still persists in the East; in England, in spite of the Industrial Revolution, it remained in full force throughout the Napoleonic wars, and until a hundred years ago, when the new class of manufacturers acquired power. In America, the system came to an end with the Revolution, except in the South, where it persisted until the Civil War. A system which lasted so long and ended so recently has naturally left a profound impress upon men's thoughts and opinions. Much that we take for granted about the desirability of work is derived from this system, and, being pre-industrial, is not adapted to the modern world. Modern technique has made it possible for leisure, within limits, to be not the prerogative of small privileged classes, but a right evenly distributed throughout the community. The morality of work is the morality of slaves, and the modern world has no need of slavery.
|
||||||
|
|
||||||
|
It is obvious that, in primitive communities, peasants, left to themselves, would not have parted with the slender surplus upon which the warriors and priests subsisted, but would have either produced less or consumed more. At first, sheer force compelled them to produce and part with the surplus. Gradually, however, it was found possible to induce many of them to accept an ethic according to which it was their duty to work hard, although part of their work went to support others in idleness. By this means the amount of compulsion required was lessened, and the expenses of government were diminished. To this day, 99 per cent of British wage-earners would be genuinely shocked if it were proposed that the King should not have a larger income than a working man. The conception of duty, speaking historically, has been a means used by the holders of power to induce others to live for the interests of their masters rather than for their own. Of course the holders of power conceal this fact from themselves by managing to believe that their interests are identical with the larger interests of humanity. Sometimes this is true; Athenian slave-owners, for instance, employed part of their leisure in making a permanent contribution to civilization which would have been impossible under a just economic system. Leisure is essential to civilization, and in former times leisure for the few was only rendered possible by the labors of the many. But their labors were valuable, not because work is good, but because leisure is good. And with modern technique it would be possible to distribute leisure justly without injury to civilization.
|
||||||
|
|
||||||
|
Modern technique has made it possible to diminish enormously the amount of labor required to secure the necessaries of life for everyone. This was made obvious during the war. At that time all the men in the armed forces, and all the men and women engaged in the production of munitions, all the men and women engaged in spying, war propaganda, or Government offices connected with the war, were withdrawn from productive occupations. In spite of this, the general level of well-being among unskilled wage-earners on the side of the Allies was higher than before or since. The significance of this fact was concealed by finance: borrowing made it appear as if the future was nourishing the present. But that, of course, would have been impossible; a man cannot eat a loaf of bread that does not yet exist. The war showed conclusively that, by the scientific organization of production, it is possible to keep modern populations in fair comfort on a small part of the working capacity of the modern world. If, at the end of the war, the scientific organization, which had been created in order to liberate men for fighting and munition work, had been preserved, and the hours of the week had been cut down to four, all would have been well. Instead of that the old chaos was restored, those whose work was demanded were made to work long hours, and the rest were left to starve as unemployed. Why? Because work is a duty, and a man should not receive wages in proportion to what he has produced, but in proportion to his virtue as exemplified by his industry.
|
||||||
|
|
||||||
|
This is the morality of the Slave State, applied in circumstances totally unlike those in which it arose. No wonder the result has been disastrous. Let us take an illustration. Suppose that, at a given moment, a certain number of people are engaged in the manufacture of pins. They make as many pins as the world needs, working (say) eight hours a day. Someone makes an invention by which the same number of men can make twice as many pins: pins are already so cheap that hardly any more will be bought at a lower price. In a sensible world, everybody concerned in the manufacturing of pins would take to working four hours instead of eight, and everything else would go on as before. But in the actual world this would be thought demoralizing. The men still work eight hours, there are too many pins, some employers go bankrupt, and half the men previously concerned in making pins are thrown out of work. There is, in the end, just as much leisure as on the other plan, but half the men are totally idle while half are still overworked. In this way, it is insured that the unavoidable leisure shall cause misery all round instead of being a universal source of happiness. Can anything more insane be imagined?
|
||||||
|
|
||||||
|
The idea that the poor should have leisure has always been shocking to the rich. In England, in the early nineteenth century, fifteen hours was the ordinary day's work for a man; children sometimes did as much, and very commonly did twelve hours a day. When meddlesome busybodies suggested that perhaps these hours were rather long, they were told that work kept adults from drink and children from mischief. When I was a child, shortly after urban working men had acquired the vote, certain public holidays were established by law, to the great indignation of the upper classes. I remember hearing an old Duchess say: 'What do the poor want with holidays? They ought to work.' People nowadays are less frank, but the sentiment persists, and is the source of much of our economic confusion.
|
||||||
|
|
||||||
|
Let us, for a moment, consider the ethics of work frankly, without superstition. Every human being, of necessity, consumes, in the course of his life, a certain amount of the produce of human labor. Assuming, as we may, that labor is on the whole disagreeable, it is unjust that a man should consume more than he produces. Of course he may provide services rather than commodities, like a medical man, for example; but he should provide something in return for his board and lodging. to this extent, the duty of work must be admitted, but to this extent only.
|
||||||
|
|
||||||
|
I shall not dwell upon the fact that, in all modern societies outside the USSR, many people escape even this minimum amount of work, namely all those who inherit money and all those who marry money. I do not think the fact that these people are allowed to be idle is nearly so harmful as the fact that wage-earners are expected to overwork or starve.
|
||||||
|
|
||||||
|
If the ordinary wage-earner worked four hours a day, there would be enough for everybody and no unemployment -- assuming a certain very moderate amount of sensible organization. This idea shocks the well-to-do, because they are convinced that the poor would not know how to use so much leisure. In America men often work long hours even when they are well off; such men, naturally, are indignant at the idea of leisure for wage-earners, except as the grim punishment of unemployment; in fact, they dislike leisure even for their sons. Oddly enough, while they wish their sons to work so hard as to have no time to be civilized, they do not mind their wives and daughters having no work at all. the snobbish admiration of uselessness, which, in an aristocratic society, extends to both sexes, is, under a plutocracy, confined to women; this, however, does not make it any more in agreement with common sense.
|
||||||
|
|
||||||
|
The wise use of leisure, it must be conceded, is a product of civilization and education. A man who has worked long hours all his life will become bored if he becomes suddenly idle. But without a considerable amount of leisure a man is cut off from many of the best things. There is no longer any reason why the bulk of the population should suffer this deprivation; only a foolish asceticism, usually vicarious, makes us continue to insist on work in excessive quantities now that the need no longer exists.
|
||||||
|
|
||||||
|
In the new creed which controls the government of Russia, while there is much that is very different from the traditional teaching of the West, there are some things that are quite unchanged. The attitude of the governing classes, and especially of those who conduct educational propaganda, on the subject of the dignity of labor, is almost exactly that which the governing classes of the world have always preached to what were called the 'honest poor'. Industry, sobriety, willingness to work long hours for distant advantages, even submissiveness to authority, all these reappear; moreover authority still represents the will of the Ruler of the Universe, Who, however, is now called by a new name, Dialectical Materialism.
|
||||||
|
|
||||||
|
The victory of the proletariat in Russia has some points in common with the victory of the feminists in some other countries. For ages, men had conceded the superior saintliness of women, and had consoled women for their inferiority by maintaining that saintliness is more desirable than power. At last the feminists decided that they would have both, since the pioneers among them believed all that the men had told them about the desirability of virtue, but not what they had told them about the worthlessness of political power. A similar thing has happened in Russia as regards manual work. For ages, the rich and their sycophants have written in praise of 'honest toil', have praised the simple life, have professed a religion which teaches that the poor are much more likely to go to heaven than the rich, and in general have tried to make manual workers believe that there is some special nobility about altering the position of matter in space, just as men tried to make women believe that they derived some special nobility from their sexual enslavement. In Russia, all this teaching about the excellence of manual work has been taken seriously, with the result that the manual worker is more honored than anyone else. What are, in essence, revivalist appeals are made, but not for the old purposes: they are made to secure shock workers for special tasks. Manual work is the ideal which is held before the young, and is the basis of all ethical teaching.
|
||||||
|
|
||||||
|
For the present, possibly, this is all to the good. A large country, full of natural resources, awaits development, and has has to be developed with very little use of credit. In these circumstances, hard work is necessary, and is likely to bring a great reward. But what will happen when the point has been reached where everybody could be comfortable without working long hours?
|
||||||
|
|
||||||
|
In the West, we have various ways of dealing with this problem. We have no attempt at economic justice, so that a large proportion of the total produce goes to a small minority of the population, many of whom do no work at all. Owing to the absence of any central control over production, we produce hosts of things that are not wanted. We keep a large percentage of the working population idle, because we can dispense with their labor by making the others overwork. When all these methods prove inadequate, we have a war: we cause a number of people to manufacture high explosives, and a number of others to explode them, as if we were children who had just discovered fireworks. By a combination of all these devices we manage, though with difficulty, to keep alive the notion that a great deal of severe manual work must be the lot of the average man.
|
||||||
|
|
||||||
|
In Russia, owing to more economic justice and central control over production, the problem will have to be differently solved. the rational solution would be, as soon as the necessaries and elementary comforts can be provided for all, to reduce the hours of labor gradually, allowing a popular vote to decide, at each stage, whether more leisure or more goods were to be preferred. But, having taught the supreme virtue of hard work, it is difficult to see how the authorities can aim at a paradise in which there will be much leisure and little work. It seems more likely that they will find continually fresh schemes, by which present leisure is to be sacrificed to future productivity. I read recently of an ingenious plan put forward by Russian engineers, for making the White Sea and the northern coasts of Siberia warm, by putting a dam across the Kara Sea. An admirable project, but liable to postpone proletarian comfort for a generation, while the nobility of toil is being displayed amid the ice-fields and snowstorms of the Arctic Ocean. This sort of thing, if it happens, will be the result of regarding the virtue of hard work as an end in itself, rather than as a means to a state of affairs in which it is no longer needed.
|
||||||
|
|
||||||
|
The fact is that moving matter about, while a certain amount of it is necessary to our existence, is emphatically not one of the ends of human life. If it were, we should have to consider every navvy superior to Shakespeare. We have been misled in this matter by two causes. One is the necessity of keeping the poor contented, which has led the rich, for thousands of years, to preach the dignity of labor, while taking care themselves to remain undignified in this respect. The other is the new pleasure in mechanism, which makes us delight in the astonishingly clever changes that we can produce on the earth's surface. Neither of these motives makes any great appeal to the actual worker. If you ask him what he thinks the best part of his life, he is not likely to say: 'I enjoy manual work because it makes me feel that I am fulfilling man's noblest task, and because I like to think how much man can transform his planet. It is true that my body demands periods of rest, which I have to fill in as best I may, but I am never so happy as when the morning comes and I can return to the toil from which my contentment springs.' I have never heard working men say this sort of thing. They consider work, as it should be considered, a necessary means to a livelihood, and it is from their leisure that they derive whatever happiness they may enjoy.
|
||||||
|
|
||||||
|
It will be said that, while a little leisure is pleasant, men would not know how to fill their days if they had only four hours of work out of the twenty-four. In so far as this is true in the modern world, it is a condemnation of our civilization; it would not have been true at any earlier period. There was formerly a capacity for light-heartedness and play which has been to some extent inhibited by the cult of efficiency. The modern man thinks that everything ought to be done for the sake of something else, and never for its own sake. Serious-minded persons, for example, are continually condemning the habit of going to the cinema, and telling us that it leads the young into crime. But all the work that goes to producing a cinema is respectable, because it is work, and because it brings a money profit. The notion that the desirable activities are those that bring a profit has made everything topsy-turvy. The butcher who provides you with meat and the baker who provides you with bread are praiseworthy, because they are making money; but when you enjoy the food they have provided, you are merely frivolous, unless you eat only to get strength for your work. Broadly speaking, it is held that getting money is good and spending money is bad. Seeing that they are two sides of one transaction, this is absurd; one might as well maintain that keys are good, but keyholes are bad. Whatever merit there may be in the production of goods must be entirely derivative from the advantage to be obtained by consuming them. The individual, in our society, works for profit; but the social purpose of his work lies in the consumption of what he produces. It is this divorce between the individual and the social purpose of production that makes it so difficult for men to think clearly in a world in which profit-making is the incentive to industry. We think too much of production, and too little of consumption. One result is that we attach too little importance to enjoyment and simple happiness, and that we do not judge production by the pleasure that it gives to the consumer.
|
||||||
|
|
||||||
|
When I suggest that working hours should be reduced to four, I am not meaning to imply that all the remaining time should necessarily be spent in pure frivolity. I mean that four hours' work a day should entitle a man to the necessities and elementary comforts of life, and that the rest of his time should be his to use as he might see fit. It is an essential part of any such social system that education should be carried further than it usually is at present, and should aim, in part, at providing tastes which would enable a man to use leisure intelligently. I am not thinking mainly of the sort of things that would be considered 'highbrow'. Peasant dances have died out except in remote rural areas, but the impulses which caused them to be cultivated must still exist in human nature. The pleasures of urban populations have become mainly passive: seeing cinemas, watching football matches, listening to the radio, and so on. This results from the fact that their active energies are fully taken up with work; if they had more leisure, they would again enjoy pleasures in which they took an active part.
|
||||||
|
|
||||||
|
In the past, there was a small leisure class and a larger working class. The leisure class enjoyed advantages for which there was no basis in social justice; this necessarily made it oppressive, limited its sympathies, and caused it to invent theories by which to justify its privileges. These facts greatly diminished its excellence, but in spite of this drawback it contributed nearly the whole of what we call civilization. It cultivated the arts and discovered the sciences; it wrote the books, invented the philosophies, and refined social relations. Even the liberation of the oppressed has usually been inaugurated from above. Without the leisure class, mankind would never have emerged from barbarism.
|
||||||
|
|
||||||
|
The method of a leisure class without duties was, however, extraordinarily wasteful. None of the members of the class had to be taught to be industrious, and the class as a whole was not exceptionally intelligent. The class might produce one Darwin, but against him had to be set tens of thousands of country gentlemen who never thought of anything more intelligent than fox-hunting and punishing poachers. At present, the universities are supposed to provide, in a more systematic way, what the leisure class provided accidentally and as a by-product. This is a great improvement, but it has certain drawbacks. University life is so different from life in the world at large that men who live in academic milieu tend to be unaware of the preoccupations and problems of ordinary men and women; moreover their ways of expressing themselves are usually such as to rob their opinions of the influence that they ought to have upon the general public. Another disadvantage is that in universities studies are organized, and the man who thinks of some original line of research is likely to be discouraged. Academic institutions, therefore, useful as they are, are not adequate guardians of the interests of civilization in a world where everyone outside their walls is too busy for unutilitarian pursuits.
|
||||||
|
|
||||||
|
In a world where no one is compelled to work more than four hours a day, every person possessed of scientific curiosity will be able to indulge it, and every painter will be able to paint without starving, however excellent his pictures may be. Young writers will not be obliged to draw attention to themselves by sensational pot-boilers, with a view to acquiring the economic independence needed for monumental works, for which, when the time at last comes, they will have lost the taste and capacity. Men who, in their professional work, have become interested in some phase of economics or government, will be able to develop their ideas without the academic detachment that makes the work of university economists often seem lacking in reality. Medical men will have the time to learn about the progress of medicine, teachers will not be exasperatedly struggling to teach by routine methods things which they learnt in their youth, which may, in the interval, have been proved to be untrue.
|
||||||
|
|
||||||
|
Above all, there will be happiness and joy of life, instead of frayed nerves, weariness, and dyspepsia. The work exacted will be enough to make leisure delightful, but not enough to produce exhaustion. Since men will not be tired in their spare time, they will not demand only such amusements as are passive and vapid. At least one per cent will probably devote the time not spent in professional work to pursuits of some public importance, and, since they will not depend upon these pursuits for their livelihood, their originality will be unhampered, and there will be no need to conform to the standards set by elderly pundits. But it is not only in these exceptional cases that the advantages of leisure will appear. Ordinary men and women, having the opportunity of a happy life, will become more kindly and less persecuting and less inclined to view others with suspicion. The taste for war will die out, partly for this reason, and partly because it will involve long and severe work for all. Good nature is, of all moral qualities, the one that the world needs most, and good nature is the result of ease and security, not of a life of arduous struggle. Modern methods of production have given us the possibility of ease and security for all; we have chosen, instead, to have overwork for some and starvation for others. Hitherto we have continued to be as energetic as we were before there were machines; in this we have been foolish, but there is no reason to go on being foolish forever.
|
||||||
|
|
||||||
|
[1] Since then, members of the Communist Party have succeeded to this privilege of the warriors and priests.
|
31
node_modules/cliui/node_modules/wordwrap/test/wrap.js
generated
vendored
Normal file
31
node_modules/cliui/node_modules/wordwrap/test/wrap.js
generated
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
var assert = require('assert');
|
||||||
|
var wordwrap = require('wordwrap');
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var idleness = fs.readFileSync(__dirname + '/idleness.txt', 'utf8');
|
||||||
|
|
||||||
|
exports.stop80 = function () {
|
||||||
|
var lines = wordwrap(80)(idleness).split(/\n/);
|
||||||
|
var words = idleness.split(/\s+/);
|
||||||
|
|
||||||
|
lines.forEach(function (line) {
|
||||||
|
assert.ok(line.length <= 80, 'line > 80 columns');
|
||||||
|
var chunks = line.match(/\S/) ? line.split(/\s+/) : [];
|
||||||
|
assert.deepEqual(chunks, words.splice(0, chunks.length));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.start20stop60 = function () {
|
||||||
|
var lines = wordwrap(20, 100)(idleness).split(/\n/);
|
||||||
|
var words = idleness.split(/\s+/);
|
||||||
|
|
||||||
|
lines.forEach(function (line) {
|
||||||
|
assert.ok(line.length <= 100, 'line > 100 columns');
|
||||||
|
var chunks = line
|
||||||
|
.split(/\s+/)
|
||||||
|
.filter(function (x) { return x.match(/\S/) })
|
||||||
|
;
|
||||||
|
assert.deepEqual(chunks, words.splice(0, chunks.length));
|
||||||
|
assert.deepEqual(line.slice(0, 20), new Array(20 + 1).join(' '));
|
||||||
|
});
|
||||||
|
};
|
91
node_modules/cliui/package.json
generated
vendored
Normal file
91
node_modules/cliui/package.json
generated
vendored
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
{
|
||||||
|
"_from": "cliui@^2.1.0",
|
||||||
|
"_id": "cliui@2.1.0",
|
||||||
|
"_inBundle": false,
|
||||||
|
"_integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
|
||||||
|
"_location": "/cliui",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"type": "range",
|
||||||
|
"registry": true,
|
||||||
|
"raw": "cliui@^2.1.0",
|
||||||
|
"name": "cliui",
|
||||||
|
"escapedName": "cliui",
|
||||||
|
"rawSpec": "^2.1.0",
|
||||||
|
"saveSpec": null,
|
||||||
|
"fetchSpec": "^2.1.0"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/yargs"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
|
||||||
|
"_shasum": "4b475760ff80264c762c3a1719032e91c7fea0d1",
|
||||||
|
"_spec": "cliui@^2.1.0",
|
||||||
|
"_where": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/node_modules/yargs",
|
||||||
|
"author": {
|
||||||
|
"name": "Ben Coe",
|
||||||
|
"email": "ben@npmjs.com"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/bcoe/cliui/issues"
|
||||||
|
},
|
||||||
|
"bundleDependencies": false,
|
||||||
|
"config": {
|
||||||
|
"blanket": {
|
||||||
|
"pattern": [
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"data-cover-never": [
|
||||||
|
"node_modules",
|
||||||
|
"test"
|
||||||
|
],
|
||||||
|
"output-reporter": "spec"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"center-align": "^0.1.1",
|
||||||
|
"right-align": "^0.1.1",
|
||||||
|
"wordwrap": "0.0.2"
|
||||||
|
},
|
||||||
|
"deprecated": false,
|
||||||
|
"description": "easily create complex multi-column command-line-interfaces",
|
||||||
|
"devDependencies": {
|
||||||
|
"blanket": "^1.1.6",
|
||||||
|
"chai": "^2.2.0",
|
||||||
|
"coveralls": "^2.11.2",
|
||||||
|
"mocha": "^2.2.4",
|
||||||
|
"mocha-lcov-reporter": "0.0.2",
|
||||||
|
"mocoverage": "^1.0.0",
|
||||||
|
"patched-blanket": "^1.0.1",
|
||||||
|
"standard": "^3.6.1"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/bcoe/cliui#readme",
|
||||||
|
"keywords": [
|
||||||
|
"cli",
|
||||||
|
"command-line",
|
||||||
|
"layout",
|
||||||
|
"design",
|
||||||
|
"console",
|
||||||
|
"wrap",
|
||||||
|
"table"
|
||||||
|
],
|
||||||
|
"license": "ISC",
|
||||||
|
"main": "index.js",
|
||||||
|
"name": "cliui",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+ssh://git@github.com/bcoe/cliui.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "standard && mocha --check-leaks --ui exports --require patched-blanket -R mocoverage"
|
||||||
|
},
|
||||||
|
"standard": {
|
||||||
|
"ignore": [
|
||||||
|
"**/example/**"
|
||||||
|
],
|
||||||
|
"globals": [
|
||||||
|
"it"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"version": "2.1.0"
|
||||||
|
}
|
349
node_modules/cliui/test/cliui.js
generated
vendored
Normal file
349
node_modules/cliui/test/cliui.js
generated
vendored
Normal file
|
@ -0,0 +1,349 @@
|
||||||
|
/* global describe, it */
|
||||||
|
|
||||||
|
require('chai').should()
|
||||||
|
|
||||||
|
var cliui = require('../')
|
||||||
|
|
||||||
|
describe('cliui', function () {
|
||||||
|
describe('div', function () {
|
||||||
|
it("wraps text at 'width' if a single column is given", function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div('i am a string that should be wrapped')
|
||||||
|
|
||||||
|
ui.toString().split('\n').forEach(function (row) {
|
||||||
|
row.length.should.be.lte(10)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('evenly divides text across columns if multiple columns are given', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
{text: 'i am a string that should be wrapped', width: 15},
|
||||||
|
'i am a second string that should be wrapped',
|
||||||
|
'i am a third string that should be wrapped'
|
||||||
|
)
|
||||||
|
|
||||||
|
// total width of all columns is <=
|
||||||
|
// the width cliui is initialized with.
|
||||||
|
ui.toString().split('\n').forEach(function (row) {
|
||||||
|
row.length.should.be.lte(40)
|
||||||
|
})
|
||||||
|
|
||||||
|
// it should wrap each column appropriately.
|
||||||
|
var expected = [
|
||||||
|
'i am a string i am a i am a third',
|
||||||
|
'that should be second string that',
|
||||||
|
'wrapped string that should be',
|
||||||
|
' should be wrapped',
|
||||||
|
' wrapped'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('allows for a blank row to be appended', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div()
|
||||||
|
|
||||||
|
// it should wrap each column appropriately.
|
||||||
|
var expected = ['']
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('_columnWidths', function () {
|
||||||
|
it('uses same width for each column by default', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
}),
|
||||||
|
widths = ui._columnWidths([{}, {}, {}])
|
||||||
|
|
||||||
|
widths[0].should.equal(13)
|
||||||
|
widths[1].should.equal(13)
|
||||||
|
widths[2].should.equal(13)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('divides width over remaining columns if first column has width specified', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
}),
|
||||||
|
widths = ui._columnWidths([{width: 20}, {}, {}])
|
||||||
|
|
||||||
|
widths[0].should.equal(20)
|
||||||
|
widths[1].should.equal(10)
|
||||||
|
widths[2].should.equal(10)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('divides width over remaining columns if middle column has width specified', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
}),
|
||||||
|
widths = ui._columnWidths([{}, {width: 10}, {}])
|
||||||
|
|
||||||
|
widths[0].should.equal(15)
|
||||||
|
widths[1].should.equal(10)
|
||||||
|
widths[2].should.equal(15)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('keeps track of remaining width if multiple columns have width specified', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
}),
|
||||||
|
widths = ui._columnWidths([{width: 20}, {width: 12}, {}])
|
||||||
|
|
||||||
|
widths[0].should.equal(20)
|
||||||
|
widths[1].should.equal(12)
|
||||||
|
widths[2].should.equal(8)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('uses a sane default if impossible widths are specified', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
}),
|
||||||
|
widths = ui._columnWidths([{width: 30}, {width: 30}, {padding: [0, 2, 0, 1]}])
|
||||||
|
|
||||||
|
widths[0].should.equal(30)
|
||||||
|
widths[1].should.equal(30)
|
||||||
|
widths[2].should.equal(4)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('alignment', function () {
|
||||||
|
it('allows a column to be right aligned', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
'i am a string',
|
||||||
|
{text: 'i am a second string', align: 'right'},
|
||||||
|
'i am a third string that should be wrapped'
|
||||||
|
)
|
||||||
|
|
||||||
|
// it should right-align the second column.
|
||||||
|
var expected = [
|
||||||
|
'i am a stringi am a secondi am a third',
|
||||||
|
' stringstring that',
|
||||||
|
' should be',
|
||||||
|
' wrapped'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('allows a column to be center aligned', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 60
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
'i am a string',
|
||||||
|
{text: 'i am a second string', align: 'center', padding: [0, 2, 0, 2]},
|
||||||
|
'i am a third string that should be wrapped'
|
||||||
|
)
|
||||||
|
|
||||||
|
// it should right-align the second column.
|
||||||
|
var expected = [
|
||||||
|
'i am a string i am a second i am a third string',
|
||||||
|
' string that should be',
|
||||||
|
' wrapped'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('padding', function () {
|
||||||
|
it('handles left/right padding', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
{text: 'i have padding on my left', padding: [0, 0, 0, 4]},
|
||||||
|
{text: 'i have padding on my right', padding: [0, 2, 0, 0], align: 'center'},
|
||||||
|
{text: 'i have no padding', padding: [0, 0, 0, 0]}
|
||||||
|
)
|
||||||
|
|
||||||
|
// it should add left/right padding to columns.
|
||||||
|
var expected = [
|
||||||
|
' i have i have i have no',
|
||||||
|
' padding padding on padding',
|
||||||
|
' on my my right',
|
||||||
|
' left'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('handles top/bottom padding', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
'i am a string',
|
||||||
|
{text: 'i am a second string', padding: [2, 0, 0, 0]},
|
||||||
|
{text: 'i am a third string that should be wrapped', padding: [0, 0, 1, 0]}
|
||||||
|
)
|
||||||
|
|
||||||
|
// it should add top/bottom padding to second
|
||||||
|
// and third columns.
|
||||||
|
var expected = [
|
||||||
|
'i am a string i am a third',
|
||||||
|
' string that',
|
||||||
|
' i am a secondshould be',
|
||||||
|
' string wrapped',
|
||||||
|
''
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('wrap', function () {
|
||||||
|
it('allows wordwrap to be disabled', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
wrap: false
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
{text: 'i am a string', padding: [0, 1, 0, 0]},
|
||||||
|
{text: 'i am a second string', padding: [0, 2, 0, 0]},
|
||||||
|
{text: 'i am a third string that should not be wrapped', padding: [0, 0, 0, 2]}
|
||||||
|
)
|
||||||
|
|
||||||
|
ui.toString().should.equal('i am a string i am a second string i am a third string that should not be wrapped')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('span', function () {
|
||||||
|
it('appends the next row to the end of the prior row if it fits', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.span(
|
||||||
|
{text: 'i am a string that will be wrapped', width: 30}
|
||||||
|
)
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
{text: ' [required] [default: 99]', align: 'right'}
|
||||||
|
)
|
||||||
|
|
||||||
|
var expected = [
|
||||||
|
'i am a string that will be',
|
||||||
|
'wrapped [required] [default: 99]'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('does not append the string if it does not fit on the prior row', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.span(
|
||||||
|
{text: 'i am a string that will be wrapped', width: 30}
|
||||||
|
)
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
{text: 'i am a second row', align: 'left'}
|
||||||
|
)
|
||||||
|
|
||||||
|
var expected = [
|
||||||
|
'i am a string that will be',
|
||||||
|
'wrapped',
|
||||||
|
'i am a second row'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('always appends text to prior span if wrap is disabled', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
wrap: false,
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.span(
|
||||||
|
{text: 'i am a string that will be wrapped', width: 30}
|
||||||
|
)
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
{text: 'i am a second row', align: 'left', padding: [0, 0, 0, 3]}
|
||||||
|
)
|
||||||
|
|
||||||
|
ui.div('a third line')
|
||||||
|
|
||||||
|
var expected = [
|
||||||
|
'i am a string that will be wrapped i am a second row',
|
||||||
|
'a third line'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('layoutDSL', function () {
|
||||||
|
it('turns tab into multiple columns', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 60
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
' <regex> \tmy awesome regex\n <my second thing> \tanother row\t a third column'
|
||||||
|
)
|
||||||
|
|
||||||
|
var expected = [
|
||||||
|
' <regex> my awesome regex',
|
||||||
|
' <my second thing> another row a third column'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('turns newline into multiple rows', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
'Usage: $0\n <regex>\t my awesome regex\n <glob>\t my awesome glob\t [required]'
|
||||||
|
)
|
||||||
|
var expected = [
|
||||||
|
'Usage: $0',
|
||||||
|
' <regex> my awesome regex',
|
||||||
|
' <glob> my awesome [required]',
|
||||||
|
' glob'
|
||||||
|
]
|
||||||
|
|
||||||
|
ui.toString().split('\n').should.eql(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('does not apply DSL if wrap is false', function () {
|
||||||
|
var ui = cliui({
|
||||||
|
width: 40,
|
||||||
|
wrap: false
|
||||||
|
})
|
||||||
|
|
||||||
|
ui.div(
|
||||||
|
'Usage: $0\ttwo\tthree'
|
||||||
|
)
|
||||||
|
|
||||||
|
ui.toString().should.eql('Usage: $0\ttwo\tthree')
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
50
node_modules/content-disposition/HISTORY.md
generated
vendored
Normal file
50
node_modules/content-disposition/HISTORY.md
generated
vendored
Normal file
|
@ -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
|
22
node_modules/content-disposition/LICENSE
generated
vendored
Normal file
22
node_modules/content-disposition/LICENSE
generated
vendored
Normal file
|
@ -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.
|
141
node_modules/content-disposition/README.md
generated
vendored
Normal file
141
node_modules/content-disposition/README.md
generated
vendored
Normal file
|
@ -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
|
445
node_modules/content-disposition/index.js
generated
vendored
Normal file
445
node_modules/content-disposition/index.js
generated
vendored
Normal file
|
@ -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
|
||||||
|
}
|
74
node_modules/content-disposition/package.json
generated
vendored
Normal file
74
node_modules/content-disposition/package.json
generated
vendored
Normal file
|
@ -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": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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"
|
||||||
|
}
|
24
node_modules/content-type/HISTORY.md
generated
vendored
Normal file
24
node_modules/content-type/HISTORY.md
generated
vendored
Normal file
|
@ -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`
|
22
node_modules/content-type/LICENSE
generated
vendored
Normal file
22
node_modules/content-type/LICENSE
generated
vendored
Normal file
|
@ -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.
|
92
node_modules/content-type/README.md
generated
vendored
Normal file
92
node_modules/content-type/README.md
generated
vendored
Normal file
|
@ -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
|
222
node_modules/content-type/index.js
generated
vendored
Normal file
222
node_modules/content-type/index.js
generated
vendored
Normal file
|
@ -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
|
||||||
|
}
|
76
node_modules/content-type/package.json
generated
vendored
Normal file
76
node_modules/content-type/package.json
generated
vendored
Normal file
|
@ -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": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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"
|
||||||
|
}
|
4
node_modules/cookie-signature/.npmignore
generated
vendored
Normal file
4
node_modules/cookie-signature/.npmignore
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
support
|
||||||
|
test
|
||||||
|
examples
|
||||||
|
*.sock
|
38
node_modules/cookie-signature/History.md
generated
vendored
Normal file
38
node_modules/cookie-signature/History.md
generated
vendored
Normal file
|
@ -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
|
42
node_modules/cookie-signature/Readme.md
generated
vendored
Normal file
42
node_modules/cookie-signature/Readme.md
generated
vendored
Normal file
|
@ -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.
|
51
node_modules/cookie-signature/index.js
generated
vendored
Normal file
51
node_modules/cookie-signature/index.js
generated
vendored
Normal file
|
@ -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');
|
||||||
|
}
|
57
node_modules/cookie-signature/package.json
generated
vendored
Normal file
57
node_modules/cookie-signature/package.json
generated
vendored
Normal file
|
@ -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": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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"
|
||||||
|
}
|
118
node_modules/cookie/HISTORY.md
generated
vendored
Normal file
118
node_modules/cookie/HISTORY.md
generated
vendored
Normal file
|
@ -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
|
24
node_modules/cookie/LICENSE
generated
vendored
Normal file
24
node_modules/cookie/LICENSE
generated
vendored
Normal file
|
@ -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.
|
||||||
|
|
220
node_modules/cookie/README.md
generated
vendored
Normal file
220
node_modules/cookie/README.md
generated
vendored
Normal file
|
@ -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
|
195
node_modules/cookie/index.js
generated
vendored
Normal file
195
node_modules/cookie/index.js
generated
vendored
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
71
node_modules/cookie/package.json
generated
vendored
Normal file
71
node_modules/cookie/package.json
generated
vendored
Normal file
|
@ -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": "/Users/anubis/Desktop/Projects/Websites/sgawebsite/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"
|
||||||
|
}
|
1
node_modules/debug/.coveralls.yml
generated
vendored
Normal file
1
node_modules/debug/.coveralls.yml
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve
|
11
node_modules/debug/.eslintrc
generated
vendored
Normal file
11
node_modules/debug/.eslintrc
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"no-console": 0,
|
||||||
|
"no-empty": [1, { "allowEmptyCatch": true }]
|
||||||
|
},
|
||||||
|
"extends": "eslint:recommended"
|
||||||
|
}
|
9
node_modules/debug/.npmignore
generated
vendored
Normal file
9
node_modules/debug/.npmignore
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
support
|
||||||
|
test
|
||||||
|
examples
|
||||||
|
example
|
||||||
|
*.sock
|
||||||
|
dist
|
||||||
|
yarn.lock
|
||||||
|
coverage
|
||||||
|
bower.json
|
14
node_modules/debug/.travis.yml
generated
vendored
Normal file
14
node_modules/debug/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- "6"
|
||||||
|
- "5"
|
||||||
|
- "4"
|
||||||
|
|
||||||
|
install:
|
||||||
|
- make node_modules
|
||||||
|
|
||||||
|
script:
|
||||||
|
- make lint
|
||||||
|
- make test
|
||||||
|
- make coveralls
|
362
node_modules/debug/CHANGELOG.md
generated
vendored
Normal file
362
node_modules/debug/CHANGELOG.md
generated
vendored
Normal file
|
@ -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
|
19
node_modules/debug/LICENSE
generated
vendored
Normal file
19
node_modules/debug/LICENSE
generated
vendored
Normal file
|
@ -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.
|
||||||
|
|
50
node_modules/debug/Makefile
generated
vendored
Normal file
50
node_modules/debug/Makefile
generated
vendored
Normal file
|
@ -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
|
312
node_modules/debug/README.md
generated
vendored
Normal file
312
node_modules/debug/README.md
generated
vendored
Normal file
|
@ -0,0 +1,312 @@
|
||||||
|
# debug
|
||||||
|
[](https://travis-ci.org/visionmedia/debug) [](https://coveralls.io/github/visionmedia/debug?branch=master) [](https://visionmedia-community-slackin.now.sh/) [](#backers)
|
||||||
|
[](#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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## 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.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user