changes
This commit is contained in:
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'
|
||||||
|
}
|
||||||
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)
|
||||||
|
}
|
||||||
156
node_modules/body-parser/index.js
generated
vendored
Normal file
156
node_modules/body-parser/index.js
generated
vendored
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
/*!
|
||||||
|
* 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) {
|
||||||
|
// use default type for parsers
|
||||||
|
var opts = Object.create(options || null, {
|
||||||
|
type: {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true,
|
||||||
|
value: undefined,
|
||||||
|
writable: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
205
node_modules/body-parser/lib/read.js
generated
vendored
Normal file
205
node_modules/body-parser/lib/read.js
generated
vendored
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/*!
|
||||||
|
* body-parser
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var createError = require('http-errors')
|
||||||
|
var destroy = require('destroy')
|
||||||
|
var getBody = require('raw-body')
|
||||||
|
var iconv = require('iconv-lite')
|
||||||
|
var onFinished = require('on-finished')
|
||||||
|
var unpipe = require('unpipe')
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
// unpipe from stream and destroy
|
||||||
|
if (stream !== req) {
|
||||||
|
unpipe(req)
|
||||||
|
destroy(stream, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// read off entire request
|
||||||
|
dump(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
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump the contents of a request.
|
||||||
|
*
|
||||||
|
* @param {object} req
|
||||||
|
* @param {function} callback
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function dump (req, callback) {
|
||||||
|
if (onFinished.isFinished(req)) {
|
||||||
|
callback(null)
|
||||||
|
} else {
|
||||||
|
onFinished(req, callback)
|
||||||
|
req.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
236
node_modules/body-parser/lib/types/json.js
generated
vendored
Normal file
236
node_modules/body-parser/lib/types/json.js
generated
vendored
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
/*!
|
||||||
|
* 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]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a middleware to parse JSON bodies.
|
||||||
|
*
|
||||||
|
* @param {object} [options]
|
||||||
|
* @return {function}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function json (options) {
|
||||||
|
var opts = options || {}
|
||||||
|
|
||||||
|
var limit = typeof opts.limit !== 'number'
|
||||||
|
? bytes.parse(opts.limit || '100kb')
|
||||||
|
: opts.limit
|
||||||
|
var inflate = opts.inflate !== false
|
||||||
|
var reviver = opts.reviver
|
||||||
|
var strict = opts.strict !== false
|
||||||
|
var type = opts.type || 'application/json'
|
||||||
|
var verify = opts.verify || false
|
||||||
|
|
||||||
|
if (verify !== false && typeof verify !== 'function') {
|
||||||
|
throw new TypeError('option verify must be function')
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the appropriate type checking function
|
||||||
|
var shouldParse = typeof type !== 'function'
|
||||||
|
? typeChecker(type)
|
||||||
|
: type
|
||||||
|
|
||||||
|
function parse (body) {
|
||||||
|
if (body.length === 0) {
|
||||||
|
// special-case empty json body, as it's a common client-side mistake
|
||||||
|
// TODO: maybe make this configurable or part of "strict" option
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strict) {
|
||||||
|
var first = firstchar(body)
|
||||||
|
|
||||||
|
if (first !== '{' && first !== '[') {
|
||||||
|
debug('strict violation')
|
||||||
|
throw createStrictSyntaxError(body, first)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
debug('parse json')
|
||||||
|
return JSON.parse(body, reviver)
|
||||||
|
} catch (e) {
|
||||||
|
throw normalizeJsonSyntaxError(e, {
|
||||||
|
message: e.message,
|
||||||
|
stack: e.stack
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return function jsonParser (req, res, next) {
|
||||||
|
if (req._body) {
|
||||||
|
debug('body already parsed')
|
||||||
|
next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
req.body = req.body || {}
|
||||||
|
|
||||||
|
// skip requests without bodies
|
||||||
|
if (!typeis.hasBody(req)) {
|
||||||
|
debug('skip empty body')
|
||||||
|
next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('content-type %j', req.headers['content-type'])
|
||||||
|
|
||||||
|
// determine if request should be parsed
|
||||||
|
if (!shouldParse(req)) {
|
||||||
|
debug('skip parsing')
|
||||||
|
next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// assert charset per RFC 7159 sec 8.1
|
||||||
|
var charset = getCharset(req) || 'utf-8'
|
||||||
|
if (charset.slice(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 = index !== -1
|
||||||
|
? 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) {
|
||||||
|
var match = FIRST_CHAR_REGEXP.exec(str)
|
||||||
|
|
||||||
|
return match
|
||||||
|
? match[1]
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the charset of a request.
|
||||||
|
*
|
||||||
|
* @param {object} req
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getCharset (req) {
|
||||||
|
try {
|
||||||
|
return (contentType.parse(req).parameters.charset || '').toLowerCase()
|
||||||
|
} catch (e) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize a SyntaxError for JSON.parse.
|
||||||
|
*
|
||||||
|
* @param {SyntaxError} error
|
||||||
|
* @param {object} obj
|
||||||
|
* @return {SyntaxError}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function normalizeJsonSyntaxError (error, obj) {
|
||||||
|
var keys = Object.getOwnPropertyNames(error)
|
||||||
|
|
||||||
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
var key = keys[i]
|
||||||
|
if (key !== 'stack' && key !== 'message') {
|
||||||
|
delete error[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace stack before message for Node.js 0.10 and below
|
||||||
|
error.stack = obj.stack.replace(error.message, obj.message)
|
||||||
|
error.message = obj.message
|
||||||
|
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the simple type checker.
|
||||||
|
*
|
||||||
|
* @param {string} type
|
||||||
|
* @return {function}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function typeChecker (type) {
|
||||||
|
return function checkType (req) {
|
||||||
|
return Boolean(typeis(req, type))
|
||||||
|
}
|
||||||
|
}
|
||||||
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
170
node_modules/bytes/index.js
generated
vendored
Normal file
170
node_modules/bytes/index.js
generated
vendored
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/*!
|
||||||
|
* 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: Math.pow(1024, 4),
|
||||||
|
pb: Math.pow(1024, 5),
|
||||||
|
};
|
||||||
|
|
||||||
|
var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/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.pb) {
|
||||||
|
unit = 'PB';
|
||||||
|
} else 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.split('.').map(function (s, i) {
|
||||||
|
return i === 0
|
||||||
|
? s.replace(formatThousandsRegExp, thousandsSeparator)
|
||||||
|
: s
|
||||||
|
}).join('.');
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNaN(floatValue)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.floor(map[unit] * floatValue);
|
||||||
|
}
|
||||||
15
node_modules/call-bind/callBound.js
generated
vendored
Normal file
15
node_modules/call-bind/callBound.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var GetIntrinsic = require('get-intrinsic');
|
||||||
|
|
||||||
|
var callBind = require('./');
|
||||||
|
|
||||||
|
var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));
|
||||||
|
|
||||||
|
module.exports = function callBoundIntrinsic(name, allowMissing) {
|
||||||
|
var intrinsic = GetIntrinsic(name, !!allowMissing);
|
||||||
|
if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
|
||||||
|
return callBind(intrinsic);
|
||||||
|
}
|
||||||
|
return intrinsic;
|
||||||
|
};
|
||||||
47
node_modules/call-bind/index.js
generated
vendored
Normal file
47
node_modules/call-bind/index.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var bind = require('function-bind');
|
||||||
|
var GetIntrinsic = require('get-intrinsic');
|
||||||
|
|
||||||
|
var $apply = GetIntrinsic('%Function.prototype.apply%');
|
||||||
|
var $call = GetIntrinsic('%Function.prototype.call%');
|
||||||
|
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);
|
||||||
|
|
||||||
|
var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
|
||||||
|
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
|
||||||
|
var $max = GetIntrinsic('%Math.max%');
|
||||||
|
|
||||||
|
if ($defineProperty) {
|
||||||
|
try {
|
||||||
|
$defineProperty({}, 'a', { value: 1 });
|
||||||
|
} catch (e) {
|
||||||
|
// IE 8 has a broken defineProperty
|
||||||
|
$defineProperty = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function callBind(originalFunction) {
|
||||||
|
var func = $reflectApply(bind, $call, arguments);
|
||||||
|
if ($gOPD && $defineProperty) {
|
||||||
|
var desc = $gOPD(func, 'length');
|
||||||
|
if (desc.configurable) {
|
||||||
|
// original length, plus the receiver, minus any additional arguments (after the receiver)
|
||||||
|
$defineProperty(
|
||||||
|
func,
|
||||||
|
'length',
|
||||||
|
{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return func;
|
||||||
|
};
|
||||||
|
|
||||||
|
var applyBind = function applyBind() {
|
||||||
|
return $reflectApply(bind, $apply, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($defineProperty) {
|
||||||
|
$defineProperty(module.exports, 'apply', { value: applyBind });
|
||||||
|
} else {
|
||||||
|
module.exports.apply = applyBind;
|
||||||
|
}
|
||||||
55
node_modules/call-bind/test/callBound.js
generated
vendored
Normal file
55
node_modules/call-bind/test/callBound.js
generated
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
|
||||||
|
var callBound = require('../callBound');
|
||||||
|
|
||||||
|
test('callBound', function (t) {
|
||||||
|
// static primitive
|
||||||
|
t.equal(callBound('Array.length'), Array.length, 'Array.length yields itself');
|
||||||
|
t.equal(callBound('%Array.length%'), Array.length, '%Array.length% yields itself');
|
||||||
|
|
||||||
|
// static non-function object
|
||||||
|
t.equal(callBound('Array.prototype'), Array.prototype, 'Array.prototype yields itself');
|
||||||
|
t.equal(callBound('%Array.prototype%'), Array.prototype, '%Array.prototype% yields itself');
|
||||||
|
t.equal(callBound('Array.constructor'), Array.constructor, 'Array.constructor yields itself');
|
||||||
|
t.equal(callBound('%Array.constructor%'), Array.constructor, '%Array.constructor% yields itself');
|
||||||
|
|
||||||
|
// static function
|
||||||
|
t.equal(callBound('Date.parse'), Date.parse, 'Date.parse yields itself');
|
||||||
|
t.equal(callBound('%Date.parse%'), Date.parse, '%Date.parse% yields itself');
|
||||||
|
|
||||||
|
// prototype primitive
|
||||||
|
t.equal(callBound('Error.prototype.message'), Error.prototype.message, 'Error.prototype.message yields itself');
|
||||||
|
t.equal(callBound('%Error.prototype.message%'), Error.prototype.message, '%Error.prototype.message% yields itself');
|
||||||
|
|
||||||
|
// prototype function
|
||||||
|
t.notEqual(callBound('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString does not yield itself');
|
||||||
|
t.notEqual(callBound('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% does not yield itself');
|
||||||
|
t.equal(callBound('Object.prototype.toString')(true), Object.prototype.toString.call(true), 'call-bound Object.prototype.toString calls into the original');
|
||||||
|
t.equal(callBound('%Object.prototype.toString%')(true), Object.prototype.toString.call(true), 'call-bound %Object.prototype.toString% calls into the original');
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { callBound('does not exist'); },
|
||||||
|
SyntaxError,
|
||||||
|
'nonexistent intrinsic throws'
|
||||||
|
);
|
||||||
|
t['throws'](
|
||||||
|
function () { callBound('does not exist', true); },
|
||||||
|
SyntaxError,
|
||||||
|
'allowMissing arg still throws for unknown intrinsic'
|
||||||
|
);
|
||||||
|
|
||||||
|
/* globals WeakRef: false */
|
||||||
|
t.test('real but absent intrinsic', { skip: typeof WeakRef !== 'undefined' }, function (st) {
|
||||||
|
st['throws'](
|
||||||
|
function () { callBound('WeakRef'); },
|
||||||
|
TypeError,
|
||||||
|
'real but absent intrinsic throws'
|
||||||
|
);
|
||||||
|
st.equal(callBound('WeakRef', true), undefined, 'allowMissing arg avoids exception');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
66
node_modules/call-bind/test/index.js
generated
vendored
Normal file
66
node_modules/call-bind/test/index.js
generated
vendored
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var callBind = require('../');
|
||||||
|
var bind = require('function-bind');
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* older engines have length nonconfigurable
|
||||||
|
* in io.js v3, it is configurable except on bound functions, hence the .bind()
|
||||||
|
*/
|
||||||
|
var functionsHaveConfigurableLengths = !!(
|
||||||
|
Object.getOwnPropertyDescriptor
|
||||||
|
&& Object.getOwnPropertyDescriptor(bind.call(function () {}), 'length').configurable
|
||||||
|
);
|
||||||
|
|
||||||
|
test('callBind', function (t) {
|
||||||
|
var sentinel = { sentinel: true };
|
||||||
|
var func = function (a, b) {
|
||||||
|
// eslint-disable-next-line no-invalid-this
|
||||||
|
return [this, a, b];
|
||||||
|
};
|
||||||
|
t.equal(func.length, 2, 'original function length is 2');
|
||||||
|
t.deepEqual(func(), [undefined, undefined, undefined], 'unbound func with too few args');
|
||||||
|
t.deepEqual(func(1, 2), [undefined, 1, 2], 'unbound func with right args');
|
||||||
|
t.deepEqual(func(1, 2, 3), [undefined, 1, 2], 'unbound func with too many args');
|
||||||
|
|
||||||
|
var bound = callBind(func);
|
||||||
|
t.equal(bound.length, func.length + 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
|
||||||
|
t.deepEqual(bound(), [undefined, undefined, undefined], 'bound func with too few args');
|
||||||
|
t.deepEqual(bound(1, 2), [1, 2, undefined], 'bound func with right args');
|
||||||
|
t.deepEqual(bound(1, 2, 3), [1, 2, 3], 'bound func with too many args');
|
||||||
|
|
||||||
|
var boundR = callBind(func, sentinel);
|
||||||
|
t.equal(boundR.length, func.length, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
|
||||||
|
t.deepEqual(boundR(), [sentinel, undefined, undefined], 'bound func with receiver, with too few args');
|
||||||
|
t.deepEqual(boundR(1, 2), [sentinel, 1, 2], 'bound func with receiver, with right args');
|
||||||
|
t.deepEqual(boundR(1, 2, 3), [sentinel, 1, 2], 'bound func with receiver, with too many args');
|
||||||
|
|
||||||
|
var boundArg = callBind(func, sentinel, 1);
|
||||||
|
t.equal(boundArg.length, func.length - 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
|
||||||
|
t.deepEqual(boundArg(), [sentinel, 1, undefined], 'bound func with receiver and arg, with too few args');
|
||||||
|
t.deepEqual(boundArg(2), [sentinel, 1, 2], 'bound func with receiver and arg, with right arg');
|
||||||
|
t.deepEqual(boundArg(2, 3), [sentinel, 1, 2], 'bound func with receiver and arg, with too many args');
|
||||||
|
|
||||||
|
t.test('callBind.apply', function (st) {
|
||||||
|
var aBound = callBind.apply(func);
|
||||||
|
st.deepEqual(aBound(sentinel), [sentinel, undefined, undefined], 'apply-bound func with no args');
|
||||||
|
st.deepEqual(aBound(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args');
|
||||||
|
st.deepEqual(aBound(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args');
|
||||||
|
|
||||||
|
var aBoundArg = callBind.apply(func);
|
||||||
|
st.deepEqual(aBoundArg(sentinel, [1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with too many args');
|
||||||
|
st.deepEqual(aBoundArg(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args');
|
||||||
|
st.deepEqual(aBoundArg(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args');
|
||||||
|
|
||||||
|
var aBoundR = callBind.apply(func, sentinel);
|
||||||
|
st.deepEqual(aBoundR([1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with receiver and too many args');
|
||||||
|
st.deepEqual(aBoundR([1, 2], 4), [sentinel, 1, 2], 'apply-bound func with receiver and right args');
|
||||||
|
st.deepEqual(aBoundR([1], 4), [sentinel, 1, undefined], 'apply-bound func with receiver and too few args');
|
||||||
|
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
458
node_modules/content-disposition/index.js
generated
vendored
Normal file
458
node_modules/content-disposition/index.js
generated
vendored
Normal file
@@ -0,0 +1,458 @@
|
|||||||
|
/*!
|
||||||
|
* content-disposition
|
||||||
|
* Copyright(c) 2014-2017 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = contentDisposition
|
||||||
|
module.exports.parse = parse
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var basename = require('path').basename
|
||||||
|
var Buffer = require('safe-buffer').Buffer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%")
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g // eslint-disable-line no-control-regex
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match percent encoding escape.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
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.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
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)>
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var QESC_REGEXP = /\\([\u0000-\u007f])/g // eslint-disable-line no-control-regex
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match chars that must be quoted-pair in RFC 2616
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
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>
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
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
|
||||||
|
* / "!" / "#" / "$" / "&" / "+" / "-" / "."
|
||||||
|
* / "^" / "_" / "`" / "|" / "~"
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
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 "*">
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
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}
|
||||||
|
* @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}
|
||||||
|
* @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}
|
||||||
|
* @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 5987 field value (gracefully).
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @return {string}
|
||||||
|
* @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 = Buffer.from(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}
|
||||||
|
* @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}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
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}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function pdecode (str, hex) {
|
||||||
|
return String.fromCharCode(parseInt(hex, 16))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Percent encode a single character.
|
||||||
|
*
|
||||||
|
* @param {string} char
|
||||||
|
* @return {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function pencode (char) {
|
||||||
|
return '%' + String(char)
|
||||||
|
.charCodeAt(0)
|
||||||
|
.toString(16)
|
||||||
|
.toUpperCase()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quote a string for HTTP.
|
||||||
|
*
|
||||||
|
* @param {string} val
|
||||||
|
* @return {string}
|
||||||
|
* @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}
|
||||||
|
* @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
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
* @param {string} type
|
||||||
|
* @param {object} parameters
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
function ContentDisposition (type, parameters) {
|
||||||
|
this.type = type
|
||||||
|
this.parameters = parameters
|
||||||
|
}
|
||||||
225
node_modules/content-type/index.js
generated
vendored
Normal file
225
node_modules/content-type/index.js
generated
vendored
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
/*!
|
||||||
|
* 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 // eslint-disable-line no-control-regex
|
||||||
|
var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ // eslint-disable-line no-control-regex
|
||||||
|
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 // eslint-disable-line no-control-regex
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.slice(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.charCodeAt(0) === 0x22 /* " */) {
|
||||||
|
// remove quotes
|
||||||
|
value = value.slice(1, -1)
|
||||||
|
|
||||||
|
// remove escapes
|
||||||
|
if (value.indexOf('\\') !== -1) {
|
||||||
|
value = value.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
|
||||||
|
}
|
||||||
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');
|
||||||
|
}
|
||||||
270
node_modules/cookie/index.js
generated
vendored
Normal file
270
node_modules/cookie/index.js
generated
vendored
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
/*!
|
||||||
|
* 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 __toString = Object.prototype.toString
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 dec = opt.decode || decode;
|
||||||
|
|
||||||
|
var index = 0
|
||||||
|
while (index < str.length) {
|
||||||
|
var eqIdx = str.indexOf('=', index)
|
||||||
|
|
||||||
|
// no more cookie pairs
|
||||||
|
if (eqIdx === -1) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
var endIdx = str.indexOf(';', index)
|
||||||
|
|
||||||
|
if (endIdx === -1) {
|
||||||
|
endIdx = str.length
|
||||||
|
} else if (endIdx < eqIdx) {
|
||||||
|
// backtrack on prior semicolon
|
||||||
|
index = str.lastIndexOf(';', eqIdx - 1) + 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var key = str.slice(index, eqIdx).trim()
|
||||||
|
|
||||||
|
// only assign once
|
||||||
|
if (undefined === obj[key]) {
|
||||||
|
var val = str.slice(eqIdx + 1, endIdx).trim()
|
||||||
|
|
||||||
|
// quoted values
|
||||||
|
if (val.charCodeAt(0) === 0x22) {
|
||||||
|
val = val.slice(1, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
obj[key] = tryDecode(val, dec);
|
||||||
|
}
|
||||||
|
|
||||||
|
index = endIdx + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
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) || !isFinite(maxAge)) {
|
||||||
|
throw new TypeError('option maxAge is invalid')
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
var expires = opt.expires
|
||||||
|
|
||||||
|
if (!isDate(expires) || isNaN(expires.valueOf())) {
|
||||||
|
throw new TypeError('option expires is invalid');
|
||||||
|
}
|
||||||
|
|
||||||
|
str += '; Expires=' + expires.toUTCString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.httpOnly) {
|
||||||
|
str += '; HttpOnly';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.secure) {
|
||||||
|
str += '; Secure';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.priority) {
|
||||||
|
var priority = typeof opt.priority === 'string'
|
||||||
|
? opt.priority.toLowerCase()
|
||||||
|
: opt.priority
|
||||||
|
|
||||||
|
switch (priority) {
|
||||||
|
case 'low':
|
||||||
|
str += '; Priority=Low'
|
||||||
|
break
|
||||||
|
case 'medium':
|
||||||
|
str += '; Priority=Medium'
|
||||||
|
break
|
||||||
|
case 'high':
|
||||||
|
str += '; Priority=High'
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
throw new TypeError('option priority is invalid')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
case 'none':
|
||||||
|
str += '; SameSite=None';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new TypeError('option sameSite is invalid');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL-decode string value. Optimized to skip native call when no %.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function decode (str) {
|
||||||
|
return str.indexOf('%') !== -1
|
||||||
|
? decodeURIComponent(str)
|
||||||
|
: str
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL-encode value.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function encode (val) {
|
||||||
|
return encodeURIComponent(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if value is a Date.
|
||||||
|
*
|
||||||
|
* @param {*} val
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isDate (val) {
|
||||||
|
return __toString.call(val) === '[object Date]' ||
|
||||||
|
val instanceof Date
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
70
node_modules/debug/karma.conf.js
generated
vendored
Normal file
70
node_modules/debug/karma.conf.js
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
// Karma configuration
|
||||||
|
// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC)
|
||||||
|
|
||||||
|
module.exports = function(config) {
|
||||||
|
config.set({
|
||||||
|
|
||||||
|
// base path that will be used to resolve all patterns (eg. files, exclude)
|
||||||
|
basePath: '',
|
||||||
|
|
||||||
|
|
||||||
|
// frameworks to use
|
||||||
|
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||||
|
frameworks: ['mocha', 'chai', 'sinon'],
|
||||||
|
|
||||||
|
|
||||||
|
// list of files / patterns to load in the browser
|
||||||
|
files: [
|
||||||
|
'dist/debug.js',
|
||||||
|
'test/*spec.js'
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
// list of files to exclude
|
||||||
|
exclude: [
|
||||||
|
'src/node.js'
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
// preprocess matching files before serving them to the browser
|
||||||
|
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
|
||||||
|
preprocessors: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// test results reporter to use
|
||||||
|
// possible values: 'dots', 'progress'
|
||||||
|
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||||
|
reporters: ['progress'],
|
||||||
|
|
||||||
|
|
||||||
|
// web server port
|
||||||
|
port: 9876,
|
||||||
|
|
||||||
|
|
||||||
|
// enable / disable colors in the output (reporters and logs)
|
||||||
|
colors: true,
|
||||||
|
|
||||||
|
|
||||||
|
// level of logging
|
||||||
|
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||||
|
logLevel: config.LOG_INFO,
|
||||||
|
|
||||||
|
|
||||||
|
// enable / disable watching file and executing tests whenever any file changes
|
||||||
|
autoWatch: true,
|
||||||
|
|
||||||
|
|
||||||
|
// start these browsers
|
||||||
|
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
||||||
|
browsers: ['PhantomJS'],
|
||||||
|
|
||||||
|
|
||||||
|
// Continuous Integration mode
|
||||||
|
// if true, Karma captures browsers, runs the tests and exits
|
||||||
|
singleRun: false,
|
||||||
|
|
||||||
|
// Concurrency level
|
||||||
|
// how many browser should be started simultaneous
|
||||||
|
concurrency: Infinity
|
||||||
|
})
|
||||||
|
}
|
||||||
1
node_modules/debug/node.js
generated
vendored
Normal file
1
node_modules/debug/node.js
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module.exports = require('./src/node');
|
||||||
185
node_modules/debug/src/browser.js
generated
vendored
Normal file
185
node_modules/debug/src/browser.js
generated
vendored
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
/**
|
||||||
|
* This is the web browser implementation of `debug()`.
|
||||||
|
*
|
||||||
|
* Expose `debug()` as the module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports = module.exports = require('./debug');
|
||||||
|
exports.log = log;
|
||||||
|
exports.formatArgs = formatArgs;
|
||||||
|
exports.save = save;
|
||||||
|
exports.load = load;
|
||||||
|
exports.useColors = useColors;
|
||||||
|
exports.storage = 'undefined' != typeof chrome
|
||||||
|
&& 'undefined' != typeof chrome.storage
|
||||||
|
? chrome.storage.local
|
||||||
|
: localstorage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.colors = [
|
||||||
|
'lightseagreen',
|
||||||
|
'forestgreen',
|
||||||
|
'goldenrod',
|
||||||
|
'dodgerblue',
|
||||||
|
'darkorchid',
|
||||||
|
'crimson'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
|
||||||
|
* and the Firebug extension (any Firefox version) are known
|
||||||
|
* to support "%c" CSS customizations.
|
||||||
|
*
|
||||||
|
* TODO: add a `localStorage` variable to explicitly enable/disable colors
|
||||||
|
*/
|
||||||
|
|
||||||
|
function useColors() {
|
||||||
|
// NB: In an Electron preload script, document will be defined but not fully
|
||||||
|
// initialized. Since we know we're in Chrome, we'll just detect this case
|
||||||
|
// explicitly
|
||||||
|
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// is webkit? http://stackoverflow.com/a/16459606/376773
|
||||||
|
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
|
||||||
|
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
|
||||||
|
// is firebug? http://stackoverflow.com/a/398120/376773
|
||||||
|
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
|
||||||
|
// is firefox >= v31?
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
||||||
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
|
||||||
|
// double check webkit in userAgent just in case we are in a worker
|
||||||
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.formatters.j = function(v) {
|
||||||
|
try {
|
||||||
|
return JSON.stringify(v);
|
||||||
|
} catch (err) {
|
||||||
|
return '[UnexpectedJSONParseError]: ' + err.message;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colorize log arguments if enabled.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatArgs(args) {
|
||||||
|
var useColors = this.useColors;
|
||||||
|
|
||||||
|
args[0] = (useColors ? '%c' : '')
|
||||||
|
+ this.namespace
|
||||||
|
+ (useColors ? ' %c' : ' ')
|
||||||
|
+ args[0]
|
||||||
|
+ (useColors ? '%c ' : ' ')
|
||||||
|
+ '+' + exports.humanize(this.diff);
|
||||||
|
|
||||||
|
if (!useColors) return;
|
||||||
|
|
||||||
|
var c = 'color: ' + this.color;
|
||||||
|
args.splice(1, 0, c, 'color: inherit')
|
||||||
|
|
||||||
|
// the final "%c" is somewhat tricky, because there could be other
|
||||||
|
// arguments passed either before or after the %c, so we need to
|
||||||
|
// figure out the correct index to insert the CSS into
|
||||||
|
var index = 0;
|
||||||
|
var lastC = 0;
|
||||||
|
args[0].replace(/%[a-zA-Z%]/g, function(match) {
|
||||||
|
if ('%%' === match) return;
|
||||||
|
index++;
|
||||||
|
if ('%c' === match) {
|
||||||
|
// we only are interested in the *last* %c
|
||||||
|
// (the user may have provided their own)
|
||||||
|
lastC = index;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
args.splice(lastC, 0, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes `console.log()` when available.
|
||||||
|
* No-op when `console.log` is not a "function".
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
// this hackery is required for IE8/9, where
|
||||||
|
// the `console.log` function doesn't have 'apply'
|
||||||
|
return 'object' === typeof console
|
||||||
|
&& console.log
|
||||||
|
&& Function.prototype.apply.call(console.log, console, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save `namespaces`.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function save(namespaces) {
|
||||||
|
try {
|
||||||
|
if (null == namespaces) {
|
||||||
|
exports.storage.removeItem('debug');
|
||||||
|
} else {
|
||||||
|
exports.storage.debug = namespaces;
|
||||||
|
}
|
||||||
|
} catch(e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load `namespaces`.
|
||||||
|
*
|
||||||
|
* @return {String} returns the previously persisted debug modes
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function load() {
|
||||||
|
var r;
|
||||||
|
try {
|
||||||
|
r = exports.storage.debug;
|
||||||
|
} catch(e) {}
|
||||||
|
|
||||||
|
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
|
||||||
|
if (!r && typeof process !== 'undefined' && 'env' in process) {
|
||||||
|
r = process.env.DEBUG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable namespaces listed in `localStorage.debug` initially.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.enable(load());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Localstorage attempts to return the localstorage.
|
||||||
|
*
|
||||||
|
* This is necessary because safari throws
|
||||||
|
* when a user disables cookies/localstorage
|
||||||
|
* and you attempt to access it.
|
||||||
|
*
|
||||||
|
* @return {LocalStorage}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function localstorage() {
|
||||||
|
try {
|
||||||
|
return window.localStorage;
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
202
node_modules/debug/src/debug.js
generated
vendored
Normal file
202
node_modules/debug/src/debug.js
generated
vendored
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* This is the common logic for both the Node.js and web browser
|
||||||
|
* implementations of `debug()`.
|
||||||
|
*
|
||||||
|
* Expose `debug()` as the module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
|
||||||
|
exports.coerce = coerce;
|
||||||
|
exports.disable = disable;
|
||||||
|
exports.enable = enable;
|
||||||
|
exports.enabled = enabled;
|
||||||
|
exports.humanize = require('ms');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The currently active debug mode names, and names to skip.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.names = [];
|
||||||
|
exports.skips = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of special "%n" handling functions, for the debug "format" argument.
|
||||||
|
*
|
||||||
|
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.formatters = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Previous log timestamp.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var prevTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select a color.
|
||||||
|
* @param {String} namespace
|
||||||
|
* @return {Number}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function selectColor(namespace) {
|
||||||
|
var hash = 0, i;
|
||||||
|
|
||||||
|
for (i in namespace) {
|
||||||
|
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
|
||||||
|
hash |= 0; // Convert to 32bit integer
|
||||||
|
}
|
||||||
|
|
||||||
|
return exports.colors[Math.abs(hash) % exports.colors.length];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a debugger with the given `namespace`.
|
||||||
|
*
|
||||||
|
* @param {String} namespace
|
||||||
|
* @return {Function}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createDebug(namespace) {
|
||||||
|
|
||||||
|
function debug() {
|
||||||
|
// disabled?
|
||||||
|
if (!debug.enabled) return;
|
||||||
|
|
||||||
|
var self = debug;
|
||||||
|
|
||||||
|
// set `diff` timestamp
|
||||||
|
var curr = +new Date();
|
||||||
|
var ms = curr - (prevTime || curr);
|
||||||
|
self.diff = ms;
|
||||||
|
self.prev = prevTime;
|
||||||
|
self.curr = curr;
|
||||||
|
prevTime = curr;
|
||||||
|
|
||||||
|
// turn the `arguments` into a proper Array
|
||||||
|
var args = new Array(arguments.length);
|
||||||
|
for (var i = 0; i < args.length; i++) {
|
||||||
|
args[i] = arguments[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
args[0] = exports.coerce(args[0]);
|
||||||
|
|
||||||
|
if ('string' !== typeof args[0]) {
|
||||||
|
// anything else let's inspect with %O
|
||||||
|
args.unshift('%O');
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply any `formatters` transformations
|
||||||
|
var index = 0;
|
||||||
|
args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
|
||||||
|
// if we encounter an escaped % then don't increase the array index
|
||||||
|
if (match === '%%') return match;
|
||||||
|
index++;
|
||||||
|
var formatter = exports.formatters[format];
|
||||||
|
if ('function' === typeof formatter) {
|
||||||
|
var val = args[index];
|
||||||
|
match = formatter.call(self, val);
|
||||||
|
|
||||||
|
// now we need to remove `args[index]` since it's inlined in the `format`
|
||||||
|
args.splice(index, 1);
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
|
||||||
|
// apply env-specific formatting (colors, etc.)
|
||||||
|
exports.formatArgs.call(self, args);
|
||||||
|
|
||||||
|
var logFn = debug.log || exports.log || console.log.bind(console);
|
||||||
|
logFn.apply(self, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug.namespace = namespace;
|
||||||
|
debug.enabled = exports.enabled(namespace);
|
||||||
|
debug.useColors = exports.useColors();
|
||||||
|
debug.color = selectColor(namespace);
|
||||||
|
|
||||||
|
// env-specific initialization logic for debug instances
|
||||||
|
if ('function' === typeof exports.init) {
|
||||||
|
exports.init(debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
return debug;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables a debug mode by namespaces. This can include modes
|
||||||
|
* separated by a colon and wildcards.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function enable(namespaces) {
|
||||||
|
exports.save(namespaces);
|
||||||
|
|
||||||
|
exports.names = [];
|
||||||
|
exports.skips = [];
|
||||||
|
|
||||||
|
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
|
||||||
|
var len = split.length;
|
||||||
|
|
||||||
|
for (var i = 0; i < len; i++) {
|
||||||
|
if (!split[i]) continue; // ignore empty strings
|
||||||
|
namespaces = split[i].replace(/\*/g, '.*?');
|
||||||
|
if (namespaces[0] === '-') {
|
||||||
|
exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
|
||||||
|
} else {
|
||||||
|
exports.names.push(new RegExp('^' + namespaces + '$'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable debug output.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function disable() {
|
||||||
|
exports.enable('');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the given mode name is enabled, false otherwise.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Boolean}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function enabled(name) {
|
||||||
|
var i, len;
|
||||||
|
for (i = 0, len = exports.skips.length; i < len; i++) {
|
||||||
|
if (exports.skips[i].test(name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0, len = exports.names.length; i < len; i++) {
|
||||||
|
if (exports.names[i].test(name)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coerce `val`.
|
||||||
|
*
|
||||||
|
* @param {Mixed} val
|
||||||
|
* @return {Mixed}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function coerce(val) {
|
||||||
|
if (val instanceof Error) return val.stack || val.message;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
10
node_modules/debug/src/index.js
generated
vendored
Normal file
10
node_modules/debug/src/index.js
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* Detect Electron renderer process, which is node, but we should
|
||||||
|
* treat as a browser.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (typeof process !== 'undefined' && process.type === 'renderer') {
|
||||||
|
module.exports = require('./browser.js');
|
||||||
|
} else {
|
||||||
|
module.exports = require('./node.js');
|
||||||
|
}
|
||||||
15
node_modules/debug/src/inspector-log.js
generated
vendored
Normal file
15
node_modules/debug/src/inspector-log.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
module.exports = inspectorLog;
|
||||||
|
|
||||||
|
// black hole
|
||||||
|
const nullStream = new (require('stream').Writable)();
|
||||||
|
nullStream._write = () => {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Outputs a `console.log()` to the Node.js Inspector console *only*.
|
||||||
|
*/
|
||||||
|
function inspectorLog() {
|
||||||
|
const stdout = console._stdout;
|
||||||
|
console._stdout = nullStream;
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
console._stdout = stdout;
|
||||||
|
}
|
||||||
248
node_modules/debug/src/node.js
generated
vendored
Normal file
248
node_modules/debug/src/node.js
generated
vendored
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var tty = require('tty');
|
||||||
|
var util = require('util');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the Node.js implementation of `debug()`.
|
||||||
|
*
|
||||||
|
* Expose `debug()` as the module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports = module.exports = require('./debug');
|
||||||
|
exports.init = init;
|
||||||
|
exports.log = log;
|
||||||
|
exports.formatArgs = formatArgs;
|
||||||
|
exports.save = save;
|
||||||
|
exports.load = load;
|
||||||
|
exports.useColors = useColors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.colors = [6, 2, 3, 4, 5, 1];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build up the default `inspectOpts` object from the environment variables.
|
||||||
|
*
|
||||||
|
* $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.inspectOpts = Object.keys(process.env).filter(function (key) {
|
||||||
|
return /^debug_/i.test(key);
|
||||||
|
}).reduce(function (obj, key) {
|
||||||
|
// camel-case
|
||||||
|
var prop = key
|
||||||
|
.substring(6)
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });
|
||||||
|
|
||||||
|
// coerce string value into JS value
|
||||||
|
var val = process.env[key];
|
||||||
|
if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
|
||||||
|
else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
|
||||||
|
else if (val === 'null') val = null;
|
||||||
|
else val = Number(val);
|
||||||
|
|
||||||
|
obj[prop] = val;
|
||||||
|
return obj;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The file descriptor to write the `debug()` calls to.
|
||||||
|
* Set the `DEBUG_FD` env variable to override with another value. i.e.:
|
||||||
|
*
|
||||||
|
* $ DEBUG_FD=3 node script.js 3>debug.log
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
|
||||||
|
|
||||||
|
if (1 !== fd && 2 !== fd) {
|
||||||
|
util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
|
||||||
|
}
|
||||||
|
|
||||||
|
var stream = 1 === fd ? process.stdout :
|
||||||
|
2 === fd ? process.stderr :
|
||||||
|
createWritableStdioStream(fd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is stdout a TTY? Colored output is enabled when `true`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function useColors() {
|
||||||
|
return 'colors' in exports.inspectOpts
|
||||||
|
? Boolean(exports.inspectOpts.colors)
|
||||||
|
: tty.isatty(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %o to `util.inspect()`, all on a single line.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.formatters.o = function(v) {
|
||||||
|
this.inspectOpts.colors = this.useColors;
|
||||||
|
return util.inspect(v, this.inspectOpts)
|
||||||
|
.split('\n').map(function(str) {
|
||||||
|
return str.trim()
|
||||||
|
}).join(' ');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %o to `util.inspect()`, allowing multiple lines if needed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.formatters.O = function(v) {
|
||||||
|
this.inspectOpts.colors = this.useColors;
|
||||||
|
return util.inspect(v, this.inspectOpts);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds ANSI color escape codes if enabled.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatArgs(args) {
|
||||||
|
var name = this.namespace;
|
||||||
|
var useColors = this.useColors;
|
||||||
|
|
||||||
|
if (useColors) {
|
||||||
|
var c = this.color;
|
||||||
|
var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';
|
||||||
|
|
||||||
|
args[0] = prefix + args[0].split('\n').join('\n' + prefix);
|
||||||
|
args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
|
||||||
|
} else {
|
||||||
|
args[0] = new Date().toUTCString()
|
||||||
|
+ ' ' + name + ' ' + args[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes `util.format()` with the specified arguments and writes to `stream`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
return stream.write(util.format.apply(util, arguments) + '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save `namespaces`.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function save(namespaces) {
|
||||||
|
if (null == namespaces) {
|
||||||
|
// If you set a process.env field to null or undefined, it gets cast to the
|
||||||
|
// string 'null' or 'undefined'. Just delete instead.
|
||||||
|
delete process.env.DEBUG;
|
||||||
|
} else {
|
||||||
|
process.env.DEBUG = namespaces;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load `namespaces`.
|
||||||
|
*
|
||||||
|
* @return {String} returns the previously persisted debug modes
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function load() {
|
||||||
|
return process.env.DEBUG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copied from `node/src/node.js`.
|
||||||
|
*
|
||||||
|
* XXX: It's lame that node doesn't expose this API out-of-the-box. It also
|
||||||
|
* relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createWritableStdioStream (fd) {
|
||||||
|
var stream;
|
||||||
|
var tty_wrap = process.binding('tty_wrap');
|
||||||
|
|
||||||
|
// Note stream._type is used for test-module-load-list.js
|
||||||
|
|
||||||
|
switch (tty_wrap.guessHandleType(fd)) {
|
||||||
|
case 'TTY':
|
||||||
|
stream = new tty.WriteStream(fd);
|
||||||
|
stream._type = 'tty';
|
||||||
|
|
||||||
|
// Hack to have stream not keep the event loop alive.
|
||||||
|
// See https://github.com/joyent/node/issues/1726
|
||||||
|
if (stream._handle && stream._handle.unref) {
|
||||||
|
stream._handle.unref();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'FILE':
|
||||||
|
var fs = require('fs');
|
||||||
|
stream = new fs.SyncWriteStream(fd, { autoClose: false });
|
||||||
|
stream._type = 'fs';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'PIPE':
|
||||||
|
case 'TCP':
|
||||||
|
var net = require('net');
|
||||||
|
stream = new net.Socket({
|
||||||
|
fd: fd,
|
||||||
|
readable: false,
|
||||||
|
writable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// FIXME Should probably have an option in net.Socket to create a
|
||||||
|
// stream from an existing fd which is writable only. But for now
|
||||||
|
// we'll just add this hack and set the `readable` member to false.
|
||||||
|
// Test: ./node test/fixtures/echo.js < /etc/passwd
|
||||||
|
stream.readable = false;
|
||||||
|
stream.read = null;
|
||||||
|
stream._type = 'pipe';
|
||||||
|
|
||||||
|
// FIXME Hack to have stream not keep the event loop alive.
|
||||||
|
// See https://github.com/joyent/node/issues/1726
|
||||||
|
if (stream._handle && stream._handle.unref) {
|
||||||
|
stream._handle.unref();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Probably an error on in uv_guess_handle()
|
||||||
|
throw new Error('Implement me. Unknown stream file type!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// For supporting legacy API we put the FD here.
|
||||||
|
stream.fd = fd;
|
||||||
|
|
||||||
|
stream._isStdio = true;
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init logic for `debug` instances.
|
||||||
|
*
|
||||||
|
* Create a new `inspectOpts` object in case `useColors` is set
|
||||||
|
* differently for a particular `debug` instance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function init (debug) {
|
||||||
|
debug.inspectOpts = {};
|
||||||
|
|
||||||
|
var keys = Object.keys(exports.inspectOpts);
|
||||||
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable namespaces listed in `process.env.DEBUG` initially.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.enable(load());
|
||||||
538
node_modules/depd/index.js
generated
vendored
Normal file
538
node_modules/depd/index.js
generated
vendored
Normal file
@@ -0,0 +1,538 @@
|
|||||||
|
/*!
|
||||||
|
* depd
|
||||||
|
* Copyright(c) 2014-2018 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var relative = require('path').relative
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = depd
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to base files on.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var basePath = process.cwd()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if namespace is contained in the string.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function containsNamespace (str, namespace) {
|
||||||
|
var vals = str.split(/[ ,]+/)
|
||||||
|
var ns = String(namespace).toLowerCase()
|
||||||
|
|
||||||
|
for (var i = 0; i < vals.length; i++) {
|
||||||
|
var val = vals[i]
|
||||||
|
|
||||||
|
// namespace contained
|
||||||
|
if (val && (val === '*' || val.toLowerCase() === ns)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a data descriptor to accessor descriptor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function convertDataDescriptorToAccessor (obj, prop, message) {
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
|
||||||
|
var value = descriptor.value
|
||||||
|
|
||||||
|
descriptor.get = function getter () { return value }
|
||||||
|
|
||||||
|
if (descriptor.writable) {
|
||||||
|
descriptor.set = function setter (val) { return (value = val) }
|
||||||
|
}
|
||||||
|
|
||||||
|
delete descriptor.value
|
||||||
|
delete descriptor.writable
|
||||||
|
|
||||||
|
Object.defineProperty(obj, prop, descriptor)
|
||||||
|
|
||||||
|
return descriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create arguments string to keep arity.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createArgumentsString (arity) {
|
||||||
|
var str = ''
|
||||||
|
|
||||||
|
for (var i = 0; i < arity; i++) {
|
||||||
|
str += ', arg' + i
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.substr(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create stack string from stack.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createStackString (stack) {
|
||||||
|
var str = this.name + ': ' + this.namespace
|
||||||
|
|
||||||
|
if (this.message) {
|
||||||
|
str += ' deprecated ' + this.message
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < stack.length; i++) {
|
||||||
|
str += '\n at ' + stack[i].toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create deprecate for namespace in caller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function depd (namespace) {
|
||||||
|
if (!namespace) {
|
||||||
|
throw new TypeError('argument namespace is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
var stack = getStack()
|
||||||
|
var site = callSiteLocation(stack[1])
|
||||||
|
var file = site[0]
|
||||||
|
|
||||||
|
function deprecate (message) {
|
||||||
|
// call to self as log
|
||||||
|
log.call(deprecate, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
deprecate._file = file
|
||||||
|
deprecate._ignored = isignored(namespace)
|
||||||
|
deprecate._namespace = namespace
|
||||||
|
deprecate._traced = istraced(namespace)
|
||||||
|
deprecate._warned = Object.create(null)
|
||||||
|
|
||||||
|
deprecate.function = wrapfunction
|
||||||
|
deprecate.property = wrapproperty
|
||||||
|
|
||||||
|
return deprecate
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if event emitter has listeners of a given type.
|
||||||
|
*
|
||||||
|
* The way to do this check is done three different ways in Node.js >= 0.8
|
||||||
|
* so this consolidates them into a minimal set using instance methods.
|
||||||
|
*
|
||||||
|
* @param {EventEmitter} emitter
|
||||||
|
* @param {string} type
|
||||||
|
* @returns {boolean}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function eehaslisteners (emitter, type) {
|
||||||
|
var count = typeof emitter.listenerCount !== 'function'
|
||||||
|
? emitter.listeners(type).length
|
||||||
|
: emitter.listenerCount(type)
|
||||||
|
|
||||||
|
return count > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if namespace is ignored.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isignored (namespace) {
|
||||||
|
if (process.noDeprecation) {
|
||||||
|
// --no-deprecation support
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
var str = process.env.NO_DEPRECATION || ''
|
||||||
|
|
||||||
|
// namespace ignored
|
||||||
|
return containsNamespace(str, namespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if namespace is traced.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function istraced (namespace) {
|
||||||
|
if (process.traceDeprecation) {
|
||||||
|
// --trace-deprecation support
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
var str = process.env.TRACE_DEPRECATION || ''
|
||||||
|
|
||||||
|
// namespace traced
|
||||||
|
return containsNamespace(str, namespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display deprecation message.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function log (message, site) {
|
||||||
|
var haslisteners = eehaslisteners(process, 'deprecation')
|
||||||
|
|
||||||
|
// abort early if no destination
|
||||||
|
if (!haslisteners && this._ignored) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var caller
|
||||||
|
var callFile
|
||||||
|
var callSite
|
||||||
|
var depSite
|
||||||
|
var i = 0
|
||||||
|
var seen = false
|
||||||
|
var stack = getStack()
|
||||||
|
var file = this._file
|
||||||
|
|
||||||
|
if (site) {
|
||||||
|
// provided site
|
||||||
|
depSite = site
|
||||||
|
callSite = callSiteLocation(stack[1])
|
||||||
|
callSite.name = depSite.name
|
||||||
|
file = callSite[0]
|
||||||
|
} else {
|
||||||
|
// get call site
|
||||||
|
i = 2
|
||||||
|
depSite = callSiteLocation(stack[i])
|
||||||
|
callSite = depSite
|
||||||
|
}
|
||||||
|
|
||||||
|
// get caller of deprecated thing in relation to file
|
||||||
|
for (; i < stack.length; i++) {
|
||||||
|
caller = callSiteLocation(stack[i])
|
||||||
|
callFile = caller[0]
|
||||||
|
|
||||||
|
if (callFile === file) {
|
||||||
|
seen = true
|
||||||
|
} else if (callFile === this._file) {
|
||||||
|
file = this._file
|
||||||
|
} else if (seen) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var key = caller
|
||||||
|
? depSite.join(':') + '__' + caller.join(':')
|
||||||
|
: undefined
|
||||||
|
|
||||||
|
if (key !== undefined && key in this._warned) {
|
||||||
|
// already warned
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this._warned[key] = true
|
||||||
|
|
||||||
|
// generate automatic message from call site
|
||||||
|
var msg = message
|
||||||
|
if (!msg) {
|
||||||
|
msg = callSite === depSite || !callSite.name
|
||||||
|
? defaultMessage(depSite)
|
||||||
|
: defaultMessage(callSite)
|
||||||
|
}
|
||||||
|
|
||||||
|
// emit deprecation if listeners exist
|
||||||
|
if (haslisteners) {
|
||||||
|
var err = DeprecationError(this._namespace, msg, stack.slice(i))
|
||||||
|
process.emit('deprecation', err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// format and write message
|
||||||
|
var format = process.stderr.isTTY
|
||||||
|
? formatColor
|
||||||
|
: formatPlain
|
||||||
|
var output = format.call(this, msg, caller, stack.slice(i))
|
||||||
|
process.stderr.write(output + '\n', 'utf8')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get call site location as array.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function callSiteLocation (callSite) {
|
||||||
|
var file = callSite.getFileName() || '<anonymous>'
|
||||||
|
var line = callSite.getLineNumber()
|
||||||
|
var colm = callSite.getColumnNumber()
|
||||||
|
|
||||||
|
if (callSite.isEval()) {
|
||||||
|
file = callSite.getEvalOrigin() + ', ' + file
|
||||||
|
}
|
||||||
|
|
||||||
|
var site = [file, line, colm]
|
||||||
|
|
||||||
|
site.callSite = callSite
|
||||||
|
site.name = callSite.getFunctionName()
|
||||||
|
|
||||||
|
return site
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a default message from the site.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function defaultMessage (site) {
|
||||||
|
var callSite = site.callSite
|
||||||
|
var funcName = site.name
|
||||||
|
|
||||||
|
// make useful anonymous name
|
||||||
|
if (!funcName) {
|
||||||
|
funcName = '<anonymous@' + formatLocation(site) + '>'
|
||||||
|
}
|
||||||
|
|
||||||
|
var context = callSite.getThis()
|
||||||
|
var typeName = context && callSite.getTypeName()
|
||||||
|
|
||||||
|
// ignore useless type name
|
||||||
|
if (typeName === 'Object') {
|
||||||
|
typeName = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
// make useful type name
|
||||||
|
if (typeName === 'Function') {
|
||||||
|
typeName = context.name || typeName
|
||||||
|
}
|
||||||
|
|
||||||
|
return typeName && callSite.getMethodName()
|
||||||
|
? typeName + '.' + funcName
|
||||||
|
: funcName
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format deprecation message without color.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatPlain (msg, caller, stack) {
|
||||||
|
var timestamp = new Date().toUTCString()
|
||||||
|
|
||||||
|
var formatted = timestamp +
|
||||||
|
' ' + this._namespace +
|
||||||
|
' deprecated ' + msg
|
||||||
|
|
||||||
|
// add stack trace
|
||||||
|
if (this._traced) {
|
||||||
|
for (var i = 0; i < stack.length; i++) {
|
||||||
|
formatted += '\n at ' + stack[i].toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
return formatted
|
||||||
|
}
|
||||||
|
|
||||||
|
if (caller) {
|
||||||
|
formatted += ' at ' + formatLocation(caller)
|
||||||
|
}
|
||||||
|
|
||||||
|
return formatted
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format deprecation message with color.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatColor (msg, caller, stack) {
|
||||||
|
var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan
|
||||||
|
' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow
|
||||||
|
' \x1b[0m' + msg + '\x1b[39m' // reset
|
||||||
|
|
||||||
|
// add stack trace
|
||||||
|
if (this._traced) {
|
||||||
|
for (var i = 0; i < stack.length; i++) {
|
||||||
|
formatted += '\n \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan
|
||||||
|
}
|
||||||
|
|
||||||
|
return formatted
|
||||||
|
}
|
||||||
|
|
||||||
|
if (caller) {
|
||||||
|
formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan
|
||||||
|
}
|
||||||
|
|
||||||
|
return formatted
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format call site location.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatLocation (callSite) {
|
||||||
|
return relative(basePath, callSite[0]) +
|
||||||
|
':' + callSite[1] +
|
||||||
|
':' + callSite[2]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the stack as array of call sites.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getStack () {
|
||||||
|
var limit = Error.stackTraceLimit
|
||||||
|
var obj = {}
|
||||||
|
var prep = Error.prepareStackTrace
|
||||||
|
|
||||||
|
Error.prepareStackTrace = prepareObjectStackTrace
|
||||||
|
Error.stackTraceLimit = Math.max(10, limit)
|
||||||
|
|
||||||
|
// capture the stack
|
||||||
|
Error.captureStackTrace(obj)
|
||||||
|
|
||||||
|
// slice this function off the top
|
||||||
|
var stack = obj.stack.slice(1)
|
||||||
|
|
||||||
|
Error.prepareStackTrace = prep
|
||||||
|
Error.stackTraceLimit = limit
|
||||||
|
|
||||||
|
return stack
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Capture call site stack from v8.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function prepareObjectStackTrace (obj, stack) {
|
||||||
|
return stack
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a wrapped function in a deprecation message.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function wrapfunction (fn, message) {
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new TypeError('argument fn must be a function')
|
||||||
|
}
|
||||||
|
|
||||||
|
var args = createArgumentsString(fn.length)
|
||||||
|
var stack = getStack()
|
||||||
|
var site = callSiteLocation(stack[1])
|
||||||
|
|
||||||
|
site.name = fn.name
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-new-func
|
||||||
|
var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site',
|
||||||
|
'"use strict"\n' +
|
||||||
|
'return function (' + args + ') {' +
|
||||||
|
'log.call(deprecate, message, site)\n' +
|
||||||
|
'return fn.apply(this, arguments)\n' +
|
||||||
|
'}')(fn, log, this, message, site)
|
||||||
|
|
||||||
|
return deprecatedfn
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap property in a deprecation message.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function wrapproperty (obj, prop, message) {
|
||||||
|
if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
||||||
|
throw new TypeError('argument obj must be object')
|
||||||
|
}
|
||||||
|
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
|
||||||
|
|
||||||
|
if (!descriptor) {
|
||||||
|
throw new TypeError('must call property on owner object')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!descriptor.configurable) {
|
||||||
|
throw new TypeError('property must be configurable')
|
||||||
|
}
|
||||||
|
|
||||||
|
var deprecate = this
|
||||||
|
var stack = getStack()
|
||||||
|
var site = callSiteLocation(stack[1])
|
||||||
|
|
||||||
|
// set site name
|
||||||
|
site.name = prop
|
||||||
|
|
||||||
|
// convert data descriptor
|
||||||
|
if ('value' in descriptor) {
|
||||||
|
descriptor = convertDataDescriptorToAccessor(obj, prop, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
var get = descriptor.get
|
||||||
|
var set = descriptor.set
|
||||||
|
|
||||||
|
// wrap getter
|
||||||
|
if (typeof get === 'function') {
|
||||||
|
descriptor.get = function getter () {
|
||||||
|
log.call(deprecate, message, site)
|
||||||
|
return get.apply(this, arguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// wrap setter
|
||||||
|
if (typeof set === 'function') {
|
||||||
|
descriptor.set = function setter () {
|
||||||
|
log.call(deprecate, message, site)
|
||||||
|
return set.apply(this, arguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.defineProperty(obj, prop, descriptor)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create DeprecationError for deprecation
|
||||||
|
*/
|
||||||
|
|
||||||
|
function DeprecationError (namespace, message, stack) {
|
||||||
|
var error = new Error()
|
||||||
|
var stackString
|
||||||
|
|
||||||
|
Object.defineProperty(error, 'constructor', {
|
||||||
|
value: DeprecationError
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.defineProperty(error, 'message', {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
value: message,
|
||||||
|
writable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.defineProperty(error, 'name', {
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
value: 'DeprecationError',
|
||||||
|
writable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.defineProperty(error, 'namespace', {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
value: namespace,
|
||||||
|
writable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.defineProperty(error, 'stack', {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
get: function () {
|
||||||
|
if (stackString !== undefined) {
|
||||||
|
return stackString
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepare stack trace
|
||||||
|
return (stackString = createStackString.call(this, stack))
|
||||||
|
},
|
||||||
|
set: function setter (val) {
|
||||||
|
stackString = val
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return error
|
||||||
|
}
|
||||||
77
node_modules/depd/lib/browser/index.js
generated
vendored
Normal file
77
node_modules/depd/lib/browser/index.js
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/*!
|
||||||
|
* depd
|
||||||
|
* Copyright(c) 2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = depd
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create deprecate for namespace in caller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function depd (namespace) {
|
||||||
|
if (!namespace) {
|
||||||
|
throw new TypeError('argument namespace is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
function deprecate (message) {
|
||||||
|
// no-op in browser
|
||||||
|
}
|
||||||
|
|
||||||
|
deprecate._file = undefined
|
||||||
|
deprecate._ignored = true
|
||||||
|
deprecate._namespace = namespace
|
||||||
|
deprecate._traced = false
|
||||||
|
deprecate._warned = Object.create(null)
|
||||||
|
|
||||||
|
deprecate.function = wrapfunction
|
||||||
|
deprecate.property = wrapproperty
|
||||||
|
|
||||||
|
return deprecate
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a wrapped function in a deprecation message.
|
||||||
|
*
|
||||||
|
* This is a no-op version of the wrapper, which does nothing but call
|
||||||
|
* validation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function wrapfunction (fn, message) {
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new TypeError('argument fn must be a function')
|
||||||
|
}
|
||||||
|
|
||||||
|
return fn
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap property in a deprecation message.
|
||||||
|
*
|
||||||
|
* This is a no-op version of the wrapper, which does nothing but call
|
||||||
|
* validation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function wrapproperty (obj, prop, message) {
|
||||||
|
if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
||||||
|
throw new TypeError('argument obj must be object')
|
||||||
|
}
|
||||||
|
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
|
||||||
|
|
||||||
|
if (!descriptor) {
|
||||||
|
throw new TypeError('must call property on owner object')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!descriptor.configurable) {
|
||||||
|
throw new TypeError('property must be configurable')
|
||||||
|
}
|
||||||
|
}
|
||||||
209
node_modules/destroy/index.js
generated
vendored
Normal file
209
node_modules/destroy/index.js
generated
vendored
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
/*!
|
||||||
|
* destroy
|
||||||
|
* Copyright(c) 2014 Jonathan Ong
|
||||||
|
* Copyright(c) 2015-2022 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var EventEmitter = require('events').EventEmitter
|
||||||
|
var ReadStream = require('fs').ReadStream
|
||||||
|
var Stream = require('stream')
|
||||||
|
var Zlib = require('zlib')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = destroy
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the given stream, and optionally suppress any future `error` events.
|
||||||
|
*
|
||||||
|
* @param {object} stream
|
||||||
|
* @param {boolean} suppress
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function destroy (stream, suppress) {
|
||||||
|
if (isFsReadStream(stream)) {
|
||||||
|
destroyReadStream(stream)
|
||||||
|
} else if (isZlibStream(stream)) {
|
||||||
|
destroyZlibStream(stream)
|
||||||
|
} else if (hasDestroy(stream)) {
|
||||||
|
stream.destroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEventEmitter(stream) && suppress) {
|
||||||
|
stream.removeAllListeners('error')
|
||||||
|
stream.addListener('error', noop)
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy a ReadStream.
|
||||||
|
*
|
||||||
|
* @param {object} stream
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function destroyReadStream (stream) {
|
||||||
|
stream.destroy()
|
||||||
|
|
||||||
|
if (typeof stream.close === 'function') {
|
||||||
|
// node.js core bug work-around
|
||||||
|
stream.on('open', onOpenClose)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close a Zlib stream.
|
||||||
|
*
|
||||||
|
* Zlib streams below Node.js 4.5.5 have a buggy implementation
|
||||||
|
* of .close() when zlib encountered an error.
|
||||||
|
*
|
||||||
|
* @param {object} stream
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function closeZlibStream (stream) {
|
||||||
|
if (stream._hadError === true) {
|
||||||
|
var prop = stream._binding === null
|
||||||
|
? '_binding'
|
||||||
|
: '_handle'
|
||||||
|
|
||||||
|
stream[prop] = {
|
||||||
|
close: function () { this[prop] = null }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy a Zlib stream.
|
||||||
|
*
|
||||||
|
* Zlib streams don't have a destroy function in Node.js 6. On top of that
|
||||||
|
* simply calling destroy on a zlib stream in Node.js 8+ will result in a
|
||||||
|
* memory leak. So until that is fixed, we need to call both close AND destroy.
|
||||||
|
*
|
||||||
|
* PR to fix memory leak: https://github.com/nodejs/node/pull/23734
|
||||||
|
*
|
||||||
|
* In Node.js 6+8, it's important that destroy is called before close as the
|
||||||
|
* stream would otherwise emit the error 'zlib binding closed'.
|
||||||
|
*
|
||||||
|
* @param {object} stream
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function destroyZlibStream (stream) {
|
||||||
|
if (typeof stream.destroy === 'function') {
|
||||||
|
// node.js core bug work-around
|
||||||
|
// istanbul ignore if: node.js 0.8
|
||||||
|
if (stream._binding) {
|
||||||
|
// node.js < 0.10.0
|
||||||
|
stream.destroy()
|
||||||
|
if (stream._processing) {
|
||||||
|
stream._needDrain = true
|
||||||
|
stream.once('drain', onDrainClearBinding)
|
||||||
|
} else {
|
||||||
|
stream._binding.clear()
|
||||||
|
}
|
||||||
|
} else if (stream._destroy && stream._destroy !== Stream.Transform.prototype._destroy) {
|
||||||
|
// node.js >= 12, ^11.1.0, ^10.15.1
|
||||||
|
stream.destroy()
|
||||||
|
} else if (stream._destroy && typeof stream.close === 'function') {
|
||||||
|
// node.js 7, 8
|
||||||
|
stream.destroyed = true
|
||||||
|
stream.close()
|
||||||
|
} else {
|
||||||
|
// fallback
|
||||||
|
// istanbul ignore next
|
||||||
|
stream.destroy()
|
||||||
|
}
|
||||||
|
} else if (typeof stream.close === 'function') {
|
||||||
|
// node.js < 8 fallback
|
||||||
|
closeZlibStream(stream)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if stream has destroy.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function hasDestroy (stream) {
|
||||||
|
return stream instanceof Stream &&
|
||||||
|
typeof stream.destroy === 'function'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if val is EventEmitter.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isEventEmitter (val) {
|
||||||
|
return val instanceof EventEmitter
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if stream is fs.ReadStream stream.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isFsReadStream (stream) {
|
||||||
|
return stream instanceof ReadStream
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if stream is Zlib stream.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isZlibStream (stream) {
|
||||||
|
return stream instanceof Zlib.Gzip ||
|
||||||
|
stream instanceof Zlib.Gunzip ||
|
||||||
|
stream instanceof Zlib.Deflate ||
|
||||||
|
stream instanceof Zlib.DeflateRaw ||
|
||||||
|
stream instanceof Zlib.Inflate ||
|
||||||
|
stream instanceof Zlib.InflateRaw ||
|
||||||
|
stream instanceof Zlib.Unzip
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No-op function.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function noop () {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On drain handler to clear binding.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
// istanbul ignore next: node.js 0.8
|
||||||
|
function onDrainClearBinding () {
|
||||||
|
this._binding.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On open handler to close stream.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function onOpenClose () {
|
||||||
|
if (typeof this.fd === 'number') {
|
||||||
|
// actually close down the fd
|
||||||
|
this.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
95
node_modules/ee-first/index.js
generated
vendored
Normal file
95
node_modules/ee-first/index.js
generated
vendored
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*!
|
||||||
|
* ee-first
|
||||||
|
* Copyright(c) 2014 Jonathan Ong
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = first
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the first event in a set of event emitters and event pairs.
|
||||||
|
*
|
||||||
|
* @param {array} stuff
|
||||||
|
* @param {function} done
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function first(stuff, done) {
|
||||||
|
if (!Array.isArray(stuff))
|
||||||
|
throw new TypeError('arg must be an array of [ee, events...] arrays')
|
||||||
|
|
||||||
|
var cleanups = []
|
||||||
|
|
||||||
|
for (var i = 0; i < stuff.length; i++) {
|
||||||
|
var arr = stuff[i]
|
||||||
|
|
||||||
|
if (!Array.isArray(arr) || arr.length < 2)
|
||||||
|
throw new TypeError('each array member must be [ee, events...]')
|
||||||
|
|
||||||
|
var ee = arr[0]
|
||||||
|
|
||||||
|
for (var j = 1; j < arr.length; j++) {
|
||||||
|
var event = arr[j]
|
||||||
|
var fn = listener(event, callback)
|
||||||
|
|
||||||
|
// listen to the event
|
||||||
|
ee.on(event, fn)
|
||||||
|
// push this listener to the list of cleanups
|
||||||
|
cleanups.push({
|
||||||
|
ee: ee,
|
||||||
|
event: event,
|
||||||
|
fn: fn,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function callback() {
|
||||||
|
cleanup()
|
||||||
|
done.apply(null, arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup() {
|
||||||
|
var x
|
||||||
|
for (var i = 0; i < cleanups.length; i++) {
|
||||||
|
x = cleanups[i]
|
||||||
|
x.ee.removeListener(x.event, x.fn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function thunk(fn) {
|
||||||
|
done = fn
|
||||||
|
}
|
||||||
|
|
||||||
|
thunk.cancel = cleanup
|
||||||
|
|
||||||
|
return thunk
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the event listener.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function listener(event, done) {
|
||||||
|
return function onevent(arg1) {
|
||||||
|
var args = new Array(arguments.length)
|
||||||
|
var ee = this
|
||||||
|
var err = event === 'error'
|
||||||
|
? arg1
|
||||||
|
: null
|
||||||
|
|
||||||
|
// copy args to prevent arguments escaping scope
|
||||||
|
for (var i = 0; i < args.length; i++) {
|
||||||
|
args[i] = arguments[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
done(err, ee, event, args)
|
||||||
|
}
|
||||||
|
}
|
||||||
60
node_modules/encodeurl/index.js
generated
vendored
Normal file
60
node_modules/encodeurl/index.js
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*!
|
||||||
|
* encodeurl
|
||||||
|
* Copyright(c) 2016 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = encodeUrl
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match non-URL code points, *after* encoding (i.e. not including "%")
|
||||||
|
* and including invalid escape sequences.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var ENCODE_CHARS_REGEXP = /(?:[^\x21\x25\x26-\x3B\x3D\x3F-\x5B\x5D\x5F\x61-\x7A\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match unmatched surrogate pair.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String to replace unmatched surrogate pair with.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var UNMATCHED_SURROGATE_PAIR_REPLACE = '$1\uFFFD$2'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode a URL to a percent-encoded form, excluding already-encoded sequences.
|
||||||
|
*
|
||||||
|
* This function will take an already-encoded URL and encode all the non-URL
|
||||||
|
* code points. This function will not encode the "%" character unless it is
|
||||||
|
* not part of a valid sequence (`%20` will be left as-is, but `%foo` will
|
||||||
|
* be encoded as `%25foo`).
|
||||||
|
*
|
||||||
|
* This encode is meant to be "safe" and does not throw errors. It will try as
|
||||||
|
* hard as it can to properly encode the given URL, including replacing any raw,
|
||||||
|
* unpaired surrogate pairs with the Unicode replacement character prior to
|
||||||
|
* encoding.
|
||||||
|
*
|
||||||
|
* @param {string} url
|
||||||
|
* @return {string}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function encodeUrl (url) {
|
||||||
|
return String(url)
|
||||||
|
.replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE)
|
||||||
|
.replace(ENCODE_CHARS_REGEXP, encodeURI)
|
||||||
|
}
|
||||||
78
node_modules/escape-html/index.js
generated
vendored
Normal file
78
node_modules/escape-html/index.js
generated
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/*!
|
||||||
|
* escape-html
|
||||||
|
* Copyright(c) 2012-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2015 Andreas Lubbe
|
||||||
|
* Copyright(c) 2015 Tiancheng "Timothy" Gu
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var matchHtmlRegExp = /["'&<>]/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = escapeHtml;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape special characters in the given string of html.
|
||||||
|
*
|
||||||
|
* @param {string} string The string to escape for inserting into HTML
|
||||||
|
* @return {string}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function escapeHtml(string) {
|
||||||
|
var str = '' + string;
|
||||||
|
var match = matchHtmlRegExp.exec(str);
|
||||||
|
|
||||||
|
if (!match) {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
var escape;
|
||||||
|
var html = '';
|
||||||
|
var index = 0;
|
||||||
|
var lastIndex = 0;
|
||||||
|
|
||||||
|
for (index = match.index; index < str.length; index++) {
|
||||||
|
switch (str.charCodeAt(index)) {
|
||||||
|
case 34: // "
|
||||||
|
escape = '"';
|
||||||
|
break;
|
||||||
|
case 38: // &
|
||||||
|
escape = '&';
|
||||||
|
break;
|
||||||
|
case 39: // '
|
||||||
|
escape = ''';
|
||||||
|
break;
|
||||||
|
case 60: // <
|
||||||
|
escape = '<';
|
||||||
|
break;
|
||||||
|
case 62: // >
|
||||||
|
escape = '>';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastIndex !== index) {
|
||||||
|
html += str.substring(lastIndex, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastIndex = index + 1;
|
||||||
|
html += escape;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastIndex !== index
|
||||||
|
? html + str.substring(lastIndex, index)
|
||||||
|
: html;
|
||||||
|
}
|
||||||
131
node_modules/etag/index.js
generated
vendored
Normal file
131
node_modules/etag/index.js
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
/*!
|
||||||
|
* etag
|
||||||
|
* Copyright(c) 2014-2016 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = etag
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var crypto = require('crypto')
|
||||||
|
var Stats = require('fs').Stats
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var toString = Object.prototype.toString
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate an entity tag.
|
||||||
|
*
|
||||||
|
* @param {Buffer|string} entity
|
||||||
|
* @return {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function entitytag (entity) {
|
||||||
|
if (entity.length === 0) {
|
||||||
|
// fast-path empty
|
||||||
|
return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"'
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute hash of entity
|
||||||
|
var hash = crypto
|
||||||
|
.createHash('sha1')
|
||||||
|
.update(entity, 'utf8')
|
||||||
|
.digest('base64')
|
||||||
|
.substring(0, 27)
|
||||||
|
|
||||||
|
// compute length of entity
|
||||||
|
var len = typeof entity === 'string'
|
||||||
|
? Buffer.byteLength(entity, 'utf8')
|
||||||
|
: entity.length
|
||||||
|
|
||||||
|
return '"' + len.toString(16) + '-' + hash + '"'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a simple ETag.
|
||||||
|
*
|
||||||
|
* @param {string|Buffer|Stats} entity
|
||||||
|
* @param {object} [options]
|
||||||
|
* @param {boolean} [options.weak]
|
||||||
|
* @return {String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function etag (entity, options) {
|
||||||
|
if (entity == null) {
|
||||||
|
throw new TypeError('argument entity is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
// support fs.Stats object
|
||||||
|
var isStats = isstats(entity)
|
||||||
|
var weak = options && typeof options.weak === 'boolean'
|
||||||
|
? options.weak
|
||||||
|
: isStats
|
||||||
|
|
||||||
|
// validate argument
|
||||||
|
if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) {
|
||||||
|
throw new TypeError('argument entity must be string, Buffer, or fs.Stats')
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate entity tag
|
||||||
|
var tag = isStats
|
||||||
|
? stattag(entity)
|
||||||
|
: entitytag(entity)
|
||||||
|
|
||||||
|
return weak
|
||||||
|
? 'W/' + tag
|
||||||
|
: tag
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if object is a Stats object.
|
||||||
|
*
|
||||||
|
* @param {object} obj
|
||||||
|
* @return {boolean}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isstats (obj) {
|
||||||
|
// genuine fs.Stats
|
||||||
|
if (typeof Stats === 'function' && obj instanceof Stats) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// quack quack
|
||||||
|
return obj && typeof obj === 'object' &&
|
||||||
|
'ctime' in obj && toString.call(obj.ctime) === '[object Date]' &&
|
||||||
|
'mtime' in obj && toString.call(obj.mtime) === '[object Date]' &&
|
||||||
|
'ino' in obj && typeof obj.ino === 'number' &&
|
||||||
|
'size' in obj && typeof obj.size === 'number'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a tag for a stat.
|
||||||
|
*
|
||||||
|
* @param {object} stat
|
||||||
|
* @return {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function stattag (stat) {
|
||||||
|
var mtime = stat.mtime.getTime().toString(16)
|
||||||
|
var size = stat.size.toString(16)
|
||||||
|
|
||||||
|
return '"' + size + '-' + mtime + '"'
|
||||||
|
}
|
||||||
11
node_modules/express/index.js
generated
vendored
Normal file
11
node_modules/express/index.js
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = require('./lib/express');
|
||||||
661
node_modules/express/lib/application.js
generated
vendored
Normal file
661
node_modules/express/lib/application.js
generated
vendored
Normal file
@@ -0,0 +1,661 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var finalhandler = require('finalhandler');
|
||||||
|
var Router = require('./router');
|
||||||
|
var methods = require('methods');
|
||||||
|
var middleware = require('./middleware/init');
|
||||||
|
var query = require('./middleware/query');
|
||||||
|
var debug = require('debug')('express:application');
|
||||||
|
var View = require('./view');
|
||||||
|
var http = require('http');
|
||||||
|
var compileETag = require('./utils').compileETag;
|
||||||
|
var compileQueryParser = require('./utils').compileQueryParser;
|
||||||
|
var compileTrust = require('./utils').compileTrust;
|
||||||
|
var deprecate = require('depd')('express');
|
||||||
|
var flatten = require('array-flatten');
|
||||||
|
var merge = require('utils-merge');
|
||||||
|
var resolve = require('path').resolve;
|
||||||
|
var setPrototypeOf = require('setprototypeof')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty
|
||||||
|
var slice = Array.prototype.slice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application prototype.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var app = exports = module.exports = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variable for trust proxy inheritance back-compat
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the server.
|
||||||
|
*
|
||||||
|
* - setup default configuration
|
||||||
|
* - setup default middleware
|
||||||
|
* - setup route reflection methods
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.init = function init() {
|
||||||
|
this.cache = {};
|
||||||
|
this.engines = {};
|
||||||
|
this.settings = {};
|
||||||
|
|
||||||
|
this.defaultConfiguration();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize application configuration.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.defaultConfiguration = function defaultConfiguration() {
|
||||||
|
var env = process.env.NODE_ENV || 'development';
|
||||||
|
|
||||||
|
// default settings
|
||||||
|
this.enable('x-powered-by');
|
||||||
|
this.set('etag', 'weak');
|
||||||
|
this.set('env', env);
|
||||||
|
this.set('query parser', 'extended');
|
||||||
|
this.set('subdomain offset', 2);
|
||||||
|
this.set('trust proxy', false);
|
||||||
|
|
||||||
|
// trust proxy inherit back-compat
|
||||||
|
Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
|
||||||
|
configurable: true,
|
||||||
|
value: true
|
||||||
|
});
|
||||||
|
|
||||||
|
debug('booting in %s mode', env);
|
||||||
|
|
||||||
|
this.on('mount', function onmount(parent) {
|
||||||
|
// inherit trust proxy
|
||||||
|
if (this.settings[trustProxyDefaultSymbol] === true
|
||||||
|
&& typeof parent.settings['trust proxy fn'] === 'function') {
|
||||||
|
delete this.settings['trust proxy'];
|
||||||
|
delete this.settings['trust proxy fn'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// inherit protos
|
||||||
|
setPrototypeOf(this.request, parent.request)
|
||||||
|
setPrototypeOf(this.response, parent.response)
|
||||||
|
setPrototypeOf(this.engines, parent.engines)
|
||||||
|
setPrototypeOf(this.settings, parent.settings)
|
||||||
|
});
|
||||||
|
|
||||||
|
// setup locals
|
||||||
|
this.locals = Object.create(null);
|
||||||
|
|
||||||
|
// top-most app is mounted at /
|
||||||
|
this.mountpath = '/';
|
||||||
|
|
||||||
|
// default locals
|
||||||
|
this.locals.settings = this.settings;
|
||||||
|
|
||||||
|
// default configuration
|
||||||
|
this.set('view', View);
|
||||||
|
this.set('views', resolve('views'));
|
||||||
|
this.set('jsonp callback name', 'callback');
|
||||||
|
|
||||||
|
if (env === 'production') {
|
||||||
|
this.enable('view cache');
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.defineProperty(this, 'router', {
|
||||||
|
get: function() {
|
||||||
|
throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lazily adds the base router if it has not yet been added.
|
||||||
|
*
|
||||||
|
* We cannot add the base router in the defaultConfiguration because
|
||||||
|
* it reads app settings which might be set after that has run.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
app.lazyrouter = function lazyrouter() {
|
||||||
|
if (!this._router) {
|
||||||
|
this._router = new Router({
|
||||||
|
caseSensitive: this.enabled('case sensitive routing'),
|
||||||
|
strict: this.enabled('strict routing')
|
||||||
|
});
|
||||||
|
|
||||||
|
this._router.use(query(this.get('query parser fn')));
|
||||||
|
this._router.use(middleware.init(this));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch a req, res pair into the application. Starts pipeline processing.
|
||||||
|
*
|
||||||
|
* If no callback is provided, then default error handlers will respond
|
||||||
|
* in the event of an error bubbling through the stack.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.handle = function handle(req, res, callback) {
|
||||||
|
var router = this._router;
|
||||||
|
|
||||||
|
// final handler
|
||||||
|
var done = callback || finalhandler(req, res, {
|
||||||
|
env: this.get('env'),
|
||||||
|
onerror: logerror.bind(this)
|
||||||
|
});
|
||||||
|
|
||||||
|
// no routes
|
||||||
|
if (!router) {
|
||||||
|
debug('no routes defined on app');
|
||||||
|
done();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
router.handle(req, res, done);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proxy `Router#use()` to add middleware to the app router.
|
||||||
|
* See Router#use() documentation for details.
|
||||||
|
*
|
||||||
|
* If the _fn_ parameter is an express app, then it will be
|
||||||
|
* mounted at the _route_ specified.
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.use = function use(fn) {
|
||||||
|
var offset = 0;
|
||||||
|
var path = '/';
|
||||||
|
|
||||||
|
// default path to '/'
|
||||||
|
// disambiguate app.use([fn])
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
var arg = fn;
|
||||||
|
|
||||||
|
while (Array.isArray(arg) && arg.length !== 0) {
|
||||||
|
arg = arg[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// first arg is the path
|
||||||
|
if (typeof arg !== 'function') {
|
||||||
|
offset = 1;
|
||||||
|
path = fn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var fns = flatten(slice.call(arguments, offset));
|
||||||
|
|
||||||
|
if (fns.length === 0) {
|
||||||
|
throw new TypeError('app.use() requires a middleware function')
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup router
|
||||||
|
this.lazyrouter();
|
||||||
|
var router = this._router;
|
||||||
|
|
||||||
|
fns.forEach(function (fn) {
|
||||||
|
// non-express app
|
||||||
|
if (!fn || !fn.handle || !fn.set) {
|
||||||
|
return router.use(path, fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('.use app under %s', path);
|
||||||
|
fn.mountpath = path;
|
||||||
|
fn.parent = this;
|
||||||
|
|
||||||
|
// restore .app property on req and res
|
||||||
|
router.use(path, function mounted_app(req, res, next) {
|
||||||
|
var orig = req.app;
|
||||||
|
fn.handle(req, res, function (err) {
|
||||||
|
setPrototypeOf(req, orig.request)
|
||||||
|
setPrototypeOf(res, orig.response)
|
||||||
|
next(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// mounted an app
|
||||||
|
fn.emit('mount', this);
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proxy to the app `Router#route()`
|
||||||
|
* Returns a new `Route` instance for the _path_.
|
||||||
|
*
|
||||||
|
* Routes are isolated middleware stacks for specific paths.
|
||||||
|
* See the Route api docs for details.
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.route = function route(path) {
|
||||||
|
this.lazyrouter();
|
||||||
|
return this._router.route(path);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register the given template engine callback `fn`
|
||||||
|
* as `ext`.
|
||||||
|
*
|
||||||
|
* By default will `require()` the engine based on the
|
||||||
|
* file extension. For example if you try to render
|
||||||
|
* a "foo.ejs" file Express will invoke the following internally:
|
||||||
|
*
|
||||||
|
* app.engine('ejs', require('ejs').__express);
|
||||||
|
*
|
||||||
|
* For engines that do not provide `.__express` out of the box,
|
||||||
|
* or if you wish to "map" a different extension to the template engine
|
||||||
|
* you may use this method. For example mapping the EJS template engine to
|
||||||
|
* ".html" files:
|
||||||
|
*
|
||||||
|
* app.engine('html', require('ejs').renderFile);
|
||||||
|
*
|
||||||
|
* In this case EJS provides a `.renderFile()` method with
|
||||||
|
* the same signature that Express expects: `(path, options, callback)`,
|
||||||
|
* though note that it aliases this method as `ejs.__express` internally
|
||||||
|
* so if you're using ".ejs" extensions you don't need to do anything.
|
||||||
|
*
|
||||||
|
* Some template engines do not follow this convention, the
|
||||||
|
* [Consolidate.js](https://github.com/tj/consolidate.js)
|
||||||
|
* library was created to map all of node's popular template
|
||||||
|
* engines to follow this convention, thus allowing them to
|
||||||
|
* work seamlessly within Express.
|
||||||
|
*
|
||||||
|
* @param {String} ext
|
||||||
|
* @param {Function} fn
|
||||||
|
* @return {app} for chaining
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.engine = function engine(ext, fn) {
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new Error('callback function required');
|
||||||
|
}
|
||||||
|
|
||||||
|
// get file extension
|
||||||
|
var extension = ext[0] !== '.'
|
||||||
|
? '.' + ext
|
||||||
|
: ext;
|
||||||
|
|
||||||
|
// store engine
|
||||||
|
this.engines[extension] = fn;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proxy to `Router#param()` with one added api feature. The _name_ parameter
|
||||||
|
* can be an array of names.
|
||||||
|
*
|
||||||
|
* See the Router#param() docs for more details.
|
||||||
|
*
|
||||||
|
* @param {String|Array} name
|
||||||
|
* @param {Function} fn
|
||||||
|
* @return {app} for chaining
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.param = function param(name, fn) {
|
||||||
|
this.lazyrouter();
|
||||||
|
|
||||||
|
if (Array.isArray(name)) {
|
||||||
|
for (var i = 0; i < name.length; i++) {
|
||||||
|
this.param(name[i], fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._router.param(name, fn);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assign `setting` to `val`, or return `setting`'s value.
|
||||||
|
*
|
||||||
|
* app.set('foo', 'bar');
|
||||||
|
* app.set('foo');
|
||||||
|
* // => "bar"
|
||||||
|
*
|
||||||
|
* Mounted servers inherit their parent server's settings.
|
||||||
|
*
|
||||||
|
* @param {String} setting
|
||||||
|
* @param {*} [val]
|
||||||
|
* @return {Server} for chaining
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.set = function set(setting, val) {
|
||||||
|
if (arguments.length === 1) {
|
||||||
|
// app.get(setting)
|
||||||
|
var settings = this.settings
|
||||||
|
|
||||||
|
while (settings && settings !== Object.prototype) {
|
||||||
|
if (hasOwnProperty.call(settings, setting)) {
|
||||||
|
return settings[setting]
|
||||||
|
}
|
||||||
|
|
||||||
|
settings = Object.getPrototypeOf(settings)
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('set "%s" to %o', setting, val);
|
||||||
|
|
||||||
|
// set value
|
||||||
|
this.settings[setting] = val;
|
||||||
|
|
||||||
|
// trigger matched settings
|
||||||
|
switch (setting) {
|
||||||
|
case 'etag':
|
||||||
|
this.set('etag fn', compileETag(val));
|
||||||
|
break;
|
||||||
|
case 'query parser':
|
||||||
|
this.set('query parser fn', compileQueryParser(val));
|
||||||
|
break;
|
||||||
|
case 'trust proxy':
|
||||||
|
this.set('trust proxy fn', compileTrust(val));
|
||||||
|
|
||||||
|
// trust proxy inherit back-compat
|
||||||
|
Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
|
||||||
|
configurable: true,
|
||||||
|
value: false
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the app's absolute pathname
|
||||||
|
* based on the parent(s) that have
|
||||||
|
* mounted it.
|
||||||
|
*
|
||||||
|
* For example if the application was
|
||||||
|
* mounted as "/admin", which itself
|
||||||
|
* was mounted as "/blog" then the
|
||||||
|
* return value would be "/blog/admin".
|
||||||
|
*
|
||||||
|
* @return {String}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.path = function path() {
|
||||||
|
return this.parent
|
||||||
|
? this.parent.path() + this.mountpath
|
||||||
|
: '';
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if `setting` is enabled (truthy).
|
||||||
|
*
|
||||||
|
* app.enabled('foo')
|
||||||
|
* // => false
|
||||||
|
*
|
||||||
|
* app.enable('foo')
|
||||||
|
* app.enabled('foo')
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* @param {String} setting
|
||||||
|
* @return {Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.enabled = function enabled(setting) {
|
||||||
|
return Boolean(this.set(setting));
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if `setting` is disabled.
|
||||||
|
*
|
||||||
|
* app.disabled('foo')
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* app.enable('foo')
|
||||||
|
* app.disabled('foo')
|
||||||
|
* // => false
|
||||||
|
*
|
||||||
|
* @param {String} setting
|
||||||
|
* @return {Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.disabled = function disabled(setting) {
|
||||||
|
return !this.set(setting);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable `setting`.
|
||||||
|
*
|
||||||
|
* @param {String} setting
|
||||||
|
* @return {app} for chaining
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.enable = function enable(setting) {
|
||||||
|
return this.set(setting, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable `setting`.
|
||||||
|
*
|
||||||
|
* @param {String} setting
|
||||||
|
* @return {app} for chaining
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.disable = function disable(setting) {
|
||||||
|
return this.set(setting, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegate `.VERB(...)` calls to `router.VERB(...)`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
methods.forEach(function(method){
|
||||||
|
app[method] = function(path){
|
||||||
|
if (method === 'get' && arguments.length === 1) {
|
||||||
|
// app.get(setting)
|
||||||
|
return this.set(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lazyrouter();
|
||||||
|
|
||||||
|
var route = this._router.route(path);
|
||||||
|
route[method].apply(route, slice.call(arguments, 1));
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Special-cased "all" method, applying the given route `path`,
|
||||||
|
* middleware, and callback to _every_ HTTP method.
|
||||||
|
*
|
||||||
|
* @param {String} path
|
||||||
|
* @param {Function} ...
|
||||||
|
* @return {app} for chaining
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.all = function all(path) {
|
||||||
|
this.lazyrouter();
|
||||||
|
|
||||||
|
var route = this._router.route(path);
|
||||||
|
var args = slice.call(arguments, 1);
|
||||||
|
|
||||||
|
for (var i = 0; i < methods.length; i++) {
|
||||||
|
route[methods[i]].apply(route, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
// del -> delete alias
|
||||||
|
|
||||||
|
app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render the given view `name` name with `options`
|
||||||
|
* and a callback accepting an error and the
|
||||||
|
* rendered template string.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* app.render('email', { name: 'Tobi' }, function(err, html){
|
||||||
|
* // ...
|
||||||
|
* })
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @param {Object|Function} options or fn
|
||||||
|
* @param {Function} callback
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.render = function render(name, options, callback) {
|
||||||
|
var cache = this.cache;
|
||||||
|
var done = callback;
|
||||||
|
var engines = this.engines;
|
||||||
|
var opts = options;
|
||||||
|
var renderOptions = {};
|
||||||
|
var view;
|
||||||
|
|
||||||
|
// support callback function as second arg
|
||||||
|
if (typeof options === 'function') {
|
||||||
|
done = options;
|
||||||
|
opts = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge app.locals
|
||||||
|
merge(renderOptions, this.locals);
|
||||||
|
|
||||||
|
// merge options._locals
|
||||||
|
if (opts._locals) {
|
||||||
|
merge(renderOptions, opts._locals);
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge options
|
||||||
|
merge(renderOptions, opts);
|
||||||
|
|
||||||
|
// set .cache unless explicitly provided
|
||||||
|
if (renderOptions.cache == null) {
|
||||||
|
renderOptions.cache = this.enabled('view cache');
|
||||||
|
}
|
||||||
|
|
||||||
|
// primed cache
|
||||||
|
if (renderOptions.cache) {
|
||||||
|
view = cache[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
// view
|
||||||
|
if (!view) {
|
||||||
|
var View = this.get('view');
|
||||||
|
|
||||||
|
view = new View(name, {
|
||||||
|
defaultEngine: this.get('view engine'),
|
||||||
|
root: this.get('views'),
|
||||||
|
engines: engines
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!view.path) {
|
||||||
|
var dirs = Array.isArray(view.root) && view.root.length > 1
|
||||||
|
? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"'
|
||||||
|
: 'directory "' + view.root + '"'
|
||||||
|
var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs);
|
||||||
|
err.view = view;
|
||||||
|
return done(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// prime the cache
|
||||||
|
if (renderOptions.cache) {
|
||||||
|
cache[name] = view;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// render
|
||||||
|
tryRender(view, renderOptions, done);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen for connections.
|
||||||
|
*
|
||||||
|
* A node `http.Server` is returned, with this
|
||||||
|
* application (which is a `Function`) as its
|
||||||
|
* callback. If you wish to create both an HTTP
|
||||||
|
* and HTTPS server you may do so with the "http"
|
||||||
|
* and "https" modules as shown here:
|
||||||
|
*
|
||||||
|
* var http = require('http')
|
||||||
|
* , https = require('https')
|
||||||
|
* , express = require('express')
|
||||||
|
* , app = express();
|
||||||
|
*
|
||||||
|
* http.createServer(app).listen(80);
|
||||||
|
* https.createServer({ ... }, app).listen(443);
|
||||||
|
*
|
||||||
|
* @return {http.Server}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.listen = function listen() {
|
||||||
|
var server = http.createServer(this);
|
||||||
|
return server.listen.apply(server, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log error using console.error.
|
||||||
|
*
|
||||||
|
* @param {Error} err
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function logerror(err) {
|
||||||
|
/* istanbul ignore next */
|
||||||
|
if (this.get('env') !== 'test') console.error(err.stack || err.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try rendering a view.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function tryRender(view, options, callback) {
|
||||||
|
try {
|
||||||
|
view.render(options, callback);
|
||||||
|
} catch (err) {
|
||||||
|
callback(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
116
node_modules/express/lib/express.js
generated
vendored
Normal file
116
node_modules/express/lib/express.js
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var bodyParser = require('body-parser')
|
||||||
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
var mixin = require('merge-descriptors');
|
||||||
|
var proto = require('./application');
|
||||||
|
var Route = require('./router/route');
|
||||||
|
var Router = require('./router');
|
||||||
|
var req = require('./request');
|
||||||
|
var res = require('./response');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose `createApplication()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports = module.exports = createApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an express application.
|
||||||
|
*
|
||||||
|
* @return {Function}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createApplication() {
|
||||||
|
var app = function(req, res, next) {
|
||||||
|
app.handle(req, res, next);
|
||||||
|
};
|
||||||
|
|
||||||
|
mixin(app, EventEmitter.prototype, false);
|
||||||
|
mixin(app, proto, false);
|
||||||
|
|
||||||
|
// expose the prototype that will get set on requests
|
||||||
|
app.request = Object.create(req, {
|
||||||
|
app: { configurable: true, enumerable: true, writable: true, value: app }
|
||||||
|
})
|
||||||
|
|
||||||
|
// expose the prototype that will get set on responses
|
||||||
|
app.response = Object.create(res, {
|
||||||
|
app: { configurable: true, enumerable: true, writable: true, value: app }
|
||||||
|
})
|
||||||
|
|
||||||
|
app.init();
|
||||||
|
return app;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose the prototypes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.application = proto;
|
||||||
|
exports.request = req;
|
||||||
|
exports.response = res;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose constructors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.Route = Route;
|
||||||
|
exports.Router = Router;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose middleware
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.json = bodyParser.json
|
||||||
|
exports.query = require('./middleware/query');
|
||||||
|
exports.raw = bodyParser.raw
|
||||||
|
exports.static = require('serve-static');
|
||||||
|
exports.text = bodyParser.text
|
||||||
|
exports.urlencoded = bodyParser.urlencoded
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace removed middleware with an appropriate error message.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var removedMiddlewares = [
|
||||||
|
'bodyParser',
|
||||||
|
'compress',
|
||||||
|
'cookieSession',
|
||||||
|
'session',
|
||||||
|
'logger',
|
||||||
|
'cookieParser',
|
||||||
|
'favicon',
|
||||||
|
'responseTime',
|
||||||
|
'errorHandler',
|
||||||
|
'timeout',
|
||||||
|
'methodOverride',
|
||||||
|
'vhost',
|
||||||
|
'csrf',
|
||||||
|
'directory',
|
||||||
|
'limit',
|
||||||
|
'multipart',
|
||||||
|
'staticCache'
|
||||||
|
]
|
||||||
|
|
||||||
|
removedMiddlewares.forEach(function (name) {
|
||||||
|
Object.defineProperty(exports, name, {
|
||||||
|
get: function () {
|
||||||
|
throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.');
|
||||||
|
},
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
});
|
||||||
43
node_modules/express/lib/middleware/init.js
generated
vendored
Normal file
43
node_modules/express/lib/middleware/init.js
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var setPrototypeOf = require('setprototypeof')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization middleware, exposing the
|
||||||
|
* request and response to each other, as well
|
||||||
|
* as defaulting the X-Powered-By header field.
|
||||||
|
*
|
||||||
|
* @param {Function} app
|
||||||
|
* @return {Function}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.init = function(app){
|
||||||
|
return function expressInit(req, res, next){
|
||||||
|
if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express');
|
||||||
|
req.res = res;
|
||||||
|
res.req = req;
|
||||||
|
req.next = next;
|
||||||
|
|
||||||
|
setPrototypeOf(req, app.request)
|
||||||
|
setPrototypeOf(res, app.response)
|
||||||
|
|
||||||
|
res.locals = res.locals || Object.create(null);
|
||||||
|
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
47
node_modules/express/lib/middleware/query.js
generated
vendored
Normal file
47
node_modules/express/lib/middleware/query.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var merge = require('utils-merge')
|
||||||
|
var parseUrl = require('parseurl');
|
||||||
|
var qs = require('qs');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} options
|
||||||
|
* @return {Function}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function query(options) {
|
||||||
|
var opts = merge({}, options)
|
||||||
|
var queryparse = qs.parse;
|
||||||
|
|
||||||
|
if (typeof options === 'function') {
|
||||||
|
queryparse = options;
|
||||||
|
opts = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts !== undefined && opts.allowPrototypes === undefined) {
|
||||||
|
// back-compat for qs module
|
||||||
|
opts.allowPrototypes = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return function query(req, res, next){
|
||||||
|
if (!req.query) {
|
||||||
|
var val = parseUrl(req).query;
|
||||||
|
req.query = queryparse(val, opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
};
|
||||||
525
node_modules/express/lib/request.js
generated
vendored
Normal file
525
node_modules/express/lib/request.js
generated
vendored
Normal file
@@ -0,0 +1,525 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var accepts = require('accepts');
|
||||||
|
var deprecate = require('depd')('express');
|
||||||
|
var isIP = require('net').isIP;
|
||||||
|
var typeis = require('type-is');
|
||||||
|
var http = require('http');
|
||||||
|
var fresh = require('fresh');
|
||||||
|
var parseRange = require('range-parser');
|
||||||
|
var parse = require('parseurl');
|
||||||
|
var proxyaddr = require('proxy-addr');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request prototype.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
var req = Object.create(http.IncomingMessage.prototype)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = req
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return request header.
|
||||||
|
*
|
||||||
|
* The `Referrer` header field is special-cased,
|
||||||
|
* both `Referrer` and `Referer` are interchangeable.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* req.get('Content-Type');
|
||||||
|
* // => "text/plain"
|
||||||
|
*
|
||||||
|
* req.get('content-type');
|
||||||
|
* // => "text/plain"
|
||||||
|
*
|
||||||
|
* req.get('Something');
|
||||||
|
* // => undefined
|
||||||
|
*
|
||||||
|
* Aliased as `req.header()`.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.get =
|
||||||
|
req.header = function header(name) {
|
||||||
|
if (!name) {
|
||||||
|
throw new TypeError('name argument is required to req.get');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof name !== 'string') {
|
||||||
|
throw new TypeError('name must be a string to req.get');
|
||||||
|
}
|
||||||
|
|
||||||
|
var lc = name.toLowerCase();
|
||||||
|
|
||||||
|
switch (lc) {
|
||||||
|
case 'referer':
|
||||||
|
case 'referrer':
|
||||||
|
return this.headers.referrer
|
||||||
|
|| this.headers.referer;
|
||||||
|
default:
|
||||||
|
return this.headers[lc];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To do: update docs.
|
||||||
|
*
|
||||||
|
* 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", an extension name
|
||||||
|
* such as "json", a comma-delimited list such as "json, html, text/plain",
|
||||||
|
* an argument list such as `"json", "html", "text/plain"`,
|
||||||
|
* 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
|
||||||
|
* req.accepts('html');
|
||||||
|
* // => "html"
|
||||||
|
*
|
||||||
|
* // Accept: text/*, application/json
|
||||||
|
* req.accepts('html');
|
||||||
|
* // => "html"
|
||||||
|
* req.accepts('text/html');
|
||||||
|
* // => "text/html"
|
||||||
|
* req.accepts('json, text');
|
||||||
|
* // => "json"
|
||||||
|
* req.accepts('application/json');
|
||||||
|
* // => "application/json"
|
||||||
|
*
|
||||||
|
* // Accept: text/*, application/json
|
||||||
|
* req.accepts('image/png');
|
||||||
|
* req.accepts('png');
|
||||||
|
* // => undefined
|
||||||
|
*
|
||||||
|
* // Accept: text/*;q=.5, application/json
|
||||||
|
* req.accepts(['html', 'json']);
|
||||||
|
* req.accepts('html', 'json');
|
||||||
|
* req.accepts('html, json');
|
||||||
|
* // => "json"
|
||||||
|
*
|
||||||
|
* @param {String|Array} type(s)
|
||||||
|
* @return {String|Array|Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.accepts = function(){
|
||||||
|
var accept = accepts(this);
|
||||||
|
return accept.types.apply(accept, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given `encoding`s are accepted.
|
||||||
|
*
|
||||||
|
* @param {String} ...encoding
|
||||||
|
* @return {String|Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.acceptsEncodings = function(){
|
||||||
|
var accept = accepts(this);
|
||||||
|
return accept.encodings.apply(accept, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
req.acceptsEncoding = deprecate.function(req.acceptsEncodings,
|
||||||
|
'req.acceptsEncoding: Use acceptsEncodings instead');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given `charset`s are acceptable,
|
||||||
|
* otherwise you should respond with 406 "Not Acceptable".
|
||||||
|
*
|
||||||
|
* @param {String} ...charset
|
||||||
|
* @return {String|Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.acceptsCharsets = function(){
|
||||||
|
var accept = accepts(this);
|
||||||
|
return accept.charsets.apply(accept, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
req.acceptsCharset = deprecate.function(req.acceptsCharsets,
|
||||||
|
'req.acceptsCharset: Use acceptsCharsets instead');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given `lang`s are acceptable,
|
||||||
|
* otherwise you should respond with 406 "Not Acceptable".
|
||||||
|
*
|
||||||
|
* @param {String} ...lang
|
||||||
|
* @return {String|Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.acceptsLanguages = function(){
|
||||||
|
var accept = accepts(this);
|
||||||
|
return accept.languages.apply(accept, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
req.acceptsLanguage = deprecate.function(req.acceptsLanguages,
|
||||||
|
'req.acceptsLanguage: Use acceptsLanguages instead');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse Range header field, capping to the given `size`.
|
||||||
|
*
|
||||||
|
* Unspecified ranges such as "0-" require knowledge of your resource length. In
|
||||||
|
* the case of a byte range this is of course the total number of bytes. If the
|
||||||
|
* Range header field is not given `undefined` is returned, `-1` when unsatisfiable,
|
||||||
|
* and `-2` when syntactically invalid.
|
||||||
|
*
|
||||||
|
* When ranges are returned, the array has a "type" property which is the type of
|
||||||
|
* range that is required (most commonly, "bytes"). Each array element is an object
|
||||||
|
* with a "start" and "end" property for the portion of the range.
|
||||||
|
*
|
||||||
|
* The "combine" option can be set to `true` and overlapping & adjacent ranges
|
||||||
|
* will be combined into a single range.
|
||||||
|
*
|
||||||
|
* NOTE: remember that ranges are inclusive, so for example "Range: users=0-3"
|
||||||
|
* should respond with 4 users when available, not 3.
|
||||||
|
*
|
||||||
|
* @param {number} size
|
||||||
|
* @param {object} [options]
|
||||||
|
* @param {boolean} [options.combine=false]
|
||||||
|
* @return {number|array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.range = function range(size, options) {
|
||||||
|
var range = this.get('Range');
|
||||||
|
if (!range) return;
|
||||||
|
return parseRange(size, range, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the value of param `name` when present or `defaultValue`.
|
||||||
|
*
|
||||||
|
* - Checks route placeholders, ex: _/user/:id_
|
||||||
|
* - Checks body params, ex: id=12, {"id":12}
|
||||||
|
* - Checks query string params, ex: ?id=12
|
||||||
|
*
|
||||||
|
* To utilize request bodies, `req.body`
|
||||||
|
* should be an object. This can be done by using
|
||||||
|
* the `bodyParser()` middleware.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @param {Mixed} [defaultValue]
|
||||||
|
* @return {String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.param = function param(name, defaultValue) {
|
||||||
|
var params = this.params || {};
|
||||||
|
var body = this.body || {};
|
||||||
|
var query = this.query || {};
|
||||||
|
|
||||||
|
var args = arguments.length === 1
|
||||||
|
? 'name'
|
||||||
|
: 'name, default';
|
||||||
|
deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead');
|
||||||
|
|
||||||
|
if (null != params[name] && params.hasOwnProperty(name)) return params[name];
|
||||||
|
if (null != body[name]) return body[name];
|
||||||
|
if (null != query[name]) return query[name];
|
||||||
|
|
||||||
|
return defaultValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the incoming request contains the "Content-Type"
|
||||||
|
* header field, and it contains the given mime `type`.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* // With Content-Type: text/html; charset=utf-8
|
||||||
|
* req.is('html');
|
||||||
|
* req.is('text/html');
|
||||||
|
* req.is('text/*');
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* // When Content-Type is application/json
|
||||||
|
* req.is('json');
|
||||||
|
* req.is('application/json');
|
||||||
|
* req.is('application/*');
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* req.is('html');
|
||||||
|
* // => false
|
||||||
|
*
|
||||||
|
* @param {String|Array} types...
|
||||||
|
* @return {String|false|null}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
req.is = function is(types) {
|
||||||
|
var arr = types;
|
||||||
|
|
||||||
|
// support flattened arguments
|
||||||
|
if (!Array.isArray(types)) {
|
||||||
|
arr = new Array(arguments.length);
|
||||||
|
for (var i = 0; i < arr.length; i++) {
|
||||||
|
arr[i] = arguments[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return typeis(this, arr);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the protocol string "http" or "https"
|
||||||
|
* when requested with TLS. When the "trust proxy"
|
||||||
|
* setting trusts the socket address, the
|
||||||
|
* "X-Forwarded-Proto" header field will be trusted
|
||||||
|
* and used if present.
|
||||||
|
*
|
||||||
|
* If you're running behind a reverse proxy that
|
||||||
|
* supplies https for you this may be enabled.
|
||||||
|
*
|
||||||
|
* @return {String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'protocol', function protocol(){
|
||||||
|
var proto = this.connection.encrypted
|
||||||
|
? 'https'
|
||||||
|
: 'http';
|
||||||
|
var trust = this.app.get('trust proxy fn');
|
||||||
|
|
||||||
|
if (!trust(this.connection.remoteAddress, 0)) {
|
||||||
|
return proto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: X-Forwarded-Proto is normally only ever a
|
||||||
|
// single value, but this is to be safe.
|
||||||
|
var header = this.get('X-Forwarded-Proto') || proto
|
||||||
|
var index = header.indexOf(',')
|
||||||
|
|
||||||
|
return index !== -1
|
||||||
|
? header.substring(0, index).trim()
|
||||||
|
: header.trim()
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short-hand for:
|
||||||
|
*
|
||||||
|
* req.protocol === 'https'
|
||||||
|
*
|
||||||
|
* @return {Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'secure', function secure(){
|
||||||
|
return this.protocol === 'https';
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the remote address from the trusted proxy.
|
||||||
|
*
|
||||||
|
* The is the remote address on the socket unless
|
||||||
|
* "trust proxy" is set.
|
||||||
|
*
|
||||||
|
* @return {String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'ip', function ip(){
|
||||||
|
var trust = this.app.get('trust proxy fn');
|
||||||
|
return proxyaddr(this, trust);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When "trust proxy" is set, trusted proxy addresses + client.
|
||||||
|
*
|
||||||
|
* For example if the value were "client, proxy1, proxy2"
|
||||||
|
* you would receive the array `["client", "proxy1", "proxy2"]`
|
||||||
|
* where "proxy2" is the furthest down-stream and "proxy1" and
|
||||||
|
* "proxy2" were trusted.
|
||||||
|
*
|
||||||
|
* @return {Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'ips', function ips() {
|
||||||
|
var trust = this.app.get('trust proxy fn');
|
||||||
|
var addrs = proxyaddr.all(this, trust);
|
||||||
|
|
||||||
|
// reverse the order (to farthest -> closest)
|
||||||
|
// and remove socket address
|
||||||
|
addrs.reverse().pop()
|
||||||
|
|
||||||
|
return addrs
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return subdomains as an array.
|
||||||
|
*
|
||||||
|
* Subdomains are the dot-separated parts of the host before the main domain of
|
||||||
|
* the app. By default, the domain of the app is assumed to be the last two
|
||||||
|
* parts of the host. This can be changed by setting "subdomain offset".
|
||||||
|
*
|
||||||
|
* For example, if the domain is "tobi.ferrets.example.com":
|
||||||
|
* If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`.
|
||||||
|
* If "subdomain offset" is 3, req.subdomains is `["tobi"]`.
|
||||||
|
*
|
||||||
|
* @return {Array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'subdomains', function subdomains() {
|
||||||
|
var hostname = this.hostname;
|
||||||
|
|
||||||
|
if (!hostname) return [];
|
||||||
|
|
||||||
|
var offset = this.app.get('subdomain offset');
|
||||||
|
var subdomains = !isIP(hostname)
|
||||||
|
? hostname.split('.').reverse()
|
||||||
|
: [hostname];
|
||||||
|
|
||||||
|
return subdomains.slice(offset);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short-hand for `url.parse(req.url).pathname`.
|
||||||
|
*
|
||||||
|
* @return {String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'path', function path() {
|
||||||
|
return parse(this).pathname;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the "Host" header field to a hostname.
|
||||||
|
*
|
||||||
|
* When the "trust proxy" setting trusts the socket
|
||||||
|
* address, the "X-Forwarded-Host" header field will
|
||||||
|
* be trusted.
|
||||||
|
*
|
||||||
|
* @return {String}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'hostname', function hostname(){
|
||||||
|
var trust = this.app.get('trust proxy fn');
|
||||||
|
var host = this.get('X-Forwarded-Host');
|
||||||
|
|
||||||
|
if (!host || !trust(this.connection.remoteAddress, 0)) {
|
||||||
|
host = this.get('Host');
|
||||||
|
} else if (host.indexOf(',') !== -1) {
|
||||||
|
// Note: X-Forwarded-Host is normally only ever a
|
||||||
|
// single value, but this is to be safe.
|
||||||
|
host = host.substring(0, host.indexOf(',')).trimRight()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!host) return;
|
||||||
|
|
||||||
|
// IPv6 literal support
|
||||||
|
var offset = host[0] === '['
|
||||||
|
? host.indexOf(']') + 1
|
||||||
|
: 0;
|
||||||
|
var index = host.indexOf(':', offset);
|
||||||
|
|
||||||
|
return index !== -1
|
||||||
|
? host.substring(0, index)
|
||||||
|
: host;
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: change req.host to return host in next major
|
||||||
|
|
||||||
|
defineGetter(req, 'host', deprecate.function(function host(){
|
||||||
|
return this.hostname;
|
||||||
|
}, 'req.host: Use req.hostname instead'));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the request is fresh, aka
|
||||||
|
* Last-Modified and/or the ETag
|
||||||
|
* still match.
|
||||||
|
*
|
||||||
|
* @return {Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'fresh', function(){
|
||||||
|
var method = this.method;
|
||||||
|
var res = this.res
|
||||||
|
var status = res.statusCode
|
||||||
|
|
||||||
|
// GET or HEAD for weak freshness validation only
|
||||||
|
if ('GET' !== method && 'HEAD' !== method) return false;
|
||||||
|
|
||||||
|
// 2xx or 304 as per rfc2616 14.26
|
||||||
|
if ((status >= 200 && status < 300) || 304 === status) {
|
||||||
|
return fresh(this.headers, {
|
||||||
|
'etag': res.get('ETag'),
|
||||||
|
'last-modified': res.get('Last-Modified')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the request is stale, aka
|
||||||
|
* "Last-Modified" and / or the "ETag" for the
|
||||||
|
* resource has changed.
|
||||||
|
*
|
||||||
|
* @return {Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'stale', function stale(){
|
||||||
|
return !this.fresh;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the request was an _XMLHttpRequest_.
|
||||||
|
*
|
||||||
|
* @return {Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
defineGetter(req, 'xhr', function xhr(){
|
||||||
|
var val = this.get('X-Requested-With') || '';
|
||||||
|
return val.toLowerCase() === 'xmlhttprequest';
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function for creating a getter on an object.
|
||||||
|
*
|
||||||
|
* @param {Object} obj
|
||||||
|
* @param {String} name
|
||||||
|
* @param {Function} getter
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function defineGetter(obj, name, getter) {
|
||||||
|
Object.defineProperty(obj, name, {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true,
|
||||||
|
get: getter
|
||||||
|
});
|
||||||
|
}
|
||||||
1169
node_modules/express/lib/response.js
generated
vendored
Normal file
1169
node_modules/express/lib/response.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
673
node_modules/express/lib/router/index.js
generated
vendored
Normal file
673
node_modules/express/lib/router/index.js
generated
vendored
Normal file
@@ -0,0 +1,673 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Route = require('./route');
|
||||||
|
var Layer = require('./layer');
|
||||||
|
var methods = require('methods');
|
||||||
|
var mixin = require('utils-merge');
|
||||||
|
var debug = require('debug')('express:router');
|
||||||
|
var deprecate = require('depd')('express');
|
||||||
|
var flatten = require('array-flatten');
|
||||||
|
var parseUrl = require('parseurl');
|
||||||
|
var setPrototypeOf = require('setprototypeof')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var objectRegExp = /^\[object (\S+)\]$/;
|
||||||
|
var slice = Array.prototype.slice;
|
||||||
|
var toString = Object.prototype.toString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a new `Router` with the given `options`.
|
||||||
|
*
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @return {Router} which is an callable function
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
var proto = module.exports = function(options) {
|
||||||
|
var opts = options || {};
|
||||||
|
|
||||||
|
function router(req, res, next) {
|
||||||
|
router.handle(req, res, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
// mixin Router class functions
|
||||||
|
setPrototypeOf(router, proto)
|
||||||
|
|
||||||
|
router.params = {};
|
||||||
|
router._params = [];
|
||||||
|
router.caseSensitive = opts.caseSensitive;
|
||||||
|
router.mergeParams = opts.mergeParams;
|
||||||
|
router.strict = opts.strict;
|
||||||
|
router.stack = [];
|
||||||
|
|
||||||
|
return router;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map the given param placeholder `name`(s) to the given callback.
|
||||||
|
*
|
||||||
|
* Parameter mapping is used to provide pre-conditions to routes
|
||||||
|
* which use normalized placeholders. For example a _:user_id_ parameter
|
||||||
|
* could automatically load a user's information from the database without
|
||||||
|
* any additional code,
|
||||||
|
*
|
||||||
|
* The callback uses the same signature as middleware, the only difference
|
||||||
|
* being that the value of the placeholder is passed, in this case the _id_
|
||||||
|
* of the user. Once the `next()` function is invoked, just like middleware
|
||||||
|
* it will continue on to execute the route, or subsequent parameter functions.
|
||||||
|
*
|
||||||
|
* Just like in middleware, you must either respond to the request or call next
|
||||||
|
* to avoid stalling the request.
|
||||||
|
*
|
||||||
|
* app.param('user_id', function(req, res, next, id){
|
||||||
|
* User.find(id, function(err, user){
|
||||||
|
* if (err) {
|
||||||
|
* return next(err);
|
||||||
|
* } else if (!user) {
|
||||||
|
* return next(new Error('failed to load user'));
|
||||||
|
* }
|
||||||
|
* req.user = user;
|
||||||
|
* next();
|
||||||
|
* });
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @param {Function} fn
|
||||||
|
* @return {app} for chaining
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
proto.param = function param(name, fn) {
|
||||||
|
// param logic
|
||||||
|
if (typeof name === 'function') {
|
||||||
|
deprecate('router.param(fn): Refactor to use path params');
|
||||||
|
this._params.push(name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply param functions
|
||||||
|
var params = this._params;
|
||||||
|
var len = params.length;
|
||||||
|
var ret;
|
||||||
|
|
||||||
|
if (name[0] === ':') {
|
||||||
|
deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.slice(1)) + ', fn) instead')
|
||||||
|
name = name.slice(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < len; ++i) {
|
||||||
|
if (ret = params[i](name, fn)) {
|
||||||
|
fn = ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure we end up with a
|
||||||
|
// middleware function
|
||||||
|
if ('function' !== typeof fn) {
|
||||||
|
throw new Error('invalid param() call for ' + name + ', got ' + fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
(this.params[name] = this.params[name] || []).push(fn);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch a req, res into the router.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
proto.handle = function handle(req, res, out) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
debug('dispatching %s %s', req.method, req.url);
|
||||||
|
|
||||||
|
var idx = 0;
|
||||||
|
var protohost = getProtohost(req.url) || ''
|
||||||
|
var removed = '';
|
||||||
|
var slashAdded = false;
|
||||||
|
var sync = 0
|
||||||
|
var paramcalled = {};
|
||||||
|
|
||||||
|
// store options for OPTIONS request
|
||||||
|
// only used if OPTIONS request
|
||||||
|
var options = [];
|
||||||
|
|
||||||
|
// middleware and routes
|
||||||
|
var stack = self.stack;
|
||||||
|
|
||||||
|
// manage inter-router variables
|
||||||
|
var parentParams = req.params;
|
||||||
|
var parentUrl = req.baseUrl || '';
|
||||||
|
var done = restore(out, req, 'baseUrl', 'next', 'params');
|
||||||
|
|
||||||
|
// setup next layer
|
||||||
|
req.next = next;
|
||||||
|
|
||||||
|
// for options requests, respond with a default if nothing else responds
|
||||||
|
if (req.method === 'OPTIONS') {
|
||||||
|
done = wrap(done, function(old, err) {
|
||||||
|
if (err || options.length === 0) return old(err);
|
||||||
|
sendOptionsResponse(res, options, old);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup basic req values
|
||||||
|
req.baseUrl = parentUrl;
|
||||||
|
req.originalUrl = req.originalUrl || req.url;
|
||||||
|
|
||||||
|
next();
|
||||||
|
|
||||||
|
function next(err) {
|
||||||
|
var layerError = err === 'route'
|
||||||
|
? null
|
||||||
|
: err;
|
||||||
|
|
||||||
|
// remove added slash
|
||||||
|
if (slashAdded) {
|
||||||
|
req.url = req.url.slice(1)
|
||||||
|
slashAdded = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore altered req.url
|
||||||
|
if (removed.length !== 0) {
|
||||||
|
req.baseUrl = parentUrl;
|
||||||
|
req.url = protohost + removed + req.url.slice(protohost.length)
|
||||||
|
removed = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// signal to exit router
|
||||||
|
if (layerError === 'router') {
|
||||||
|
setImmediate(done, null)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// no more matching layers
|
||||||
|
if (idx >= stack.length) {
|
||||||
|
setImmediate(done, layerError);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// max sync stack
|
||||||
|
if (++sync > 100) {
|
||||||
|
return setImmediate(next, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// get pathname of request
|
||||||
|
var path = getPathname(req);
|
||||||
|
|
||||||
|
if (path == null) {
|
||||||
|
return done(layerError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// find next matching layer
|
||||||
|
var layer;
|
||||||
|
var match;
|
||||||
|
var route;
|
||||||
|
|
||||||
|
while (match !== true && idx < stack.length) {
|
||||||
|
layer = stack[idx++];
|
||||||
|
match = matchLayer(layer, path);
|
||||||
|
route = layer.route;
|
||||||
|
|
||||||
|
if (typeof match !== 'boolean') {
|
||||||
|
// hold on to layerError
|
||||||
|
layerError = layerError || match;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match !== true) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!route) {
|
||||||
|
// process non-route handlers normally
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layerError) {
|
||||||
|
// routes do not match with a pending error
|
||||||
|
match = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var method = req.method;
|
||||||
|
var has_method = route._handles_method(method);
|
||||||
|
|
||||||
|
// build up automatic options response
|
||||||
|
if (!has_method && method === 'OPTIONS') {
|
||||||
|
appendMethods(options, route._options());
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't even bother matching route
|
||||||
|
if (!has_method && method !== 'HEAD') {
|
||||||
|
match = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no match
|
||||||
|
if (match !== true) {
|
||||||
|
return done(layerError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// store route for dispatch on change
|
||||||
|
if (route) {
|
||||||
|
req.route = route;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Capture one-time layer values
|
||||||
|
req.params = self.mergeParams
|
||||||
|
? mergeParams(layer.params, parentParams)
|
||||||
|
: layer.params;
|
||||||
|
var layerPath = layer.path;
|
||||||
|
|
||||||
|
// this should be done for the layer
|
||||||
|
self.process_params(layer, paramcalled, req, res, function (err) {
|
||||||
|
if (err) {
|
||||||
|
next(layerError || err)
|
||||||
|
} else if (route) {
|
||||||
|
layer.handle_request(req, res, next)
|
||||||
|
} else {
|
||||||
|
trim_prefix(layer, layerError, layerPath, path)
|
||||||
|
}
|
||||||
|
|
||||||
|
sync = 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function trim_prefix(layer, layerError, layerPath, path) {
|
||||||
|
if (layerPath.length !== 0) {
|
||||||
|
// Validate path is a prefix match
|
||||||
|
if (layerPath !== path.slice(0, layerPath.length)) {
|
||||||
|
next(layerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate path breaks on a path separator
|
||||||
|
var c = path[layerPath.length]
|
||||||
|
if (c && c !== '/' && c !== '.') return next(layerError)
|
||||||
|
|
||||||
|
// Trim off the part of the url that matches the route
|
||||||
|
// middleware (.use stuff) needs to have the path stripped
|
||||||
|
debug('trim prefix (%s) from url %s', layerPath, req.url);
|
||||||
|
removed = layerPath;
|
||||||
|
req.url = protohost + req.url.slice(protohost.length + removed.length)
|
||||||
|
|
||||||
|
// Ensure leading slash
|
||||||
|
if (!protohost && req.url[0] !== '/') {
|
||||||
|
req.url = '/' + req.url;
|
||||||
|
slashAdded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup base URL (no trailing slash)
|
||||||
|
req.baseUrl = parentUrl + (removed[removed.length - 1] === '/'
|
||||||
|
? removed.substring(0, removed.length - 1)
|
||||||
|
: removed);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('%s %s : %s', layer.name, layerPath, req.originalUrl);
|
||||||
|
|
||||||
|
if (layerError) {
|
||||||
|
layer.handle_error(layerError, req, res, next);
|
||||||
|
} else {
|
||||||
|
layer.handle_request(req, res, next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process any parameters for the layer.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
proto.process_params = function process_params(layer, called, req, res, done) {
|
||||||
|
var params = this.params;
|
||||||
|
|
||||||
|
// captured parameters from the layer, keys and values
|
||||||
|
var keys = layer.keys;
|
||||||
|
|
||||||
|
// fast track
|
||||||
|
if (!keys || keys.length === 0) {
|
||||||
|
return done();
|
||||||
|
}
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
var name;
|
||||||
|
var paramIndex = 0;
|
||||||
|
var key;
|
||||||
|
var paramVal;
|
||||||
|
var paramCallbacks;
|
||||||
|
var paramCalled;
|
||||||
|
|
||||||
|
// process params in order
|
||||||
|
// param callbacks can be async
|
||||||
|
function param(err) {
|
||||||
|
if (err) {
|
||||||
|
return done(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= keys.length ) {
|
||||||
|
return done();
|
||||||
|
}
|
||||||
|
|
||||||
|
paramIndex = 0;
|
||||||
|
key = keys[i++];
|
||||||
|
name = key.name;
|
||||||
|
paramVal = req.params[name];
|
||||||
|
paramCallbacks = params[name];
|
||||||
|
paramCalled = called[name];
|
||||||
|
|
||||||
|
if (paramVal === undefined || !paramCallbacks) {
|
||||||
|
return param();
|
||||||
|
}
|
||||||
|
|
||||||
|
// param previously called with same value or error occurred
|
||||||
|
if (paramCalled && (paramCalled.match === paramVal
|
||||||
|
|| (paramCalled.error && paramCalled.error !== 'route'))) {
|
||||||
|
// restore value
|
||||||
|
req.params[name] = paramCalled.value;
|
||||||
|
|
||||||
|
// next param
|
||||||
|
return param(paramCalled.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
called[name] = paramCalled = {
|
||||||
|
error: null,
|
||||||
|
match: paramVal,
|
||||||
|
value: paramVal
|
||||||
|
};
|
||||||
|
|
||||||
|
paramCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
// single param callbacks
|
||||||
|
function paramCallback(err) {
|
||||||
|
var fn = paramCallbacks[paramIndex++];
|
||||||
|
|
||||||
|
// store updated value
|
||||||
|
paramCalled.value = req.params[key.name];
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
// store error
|
||||||
|
paramCalled.error = err;
|
||||||
|
param(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fn) return param();
|
||||||
|
|
||||||
|
try {
|
||||||
|
fn(req, res, paramCallback, paramVal, key.name);
|
||||||
|
} catch (e) {
|
||||||
|
paramCallback(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
param();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use the given middleware function, with optional path, defaulting to "/".
|
||||||
|
*
|
||||||
|
* Use (like `.all`) will run for any http METHOD, but it will not add
|
||||||
|
* handlers for those methods so OPTIONS requests will not consider `.use`
|
||||||
|
* functions even if they could respond.
|
||||||
|
*
|
||||||
|
* The other difference is that _route_ path is stripped and not visible
|
||||||
|
* to the handler function. The main effect of this feature is that mounted
|
||||||
|
* handlers can operate without any code changes regardless of the "prefix"
|
||||||
|
* pathname.
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
proto.use = function use(fn) {
|
||||||
|
var offset = 0;
|
||||||
|
var path = '/';
|
||||||
|
|
||||||
|
// default path to '/'
|
||||||
|
// disambiguate router.use([fn])
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
var arg = fn;
|
||||||
|
|
||||||
|
while (Array.isArray(arg) && arg.length !== 0) {
|
||||||
|
arg = arg[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// first arg is the path
|
||||||
|
if (typeof arg !== 'function') {
|
||||||
|
offset = 1;
|
||||||
|
path = fn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var callbacks = flatten(slice.call(arguments, offset));
|
||||||
|
|
||||||
|
if (callbacks.length === 0) {
|
||||||
|
throw new TypeError('Router.use() requires a middleware function')
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < callbacks.length; i++) {
|
||||||
|
var fn = callbacks[i];
|
||||||
|
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the middleware
|
||||||
|
debug('use %o %s', path, fn.name || '<anonymous>')
|
||||||
|
|
||||||
|
var layer = new Layer(path, {
|
||||||
|
sensitive: this.caseSensitive,
|
||||||
|
strict: false,
|
||||||
|
end: false
|
||||||
|
}, fn);
|
||||||
|
|
||||||
|
layer.route = undefined;
|
||||||
|
|
||||||
|
this.stack.push(layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new Route for the given path.
|
||||||
|
*
|
||||||
|
* Each route contains a separate middleware stack and VERB handlers.
|
||||||
|
*
|
||||||
|
* See the Route api documentation for details on adding handlers
|
||||||
|
* and middleware to routes.
|
||||||
|
*
|
||||||
|
* @param {String} path
|
||||||
|
* @return {Route}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
proto.route = function route(path) {
|
||||||
|
var route = new Route(path);
|
||||||
|
|
||||||
|
var layer = new Layer(path, {
|
||||||
|
sensitive: this.caseSensitive,
|
||||||
|
strict: this.strict,
|
||||||
|
end: true
|
||||||
|
}, route.dispatch.bind(route));
|
||||||
|
|
||||||
|
layer.route = route;
|
||||||
|
|
||||||
|
this.stack.push(layer);
|
||||||
|
return route;
|
||||||
|
};
|
||||||
|
|
||||||
|
// create Router#VERB functions
|
||||||
|
methods.concat('all').forEach(function(method){
|
||||||
|
proto[method] = function(path){
|
||||||
|
var route = this.route(path)
|
||||||
|
route[method].apply(route, slice.call(arguments, 1));
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// append methods to a list of methods
|
||||||
|
function appendMethods(list, addition) {
|
||||||
|
for (var i = 0; i < addition.length; i++) {
|
||||||
|
var method = addition[i];
|
||||||
|
if (list.indexOf(method) === -1) {
|
||||||
|
list.push(method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get pathname of request
|
||||||
|
function getPathname(req) {
|
||||||
|
try {
|
||||||
|
return parseUrl(req).pathname;
|
||||||
|
} catch (err) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get get protocol + host for a URL
|
||||||
|
function getProtohost(url) {
|
||||||
|
if (typeof url !== 'string' || url.length === 0 || url[0] === '/') {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
var searchIndex = url.indexOf('?')
|
||||||
|
var pathLength = searchIndex !== -1
|
||||||
|
? searchIndex
|
||||||
|
: url.length
|
||||||
|
var fqdnIndex = url.slice(0, pathLength).indexOf('://')
|
||||||
|
|
||||||
|
return fqdnIndex !== -1
|
||||||
|
? url.substring(0, url.indexOf('/', 3 + fqdnIndex))
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
// get type for error message
|
||||||
|
function gettype(obj) {
|
||||||
|
var type = typeof obj;
|
||||||
|
|
||||||
|
if (type !== 'object') {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// inspect [[Class]] for objects
|
||||||
|
return toString.call(obj)
|
||||||
|
.replace(objectRegExp, '$1');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Match path to a layer.
|
||||||
|
*
|
||||||
|
* @param {Layer} layer
|
||||||
|
* @param {string} path
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function matchLayer(layer, path) {
|
||||||
|
try {
|
||||||
|
return layer.match(path);
|
||||||
|
} catch (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge params with parent params
|
||||||
|
function mergeParams(params, parent) {
|
||||||
|
if (typeof parent !== 'object' || !parent) {
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make copy of parent for base
|
||||||
|
var obj = mixin({}, parent);
|
||||||
|
|
||||||
|
// simple non-numeric merging
|
||||||
|
if (!(0 in params) || !(0 in parent)) {
|
||||||
|
return mixin(obj, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
var o = 0;
|
||||||
|
|
||||||
|
// determine numeric gaps
|
||||||
|
while (i in params) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (o in parent) {
|
||||||
|
o++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// offset numeric indices in params before merge
|
||||||
|
for (i--; i >= 0; i--) {
|
||||||
|
params[i + o] = params[i];
|
||||||
|
|
||||||
|
// create holes for the merge when necessary
|
||||||
|
if (i < o) {
|
||||||
|
delete params[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mixin(obj, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore obj props after function
|
||||||
|
function restore(fn, obj) {
|
||||||
|
var props = new Array(arguments.length - 2);
|
||||||
|
var vals = new Array(arguments.length - 2);
|
||||||
|
|
||||||
|
for (var i = 0; i < props.length; i++) {
|
||||||
|
props[i] = arguments[i + 2];
|
||||||
|
vals[i] = obj[props[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return function () {
|
||||||
|
// restore vals
|
||||||
|
for (var i = 0; i < props.length; i++) {
|
||||||
|
obj[props[i]] = vals[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return fn.apply(this, arguments);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// send an OPTIONS response
|
||||||
|
function sendOptionsResponse(res, options, next) {
|
||||||
|
try {
|
||||||
|
var body = options.join(',');
|
||||||
|
res.set('Allow', body);
|
||||||
|
res.send(body);
|
||||||
|
} catch (err) {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// wrap a function
|
||||||
|
function wrap(old, fn) {
|
||||||
|
return function proxy() {
|
||||||
|
var args = new Array(arguments.length + 1);
|
||||||
|
|
||||||
|
args[0] = old;
|
||||||
|
for (var i = 0, len = arguments.length; i < len; i++) {
|
||||||
|
args[i + 1] = arguments[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
fn.apply(this, args);
|
||||||
|
};
|
||||||
|
}
|
||||||
181
node_modules/express/lib/router/layer.js
generated
vendored
Normal file
181
node_modules/express/lib/router/layer.js
generated
vendored
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var pathRegexp = require('path-to-regexp');
|
||||||
|
var debug = require('debug')('express:router:layer');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = Layer;
|
||||||
|
|
||||||
|
function Layer(path, options, fn) {
|
||||||
|
if (!(this instanceof Layer)) {
|
||||||
|
return new Layer(path, options, fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('new %o', path)
|
||||||
|
var opts = options || {};
|
||||||
|
|
||||||
|
this.handle = fn;
|
||||||
|
this.name = fn.name || '<anonymous>';
|
||||||
|
this.params = undefined;
|
||||||
|
this.path = undefined;
|
||||||
|
this.regexp = pathRegexp(path, this.keys = [], opts);
|
||||||
|
|
||||||
|
// set fast path flags
|
||||||
|
this.regexp.fast_star = path === '*'
|
||||||
|
this.regexp.fast_slash = path === '/' && opts.end === false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the error for the layer.
|
||||||
|
*
|
||||||
|
* @param {Error} error
|
||||||
|
* @param {Request} req
|
||||||
|
* @param {Response} res
|
||||||
|
* @param {function} next
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Layer.prototype.handle_error = function handle_error(error, req, res, next) {
|
||||||
|
var fn = this.handle;
|
||||||
|
|
||||||
|
if (fn.length !== 4) {
|
||||||
|
// not a standard error handler
|
||||||
|
return next(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
fn(error, req, res, next);
|
||||||
|
} catch (err) {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the request for the layer.
|
||||||
|
*
|
||||||
|
* @param {Request} req
|
||||||
|
* @param {Response} res
|
||||||
|
* @param {function} next
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Layer.prototype.handle_request = function handle(req, res, next) {
|
||||||
|
var fn = this.handle;
|
||||||
|
|
||||||
|
if (fn.length > 3) {
|
||||||
|
// not a standard request handler
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
fn(req, res, next);
|
||||||
|
} catch (err) {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this route matches `path`, if so
|
||||||
|
* populate `.params`.
|
||||||
|
*
|
||||||
|
* @param {String} path
|
||||||
|
* @return {Boolean}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Layer.prototype.match = function match(path) {
|
||||||
|
var match
|
||||||
|
|
||||||
|
if (path != null) {
|
||||||
|
// fast path non-ending match for / (any path matches)
|
||||||
|
if (this.regexp.fast_slash) {
|
||||||
|
this.params = {}
|
||||||
|
this.path = ''
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// fast path for * (everything matched in a param)
|
||||||
|
if (this.regexp.fast_star) {
|
||||||
|
this.params = {'0': decode_param(path)}
|
||||||
|
this.path = path
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// match the path
|
||||||
|
match = this.regexp.exec(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!match) {
|
||||||
|
this.params = undefined;
|
||||||
|
this.path = undefined;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store values
|
||||||
|
this.params = {};
|
||||||
|
this.path = match[0]
|
||||||
|
|
||||||
|
var keys = this.keys;
|
||||||
|
var params = this.params;
|
||||||
|
|
||||||
|
for (var i = 1; i < match.length; i++) {
|
||||||
|
var key = keys[i - 1];
|
||||||
|
var prop = key.name;
|
||||||
|
var val = decode_param(match[i])
|
||||||
|
|
||||||
|
if (val !== undefined || !(hasOwnProperty.call(params, prop))) {
|
||||||
|
params[prop] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode param value.
|
||||||
|
*
|
||||||
|
* @param {string} val
|
||||||
|
* @return {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function decode_param(val) {
|
||||||
|
if (typeof val !== 'string' || val.length === 0) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return decodeURIComponent(val);
|
||||||
|
} catch (err) {
|
||||||
|
if (err instanceof URIError) {
|
||||||
|
err.message = 'Failed to decode param \'' + val + '\'';
|
||||||
|
err.status = err.statusCode = 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
225
node_modules/express/lib/router/route.js
generated
vendored
Normal file
225
node_modules/express/lib/router/route.js
generated
vendored
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var debug = require('debug')('express:router:route');
|
||||||
|
var flatten = require('array-flatten');
|
||||||
|
var Layer = require('./layer');
|
||||||
|
var methods = require('methods');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var slice = Array.prototype.slice;
|
||||||
|
var toString = Object.prototype.toString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = Route;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize `Route` with the given `path`,
|
||||||
|
*
|
||||||
|
* @param {String} path
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function Route(path) {
|
||||||
|
this.path = path;
|
||||||
|
this.stack = [];
|
||||||
|
|
||||||
|
debug('new %o', path)
|
||||||
|
|
||||||
|
// route handlers for various http methods
|
||||||
|
this.methods = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the route handles a given method.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Route.prototype._handles_method = function _handles_method(method) {
|
||||||
|
if (this.methods._all) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var name = method.toLowerCase();
|
||||||
|
|
||||||
|
if (name === 'head' && !this.methods['head']) {
|
||||||
|
name = 'get';
|
||||||
|
}
|
||||||
|
|
||||||
|
return Boolean(this.methods[name]);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {Array} supported HTTP methods
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Route.prototype._options = function _options() {
|
||||||
|
var methods = Object.keys(this.methods);
|
||||||
|
|
||||||
|
// append automatic head
|
||||||
|
if (this.methods.get && !this.methods.head) {
|
||||||
|
methods.push('head');
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < methods.length; i++) {
|
||||||
|
// make upper case
|
||||||
|
methods[i] = methods[i].toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
return methods;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dispatch req, res into this route
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
Route.prototype.dispatch = function dispatch(req, res, done) {
|
||||||
|
var idx = 0;
|
||||||
|
var stack = this.stack;
|
||||||
|
var sync = 0
|
||||||
|
|
||||||
|
if (stack.length === 0) {
|
||||||
|
return done();
|
||||||
|
}
|
||||||
|
|
||||||
|
var method = req.method.toLowerCase();
|
||||||
|
if (method === 'head' && !this.methods['head']) {
|
||||||
|
method = 'get';
|
||||||
|
}
|
||||||
|
|
||||||
|
req.route = this;
|
||||||
|
|
||||||
|
next();
|
||||||
|
|
||||||
|
function next(err) {
|
||||||
|
// signal to exit route
|
||||||
|
if (err && err === 'route') {
|
||||||
|
return done();
|
||||||
|
}
|
||||||
|
|
||||||
|
// signal to exit router
|
||||||
|
if (err && err === 'router') {
|
||||||
|
return done(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// max sync stack
|
||||||
|
if (++sync > 100) {
|
||||||
|
return setImmediate(next, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var layer = stack[idx++]
|
||||||
|
|
||||||
|
// end of layers
|
||||||
|
if (!layer) {
|
||||||
|
return done(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layer.method && layer.method !== method) {
|
||||||
|
next(err)
|
||||||
|
} else if (err) {
|
||||||
|
layer.handle_error(err, req, res, next);
|
||||||
|
} else {
|
||||||
|
layer.handle_request(req, res, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
sync = 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a handler for all HTTP verbs to this route.
|
||||||
|
*
|
||||||
|
* Behaves just like middleware and can respond or call `next`
|
||||||
|
* to continue processing.
|
||||||
|
*
|
||||||
|
* You can use multiple `.all` call to add multiple handlers.
|
||||||
|
*
|
||||||
|
* function check_something(req, res, next){
|
||||||
|
* next();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* function validate_user(req, res, next){
|
||||||
|
* next();
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* route
|
||||||
|
* .all(validate_user)
|
||||||
|
* .all(check_something)
|
||||||
|
* .get(function(req, res, next){
|
||||||
|
* res.send('hello world');
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* @param {function} handler
|
||||||
|
* @return {Route} for chaining
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Route.prototype.all = function all() {
|
||||||
|
var handles = flatten(slice.call(arguments));
|
||||||
|
|
||||||
|
for (var i = 0; i < handles.length; i++) {
|
||||||
|
var handle = handles[i];
|
||||||
|
|
||||||
|
if (typeof handle !== 'function') {
|
||||||
|
var type = toString.call(handle);
|
||||||
|
var msg = 'Route.all() requires a callback function but got a ' + type
|
||||||
|
throw new TypeError(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
var layer = Layer('/', {}, handle);
|
||||||
|
layer.method = undefined;
|
||||||
|
|
||||||
|
this.methods._all = true;
|
||||||
|
this.stack.push(layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
methods.forEach(function(method){
|
||||||
|
Route.prototype[method] = function(){
|
||||||
|
var handles = flatten(slice.call(arguments));
|
||||||
|
|
||||||
|
for (var i = 0; i < handles.length; i++) {
|
||||||
|
var handle = handles[i];
|
||||||
|
|
||||||
|
if (typeof handle !== 'function') {
|
||||||
|
var type = toString.call(handle);
|
||||||
|
var msg = 'Route.' + method + '() requires a callback function but got a ' + type
|
||||||
|
throw new Error(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('%s %o', method, this.path)
|
||||||
|
|
||||||
|
var layer = Layer('/', {}, handle);
|
||||||
|
layer.method = method;
|
||||||
|
|
||||||
|
this.methods[method] = true;
|
||||||
|
this.stack.push(layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
});
|
||||||
304
node_modules/express/lib/utils.js
generated
vendored
Normal file
304
node_modules/express/lib/utils.js
generated
vendored
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Buffer = require('safe-buffer').Buffer
|
||||||
|
var contentDisposition = require('content-disposition');
|
||||||
|
var contentType = require('content-type');
|
||||||
|
var deprecate = require('depd')('express');
|
||||||
|
var flatten = require('array-flatten');
|
||||||
|
var mime = require('send').mime;
|
||||||
|
var etag = require('etag');
|
||||||
|
var proxyaddr = require('proxy-addr');
|
||||||
|
var qs = require('qs');
|
||||||
|
var querystring = require('querystring');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return strong ETag for `body`.
|
||||||
|
*
|
||||||
|
* @param {String|Buffer} body
|
||||||
|
* @param {String} [encoding]
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.etag = createETagGenerator({ weak: false })
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return weak ETag for `body`.
|
||||||
|
*
|
||||||
|
* @param {String|Buffer} body
|
||||||
|
* @param {String} [encoding]
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.wetag = createETagGenerator({ weak: true })
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if `path` looks absolute.
|
||||||
|
*
|
||||||
|
* @param {String} path
|
||||||
|
* @return {Boolean}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.isAbsolute = function(path){
|
||||||
|
if ('/' === path[0]) return true;
|
||||||
|
if (':' === path[1] && ('\\' === path[2] || '/' === path[2])) return true; // Windows device path
|
||||||
|
if ('\\\\' === path.substring(0, 2)) return true; // Microsoft Azure absolute path
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten the given `arr`.
|
||||||
|
*
|
||||||
|
* @param {Array} arr
|
||||||
|
* @return {Array}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.flatten = deprecate.function(flatten,
|
||||||
|
'utils.flatten: use array-flatten npm module instead');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize the given `type`, for example "html" becomes "text/html".
|
||||||
|
*
|
||||||
|
* @param {String} type
|
||||||
|
* @return {Object}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.normalizeType = function(type){
|
||||||
|
return ~type.indexOf('/')
|
||||||
|
? acceptParams(type)
|
||||||
|
: { value: mime.lookup(type), params: {} };
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize `types`, for example "html" becomes "text/html".
|
||||||
|
*
|
||||||
|
* @param {Array} types
|
||||||
|
* @return {Array}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.normalizeTypes = function(types){
|
||||||
|
var ret = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < types.length; ++i) {
|
||||||
|
ret.push(exports.normalizeType(types[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate Content-Disposition header appropriate for the filename.
|
||||||
|
* non-ascii filenames are urlencoded and a filename* parameter is added
|
||||||
|
*
|
||||||
|
* @param {String} filename
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.contentDisposition = deprecate.function(contentDisposition,
|
||||||
|
'utils.contentDisposition: use content-disposition npm module instead');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse accept params `str` returning an
|
||||||
|
* object with `.value`, `.quality` and `.params`.
|
||||||
|
* also includes `.originalIndex` for stable sorting
|
||||||
|
*
|
||||||
|
* @param {String} str
|
||||||
|
* @param {Number} index
|
||||||
|
* @return {Object}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function acceptParams(str, index) {
|
||||||
|
var parts = str.split(/ *; */);
|
||||||
|
var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index };
|
||||||
|
|
||||||
|
for (var i = 1; i < parts.length; ++i) {
|
||||||
|
var pms = parts[i].split(/ *= */);
|
||||||
|
if ('q' === pms[0]) {
|
||||||
|
ret.quality = parseFloat(pms[1]);
|
||||||
|
} else {
|
||||||
|
ret.params[pms[0]] = pms[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile "etag" value to function.
|
||||||
|
*
|
||||||
|
* @param {Boolean|String|Function} val
|
||||||
|
* @return {Function}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.compileETag = function(val) {
|
||||||
|
var fn;
|
||||||
|
|
||||||
|
if (typeof val === 'function') {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (val) {
|
||||||
|
case true:
|
||||||
|
case 'weak':
|
||||||
|
fn = exports.wetag;
|
||||||
|
break;
|
||||||
|
case false:
|
||||||
|
break;
|
||||||
|
case 'strong':
|
||||||
|
fn = exports.etag;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new TypeError('unknown value for etag function: ' + val);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile "query parser" value to function.
|
||||||
|
*
|
||||||
|
* @param {String|Function} val
|
||||||
|
* @return {Function}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.compileQueryParser = function compileQueryParser(val) {
|
||||||
|
var fn;
|
||||||
|
|
||||||
|
if (typeof val === 'function') {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (val) {
|
||||||
|
case true:
|
||||||
|
case 'simple':
|
||||||
|
fn = querystring.parse;
|
||||||
|
break;
|
||||||
|
case false:
|
||||||
|
fn = newObject;
|
||||||
|
break;
|
||||||
|
case 'extended':
|
||||||
|
fn = parseExtendedQueryString;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new TypeError('unknown value for query parser function: ' + val);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile "proxy trust" value to function.
|
||||||
|
*
|
||||||
|
* @param {Boolean|String|Number|Array|Function} val
|
||||||
|
* @return {Function}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.compileTrust = function(val) {
|
||||||
|
if (typeof val === 'function') return val;
|
||||||
|
|
||||||
|
if (val === true) {
|
||||||
|
// Support plain true/false
|
||||||
|
return function(){ return true };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof val === 'number') {
|
||||||
|
// Support trusting hop count
|
||||||
|
return function(a, i){ return i < val };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof val === 'string') {
|
||||||
|
// Support comma-separated values
|
||||||
|
val = val.split(',')
|
||||||
|
.map(function (v) { return v.trim() })
|
||||||
|
}
|
||||||
|
|
||||||
|
return proxyaddr.compile(val || []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the charset in a given Content-Type string.
|
||||||
|
*
|
||||||
|
* @param {String} type
|
||||||
|
* @param {String} charset
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.setCharset = function setCharset(type, charset) {
|
||||||
|
if (!type || !charset) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse type
|
||||||
|
var parsed = contentType.parse(type);
|
||||||
|
|
||||||
|
// set charset
|
||||||
|
parsed.parameters.charset = charset;
|
||||||
|
|
||||||
|
// format type
|
||||||
|
return contentType.format(parsed);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an ETag generator function, generating ETags with
|
||||||
|
* the given options.
|
||||||
|
*
|
||||||
|
* @param {object} options
|
||||||
|
* @return {function}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createETagGenerator (options) {
|
||||||
|
return function generateETag (body, encoding) {
|
||||||
|
var buf = !Buffer.isBuffer(body)
|
||||||
|
? Buffer.from(body, encoding)
|
||||||
|
: body
|
||||||
|
|
||||||
|
return etag(buf, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse an extended query string with qs.
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseExtendedQueryString(str) {
|
||||||
|
return qs.parse(str, {
|
||||||
|
allowPrototypes: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return new empty object.
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function newObject() {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
182
node_modules/express/lib/view.js
generated
vendored
Normal file
182
node_modules/express/lib/view.js
generated
vendored
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
/*!
|
||||||
|
* express
|
||||||
|
* Copyright(c) 2009-2013 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2013 Roman Shtylman
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var debug = require('debug')('express:view');
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var dirname = path.dirname;
|
||||||
|
var basename = path.basename;
|
||||||
|
var extname = path.extname;
|
||||||
|
var join = path.join;
|
||||||
|
var resolve = path.resolve;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = View;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a new `View` with the given `name`.
|
||||||
|
*
|
||||||
|
* Options:
|
||||||
|
*
|
||||||
|
* - `defaultEngine` the default template engine name
|
||||||
|
* - `engines` template engine require() cache
|
||||||
|
* - `root` root path for view lookup
|
||||||
|
*
|
||||||
|
* @param {string} name
|
||||||
|
* @param {object} options
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function View(name, options) {
|
||||||
|
var opts = options || {};
|
||||||
|
|
||||||
|
this.defaultEngine = opts.defaultEngine;
|
||||||
|
this.ext = extname(name);
|
||||||
|
this.name = name;
|
||||||
|
this.root = opts.root;
|
||||||
|
|
||||||
|
if (!this.ext && !this.defaultEngine) {
|
||||||
|
throw new Error('No default engine was specified and no extension was provided.');
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileName = name;
|
||||||
|
|
||||||
|
if (!this.ext) {
|
||||||
|
// get extension from default engine name
|
||||||
|
this.ext = this.defaultEngine[0] !== '.'
|
||||||
|
? '.' + this.defaultEngine
|
||||||
|
: this.defaultEngine;
|
||||||
|
|
||||||
|
fileName += this.ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opts.engines[this.ext]) {
|
||||||
|
// load engine
|
||||||
|
var mod = this.ext.slice(1)
|
||||||
|
debug('require "%s"', mod)
|
||||||
|
|
||||||
|
// default engine export
|
||||||
|
var fn = require(mod).__express
|
||||||
|
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new Error('Module "' + mod + '" does not provide a view engine.')
|
||||||
|
}
|
||||||
|
|
||||||
|
opts.engines[this.ext] = fn
|
||||||
|
}
|
||||||
|
|
||||||
|
// store loaded engine
|
||||||
|
this.engine = opts.engines[this.ext];
|
||||||
|
|
||||||
|
// lookup path
|
||||||
|
this.path = this.lookup(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup view by the given `name`
|
||||||
|
*
|
||||||
|
* @param {string} name
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
View.prototype.lookup = function lookup(name) {
|
||||||
|
var path;
|
||||||
|
var roots = [].concat(this.root);
|
||||||
|
|
||||||
|
debug('lookup "%s"', name);
|
||||||
|
|
||||||
|
for (var i = 0; i < roots.length && !path; i++) {
|
||||||
|
var root = roots[i];
|
||||||
|
|
||||||
|
// resolve the path
|
||||||
|
var loc = resolve(root, name);
|
||||||
|
var dir = dirname(loc);
|
||||||
|
var file = basename(loc);
|
||||||
|
|
||||||
|
// resolve the file
|
||||||
|
path = this.resolve(dir, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render with the given options.
|
||||||
|
*
|
||||||
|
* @param {object} options
|
||||||
|
* @param {function} callback
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
View.prototype.render = function render(options, callback) {
|
||||||
|
debug('render "%s"', this.path);
|
||||||
|
this.engine(this.path, options, callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve the file within the given directory.
|
||||||
|
*
|
||||||
|
* @param {string} dir
|
||||||
|
* @param {string} file
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
View.prototype.resolve = function resolve(dir, file) {
|
||||||
|
var ext = this.ext;
|
||||||
|
|
||||||
|
// <path>.<ext>
|
||||||
|
var path = join(dir, file);
|
||||||
|
var stat = tryStat(path);
|
||||||
|
|
||||||
|
if (stat && stat.isFile()) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <path>/index.<ext>
|
||||||
|
path = join(dir, basename(file, ext), 'index' + ext);
|
||||||
|
stat = tryStat(path);
|
||||||
|
|
||||||
|
if (stat && stat.isFile()) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a stat, maybe.
|
||||||
|
*
|
||||||
|
* @param {string} path
|
||||||
|
* @return {fs.Stats}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function tryStat(path) {
|
||||||
|
debug('stat "%s"', path);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return fs.statSync(path);
|
||||||
|
} catch (e) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
336
node_modules/finalhandler/index.js
generated
vendored
Normal file
336
node_modules/finalhandler/index.js
generated
vendored
Normal file
@@ -0,0 +1,336 @@
|
|||||||
|
/*!
|
||||||
|
* finalhandler
|
||||||
|
* Copyright(c) 2014-2022 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var debug = require('debug')('finalhandler')
|
||||||
|
var encodeUrl = require('encodeurl')
|
||||||
|
var escapeHtml = require('escape-html')
|
||||||
|
var onFinished = require('on-finished')
|
||||||
|
var parseUrl = require('parseurl')
|
||||||
|
var statuses = require('statuses')
|
||||||
|
var unpipe = require('unpipe')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var DOUBLE_SPACE_REGEXP = /\x20{2}/g
|
||||||
|
var NEWLINE_REGEXP = /\n/g
|
||||||
|
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var defer = typeof setImmediate === 'function'
|
||||||
|
? setImmediate
|
||||||
|
: function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) }
|
||||||
|
var isFinished = onFinished.isFinished
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a minimal HTML document.
|
||||||
|
*
|
||||||
|
* @param {string} message
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createHtmlDocument (message) {
|
||||||
|
var body = escapeHtml(message)
|
||||||
|
.replace(NEWLINE_REGEXP, '<br>')
|
||||||
|
.replace(DOUBLE_SPACE_REGEXP, ' ')
|
||||||
|
|
||||||
|
return '<!DOCTYPE html>\n' +
|
||||||
|
'<html lang="en">\n' +
|
||||||
|
'<head>\n' +
|
||||||
|
'<meta charset="utf-8">\n' +
|
||||||
|
'<title>Error</title>\n' +
|
||||||
|
'</head>\n' +
|
||||||
|
'<body>\n' +
|
||||||
|
'<pre>' + body + '</pre>\n' +
|
||||||
|
'</body>\n' +
|
||||||
|
'</html>\n'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = finalhandler
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a function to handle the final response.
|
||||||
|
*
|
||||||
|
* @param {Request} req
|
||||||
|
* @param {Response} res
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @return {Function}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function finalhandler (req, res, options) {
|
||||||
|
var opts = options || {}
|
||||||
|
|
||||||
|
// get environment
|
||||||
|
var env = opts.env || process.env.NODE_ENV || 'development'
|
||||||
|
|
||||||
|
// get error callback
|
||||||
|
var onerror = opts.onerror
|
||||||
|
|
||||||
|
return function (err) {
|
||||||
|
var headers
|
||||||
|
var msg
|
||||||
|
var status
|
||||||
|
|
||||||
|
// ignore 404 on in-flight response
|
||||||
|
if (!err && headersSent(res)) {
|
||||||
|
debug('cannot 404 after headers sent')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// unhandled error
|
||||||
|
if (err) {
|
||||||
|
// respect status code from error
|
||||||
|
status = getErrorStatusCode(err)
|
||||||
|
|
||||||
|
if (status === undefined) {
|
||||||
|
// fallback to status code on response
|
||||||
|
status = getResponseStatusCode(res)
|
||||||
|
} else {
|
||||||
|
// respect headers from error
|
||||||
|
headers = getErrorHeaders(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// get error message
|
||||||
|
msg = getErrorMessage(err, status, env)
|
||||||
|
} else {
|
||||||
|
// not found
|
||||||
|
status = 404
|
||||||
|
msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req))
|
||||||
|
}
|
||||||
|
|
||||||
|
debug('default %s', status)
|
||||||
|
|
||||||
|
// schedule onerror callback
|
||||||
|
if (err && onerror) {
|
||||||
|
defer(onerror, err, req, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// cannot actually respond
|
||||||
|
if (headersSent(res)) {
|
||||||
|
debug('cannot %d after headers sent', status)
|
||||||
|
req.socket.destroy()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// send response
|
||||||
|
send(req, res, status, headers, msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get headers from Error object.
|
||||||
|
*
|
||||||
|
* @param {Error} err
|
||||||
|
* @return {object}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getErrorHeaders (err) {
|
||||||
|
if (!err.headers || typeof err.headers !== 'object') {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
var headers = Object.create(null)
|
||||||
|
var keys = Object.keys(err.headers)
|
||||||
|
|
||||||
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
var key = keys[i]
|
||||||
|
headers[key] = err.headers[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
return headers
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get message from Error object, fallback to status message.
|
||||||
|
*
|
||||||
|
* @param {Error} err
|
||||||
|
* @param {number} status
|
||||||
|
* @param {string} env
|
||||||
|
* @return {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getErrorMessage (err, status, env) {
|
||||||
|
var msg
|
||||||
|
|
||||||
|
if (env !== 'production') {
|
||||||
|
// use err.stack, which typically includes err.message
|
||||||
|
msg = err.stack
|
||||||
|
|
||||||
|
// fallback to err.toString() when possible
|
||||||
|
if (!msg && typeof err.toString === 'function') {
|
||||||
|
msg = err.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return msg || statuses.message[status]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get status code from Error object.
|
||||||
|
*
|
||||||
|
* @param {Error} err
|
||||||
|
* @return {number}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getErrorStatusCode (err) {
|
||||||
|
// check err.status
|
||||||
|
if (typeof err.status === 'number' && err.status >= 400 && err.status < 600) {
|
||||||
|
return err.status
|
||||||
|
}
|
||||||
|
|
||||||
|
// check err.statusCode
|
||||||
|
if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) {
|
||||||
|
return err.statusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get resource name for the request.
|
||||||
|
*
|
||||||
|
* This is typically just the original pathname of the request
|
||||||
|
* but will fallback to "resource" is that cannot be determined.
|
||||||
|
*
|
||||||
|
* @param {IncomingMessage} req
|
||||||
|
* @return {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getResourceName (req) {
|
||||||
|
try {
|
||||||
|
return parseUrl.original(req).pathname
|
||||||
|
} catch (e) {
|
||||||
|
return 'resource'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get status code from response.
|
||||||
|
*
|
||||||
|
* @param {OutgoingMessage} res
|
||||||
|
* @return {number}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getResponseStatusCode (res) {
|
||||||
|
var status = res.statusCode
|
||||||
|
|
||||||
|
// default status code to 500 if outside valid range
|
||||||
|
if (typeof status !== 'number' || status < 400 || status > 599) {
|
||||||
|
status = 500
|
||||||
|
}
|
||||||
|
|
||||||
|
return status
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the response headers have been sent.
|
||||||
|
*
|
||||||
|
* @param {object} res
|
||||||
|
* @returns {boolean}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function headersSent (res) {
|
||||||
|
return typeof res.headersSent !== 'boolean'
|
||||||
|
? Boolean(res._header)
|
||||||
|
: res.headersSent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send response.
|
||||||
|
*
|
||||||
|
* @param {IncomingMessage} req
|
||||||
|
* @param {OutgoingMessage} res
|
||||||
|
* @param {number} status
|
||||||
|
* @param {object} headers
|
||||||
|
* @param {string} message
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function send (req, res, status, headers, message) {
|
||||||
|
function write () {
|
||||||
|
// response body
|
||||||
|
var body = createHtmlDocument(message)
|
||||||
|
|
||||||
|
// response status
|
||||||
|
res.statusCode = status
|
||||||
|
res.statusMessage = statuses.message[status]
|
||||||
|
|
||||||
|
// remove any content headers
|
||||||
|
res.removeHeader('Content-Encoding')
|
||||||
|
res.removeHeader('Content-Language')
|
||||||
|
res.removeHeader('Content-Range')
|
||||||
|
|
||||||
|
// response headers
|
||||||
|
setHeaders(res, headers)
|
||||||
|
|
||||||
|
// security headers
|
||||||
|
res.setHeader('Content-Security-Policy', "default-src 'none'")
|
||||||
|
res.setHeader('X-Content-Type-Options', 'nosniff')
|
||||||
|
|
||||||
|
// standard headers
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8')
|
||||||
|
res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'))
|
||||||
|
|
||||||
|
if (req.method === 'HEAD') {
|
||||||
|
res.end()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.end(body, 'utf8')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFinished(req)) {
|
||||||
|
write()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// unpipe everything from the request
|
||||||
|
unpipe(req)
|
||||||
|
|
||||||
|
// flush the request
|
||||||
|
onFinished(req, write)
|
||||||
|
req.resume()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set response headers from an object.
|
||||||
|
*
|
||||||
|
* @param {OutgoingMessage} res
|
||||||
|
* @param {object} headers
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function setHeaders (res, headers) {
|
||||||
|
if (!headers) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var keys = Object.keys(headers)
|
||||||
|
for (var i = 0; i < keys.length; i++) {
|
||||||
|
var key = keys[i]
|
||||||
|
res.setHeader(key, headers[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
90
node_modules/forwarded/index.js
generated
vendored
Normal file
90
node_modules/forwarded/index.js
generated
vendored
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/*!
|
||||||
|
* forwarded
|
||||||
|
* Copyright(c) 2014-2017 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = forwarded
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all addresses in the request, using the `X-Forwarded-For` header.
|
||||||
|
*
|
||||||
|
* @param {object} req
|
||||||
|
* @return {array}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function forwarded (req) {
|
||||||
|
if (!req) {
|
||||||
|
throw new TypeError('argument req is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
// simple header parsing
|
||||||
|
var proxyAddrs = parse(req.headers['x-forwarded-for'] || '')
|
||||||
|
var socketAddr = getSocketAddr(req)
|
||||||
|
var addrs = [socketAddr].concat(proxyAddrs)
|
||||||
|
|
||||||
|
// return all addresses
|
||||||
|
return addrs
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the socket address for a request.
|
||||||
|
*
|
||||||
|
* @param {object} req
|
||||||
|
* @return {string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getSocketAddr (req) {
|
||||||
|
return req.socket
|
||||||
|
? req.socket.remoteAddress
|
||||||
|
: req.connection.remoteAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the X-Forwarded-For header.
|
||||||
|
*
|
||||||
|
* @param {string} header
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parse (header) {
|
||||||
|
var end = header.length
|
||||||
|
var list = []
|
||||||
|
var start = header.length
|
||||||
|
|
||||||
|
// gather addresses, backwards
|
||||||
|
for (var i = header.length - 1; i >= 0; i--) {
|
||||||
|
switch (header.charCodeAt(i)) {
|
||||||
|
case 0x20: /* */
|
||||||
|
if (start === end) {
|
||||||
|
start = end = i
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case 0x2c: /* , */
|
||||||
|
if (start !== end) {
|
||||||
|
list.push(header.substring(start, end))
|
||||||
|
}
|
||||||
|
start = end = i
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
start = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// final address
|
||||||
|
if (start !== end) {
|
||||||
|
list.push(header.substring(start, end))
|
||||||
|
}
|
||||||
|
|
||||||
|
return list
|
||||||
|
}
|
||||||
137
node_modules/fresh/index.js
generated
vendored
Normal file
137
node_modules/fresh/index.js
generated
vendored
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
/*!
|
||||||
|
* fresh
|
||||||
|
* Copyright(c) 2012 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2016-2017 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to check for no-cache token in Cache-Control.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = fresh
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check freshness of the response using request and response headers.
|
||||||
|
*
|
||||||
|
* @param {Object} reqHeaders
|
||||||
|
* @param {Object} resHeaders
|
||||||
|
* @return {Boolean}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fresh (reqHeaders, resHeaders) {
|
||||||
|
// fields
|
||||||
|
var modifiedSince = reqHeaders['if-modified-since']
|
||||||
|
var noneMatch = reqHeaders['if-none-match']
|
||||||
|
|
||||||
|
// unconditional request
|
||||||
|
if (!modifiedSince && !noneMatch) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always return stale when Cache-Control: no-cache
|
||||||
|
// to support end-to-end reload requests
|
||||||
|
// https://tools.ietf.org/html/rfc2616#section-14.9.4
|
||||||
|
var cacheControl = reqHeaders['cache-control']
|
||||||
|
if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// if-none-match
|
||||||
|
if (noneMatch && noneMatch !== '*') {
|
||||||
|
var etag = resHeaders['etag']
|
||||||
|
|
||||||
|
if (!etag) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var etagStale = true
|
||||||
|
var matches = parseTokenList(noneMatch)
|
||||||
|
for (var i = 0; i < matches.length; i++) {
|
||||||
|
var match = matches[i]
|
||||||
|
if (match === etag || match === 'W/' + etag || 'W/' + match === etag) {
|
||||||
|
etagStale = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (etagStale) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if-modified-since
|
||||||
|
if (modifiedSince) {
|
||||||
|
var lastModified = resHeaders['last-modified']
|
||||||
|
var modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince))
|
||||||
|
|
||||||
|
if (modifiedStale) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse an HTTP Date into a number.
|
||||||
|
*
|
||||||
|
* @param {string} date
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseHttpDate (date) {
|
||||||
|
var timestamp = date && Date.parse(date)
|
||||||
|
|
||||||
|
// istanbul ignore next: guard against date.js Date.parse patching
|
||||||
|
return typeof timestamp === 'number'
|
||||||
|
? timestamp
|
||||||
|
: NaN
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a HTTP token list.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseTokenList (str) {
|
||||||
|
var end = 0
|
||||||
|
var list = []
|
||||||
|
var start = 0
|
||||||
|
|
||||||
|
// gather tokens
|
||||||
|
for (var i = 0, len = str.length; i < len; i++) {
|
||||||
|
switch (str.charCodeAt(i)) {
|
||||||
|
case 0x20: /* */
|
||||||
|
if (start === end) {
|
||||||
|
start = end = i + 1
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case 0x2c: /* , */
|
||||||
|
list.push(str.substring(start, end))
|
||||||
|
start = end = i + 1
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
end = i + 1
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// final token
|
||||||
|
list.push(str.substring(start, end))
|
||||||
|
|
||||||
|
return list
|
||||||
|
}
|
||||||
52
node_modules/function-bind/implementation.js
generated
vendored
Normal file
52
node_modules/function-bind/implementation.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* eslint no-invalid-this: 1 */
|
||||||
|
|
||||||
|
var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
|
||||||
|
var slice = Array.prototype.slice;
|
||||||
|
var toStr = Object.prototype.toString;
|
||||||
|
var funcType = '[object Function]';
|
||||||
|
|
||||||
|
module.exports = function bind(that) {
|
||||||
|
var target = this;
|
||||||
|
if (typeof target !== 'function' || toStr.call(target) !== funcType) {
|
||||||
|
throw new TypeError(ERROR_MESSAGE + target);
|
||||||
|
}
|
||||||
|
var args = slice.call(arguments, 1);
|
||||||
|
|
||||||
|
var bound;
|
||||||
|
var binder = function () {
|
||||||
|
if (this instanceof bound) {
|
||||||
|
var result = target.apply(
|
||||||
|
this,
|
||||||
|
args.concat(slice.call(arguments))
|
||||||
|
);
|
||||||
|
if (Object(result) === result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
} else {
|
||||||
|
return target.apply(
|
||||||
|
that,
|
||||||
|
args.concat(slice.call(arguments))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var boundLength = Math.max(0, target.length - args.length);
|
||||||
|
var boundArgs = [];
|
||||||
|
for (var i = 0; i < boundLength; i++) {
|
||||||
|
boundArgs.push('$' + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
|
||||||
|
|
||||||
|
if (target.prototype) {
|
||||||
|
var Empty = function Empty() {};
|
||||||
|
Empty.prototype = target.prototype;
|
||||||
|
bound.prototype = new Empty();
|
||||||
|
Empty.prototype = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bound;
|
||||||
|
};
|
||||||
5
node_modules/function-bind/index.js
generated
vendored
Normal file
5
node_modules/function-bind/index.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var implementation = require('./implementation');
|
||||||
|
|
||||||
|
module.exports = Function.prototype.bind || implementation;
|
||||||
252
node_modules/function-bind/test/index.js
generated
vendored
Normal file
252
node_modules/function-bind/test/index.js
generated
vendored
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
// jscs:disable requireUseStrict
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
|
||||||
|
var functionBind = require('../implementation');
|
||||||
|
var getCurrentContext = function () { return this; };
|
||||||
|
|
||||||
|
test('functionBind is a function', function (t) {
|
||||||
|
t.equal(typeof functionBind, 'function');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('non-functions', function (t) {
|
||||||
|
var nonFunctions = [true, false, [], {}, 42, 'foo', NaN, /a/g];
|
||||||
|
t.plan(nonFunctions.length);
|
||||||
|
for (var i = 0; i < nonFunctions.length; ++i) {
|
||||||
|
try { functionBind.call(nonFunctions[i]); } catch (ex) {
|
||||||
|
t.ok(ex instanceof TypeError, 'throws when given ' + String(nonFunctions[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('without a context', function (t) {
|
||||||
|
t.test('binds properly', function (st) {
|
||||||
|
var args, context;
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
context = this;
|
||||||
|
})
|
||||||
|
};
|
||||||
|
namespace.func(1, 2, 3);
|
||||||
|
st.deepEqual(args, [1, 2, 3]);
|
||||||
|
st.equal(context, getCurrentContext.call());
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('binds properly, and still supplies bound arguments', function (st) {
|
||||||
|
var args, context;
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
context = this;
|
||||||
|
}, undefined, 1, 2, 3)
|
||||||
|
};
|
||||||
|
namespace.func(4, 5, 6);
|
||||||
|
st.deepEqual(args, [1, 2, 3, 4, 5, 6]);
|
||||||
|
st.equal(context, getCurrentContext.call());
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('returns properly', function (st) {
|
||||||
|
var args;
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
return this;
|
||||||
|
}, null)
|
||||||
|
};
|
||||||
|
var context = namespace.func(1, 2, 3);
|
||||||
|
st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
|
||||||
|
st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('returns properly with bound arguments', function (st) {
|
||||||
|
var args;
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
return this;
|
||||||
|
}, null, 1, 2, 3)
|
||||||
|
};
|
||||||
|
var context = namespace.func(4, 5, 6);
|
||||||
|
st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
|
||||||
|
st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('called as a constructor', function (st) {
|
||||||
|
var thunkify = function (value) {
|
||||||
|
return function () { return value; };
|
||||||
|
};
|
||||||
|
st.test('returns object value', function (sst) {
|
||||||
|
var expectedReturnValue = [1, 2, 3];
|
||||||
|
var Constructor = functionBind.call(thunkify(expectedReturnValue), null);
|
||||||
|
var result = new Constructor();
|
||||||
|
sst.equal(result, expectedReturnValue);
|
||||||
|
sst.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
st.test('does not return primitive value', function (sst) {
|
||||||
|
var Constructor = functionBind.call(thunkify(42), null);
|
||||||
|
var result = new Constructor();
|
||||||
|
sst.notEqual(result, 42);
|
||||||
|
sst.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
st.test('object from bound constructor is instance of original and bound constructor', function (sst) {
|
||||||
|
var A = function (x) {
|
||||||
|
this.name = x || 'A';
|
||||||
|
};
|
||||||
|
var B = functionBind.call(A, null, 'B');
|
||||||
|
|
||||||
|
var result = new B();
|
||||||
|
sst.ok(result instanceof B, 'result is instance of bound constructor');
|
||||||
|
sst.ok(result instanceof A, 'result is instance of original constructor');
|
||||||
|
sst.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('with a context', function (t) {
|
||||||
|
t.test('with no bound arguments', function (st) {
|
||||||
|
var args, context;
|
||||||
|
var boundContext = {};
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
context = this;
|
||||||
|
}, boundContext)
|
||||||
|
};
|
||||||
|
namespace.func(1, 2, 3);
|
||||||
|
st.equal(context, boundContext, 'binds a context properly');
|
||||||
|
st.deepEqual(args, [1, 2, 3], 'supplies passed arguments');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('with bound arguments', function (st) {
|
||||||
|
var args, context;
|
||||||
|
var boundContext = {};
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
context = this;
|
||||||
|
}, boundContext, 1, 2, 3)
|
||||||
|
};
|
||||||
|
namespace.func(4, 5, 6);
|
||||||
|
st.equal(context, boundContext, 'binds a context properly');
|
||||||
|
st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'supplies bound and passed arguments');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('returns properly', function (st) {
|
||||||
|
var boundContext = {};
|
||||||
|
var args;
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
return this;
|
||||||
|
}, boundContext)
|
||||||
|
};
|
||||||
|
var context = namespace.func(1, 2, 3);
|
||||||
|
st.equal(context, boundContext, 'returned context is bound context');
|
||||||
|
st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
|
||||||
|
st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('returns properly with bound arguments', function (st) {
|
||||||
|
var boundContext = {};
|
||||||
|
var args;
|
||||||
|
var namespace = {
|
||||||
|
func: functionBind.call(function () {
|
||||||
|
args = Array.prototype.slice.call(arguments);
|
||||||
|
return this;
|
||||||
|
}, boundContext, 1, 2, 3)
|
||||||
|
};
|
||||||
|
var context = namespace.func(4, 5, 6);
|
||||||
|
st.equal(context, boundContext, 'returned context is bound context');
|
||||||
|
st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
|
||||||
|
st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('passes the correct arguments when called as a constructor', function (st) {
|
||||||
|
var expected = { name: 'Correct' };
|
||||||
|
var namespace = {
|
||||||
|
Func: functionBind.call(function (arg) {
|
||||||
|
return arg;
|
||||||
|
}, { name: 'Incorrect' })
|
||||||
|
};
|
||||||
|
var returned = new namespace.Func(expected);
|
||||||
|
st.equal(returned, expected, 'returns the right arg when called as a constructor');
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('has the new instance\'s context when called as a constructor', function (st) {
|
||||||
|
var actualContext;
|
||||||
|
var expectedContext = { foo: 'bar' };
|
||||||
|
var namespace = {
|
||||||
|
Func: functionBind.call(function () {
|
||||||
|
actualContext = this;
|
||||||
|
}, expectedContext)
|
||||||
|
};
|
||||||
|
var result = new namespace.Func();
|
||||||
|
st.equal(result instanceof namespace.Func, true);
|
||||||
|
st.notEqual(actualContext, expectedContext);
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('bound function length', function (t) {
|
||||||
|
t.test('sets a correct length without thisArg', function (st) {
|
||||||
|
var subject = functionBind.call(function (a, b, c) { return a + b + c; });
|
||||||
|
st.equal(subject.length, 3);
|
||||||
|
st.equal(subject(1, 2, 3), 6);
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('sets a correct length with thisArg', function (st) {
|
||||||
|
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {});
|
||||||
|
st.equal(subject.length, 3);
|
||||||
|
st.equal(subject(1, 2, 3), 6);
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('sets a correct length without thisArg and first argument', function (st) {
|
||||||
|
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1);
|
||||||
|
st.equal(subject.length, 2);
|
||||||
|
st.equal(subject(2, 3), 6);
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('sets a correct length with thisArg and first argument', function (st) {
|
||||||
|
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1);
|
||||||
|
st.equal(subject.length, 2);
|
||||||
|
st.equal(subject(2, 3), 6);
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('sets a correct length without thisArg and too many arguments', function (st) {
|
||||||
|
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1, 2, 3, 4);
|
||||||
|
st.equal(subject.length, 0);
|
||||||
|
st.equal(subject(), 6);
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.test('sets a correct length with thisArg and too many arguments', function (st) {
|
||||||
|
var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1, 2, 3, 4);
|
||||||
|
st.equal(subject.length, 0);
|
||||||
|
st.equal(subject(), 6);
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
});
|
||||||
351
node_modules/get-intrinsic/index.js
generated
vendored
Normal file
351
node_modules/get-intrinsic/index.js
generated
vendored
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var undefined;
|
||||||
|
|
||||||
|
var $SyntaxError = SyntaxError;
|
||||||
|
var $Function = Function;
|
||||||
|
var $TypeError = TypeError;
|
||||||
|
|
||||||
|
// eslint-disable-next-line consistent-return
|
||||||
|
var getEvalledConstructor = function (expressionSyntax) {
|
||||||
|
try {
|
||||||
|
return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
|
||||||
|
} catch (e) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
var $gOPD = Object.getOwnPropertyDescriptor;
|
||||||
|
if ($gOPD) {
|
||||||
|
try {
|
||||||
|
$gOPD({}, '');
|
||||||
|
} catch (e) {
|
||||||
|
$gOPD = null; // this is IE 8, which has a broken gOPD
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var throwTypeError = function () {
|
||||||
|
throw new $TypeError();
|
||||||
|
};
|
||||||
|
var ThrowTypeError = $gOPD
|
||||||
|
? (function () {
|
||||||
|
try {
|
||||||
|
// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
|
||||||
|
arguments.callee; // IE 8 does not throw here
|
||||||
|
return throwTypeError;
|
||||||
|
} catch (calleeThrows) {
|
||||||
|
try {
|
||||||
|
// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
|
||||||
|
return $gOPD(arguments, 'callee').get;
|
||||||
|
} catch (gOPDthrows) {
|
||||||
|
return throwTypeError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}())
|
||||||
|
: throwTypeError;
|
||||||
|
|
||||||
|
var hasSymbols = require('has-symbols')();
|
||||||
|
var hasProto = require('has-proto')();
|
||||||
|
|
||||||
|
var getProto = Object.getPrototypeOf || (
|
||||||
|
hasProto
|
||||||
|
? function (x) { return x.__proto__; } // eslint-disable-line no-proto
|
||||||
|
: null
|
||||||
|
);
|
||||||
|
|
||||||
|
var needsEval = {};
|
||||||
|
|
||||||
|
var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);
|
||||||
|
|
||||||
|
var INTRINSICS = {
|
||||||
|
'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
|
||||||
|
'%Array%': Array,
|
||||||
|
'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
|
||||||
|
'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,
|
||||||
|
'%AsyncFromSyncIteratorPrototype%': undefined,
|
||||||
|
'%AsyncFunction%': needsEval,
|
||||||
|
'%AsyncGenerator%': needsEval,
|
||||||
|
'%AsyncGeneratorFunction%': needsEval,
|
||||||
|
'%AsyncIteratorPrototype%': needsEval,
|
||||||
|
'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
|
||||||
|
'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
|
||||||
|
'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,
|
||||||
|
'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,
|
||||||
|
'%Boolean%': Boolean,
|
||||||
|
'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
|
||||||
|
'%Date%': Date,
|
||||||
|
'%decodeURI%': decodeURI,
|
||||||
|
'%decodeURIComponent%': decodeURIComponent,
|
||||||
|
'%encodeURI%': encodeURI,
|
||||||
|
'%encodeURIComponent%': encodeURIComponent,
|
||||||
|
'%Error%': Error,
|
||||||
|
'%eval%': eval, // eslint-disable-line no-eval
|
||||||
|
'%EvalError%': EvalError,
|
||||||
|
'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
|
||||||
|
'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
|
||||||
|
'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
|
||||||
|
'%Function%': $Function,
|
||||||
|
'%GeneratorFunction%': needsEval,
|
||||||
|
'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
|
||||||
|
'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
|
||||||
|
'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
|
||||||
|
'%isFinite%': isFinite,
|
||||||
|
'%isNaN%': isNaN,
|
||||||
|
'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,
|
||||||
|
'%JSON%': typeof JSON === 'object' ? JSON : undefined,
|
||||||
|
'%Map%': typeof Map === 'undefined' ? undefined : Map,
|
||||||
|
'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),
|
||||||
|
'%Math%': Math,
|
||||||
|
'%Number%': Number,
|
||||||
|
'%Object%': Object,
|
||||||
|
'%parseFloat%': parseFloat,
|
||||||
|
'%parseInt%': parseInt,
|
||||||
|
'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
|
||||||
|
'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
|
||||||
|
'%RangeError%': RangeError,
|
||||||
|
'%ReferenceError%': ReferenceError,
|
||||||
|
'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
|
||||||
|
'%RegExp%': RegExp,
|
||||||
|
'%Set%': typeof Set === 'undefined' ? undefined : Set,
|
||||||
|
'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),
|
||||||
|
'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
|
||||||
|
'%String%': String,
|
||||||
|
'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,
|
||||||
|
'%Symbol%': hasSymbols ? Symbol : undefined,
|
||||||
|
'%SyntaxError%': $SyntaxError,
|
||||||
|
'%ThrowTypeError%': ThrowTypeError,
|
||||||
|
'%TypedArray%': TypedArray,
|
||||||
|
'%TypeError%': $TypeError,
|
||||||
|
'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
|
||||||
|
'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
|
||||||
|
'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
|
||||||
|
'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
|
||||||
|
'%URIError%': URIError,
|
||||||
|
'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
|
||||||
|
'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
|
||||||
|
'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
|
||||||
|
};
|
||||||
|
|
||||||
|
if (getProto) {
|
||||||
|
try {
|
||||||
|
null.error; // eslint-disable-line no-unused-expressions
|
||||||
|
} catch (e) {
|
||||||
|
// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229
|
||||||
|
var errorProto = getProto(getProto(e));
|
||||||
|
INTRINSICS['%Error.prototype%'] = errorProto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var doEval = function doEval(name) {
|
||||||
|
var value;
|
||||||
|
if (name === '%AsyncFunction%') {
|
||||||
|
value = getEvalledConstructor('async function () {}');
|
||||||
|
} else if (name === '%GeneratorFunction%') {
|
||||||
|
value = getEvalledConstructor('function* () {}');
|
||||||
|
} else if (name === '%AsyncGeneratorFunction%') {
|
||||||
|
value = getEvalledConstructor('async function* () {}');
|
||||||
|
} else if (name === '%AsyncGenerator%') {
|
||||||
|
var fn = doEval('%AsyncGeneratorFunction%');
|
||||||
|
if (fn) {
|
||||||
|
value = fn.prototype;
|
||||||
|
}
|
||||||
|
} else if (name === '%AsyncIteratorPrototype%') {
|
||||||
|
var gen = doEval('%AsyncGenerator%');
|
||||||
|
if (gen && getProto) {
|
||||||
|
value = getProto(gen.prototype);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INTRINSICS[name] = value;
|
||||||
|
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
var LEGACY_ALIASES = {
|
||||||
|
'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
|
||||||
|
'%ArrayPrototype%': ['Array', 'prototype'],
|
||||||
|
'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
|
||||||
|
'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
|
||||||
|
'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
|
||||||
|
'%ArrayProto_values%': ['Array', 'prototype', 'values'],
|
||||||
|
'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
|
||||||
|
'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
|
||||||
|
'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
|
||||||
|
'%BooleanPrototype%': ['Boolean', 'prototype'],
|
||||||
|
'%DataViewPrototype%': ['DataView', 'prototype'],
|
||||||
|
'%DatePrototype%': ['Date', 'prototype'],
|
||||||
|
'%ErrorPrototype%': ['Error', 'prototype'],
|
||||||
|
'%EvalErrorPrototype%': ['EvalError', 'prototype'],
|
||||||
|
'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
|
||||||
|
'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
|
||||||
|
'%FunctionPrototype%': ['Function', 'prototype'],
|
||||||
|
'%Generator%': ['GeneratorFunction', 'prototype'],
|
||||||
|
'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
|
||||||
|
'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
|
||||||
|
'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
|
||||||
|
'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
|
||||||
|
'%JSONParse%': ['JSON', 'parse'],
|
||||||
|
'%JSONStringify%': ['JSON', 'stringify'],
|
||||||
|
'%MapPrototype%': ['Map', 'prototype'],
|
||||||
|
'%NumberPrototype%': ['Number', 'prototype'],
|
||||||
|
'%ObjectPrototype%': ['Object', 'prototype'],
|
||||||
|
'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
|
||||||
|
'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
|
||||||
|
'%PromisePrototype%': ['Promise', 'prototype'],
|
||||||
|
'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
|
||||||
|
'%Promise_all%': ['Promise', 'all'],
|
||||||
|
'%Promise_reject%': ['Promise', 'reject'],
|
||||||
|
'%Promise_resolve%': ['Promise', 'resolve'],
|
||||||
|
'%RangeErrorPrototype%': ['RangeError', 'prototype'],
|
||||||
|
'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
|
||||||
|
'%RegExpPrototype%': ['RegExp', 'prototype'],
|
||||||
|
'%SetPrototype%': ['Set', 'prototype'],
|
||||||
|
'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
|
||||||
|
'%StringPrototype%': ['String', 'prototype'],
|
||||||
|
'%SymbolPrototype%': ['Symbol', 'prototype'],
|
||||||
|
'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
|
||||||
|
'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
|
||||||
|
'%TypeErrorPrototype%': ['TypeError', 'prototype'],
|
||||||
|
'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
|
||||||
|
'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
|
||||||
|
'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
|
||||||
|
'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
|
||||||
|
'%URIErrorPrototype%': ['URIError', 'prototype'],
|
||||||
|
'%WeakMapPrototype%': ['WeakMap', 'prototype'],
|
||||||
|
'%WeakSetPrototype%': ['WeakSet', 'prototype']
|
||||||
|
};
|
||||||
|
|
||||||
|
var bind = require('function-bind');
|
||||||
|
var hasOwn = require('has');
|
||||||
|
var $concat = bind.call(Function.call, Array.prototype.concat);
|
||||||
|
var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
|
||||||
|
var $replace = bind.call(Function.call, String.prototype.replace);
|
||||||
|
var $strSlice = bind.call(Function.call, String.prototype.slice);
|
||||||
|
var $exec = bind.call(Function.call, RegExp.prototype.exec);
|
||||||
|
|
||||||
|
/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
|
||||||
|
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
|
||||||
|
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
|
||||||
|
var stringToPath = function stringToPath(string) {
|
||||||
|
var first = $strSlice(string, 0, 1);
|
||||||
|
var last = $strSlice(string, -1);
|
||||||
|
if (first === '%' && last !== '%') {
|
||||||
|
throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
|
||||||
|
} else if (last === '%' && first !== '%') {
|
||||||
|
throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
|
||||||
|
}
|
||||||
|
var result = [];
|
||||||
|
$replace(string, rePropName, function (match, number, quote, subString) {
|
||||||
|
result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
/* end adaptation */
|
||||||
|
|
||||||
|
var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
|
||||||
|
var intrinsicName = name;
|
||||||
|
var alias;
|
||||||
|
if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
|
||||||
|
alias = LEGACY_ALIASES[intrinsicName];
|
||||||
|
intrinsicName = '%' + alias[0] + '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasOwn(INTRINSICS, intrinsicName)) {
|
||||||
|
var value = INTRINSICS[intrinsicName];
|
||||||
|
if (value === needsEval) {
|
||||||
|
value = doEval(intrinsicName);
|
||||||
|
}
|
||||||
|
if (typeof value === 'undefined' && !allowMissing) {
|
||||||
|
throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
alias: alias,
|
||||||
|
name: intrinsicName,
|
||||||
|
value: value
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = function GetIntrinsic(name, allowMissing) {
|
||||||
|
if (typeof name !== 'string' || name.length === 0) {
|
||||||
|
throw new $TypeError('intrinsic name must be a non-empty string');
|
||||||
|
}
|
||||||
|
if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
|
||||||
|
throw new $TypeError('"allowMissing" argument must be a boolean');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($exec(/^%?[^%]*%?$/, name) === null) {
|
||||||
|
throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');
|
||||||
|
}
|
||||||
|
var parts = stringToPath(name);
|
||||||
|
var intrinsicBaseName = parts.length > 0 ? parts[0] : '';
|
||||||
|
|
||||||
|
var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
|
||||||
|
var intrinsicRealName = intrinsic.name;
|
||||||
|
var value = intrinsic.value;
|
||||||
|
var skipFurtherCaching = false;
|
||||||
|
|
||||||
|
var alias = intrinsic.alias;
|
||||||
|
if (alias) {
|
||||||
|
intrinsicBaseName = alias[0];
|
||||||
|
$spliceApply(parts, $concat([0, 1], alias));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 1, isOwn = true; i < parts.length; i += 1) {
|
||||||
|
var part = parts[i];
|
||||||
|
var first = $strSlice(part, 0, 1);
|
||||||
|
var last = $strSlice(part, -1);
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
(first === '"' || first === "'" || first === '`')
|
||||||
|
|| (last === '"' || last === "'" || last === '`')
|
||||||
|
)
|
||||||
|
&& first !== last
|
||||||
|
) {
|
||||||
|
throw new $SyntaxError('property names with quotes must have matching quotes');
|
||||||
|
}
|
||||||
|
if (part === 'constructor' || !isOwn) {
|
||||||
|
skipFurtherCaching = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
intrinsicBaseName += '.' + part;
|
||||||
|
intrinsicRealName = '%' + intrinsicBaseName + '%';
|
||||||
|
|
||||||
|
if (hasOwn(INTRINSICS, intrinsicRealName)) {
|
||||||
|
value = INTRINSICS[intrinsicRealName];
|
||||||
|
} else if (value != null) {
|
||||||
|
if (!(part in value)) {
|
||||||
|
if (!allowMissing) {
|
||||||
|
throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
|
||||||
|
}
|
||||||
|
return void undefined;
|
||||||
|
}
|
||||||
|
if ($gOPD && (i + 1) >= parts.length) {
|
||||||
|
var desc = $gOPD(value, part);
|
||||||
|
isOwn = !!desc;
|
||||||
|
|
||||||
|
// By convention, when a data property is converted to an accessor
|
||||||
|
// property to emulate a data property that does not suffer from
|
||||||
|
// the override mistake, that accessor's getter is marked with
|
||||||
|
// an `originalValue` property. Here, when we detect this, we
|
||||||
|
// uphold the illusion by pretending to see that original data
|
||||||
|
// property, i.e., returning the value rather than the getter
|
||||||
|
// itself.
|
||||||
|
if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
|
||||||
|
value = desc.get;
|
||||||
|
} else {
|
||||||
|
value = value[part];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
isOwn = hasOwn(value, part);
|
||||||
|
value = value[part];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isOwn && !skipFurtherCaching) {
|
||||||
|
INTRINSICS[intrinsicRealName] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
274
node_modules/get-intrinsic/test/GetIntrinsic.js
generated
vendored
Normal file
274
node_modules/get-intrinsic/test/GetIntrinsic.js
generated
vendored
Normal file
@@ -0,0 +1,274 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var GetIntrinsic = require('../');
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
var forEach = require('for-each');
|
||||||
|
var debug = require('object-inspect');
|
||||||
|
var generatorFns = require('make-generator-function')();
|
||||||
|
var asyncFns = require('make-async-function').list();
|
||||||
|
var asyncGenFns = require('make-async-generator-function')();
|
||||||
|
var mockProperty = require('mock-property');
|
||||||
|
|
||||||
|
var callBound = require('call-bind/callBound');
|
||||||
|
var v = require('es-value-fixtures');
|
||||||
|
var $gOPD = require('gopd');
|
||||||
|
var DefinePropertyOrThrow = require('es-abstract/2021/DefinePropertyOrThrow');
|
||||||
|
|
||||||
|
var $isProto = callBound('%Object.prototype.isPrototypeOf%');
|
||||||
|
|
||||||
|
test('export', function (t) {
|
||||||
|
t.equal(typeof GetIntrinsic, 'function', 'it is a function');
|
||||||
|
t.equal(GetIntrinsic.length, 2, 'function has length of 2');
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('throws', function (t) {
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('not an intrinsic'); },
|
||||||
|
SyntaxError,
|
||||||
|
'nonexistent intrinsic throws a syntax error'
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic(''); },
|
||||||
|
TypeError,
|
||||||
|
'empty string intrinsic throws a type error'
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('.'); },
|
||||||
|
SyntaxError,
|
||||||
|
'"just a dot" intrinsic throws a syntax error'
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('%String'); },
|
||||||
|
SyntaxError,
|
||||||
|
'Leading % without trailing % throws a syntax error'
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('String%'); },
|
||||||
|
SyntaxError,
|
||||||
|
'Trailing % without leading % throws a syntax error'
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic("String['prototype]"); },
|
||||||
|
SyntaxError,
|
||||||
|
'Dynamic property access is disallowed for intrinsics (unterminated string)'
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('%Proxy.prototype.undefined%'); },
|
||||||
|
TypeError,
|
||||||
|
"Throws when middle part doesn't exist (%Proxy.prototype.undefined%)"
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('%Array.prototype%garbage%'); },
|
||||||
|
SyntaxError,
|
||||||
|
'Throws with extra percent signs'
|
||||||
|
);
|
||||||
|
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('%Array.prototype%push%'); },
|
||||||
|
SyntaxError,
|
||||||
|
'Throws with extra percent signs, even on an existing intrinsic'
|
||||||
|
);
|
||||||
|
|
||||||
|
forEach(v.nonStrings, function (nonString) {
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic(nonString); },
|
||||||
|
TypeError,
|
||||||
|
debug(nonString) + ' is not a String'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
forEach(v.nonBooleans, function (nonBoolean) {
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('%', nonBoolean); },
|
||||||
|
TypeError,
|
||||||
|
debug(nonBoolean) + ' is not a Boolean'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
forEach([
|
||||||
|
'toString',
|
||||||
|
'propertyIsEnumerable',
|
||||||
|
'hasOwnProperty'
|
||||||
|
], function (objectProtoMember) {
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic(objectProtoMember); },
|
||||||
|
SyntaxError,
|
||||||
|
debug(objectProtoMember) + ' is not an intrinsic'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('base intrinsics', function (t) {
|
||||||
|
t.equal(GetIntrinsic('%Object%'), Object, '%Object% yields Object');
|
||||||
|
t.equal(GetIntrinsic('Object'), Object, 'Object yields Object');
|
||||||
|
t.equal(GetIntrinsic('%Array%'), Array, '%Array% yields Array');
|
||||||
|
t.equal(GetIntrinsic('Array'), Array, 'Array yields Array');
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('dotted paths', function (t) {
|
||||||
|
t.equal(GetIntrinsic('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% yields Object.prototype.toString');
|
||||||
|
t.equal(GetIntrinsic('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString yields Object.prototype.toString');
|
||||||
|
t.equal(GetIntrinsic('%Array.prototype.push%'), Array.prototype.push, '%Array.prototype.push% yields Array.prototype.push');
|
||||||
|
t.equal(GetIntrinsic('Array.prototype.push'), Array.prototype.push, 'Array.prototype.push yields Array.prototype.push');
|
||||||
|
|
||||||
|
test('underscore paths are aliases for dotted paths', { skip: !Object.isFrozen || Object.isFrozen(Object.prototype) }, function (st) {
|
||||||
|
var original = GetIntrinsic('%ObjProto_toString%');
|
||||||
|
|
||||||
|
forEach([
|
||||||
|
'%Object.prototype.toString%',
|
||||||
|
'Object.prototype.toString',
|
||||||
|
'%ObjectPrototype.toString%',
|
||||||
|
'ObjectPrototype.toString',
|
||||||
|
'%ObjProto_toString%',
|
||||||
|
'ObjProto_toString'
|
||||||
|
], function (name) {
|
||||||
|
DefinePropertyOrThrow(Object.prototype, 'toString', {
|
||||||
|
'[[Value]]': function toString() {
|
||||||
|
return original.apply(this, arguments);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
st.equal(GetIntrinsic(name), original, name + ' yields original Object.prototype.toString');
|
||||||
|
});
|
||||||
|
|
||||||
|
DefinePropertyOrThrow(Object.prototype, 'toString', { '[[Value]]': original });
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('dotted paths cache', { skip: !Object.isFrozen || Object.isFrozen(Object.prototype) }, function (st) {
|
||||||
|
var original = GetIntrinsic('%Object.prototype.propertyIsEnumerable%');
|
||||||
|
|
||||||
|
forEach([
|
||||||
|
'%Object.prototype.propertyIsEnumerable%',
|
||||||
|
'Object.prototype.propertyIsEnumerable',
|
||||||
|
'%ObjectPrototype.propertyIsEnumerable%',
|
||||||
|
'ObjectPrototype.propertyIsEnumerable'
|
||||||
|
], function (name) {
|
||||||
|
var restore = mockProperty(Object.prototype, 'propertyIsEnumerable', {
|
||||||
|
value: function propertyIsEnumerable() {
|
||||||
|
return original.apply(this, arguments);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
st.equal(GetIntrinsic(name), original, name + ' yields cached Object.prototype.propertyIsEnumerable');
|
||||||
|
|
||||||
|
restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('dotted path reports correct error', function (st) {
|
||||||
|
st['throws'](function () {
|
||||||
|
GetIntrinsic('%NonExistentIntrinsic.prototype.property%');
|
||||||
|
}, /%NonExistentIntrinsic%/, 'The base intrinsic of %NonExistentIntrinsic.prototype.property% is %NonExistentIntrinsic%');
|
||||||
|
|
||||||
|
st['throws'](function () {
|
||||||
|
GetIntrinsic('%NonExistentIntrinsicPrototype.property%');
|
||||||
|
}, /%NonExistentIntrinsicPrototype%/, 'The base intrinsic of %NonExistentIntrinsicPrototype.property% is %NonExistentIntrinsicPrototype%');
|
||||||
|
|
||||||
|
st.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('accessors', { skip: !$gOPD || typeof Map !== 'function' }, function (t) {
|
||||||
|
var actual = $gOPD(Map.prototype, 'size');
|
||||||
|
t.ok(actual, 'Map.prototype.size has a descriptor');
|
||||||
|
t.equal(typeof actual.get, 'function', 'Map.prototype.size has a getter function');
|
||||||
|
t.equal(GetIntrinsic('%Map.prototype.size%'), actual.get, '%Map.prototype.size% yields the getter for it');
|
||||||
|
t.equal(GetIntrinsic('Map.prototype.size'), actual.get, 'Map.prototype.size yields the getter for it');
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('generator functions', { skip: !generatorFns.length }, function (t) {
|
||||||
|
var $GeneratorFunction = GetIntrinsic('%GeneratorFunction%');
|
||||||
|
var $GeneratorFunctionPrototype = GetIntrinsic('%Generator%');
|
||||||
|
var $GeneratorPrototype = GetIntrinsic('%GeneratorPrototype%');
|
||||||
|
|
||||||
|
forEach(generatorFns, function (genFn) {
|
||||||
|
var fnName = genFn.name;
|
||||||
|
fnName = fnName ? "'" + fnName + "'" : 'genFn';
|
||||||
|
|
||||||
|
t.ok(genFn instanceof $GeneratorFunction, fnName + ' instanceof %GeneratorFunction%');
|
||||||
|
t.ok($isProto($GeneratorFunctionPrototype, genFn), '%Generator% is prototype of ' + fnName);
|
||||||
|
t.ok($isProto($GeneratorPrototype, genFn.prototype), '%GeneratorPrototype% is prototype of ' + fnName + '.prototype');
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('async functions', { skip: !asyncFns.length }, function (t) {
|
||||||
|
var $AsyncFunction = GetIntrinsic('%AsyncFunction%');
|
||||||
|
var $AsyncFunctionPrototype = GetIntrinsic('%AsyncFunctionPrototype%');
|
||||||
|
|
||||||
|
forEach(asyncFns, function (asyncFn) {
|
||||||
|
var fnName = asyncFn.name;
|
||||||
|
fnName = fnName ? "'" + fnName + "'" : 'asyncFn';
|
||||||
|
|
||||||
|
t.ok(asyncFn instanceof $AsyncFunction, fnName + ' instanceof %AsyncFunction%');
|
||||||
|
t.ok($isProto($AsyncFunctionPrototype, asyncFn), '%AsyncFunctionPrototype% is prototype of ' + fnName);
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('async generator functions', { skip: asyncGenFns.length === 0 }, function (t) {
|
||||||
|
var $AsyncGeneratorFunction = GetIntrinsic('%AsyncGeneratorFunction%');
|
||||||
|
var $AsyncGeneratorFunctionPrototype = GetIntrinsic('%AsyncGenerator%');
|
||||||
|
var $AsyncGeneratorPrototype = GetIntrinsic('%AsyncGeneratorPrototype%');
|
||||||
|
|
||||||
|
forEach(asyncGenFns, function (asyncGenFn) {
|
||||||
|
var fnName = asyncGenFn.name;
|
||||||
|
fnName = fnName ? "'" + fnName + "'" : 'asyncGenFn';
|
||||||
|
|
||||||
|
t.ok(asyncGenFn instanceof $AsyncGeneratorFunction, fnName + ' instanceof %AsyncGeneratorFunction%');
|
||||||
|
t.ok($isProto($AsyncGeneratorFunctionPrototype, asyncGenFn), '%AsyncGenerator% is prototype of ' + fnName);
|
||||||
|
t.ok($isProto($AsyncGeneratorPrototype, asyncGenFn.prototype), '%AsyncGeneratorPrototype% is prototype of ' + fnName + '.prototype');
|
||||||
|
});
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('%ThrowTypeError%', function (t) {
|
||||||
|
var $ThrowTypeError = GetIntrinsic('%ThrowTypeError%');
|
||||||
|
|
||||||
|
t.equal(typeof $ThrowTypeError, 'function', 'is a function');
|
||||||
|
t['throws'](
|
||||||
|
$ThrowTypeError,
|
||||||
|
TypeError,
|
||||||
|
'%ThrowTypeError% throws a TypeError'
|
||||||
|
);
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('allowMissing', { skip: asyncGenFns.length > 0 }, function (t) {
|
||||||
|
t['throws'](
|
||||||
|
function () { GetIntrinsic('%AsyncGeneratorPrototype%'); },
|
||||||
|
TypeError,
|
||||||
|
'throws when missing'
|
||||||
|
);
|
||||||
|
|
||||||
|
t.equal(
|
||||||
|
GetIntrinsic('%AsyncGeneratorPrototype%', true),
|
||||||
|
undefined,
|
||||||
|
'does not throw when allowMissing'
|
||||||
|
);
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
11
node_modules/has-proto/index.js
generated
vendored
Normal file
11
node_modules/has-proto/index.js
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var test = {
|
||||||
|
foo: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
var $Object = Object;
|
||||||
|
|
||||||
|
module.exports = function hasProto() {
|
||||||
|
return { __proto__: test }.foo === test.foo && !({ __proto__: null } instanceof $Object);
|
||||||
|
};
|
||||||
19
node_modules/has-proto/test/index.js
generated
vendored
Normal file
19
node_modules/has-proto/test/index.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
var hasProto = require('../');
|
||||||
|
|
||||||
|
test('hasProto', function (t) {
|
||||||
|
var result = hasProto();
|
||||||
|
t.equal(typeof result, 'boolean', 'returns a boolean (' + result + ')');
|
||||||
|
|
||||||
|
var obj = { __proto__: null };
|
||||||
|
if (result) {
|
||||||
|
t.notOk('toString' in obj, 'null object lacks toString');
|
||||||
|
} else {
|
||||||
|
t.ok('toString' in obj, 'without proto, null object has toString');
|
||||||
|
t.equal(obj.__proto__, null); // eslint-disable-line no-proto
|
||||||
|
}
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
13
node_modules/has-symbols/index.js
generated
vendored
Normal file
13
node_modules/has-symbols/index.js
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var origSymbol = typeof Symbol !== 'undefined' && Symbol;
|
||||||
|
var hasSymbolSham = require('./shams');
|
||||||
|
|
||||||
|
module.exports = function hasNativeSymbols() {
|
||||||
|
if (typeof origSymbol !== 'function') { return false; }
|
||||||
|
if (typeof Symbol !== 'function') { return false; }
|
||||||
|
if (typeof origSymbol('foo') !== 'symbol') { return false; }
|
||||||
|
if (typeof Symbol('bar') !== 'symbol') { return false; }
|
||||||
|
|
||||||
|
return hasSymbolSham();
|
||||||
|
};
|
||||||
42
node_modules/has-symbols/shams.js
generated
vendored
Normal file
42
node_modules/has-symbols/shams.js
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* eslint complexity: [2, 18], max-statements: [2, 33] */
|
||||||
|
module.exports = function hasSymbols() {
|
||||||
|
if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
|
||||||
|
if (typeof Symbol.iterator === 'symbol') { return true; }
|
||||||
|
|
||||||
|
var obj = {};
|
||||||
|
var sym = Symbol('test');
|
||||||
|
var symObj = Object(sym);
|
||||||
|
if (typeof sym === 'string') { return false; }
|
||||||
|
|
||||||
|
if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
|
||||||
|
if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
|
||||||
|
|
||||||
|
// temp disabled per https://github.com/ljharb/object.assign/issues/17
|
||||||
|
// if (sym instanceof Symbol) { return false; }
|
||||||
|
// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
|
||||||
|
// if (!(symObj instanceof Symbol)) { return false; }
|
||||||
|
|
||||||
|
// if (typeof Symbol.prototype.toString !== 'function') { return false; }
|
||||||
|
// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
|
||||||
|
|
||||||
|
var symVal = 42;
|
||||||
|
obj[sym] = symVal;
|
||||||
|
for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
|
||||||
|
if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
|
||||||
|
|
||||||
|
if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
|
||||||
|
|
||||||
|
var syms = Object.getOwnPropertySymbols(obj);
|
||||||
|
if (syms.length !== 1 || syms[0] !== sym) { return false; }
|
||||||
|
|
||||||
|
if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
|
||||||
|
|
||||||
|
if (typeof Object.getOwnPropertyDescriptor === 'function') {
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
|
||||||
|
if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
22
node_modules/has-symbols/test/index.js
generated
vendored
Normal file
22
node_modules/has-symbols/test/index.js
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
var hasSymbols = require('../');
|
||||||
|
var runSymbolTests = require('./tests');
|
||||||
|
|
||||||
|
test('interface', function (t) {
|
||||||
|
t.equal(typeof hasSymbols, 'function', 'is a function');
|
||||||
|
t.equal(typeof hasSymbols(), 'boolean', 'returns a boolean');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Symbols are supported', { skip: !hasSymbols() }, function (t) {
|
||||||
|
runSymbolTests(t);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Symbols are not supported', { skip: hasSymbols() }, function (t) {
|
||||||
|
t.equal(typeof Symbol, 'undefined', 'global Symbol is undefined');
|
||||||
|
t.equal(typeof Object.getOwnPropertySymbols, 'undefined', 'Object.getOwnPropertySymbols does not exist');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
28
node_modules/has-symbols/test/shams/core-js.js
generated
vendored
Normal file
28
node_modules/has-symbols/test/shams/core-js.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
|
||||||
|
if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
|
||||||
|
test('has native Symbol support', function (t) {
|
||||||
|
t.equal(typeof Symbol, 'function');
|
||||||
|
t.equal(typeof Symbol(), 'symbol');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasSymbols = require('../../shams');
|
||||||
|
|
||||||
|
test('polyfilled Symbols', function (t) {
|
||||||
|
/* eslint-disable global-require */
|
||||||
|
t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
|
||||||
|
require('core-js/fn/symbol');
|
||||||
|
require('core-js/fn/symbol/to-string-tag');
|
||||||
|
|
||||||
|
require('../tests')(t);
|
||||||
|
|
||||||
|
var hasSymbolsAfter = hasSymbols();
|
||||||
|
t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
|
||||||
|
/* eslint-enable global-require */
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
28
node_modules/has-symbols/test/shams/get-own-property-symbols.js
generated
vendored
Normal file
28
node_modules/has-symbols/test/shams/get-own-property-symbols.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
|
||||||
|
if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
|
||||||
|
test('has native Symbol support', function (t) {
|
||||||
|
t.equal(typeof Symbol, 'function');
|
||||||
|
t.equal(typeof Symbol(), 'symbol');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasSymbols = require('../../shams');
|
||||||
|
|
||||||
|
test('polyfilled Symbols', function (t) {
|
||||||
|
/* eslint-disable global-require */
|
||||||
|
t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
|
||||||
|
|
||||||
|
require('get-own-property-symbols');
|
||||||
|
|
||||||
|
require('../tests')(t);
|
||||||
|
|
||||||
|
var hasSymbolsAfter = hasSymbols();
|
||||||
|
t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
|
||||||
|
/* eslint-enable global-require */
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
56
node_modules/has-symbols/test/tests.js
generated
vendored
Normal file
56
node_modules/has-symbols/test/tests.js
generated
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// eslint-disable-next-line consistent-return
|
||||||
|
module.exports = function runSymbolTests(t) {
|
||||||
|
t.equal(typeof Symbol, 'function', 'global Symbol is a function');
|
||||||
|
|
||||||
|
if (typeof Symbol !== 'function') { return false; }
|
||||||
|
|
||||||
|
t.notEqual(Symbol(), Symbol(), 'two symbols are not equal');
|
||||||
|
|
||||||
|
/*
|
||||||
|
t.equal(
|
||||||
|
Symbol.prototype.toString.call(Symbol('foo')),
|
||||||
|
Symbol.prototype.toString.call(Symbol('foo')),
|
||||||
|
'two symbols with the same description stringify the same'
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
var foo = Symbol('foo');
|
||||||
|
|
||||||
|
t.notEqual(
|
||||||
|
String(foo),
|
||||||
|
String(Symbol('bar')),
|
||||||
|
'two symbols with different descriptions do not stringify the same'
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
t.equal(typeof Symbol.prototype.toString, 'function', 'Symbol#toString is a function');
|
||||||
|
// t.equal(String(foo), Symbol.prototype.toString.call(foo), 'Symbol#toString equals String of the same symbol');
|
||||||
|
|
||||||
|
t.equal(typeof Object.getOwnPropertySymbols, 'function', 'Object.getOwnPropertySymbols is a function');
|
||||||
|
|
||||||
|
var obj = {};
|
||||||
|
var sym = Symbol('test');
|
||||||
|
var symObj = Object(sym);
|
||||||
|
t.notEqual(typeof sym, 'string', 'Symbol is not a string');
|
||||||
|
t.equal(Object.prototype.toString.call(sym), '[object Symbol]', 'symbol primitive Object#toStrings properly');
|
||||||
|
t.equal(Object.prototype.toString.call(symObj), '[object Symbol]', 'symbol primitive Object#toStrings properly');
|
||||||
|
|
||||||
|
var symVal = 42;
|
||||||
|
obj[sym] = symVal;
|
||||||
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
|
for (sym in obj) { t.fail('symbol property key was found in for..in of object'); }
|
||||||
|
|
||||||
|
t.deepEqual(Object.keys(obj), [], 'no enumerable own keys on symbol-valued object');
|
||||||
|
t.deepEqual(Object.getOwnPropertyNames(obj), [], 'no own names on symbol-valued object');
|
||||||
|
t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'one own symbol on symbol-valued object');
|
||||||
|
t.equal(Object.prototype.propertyIsEnumerable.call(obj, sym), true, 'symbol is enumerable');
|
||||||
|
t.deepEqual(Object.getOwnPropertyDescriptor(obj, sym), {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true,
|
||||||
|
value: 42,
|
||||||
|
writable: true
|
||||||
|
}, 'property descriptor is correct');
|
||||||
|
};
|
||||||
5
node_modules/has/src/index.js
generated
vendored
Normal file
5
node_modules/has/src/index.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var bind = require('function-bind');
|
||||||
|
|
||||||
|
module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);
|
||||||
10
node_modules/has/test/index.js
generated
vendored
Normal file
10
node_modules/has/test/index.js
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var test = require('tape');
|
||||||
|
var has = require('../');
|
||||||
|
|
||||||
|
test('has', function (t) {
|
||||||
|
t.equal(has({}, 'hasOwnProperty'), false, 'object literal does not have own property "hasOwnProperty"');
|
||||||
|
t.equal(has(Object.prototype, 'hasOwnProperty'), true, 'Object.prototype has own property "hasOwnProperty"');
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
26
node_modules/hash-index/index.js
generated
vendored
Normal file
26
node_modules/hash-index/index.js
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
var crypto = require('crypto')
|
||||||
|
|
||||||
|
var isInt = function (n) {
|
||||||
|
return Number(n) === n && n % 1 === 0
|
||||||
|
}
|
||||||
|
|
||||||
|
var isValid = function (input) {
|
||||||
|
var type = typeof input
|
||||||
|
if (type === 'number' && isNaN(input)) return false
|
||||||
|
return type === 'number' || type === 'string' || Buffer.isBuffer(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
var toNumber = function (buf) {
|
||||||
|
return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function (input, max) {
|
||||||
|
if (max === undefined) max = Infinity
|
||||||
|
if ((!isInt(max) && max !== Infinity) || max <= 0) throw new Error('max must be positive integer')
|
||||||
|
if (!isValid(input)) throw new Error('Input must be a string, buffer or a number')
|
||||||
|
|
||||||
|
if (typeof input === 'number') input = input.toString()
|
||||||
|
return toNumber(crypto.createHash('sha1').update(input).digest()) % max
|
||||||
|
}
|
||||||
126
node_modules/hash-index/test.js
generated
vendored
Normal file
126
node_modules/hash-index/test.js
generated
vendored
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
var test = require('tape')
|
||||||
|
var hasher = require('./')
|
||||||
|
|
||||||
|
test('no input', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher()
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('null input', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher(null)
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('NaN input', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher(NaN)
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('object input', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher({})
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('array input', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher([])
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('number input', function (t) {
|
||||||
|
t.ok(Number.isFinite(hasher(1)))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('string input', function (t) {
|
||||||
|
t.ok(Number.isFinite(hasher('input')))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('return between 0 and max', function (t) {
|
||||||
|
var max = 10
|
||||||
|
var input = 'input'
|
||||||
|
for (var n = 0; n < 1000; n++) {
|
||||||
|
input += n
|
||||||
|
var result = hasher(input, max)
|
||||||
|
t.ok(result >= 0)
|
||||||
|
t.ok(result < max)
|
||||||
|
}
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('max zero', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher('foo', 0)
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('max negative', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher('foo', -1)
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('max invalid', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher('foo', 'bad')
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('max float', function (t) {
|
||||||
|
t.throws(function () {
|
||||||
|
hasher('foo', 42.42)
|
||||||
|
})
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('with max', function (t) {
|
||||||
|
t.test('same input, same output', function (t) {
|
||||||
|
t.equal(hasher('foo', 10), hasher('foo', 10))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
t.test('different input, different output', function (t) {
|
||||||
|
t.notEqual(hasher('foo', 10), hasher('bar', 10))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test('without max', function (t) {
|
||||||
|
t.test('same input, same output', function (t) {
|
||||||
|
t.equal(hasher('foo'), hasher('foo'))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
t.test('different input, different output', function (t) {
|
||||||
|
t.notEqual(hasher('foo'), hasher('bar'))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test('with different max', function (t) {
|
||||||
|
t.test('same input, different output', function (t) {
|
||||||
|
t.notEqual(hasher('foobar', 10), hasher('foobar', 11))
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test('expected output', function (t) {
|
||||||
|
t.equal(hasher('foo', 100), 97)
|
||||||
|
t.equal(hasher('bar', 100), 24)
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
289
node_modules/http-errors/index.js
generated
vendored
Normal file
289
node_modules/http-errors/index.js
generated
vendored
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
/*!
|
||||||
|
* http-errors
|
||||||
|
* Copyright(c) 2014 Jonathan Ong
|
||||||
|
* Copyright(c) 2016 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var deprecate = require('depd')('http-errors')
|
||||||
|
var setPrototypeOf = require('setprototypeof')
|
||||||
|
var statuses = require('statuses')
|
||||||
|
var inherits = require('inherits')
|
||||||
|
var toIdentifier = require('toidentifier')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = createError
|
||||||
|
module.exports.HttpError = createHttpErrorConstructor()
|
||||||
|
module.exports.isHttpError = createIsHttpErrorFunction(module.exports.HttpError)
|
||||||
|
|
||||||
|
// Populate exports for all constructors
|
||||||
|
populateConstructorExports(module.exports, statuses.codes, module.exports.HttpError)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the code class of a status code.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function codeClass (status) {
|
||||||
|
return Number(String(status).charAt(0) + '00')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new HTTP Error.
|
||||||
|
*
|
||||||
|
* @returns {Error}
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createError () {
|
||||||
|
// so much arity going on ~_~
|
||||||
|
var err
|
||||||
|
var msg
|
||||||
|
var status = 500
|
||||||
|
var props = {}
|
||||||
|
for (var i = 0; i < arguments.length; i++) {
|
||||||
|
var arg = arguments[i]
|
||||||
|
var type = typeof arg
|
||||||
|
if (type === 'object' && arg instanceof Error) {
|
||||||
|
err = arg
|
||||||
|
status = err.status || err.statusCode || status
|
||||||
|
} else if (type === 'number' && i === 0) {
|
||||||
|
status = arg
|
||||||
|
} else if (type === 'string') {
|
||||||
|
msg = arg
|
||||||
|
} else if (type === 'object') {
|
||||||
|
props = arg
|
||||||
|
} else {
|
||||||
|
throw new TypeError('argument #' + (i + 1) + ' unsupported type ' + type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof status === 'number' && (status < 400 || status >= 600)) {
|
||||||
|
deprecate('non-error status code; use only 4xx or 5xx status codes')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof status !== 'number' ||
|
||||||
|
(!statuses.message[status] && (status < 400 || status >= 600))) {
|
||||||
|
status = 500
|
||||||
|
}
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
var HttpError = createError[status] || createError[codeClass(status)]
|
||||||
|
|
||||||
|
if (!err) {
|
||||||
|
// create error
|
||||||
|
err = HttpError
|
||||||
|
? new HttpError(msg)
|
||||||
|
: new Error(msg || statuses.message[status])
|
||||||
|
Error.captureStackTrace(err, createError)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HttpError || !(err instanceof HttpError) || err.status !== status) {
|
||||||
|
// add properties to generic error
|
||||||
|
err.expose = status < 500
|
||||||
|
err.status = err.statusCode = status
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var key in props) {
|
||||||
|
if (key !== 'status' && key !== 'statusCode') {
|
||||||
|
err[key] = props[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create HTTP error abstract base class.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createHttpErrorConstructor () {
|
||||||
|
function HttpError () {
|
||||||
|
throw new TypeError('cannot construct abstract class')
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(HttpError, Error)
|
||||||
|
|
||||||
|
return HttpError
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a constructor for a client error.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createClientErrorConstructor (HttpError, name, code) {
|
||||||
|
var className = toClassName(name)
|
||||||
|
|
||||||
|
function ClientError (message) {
|
||||||
|
// create the error object
|
||||||
|
var msg = message != null ? message : statuses.message[code]
|
||||||
|
var err = new Error(msg)
|
||||||
|
|
||||||
|
// capture a stack trace to the construction point
|
||||||
|
Error.captureStackTrace(err, ClientError)
|
||||||
|
|
||||||
|
// adjust the [[Prototype]]
|
||||||
|
setPrototypeOf(err, ClientError.prototype)
|
||||||
|
|
||||||
|
// redefine the error message
|
||||||
|
Object.defineProperty(err, 'message', {
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
value: msg,
|
||||||
|
writable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
// redefine the error name
|
||||||
|
Object.defineProperty(err, 'name', {
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
value: className,
|
||||||
|
writable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(ClientError, HttpError)
|
||||||
|
nameFunc(ClientError, className)
|
||||||
|
|
||||||
|
ClientError.prototype.status = code
|
||||||
|
ClientError.prototype.statusCode = code
|
||||||
|
ClientError.prototype.expose = true
|
||||||
|
|
||||||
|
return ClientError
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create function to test is a value is a HttpError.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createIsHttpErrorFunction (HttpError) {
|
||||||
|
return function isHttpError (val) {
|
||||||
|
if (!val || typeof val !== 'object') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val instanceof HttpError) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return val instanceof Error &&
|
||||||
|
typeof val.expose === 'boolean' &&
|
||||||
|
typeof val.statusCode === 'number' && val.status === val.statusCode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a constructor for a server error.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createServerErrorConstructor (HttpError, name, code) {
|
||||||
|
var className = toClassName(name)
|
||||||
|
|
||||||
|
function ServerError (message) {
|
||||||
|
// create the error object
|
||||||
|
var msg = message != null ? message : statuses.message[code]
|
||||||
|
var err = new Error(msg)
|
||||||
|
|
||||||
|
// capture a stack trace to the construction point
|
||||||
|
Error.captureStackTrace(err, ServerError)
|
||||||
|
|
||||||
|
// adjust the [[Prototype]]
|
||||||
|
setPrototypeOf(err, ServerError.prototype)
|
||||||
|
|
||||||
|
// redefine the error message
|
||||||
|
Object.defineProperty(err, 'message', {
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
value: msg,
|
||||||
|
writable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
// redefine the error name
|
||||||
|
Object.defineProperty(err, 'name', {
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
value: className,
|
||||||
|
writable: true
|
||||||
|
})
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(ServerError, HttpError)
|
||||||
|
nameFunc(ServerError, className)
|
||||||
|
|
||||||
|
ServerError.prototype.status = code
|
||||||
|
ServerError.prototype.statusCode = code
|
||||||
|
ServerError.prototype.expose = false
|
||||||
|
|
||||||
|
return ServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the name of a function, if possible.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function nameFunc (func, name) {
|
||||||
|
var desc = Object.getOwnPropertyDescriptor(func, 'name')
|
||||||
|
|
||||||
|
if (desc && desc.configurable) {
|
||||||
|
desc.value = name
|
||||||
|
Object.defineProperty(func, 'name', desc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Populate the exports object with constructors for every error class.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function populateConstructorExports (exports, codes, HttpError) {
|
||||||
|
codes.forEach(function forEachCode (code) {
|
||||||
|
var CodeError
|
||||||
|
var name = toIdentifier(statuses.message[code])
|
||||||
|
|
||||||
|
switch (codeClass(code)) {
|
||||||
|
case 400:
|
||||||
|
CodeError = createClientErrorConstructor(HttpError, name, code)
|
||||||
|
break
|
||||||
|
case 500:
|
||||||
|
CodeError = createServerErrorConstructor(HttpError, name, code)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CodeError) {
|
||||||
|
// export the constructor
|
||||||
|
exports[code] = CodeError
|
||||||
|
exports[name] = CodeError
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a class name from a name identifier.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function toClassName (name) {
|
||||||
|
return name.substr(-5) !== 'Error'
|
||||||
|
? name + 'Error'
|
||||||
|
: name
|
||||||
|
}
|
||||||
555
node_modules/iconv-lite/encodings/dbcs-codec.js
generated
vendored
Normal file
555
node_modules/iconv-lite/encodings/dbcs-codec.js
generated
vendored
Normal file
@@ -0,0 +1,555 @@
|
|||||||
|
"use strict";
|
||||||
|
var Buffer = require("safer-buffer").Buffer;
|
||||||
|
|
||||||
|
// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
|
||||||
|
// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
|
||||||
|
// To save memory and loading time, we read table files only when requested.
|
||||||
|
|
||||||
|
exports._dbcs = DBCSCodec;
|
||||||
|
|
||||||
|
var UNASSIGNED = -1,
|
||||||
|
GB18030_CODE = -2,
|
||||||
|
SEQ_START = -10,
|
||||||
|
NODE_START = -1000,
|
||||||
|
UNASSIGNED_NODE = new Array(0x100),
|
||||||
|
DEF_CHAR = -1;
|
||||||
|
|
||||||
|
for (var i = 0; i < 0x100; i++)
|
||||||
|
UNASSIGNED_NODE[i] = UNASSIGNED;
|
||||||
|
|
||||||
|
|
||||||
|
// Class DBCSCodec reads and initializes mapping tables.
|
||||||
|
function DBCSCodec(codecOptions, iconv) {
|
||||||
|
this.encodingName = codecOptions.encodingName;
|
||||||
|
if (!codecOptions)
|
||||||
|
throw new Error("DBCS codec is called without the data.")
|
||||||
|
if (!codecOptions.table)
|
||||||
|
throw new Error("Encoding '" + this.encodingName + "' has no data.");
|
||||||
|
|
||||||
|
// Load tables.
|
||||||
|
var mappingTable = codecOptions.table();
|
||||||
|
|
||||||
|
|
||||||
|
// Decode tables: MBCS -> Unicode.
|
||||||
|
|
||||||
|
// decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
|
||||||
|
// Trie root is decodeTables[0].
|
||||||
|
// Values: >= 0 -> unicode character code. can be > 0xFFFF
|
||||||
|
// == UNASSIGNED -> unknown/unassigned sequence.
|
||||||
|
// == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
|
||||||
|
// <= NODE_START -> index of the next node in our trie to process next byte.
|
||||||
|
// <= SEQ_START -> index of the start of a character code sequence, in decodeTableSeq.
|
||||||
|
this.decodeTables = [];
|
||||||
|
this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.
|
||||||
|
|
||||||
|
// Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here.
|
||||||
|
this.decodeTableSeq = [];
|
||||||
|
|
||||||
|
// Actual mapping tables consist of chunks. Use them to fill up decode tables.
|
||||||
|
for (var i = 0; i < mappingTable.length; i++)
|
||||||
|
this._addDecodeChunk(mappingTable[i]);
|
||||||
|
|
||||||
|
this.defaultCharUnicode = iconv.defaultCharUnicode;
|
||||||
|
|
||||||
|
|
||||||
|
// Encode tables: Unicode -> DBCS.
|
||||||
|
|
||||||
|
// `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
|
||||||
|
// Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
|
||||||
|
// Values: >= 0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
|
||||||
|
// == UNASSIGNED -> no conversion found. Output a default char.
|
||||||
|
// <= SEQ_START -> it's an index in encodeTableSeq, see below. The character starts a sequence.
|
||||||
|
this.encodeTable = [];
|
||||||
|
|
||||||
|
// `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
|
||||||
|
// objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
|
||||||
|
// means end of sequence (needed when one sequence is a strict subsequence of another).
|
||||||
|
// Objects are kept separately from encodeTable to increase performance.
|
||||||
|
this.encodeTableSeq = [];
|
||||||
|
|
||||||
|
// Some chars can be decoded, but need not be encoded.
|
||||||
|
var skipEncodeChars = {};
|
||||||
|
if (codecOptions.encodeSkipVals)
|
||||||
|
for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
|
||||||
|
var val = codecOptions.encodeSkipVals[i];
|
||||||
|
if (typeof val === 'number')
|
||||||
|
skipEncodeChars[val] = true;
|
||||||
|
else
|
||||||
|
for (var j = val.from; j <= val.to; j++)
|
||||||
|
skipEncodeChars[j] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use decode trie to recursively fill out encode tables.
|
||||||
|
this._fillEncodeTable(0, 0, skipEncodeChars);
|
||||||
|
|
||||||
|
// Add more encoding pairs when needed.
|
||||||
|
if (codecOptions.encodeAdd) {
|
||||||
|
for (var uChar in codecOptions.encodeAdd)
|
||||||
|
if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
|
||||||
|
this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];
|
||||||
|
if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];
|
||||||
|
if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0);
|
||||||
|
|
||||||
|
|
||||||
|
// Load & create GB18030 tables when needed.
|
||||||
|
if (typeof codecOptions.gb18030 === 'function') {
|
||||||
|
this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.
|
||||||
|
|
||||||
|
// Add GB18030 decode tables.
|
||||||
|
var thirdByteNodeIdx = this.decodeTables.length;
|
||||||
|
var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);
|
||||||
|
|
||||||
|
var fourthByteNodeIdx = this.decodeTables.length;
|
||||||
|
var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);
|
||||||
|
|
||||||
|
for (var i = 0x81; i <= 0xFE; i++) {
|
||||||
|
var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];
|
||||||
|
var secondByteNode = this.decodeTables[secondByteNodeIdx];
|
||||||
|
for (var j = 0x30; j <= 0x39; j++)
|
||||||
|
secondByteNode[j] = NODE_START - thirdByteNodeIdx;
|
||||||
|
}
|
||||||
|
for (var i = 0x81; i <= 0xFE; i++)
|
||||||
|
thirdByteNode[i] = NODE_START - fourthByteNodeIdx;
|
||||||
|
for (var i = 0x30; i <= 0x39; i++)
|
||||||
|
fourthByteNode[i] = GB18030_CODE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSCodec.prototype.encoder = DBCSEncoder;
|
||||||
|
DBCSCodec.prototype.decoder = DBCSDecoder;
|
||||||
|
|
||||||
|
// Decoder helpers
|
||||||
|
DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
|
||||||
|
var bytes = [];
|
||||||
|
for (; addr > 0; addr >>= 8)
|
||||||
|
bytes.push(addr & 0xFF);
|
||||||
|
if (bytes.length == 0)
|
||||||
|
bytes.push(0);
|
||||||
|
|
||||||
|
var node = this.decodeTables[0];
|
||||||
|
for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.
|
||||||
|
var val = node[bytes[i]];
|
||||||
|
|
||||||
|
if (val == UNASSIGNED) { // Create new node.
|
||||||
|
node[bytes[i]] = NODE_START - this.decodeTables.length;
|
||||||
|
this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));
|
||||||
|
}
|
||||||
|
else if (val <= NODE_START) { // Existing node.
|
||||||
|
node = this.decodeTables[NODE_START - val];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DBCSCodec.prototype._addDecodeChunk = function(chunk) {
|
||||||
|
// First element of chunk is the hex mbcs code where we start.
|
||||||
|
var curAddr = parseInt(chunk[0], 16);
|
||||||
|
|
||||||
|
// Choose the decoding node where we'll write our chars.
|
||||||
|
var writeTable = this._getDecodeTrieNode(curAddr);
|
||||||
|
curAddr = curAddr & 0xFF;
|
||||||
|
|
||||||
|
// Write all other elements of the chunk to the table.
|
||||||
|
for (var k = 1; k < chunk.length; k++) {
|
||||||
|
var part = chunk[k];
|
||||||
|
if (typeof part === "string") { // String, write as-is.
|
||||||
|
for (var l = 0; l < part.length;) {
|
||||||
|
var code = part.charCodeAt(l++);
|
||||||
|
if (0xD800 <= code && code < 0xDC00) { // Decode surrogate
|
||||||
|
var codeTrail = part.charCodeAt(l++);
|
||||||
|
if (0xDC00 <= codeTrail && codeTrail < 0xE000)
|
||||||
|
writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);
|
||||||
|
else
|
||||||
|
throw new Error("Incorrect surrogate pair in " + this.encodingName + " at chunk " + chunk[0]);
|
||||||
|
}
|
||||||
|
else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)
|
||||||
|
var len = 0xFFF - code + 2;
|
||||||
|
var seq = [];
|
||||||
|
for (var m = 0; m < len; m++)
|
||||||
|
seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.
|
||||||
|
|
||||||
|
writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;
|
||||||
|
this.decodeTableSeq.push(seq);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
writeTable[curAddr++] = code; // Basic char
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
|
||||||
|
var charCode = writeTable[curAddr - 1] + 1;
|
||||||
|
for (var l = 0; l < part; l++)
|
||||||
|
writeTable[curAddr++] = charCode++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new Error("Incorrect type '" + typeof part + "' given in " + this.encodingName + " at chunk " + chunk[0]);
|
||||||
|
}
|
||||||
|
if (curAddr > 0xFF)
|
||||||
|
throw new Error("Incorrect chunk in " + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encoder helpers
|
||||||
|
DBCSCodec.prototype._getEncodeBucket = function(uCode) {
|
||||||
|
var high = uCode >> 8; // This could be > 0xFF because of astral characters.
|
||||||
|
if (this.encodeTable[high] === undefined)
|
||||||
|
this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.
|
||||||
|
return this.encodeTable[high];
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
|
||||||
|
var bucket = this._getEncodeBucket(uCode);
|
||||||
|
var low = uCode & 0xFF;
|
||||||
|
if (bucket[low] <= SEQ_START)
|
||||||
|
this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.
|
||||||
|
else if (bucket[low] == UNASSIGNED)
|
||||||
|
bucket[low] = dbcsCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
|
||||||
|
|
||||||
|
// Get the root of character tree according to first character of the sequence.
|
||||||
|
var uCode = seq[0];
|
||||||
|
var bucket = this._getEncodeBucket(uCode);
|
||||||
|
var low = uCode & 0xFF;
|
||||||
|
|
||||||
|
var node;
|
||||||
|
if (bucket[low] <= SEQ_START) {
|
||||||
|
// There's already a sequence with - use it.
|
||||||
|
node = this.encodeTableSeq[SEQ_START-bucket[low]];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// There was no sequence object - allocate a new one.
|
||||||
|
node = {};
|
||||||
|
if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.
|
||||||
|
bucket[low] = SEQ_START - this.encodeTableSeq.length;
|
||||||
|
this.encodeTableSeq.push(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Traverse the character tree, allocating new nodes as needed.
|
||||||
|
for (var j = 1; j < seq.length-1; j++) {
|
||||||
|
var oldVal = node[uCode];
|
||||||
|
if (typeof oldVal === 'object')
|
||||||
|
node = oldVal;
|
||||||
|
else {
|
||||||
|
node = node[uCode] = {}
|
||||||
|
if (oldVal !== undefined)
|
||||||
|
node[DEF_CHAR] = oldVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the leaf to given dbcsCode.
|
||||||
|
uCode = seq[seq.length-1];
|
||||||
|
node[uCode] = dbcsCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
|
||||||
|
var node = this.decodeTables[nodeIdx];
|
||||||
|
for (var i = 0; i < 0x100; i++) {
|
||||||
|
var uCode = node[i];
|
||||||
|
var mbCode = prefix + i;
|
||||||
|
if (skipEncodeChars[mbCode])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (uCode >= 0)
|
||||||
|
this._setEncodeChar(uCode, mbCode);
|
||||||
|
else if (uCode <= NODE_START)
|
||||||
|
this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);
|
||||||
|
else if (uCode <= SEQ_START)
|
||||||
|
this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// == Encoder ==================================================================
|
||||||
|
|
||||||
|
function DBCSEncoder(options, codec) {
|
||||||
|
// Encoder state
|
||||||
|
this.leadSurrogate = -1;
|
||||||
|
this.seqObj = undefined;
|
||||||
|
|
||||||
|
// Static data
|
||||||
|
this.encodeTable = codec.encodeTable;
|
||||||
|
this.encodeTableSeq = codec.encodeTableSeq;
|
||||||
|
this.defaultCharSingleByte = codec.defCharSB;
|
||||||
|
this.gb18030 = codec.gb18030;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSEncoder.prototype.write = function(str) {
|
||||||
|
var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),
|
||||||
|
leadSurrogate = this.leadSurrogate,
|
||||||
|
seqObj = this.seqObj, nextChar = -1,
|
||||||
|
i = 0, j = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
// 0. Get next character.
|
||||||
|
if (nextChar === -1) {
|
||||||
|
if (i == str.length) break;
|
||||||
|
var uCode = str.charCodeAt(i++);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var uCode = nextChar;
|
||||||
|
nextChar = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. Handle surrogates.
|
||||||
|
if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.
|
||||||
|
if (uCode < 0xDC00) { // We've got lead surrogate.
|
||||||
|
if (leadSurrogate === -1) {
|
||||||
|
leadSurrogate = uCode;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
leadSurrogate = uCode;
|
||||||
|
// Double lead surrogate found.
|
||||||
|
uCode = UNASSIGNED;
|
||||||
|
}
|
||||||
|
} else { // We've got trail surrogate.
|
||||||
|
if (leadSurrogate !== -1) {
|
||||||
|
uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
|
||||||
|
leadSurrogate = -1;
|
||||||
|
} else {
|
||||||
|
// Incomplete surrogate pair - only trail surrogate found.
|
||||||
|
uCode = UNASSIGNED;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (leadSurrogate !== -1) {
|
||||||
|
// Incomplete surrogate pair - only lead surrogate found.
|
||||||
|
nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.
|
||||||
|
leadSurrogate = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Convert uCode character.
|
||||||
|
var dbcsCode = UNASSIGNED;
|
||||||
|
if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
|
||||||
|
var resCode = seqObj[uCode];
|
||||||
|
if (typeof resCode === 'object') { // Sequence continues.
|
||||||
|
seqObj = resCode;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (typeof resCode == 'number') { // Sequence finished. Write it.
|
||||||
|
dbcsCode = resCode;
|
||||||
|
|
||||||
|
} else if (resCode == undefined) { // Current character is not part of the sequence.
|
||||||
|
|
||||||
|
// Try default character for this sequence
|
||||||
|
resCode = seqObj[DEF_CHAR];
|
||||||
|
if (resCode !== undefined) {
|
||||||
|
dbcsCode = resCode; // Found. Write it.
|
||||||
|
nextChar = uCode; // Current character will be written too in the next iteration.
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// TODO: What if we have no default? (resCode == undefined)
|
||||||
|
// Then, we should write first char of the sequence as-is and try the rest recursively.
|
||||||
|
// Didn't do it for now because no encoding has this situation yet.
|
||||||
|
// Currently, just skip the sequence and write current char.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
seqObj = undefined;
|
||||||
|
}
|
||||||
|
else if (uCode >= 0) { // Regular character
|
||||||
|
var subtable = this.encodeTable[uCode >> 8];
|
||||||
|
if (subtable !== undefined)
|
||||||
|
dbcsCode = subtable[uCode & 0xFF];
|
||||||
|
|
||||||
|
if (dbcsCode <= SEQ_START) { // Sequence start
|
||||||
|
seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dbcsCode == UNASSIGNED && this.gb18030) {
|
||||||
|
// Use GB18030 algorithm to find character(s) to write.
|
||||||
|
var idx = findIdx(this.gb18030.uChars, uCode);
|
||||||
|
if (idx != -1) {
|
||||||
|
var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);
|
||||||
|
newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;
|
||||||
|
newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;
|
||||||
|
newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;
|
||||||
|
newBuf[j++] = 0x30 + dbcsCode;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Write dbcsCode character.
|
||||||
|
if (dbcsCode === UNASSIGNED)
|
||||||
|
dbcsCode = this.defaultCharSingleByte;
|
||||||
|
|
||||||
|
if (dbcsCode < 0x100) {
|
||||||
|
newBuf[j++] = dbcsCode;
|
||||||
|
}
|
||||||
|
else if (dbcsCode < 0x10000) {
|
||||||
|
newBuf[j++] = dbcsCode >> 8; // high byte
|
||||||
|
newBuf[j++] = dbcsCode & 0xFF; // low byte
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newBuf[j++] = dbcsCode >> 16;
|
||||||
|
newBuf[j++] = (dbcsCode >> 8) & 0xFF;
|
||||||
|
newBuf[j++] = dbcsCode & 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.seqObj = seqObj;
|
||||||
|
this.leadSurrogate = leadSurrogate;
|
||||||
|
return newBuf.slice(0, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSEncoder.prototype.end = function() {
|
||||||
|
if (this.leadSurrogate === -1 && this.seqObj === undefined)
|
||||||
|
return; // All clean. Most often case.
|
||||||
|
|
||||||
|
var newBuf = Buffer.alloc(10), j = 0;
|
||||||
|
|
||||||
|
if (this.seqObj) { // We're in the sequence.
|
||||||
|
var dbcsCode = this.seqObj[DEF_CHAR];
|
||||||
|
if (dbcsCode !== undefined) { // Write beginning of the sequence.
|
||||||
|
if (dbcsCode < 0x100) {
|
||||||
|
newBuf[j++] = dbcsCode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newBuf[j++] = dbcsCode >> 8; // high byte
|
||||||
|
newBuf[j++] = dbcsCode & 0xFF; // low byte
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See todo above.
|
||||||
|
}
|
||||||
|
this.seqObj = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.leadSurrogate !== -1) {
|
||||||
|
// Incomplete surrogate pair - only lead surrogate found.
|
||||||
|
newBuf[j++] = this.defaultCharSingleByte;
|
||||||
|
this.leadSurrogate = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newBuf.slice(0, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export for testing
|
||||||
|
DBCSEncoder.prototype.findIdx = findIdx;
|
||||||
|
|
||||||
|
|
||||||
|
// == Decoder ==================================================================
|
||||||
|
|
||||||
|
function DBCSDecoder(options, codec) {
|
||||||
|
// Decoder state
|
||||||
|
this.nodeIdx = 0;
|
||||||
|
this.prevBuf = Buffer.alloc(0);
|
||||||
|
|
||||||
|
// Static data
|
||||||
|
this.decodeTables = codec.decodeTables;
|
||||||
|
this.decodeTableSeq = codec.decodeTableSeq;
|
||||||
|
this.defaultCharUnicode = codec.defaultCharUnicode;
|
||||||
|
this.gb18030 = codec.gb18030;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSDecoder.prototype.write = function(buf) {
|
||||||
|
var newBuf = Buffer.alloc(buf.length*2),
|
||||||
|
nodeIdx = this.nodeIdx,
|
||||||
|
prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,
|
||||||
|
seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.
|
||||||
|
uCode;
|
||||||
|
|
||||||
|
if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.
|
||||||
|
prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);
|
||||||
|
|
||||||
|
for (var i = 0, j = 0; i < buf.length; i++) {
|
||||||
|
var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];
|
||||||
|
|
||||||
|
// Lookup in current trie node.
|
||||||
|
var uCode = this.decodeTables[nodeIdx][curByte];
|
||||||
|
|
||||||
|
if (uCode >= 0) {
|
||||||
|
// Normal character, just use it.
|
||||||
|
}
|
||||||
|
else if (uCode === UNASSIGNED) { // Unknown char.
|
||||||
|
// TODO: Callback with seq.
|
||||||
|
//var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
|
||||||
|
i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).
|
||||||
|
uCode = this.defaultCharUnicode.charCodeAt(0);
|
||||||
|
}
|
||||||
|
else if (uCode === GB18030_CODE) {
|
||||||
|
var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
|
||||||
|
var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);
|
||||||
|
var idx = findIdx(this.gb18030.gbChars, ptr);
|
||||||
|
uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];
|
||||||
|
}
|
||||||
|
else if (uCode <= NODE_START) { // Go to next trie node.
|
||||||
|
nodeIdx = NODE_START - uCode;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (uCode <= SEQ_START) { // Output a sequence of chars.
|
||||||
|
var seq = this.decodeTableSeq[SEQ_START - uCode];
|
||||||
|
for (var k = 0; k < seq.length - 1; k++) {
|
||||||
|
uCode = seq[k];
|
||||||
|
newBuf[j++] = uCode & 0xFF;
|
||||||
|
newBuf[j++] = uCode >> 8;
|
||||||
|
}
|
||||||
|
uCode = seq[seq.length-1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte);
|
||||||
|
|
||||||
|
// Write the character to buffer, handling higher planes using surrogate pair.
|
||||||
|
if (uCode > 0xFFFF) {
|
||||||
|
uCode -= 0x10000;
|
||||||
|
var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);
|
||||||
|
newBuf[j++] = uCodeLead & 0xFF;
|
||||||
|
newBuf[j++] = uCodeLead >> 8;
|
||||||
|
|
||||||
|
uCode = 0xDC00 + uCode % 0x400;
|
||||||
|
}
|
||||||
|
newBuf[j++] = uCode & 0xFF;
|
||||||
|
newBuf[j++] = uCode >> 8;
|
||||||
|
|
||||||
|
// Reset trie node.
|
||||||
|
nodeIdx = 0; seqStart = i+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.nodeIdx = nodeIdx;
|
||||||
|
this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);
|
||||||
|
return newBuf.slice(0, j).toString('ucs2');
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCSDecoder.prototype.end = function() {
|
||||||
|
var ret = '';
|
||||||
|
|
||||||
|
// Try to parse all remaining chars.
|
||||||
|
while (this.prevBuf.length > 0) {
|
||||||
|
// Skip 1 character in the buffer.
|
||||||
|
ret += this.defaultCharUnicode;
|
||||||
|
var buf = this.prevBuf.slice(1);
|
||||||
|
|
||||||
|
// Parse remaining as usual.
|
||||||
|
this.prevBuf = Buffer.alloc(0);
|
||||||
|
this.nodeIdx = 0;
|
||||||
|
if (buf.length > 0)
|
||||||
|
ret += this.write(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.nodeIdx = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Binary search for GB18030. Returns largest i such that table[i] <= val.
|
||||||
|
function findIdx(table, val) {
|
||||||
|
if (table[0] > val)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
var l = 0, r = table.length;
|
||||||
|
while (l < r-1) { // always table[l] <= val < table[r]
|
||||||
|
var mid = l + Math.floor((r-l+1)/2);
|
||||||
|
if (table[mid] <= val)
|
||||||
|
l = mid;
|
||||||
|
else
|
||||||
|
r = mid;
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
176
node_modules/iconv-lite/encodings/dbcs-data.js
generated
vendored
Normal file
176
node_modules/iconv-lite/encodings/dbcs-data.js
generated
vendored
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Description of supported double byte encodings and aliases.
|
||||||
|
// Tables are not require()-d until they are needed to speed up library load.
|
||||||
|
// require()-s are direct to support Browserify.
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
|
||||||
|
// == Japanese/ShiftJIS ====================================================
|
||||||
|
// All japanese encodings are based on JIS X set of standards:
|
||||||
|
// JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.
|
||||||
|
// JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes.
|
||||||
|
// Has several variations in 1978, 1983, 1990 and 1997.
|
||||||
|
// JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.
|
||||||
|
// JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.
|
||||||
|
// 2 planes, first is superset of 0208, second - revised 0212.
|
||||||
|
// Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)
|
||||||
|
|
||||||
|
// Byte encodings are:
|
||||||
|
// * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte
|
||||||
|
// encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.
|
||||||
|
// Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.
|
||||||
|
// * EUC-JP: Up to 3 bytes per character. Used mostly on *nixes.
|
||||||
|
// 0x00-0x7F - lower part of 0201
|
||||||
|
// 0x8E, 0xA1-0xDF - upper part of 0201
|
||||||
|
// (0xA1-0xFE)x2 - 0208 plane (94x94).
|
||||||
|
// 0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).
|
||||||
|
// * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.
|
||||||
|
// Used as-is in ISO2022 family.
|
||||||
|
// * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII,
|
||||||
|
// 0201-1976 Roman, 0208-1978, 0208-1983.
|
||||||
|
// * ISO2022-JP-1: Adds esc seq for 0212-1990.
|
||||||
|
// * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.
|
||||||
|
// * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.
|
||||||
|
// * ISO2022-JP-2004: Adds 0213-2004 Plane 1.
|
||||||
|
//
|
||||||
|
// After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.
|
||||||
|
//
|
||||||
|
// Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html
|
||||||
|
|
||||||
|
'shiftjis': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/shiftjis.json') },
|
||||||
|
encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
|
||||||
|
encodeSkipVals: [{from: 0xED40, to: 0xF940}],
|
||||||
|
},
|
||||||
|
'csshiftjis': 'shiftjis',
|
||||||
|
'mskanji': 'shiftjis',
|
||||||
|
'sjis': 'shiftjis',
|
||||||
|
'windows31j': 'shiftjis',
|
||||||
|
'ms31j': 'shiftjis',
|
||||||
|
'xsjis': 'shiftjis',
|
||||||
|
'windows932': 'shiftjis',
|
||||||
|
'ms932': 'shiftjis',
|
||||||
|
'932': 'shiftjis',
|
||||||
|
'cp932': 'shiftjis',
|
||||||
|
|
||||||
|
'eucjp': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/eucjp.json') },
|
||||||
|
encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
|
||||||
|
},
|
||||||
|
|
||||||
|
// TODO: KDDI extension to Shift_JIS
|
||||||
|
// TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.
|
||||||
|
// TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.
|
||||||
|
|
||||||
|
|
||||||
|
// == Chinese/GBK ==========================================================
|
||||||
|
// http://en.wikipedia.org/wiki/GBK
|
||||||
|
// We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder
|
||||||
|
|
||||||
|
// Oldest GB2312 (1981, ~7600 chars) is a subset of CP936
|
||||||
|
'gb2312': 'cp936',
|
||||||
|
'gb231280': 'cp936',
|
||||||
|
'gb23121980': 'cp936',
|
||||||
|
'csgb2312': 'cp936',
|
||||||
|
'csiso58gb231280': 'cp936',
|
||||||
|
'euccn': 'cp936',
|
||||||
|
|
||||||
|
// Microsoft's CP936 is a subset and approximation of GBK.
|
||||||
|
'windows936': 'cp936',
|
||||||
|
'ms936': 'cp936',
|
||||||
|
'936': 'cp936',
|
||||||
|
'cp936': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/cp936.json') },
|
||||||
|
},
|
||||||
|
|
||||||
|
// GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.
|
||||||
|
'gbk': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
|
||||||
|
},
|
||||||
|
'xgbk': 'gbk',
|
||||||
|
'isoir58': 'gbk',
|
||||||
|
|
||||||
|
// GB18030 is an algorithmic extension of GBK.
|
||||||
|
// Main source: https://www.w3.org/TR/encoding/#gbk-encoder
|
||||||
|
// http://icu-project.org/docs/papers/gb18030.html
|
||||||
|
// http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
|
||||||
|
// http://www.khngai.com/chinese/charmap/tblgbk.php?page=0
|
||||||
|
'gb18030': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
|
||||||
|
gb18030: function() { return require('./tables/gb18030-ranges.json') },
|
||||||
|
encodeSkipVals: [0x80],
|
||||||
|
encodeAdd: {'€': 0xA2E3},
|
||||||
|
},
|
||||||
|
|
||||||
|
'chinese': 'gb18030',
|
||||||
|
|
||||||
|
|
||||||
|
// == Korean ===============================================================
|
||||||
|
// EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.
|
||||||
|
'windows949': 'cp949',
|
||||||
|
'ms949': 'cp949',
|
||||||
|
'949': 'cp949',
|
||||||
|
'cp949': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/cp949.json') },
|
||||||
|
},
|
||||||
|
|
||||||
|
'cseuckr': 'cp949',
|
||||||
|
'csksc56011987': 'cp949',
|
||||||
|
'euckr': 'cp949',
|
||||||
|
'isoir149': 'cp949',
|
||||||
|
'korean': 'cp949',
|
||||||
|
'ksc56011987': 'cp949',
|
||||||
|
'ksc56011989': 'cp949',
|
||||||
|
'ksc5601': 'cp949',
|
||||||
|
|
||||||
|
|
||||||
|
// == Big5/Taiwan/Hong Kong ================================================
|
||||||
|
// There are lots of tables for Big5 and cp950. Please see the following links for history:
|
||||||
|
// http://moztw.org/docs/big5/ http://www.haible.de/bruno/charsets/conversion-tables/Big5.html
|
||||||
|
// Variations, in roughly number of defined chars:
|
||||||
|
// * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT
|
||||||
|
// * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/
|
||||||
|
// * Big5-2003 (Taiwan standard) almost superset of cp950.
|
||||||
|
// * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.
|
||||||
|
// * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard.
|
||||||
|
// many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.
|
||||||
|
// Plus, it has 4 combining sequences.
|
||||||
|
// Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299
|
||||||
|
// because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.
|
||||||
|
// Implementations are not consistent within browsers; sometimes labeled as just big5.
|
||||||
|
// MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.
|
||||||
|
// Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31
|
||||||
|
// In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.
|
||||||
|
// Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt
|
||||||
|
// http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt
|
||||||
|
//
|
||||||
|
// Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder
|
||||||
|
// Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.
|
||||||
|
|
||||||
|
'windows950': 'cp950',
|
||||||
|
'ms950': 'cp950',
|
||||||
|
'950': 'cp950',
|
||||||
|
'cp950': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/cp950.json') },
|
||||||
|
},
|
||||||
|
|
||||||
|
// Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.
|
||||||
|
'big5': 'big5hkscs',
|
||||||
|
'big5hkscs': {
|
||||||
|
type: '_dbcs',
|
||||||
|
table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },
|
||||||
|
encodeSkipVals: [0xa2cc],
|
||||||
|
},
|
||||||
|
|
||||||
|
'cnbig5': 'big5hkscs',
|
||||||
|
'csbig5': 'big5hkscs',
|
||||||
|
'xxbig5': 'big5hkscs',
|
||||||
|
};
|
||||||
22
node_modules/iconv-lite/encodings/index.js
generated
vendored
Normal file
22
node_modules/iconv-lite/encodings/index.js
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Update this array if you add/rename/remove files in this directory.
|
||||||
|
// We support Browserify by skipping automatic module discovery and requiring modules directly.
|
||||||
|
var modules = [
|
||||||
|
require("./internal"),
|
||||||
|
require("./utf16"),
|
||||||
|
require("./utf7"),
|
||||||
|
require("./sbcs-codec"),
|
||||||
|
require("./sbcs-data"),
|
||||||
|
require("./sbcs-data-generated"),
|
||||||
|
require("./dbcs-codec"),
|
||||||
|
require("./dbcs-data"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// Put all encoding/alias/codec definitions to single object and export it.
|
||||||
|
for (var i = 0; i < modules.length; i++) {
|
||||||
|
var module = modules[i];
|
||||||
|
for (var enc in module)
|
||||||
|
if (Object.prototype.hasOwnProperty.call(module, enc))
|
||||||
|
exports[enc] = module[enc];
|
||||||
|
}
|
||||||
188
node_modules/iconv-lite/encodings/internal.js
generated
vendored
Normal file
188
node_modules/iconv-lite/encodings/internal.js
generated
vendored
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
"use strict";
|
||||||
|
var Buffer = require("safer-buffer").Buffer;
|
||||||
|
|
||||||
|
// Export Node.js internal encodings.
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// Encodings
|
||||||
|
utf8: { type: "_internal", bomAware: true},
|
||||||
|
cesu8: { type: "_internal", bomAware: true},
|
||||||
|
unicode11utf8: "utf8",
|
||||||
|
|
||||||
|
ucs2: { type: "_internal", bomAware: true},
|
||||||
|
utf16le: "ucs2",
|
||||||
|
|
||||||
|
binary: { type: "_internal" },
|
||||||
|
base64: { type: "_internal" },
|
||||||
|
hex: { type: "_internal" },
|
||||||
|
|
||||||
|
// Codec.
|
||||||
|
_internal: InternalCodec,
|
||||||
|
};
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
function InternalCodec(codecOptions, iconv) {
|
||||||
|
this.enc = codecOptions.encodingName;
|
||||||
|
this.bomAware = codecOptions.bomAware;
|
||||||
|
|
||||||
|
if (this.enc === "base64")
|
||||||
|
this.encoder = InternalEncoderBase64;
|
||||||
|
else if (this.enc === "cesu8") {
|
||||||
|
this.enc = "utf8"; // Use utf8 for decoding.
|
||||||
|
this.encoder = InternalEncoderCesu8;
|
||||||
|
|
||||||
|
// Add decoder for versions of Node not supporting CESU-8
|
||||||
|
if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '💩') {
|
||||||
|
this.decoder = InternalDecoderCesu8;
|
||||||
|
this.defaultCharUnicode = iconv.defaultCharUnicode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalCodec.prototype.encoder = InternalEncoder;
|
||||||
|
InternalCodec.prototype.decoder = InternalDecoder;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// We use node.js internal decoder. Its signature is the same as ours.
|
||||||
|
var StringDecoder = require('string_decoder').StringDecoder;
|
||||||
|
|
||||||
|
if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
|
||||||
|
StringDecoder.prototype.end = function() {};
|
||||||
|
|
||||||
|
|
||||||
|
function InternalDecoder(options, codec) {
|
||||||
|
StringDecoder.call(this, codec.enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalDecoder.prototype = StringDecoder.prototype;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Encoder is mostly trivial
|
||||||
|
|
||||||
|
function InternalEncoder(options, codec) {
|
||||||
|
this.enc = codec.enc;
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalEncoder.prototype.write = function(str) {
|
||||||
|
return Buffer.from(str, this.enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalEncoder.prototype.end = function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Except base64 encoder, which must keep its state.
|
||||||
|
|
||||||
|
function InternalEncoderBase64(options, codec) {
|
||||||
|
this.prevStr = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalEncoderBase64.prototype.write = function(str) {
|
||||||
|
str = this.prevStr + str;
|
||||||
|
var completeQuads = str.length - (str.length % 4);
|
||||||
|
this.prevStr = str.slice(completeQuads);
|
||||||
|
str = str.slice(0, completeQuads);
|
||||||
|
|
||||||
|
return Buffer.from(str, "base64");
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalEncoderBase64.prototype.end = function() {
|
||||||
|
return Buffer.from(this.prevStr, "base64");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// CESU-8 encoder is also special.
|
||||||
|
|
||||||
|
function InternalEncoderCesu8(options, codec) {
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalEncoderCesu8.prototype.write = function(str) {
|
||||||
|
var buf = Buffer.alloc(str.length * 3), bufIdx = 0;
|
||||||
|
for (var i = 0; i < str.length; i++) {
|
||||||
|
var charCode = str.charCodeAt(i);
|
||||||
|
// Naive implementation, but it works because CESU-8 is especially easy
|
||||||
|
// to convert from UTF-16 (which all JS strings are encoded in).
|
||||||
|
if (charCode < 0x80)
|
||||||
|
buf[bufIdx++] = charCode;
|
||||||
|
else if (charCode < 0x800) {
|
||||||
|
buf[bufIdx++] = 0xC0 + (charCode >>> 6);
|
||||||
|
buf[bufIdx++] = 0x80 + (charCode & 0x3f);
|
||||||
|
}
|
||||||
|
else { // charCode will always be < 0x10000 in javascript.
|
||||||
|
buf[bufIdx++] = 0xE0 + (charCode >>> 12);
|
||||||
|
buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);
|
||||||
|
buf[bufIdx++] = 0x80 + (charCode & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf.slice(0, bufIdx);
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalEncoderCesu8.prototype.end = function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// CESU-8 decoder is not implemented in Node v4.0+
|
||||||
|
|
||||||
|
function InternalDecoderCesu8(options, codec) {
|
||||||
|
this.acc = 0;
|
||||||
|
this.contBytes = 0;
|
||||||
|
this.accBytes = 0;
|
||||||
|
this.defaultCharUnicode = codec.defaultCharUnicode;
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalDecoderCesu8.prototype.write = function(buf) {
|
||||||
|
var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes,
|
||||||
|
res = '';
|
||||||
|
for (var i = 0; i < buf.length; i++) {
|
||||||
|
var curByte = buf[i];
|
||||||
|
if ((curByte & 0xC0) !== 0x80) { // Leading byte
|
||||||
|
if (contBytes > 0) { // Previous code is invalid
|
||||||
|
res += this.defaultCharUnicode;
|
||||||
|
contBytes = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curByte < 0x80) { // Single-byte code
|
||||||
|
res += String.fromCharCode(curByte);
|
||||||
|
} else if (curByte < 0xE0) { // Two-byte code
|
||||||
|
acc = curByte & 0x1F;
|
||||||
|
contBytes = 1; accBytes = 1;
|
||||||
|
} else if (curByte < 0xF0) { // Three-byte code
|
||||||
|
acc = curByte & 0x0F;
|
||||||
|
contBytes = 2; accBytes = 1;
|
||||||
|
} else { // Four or more are not supported for CESU-8.
|
||||||
|
res += this.defaultCharUnicode;
|
||||||
|
}
|
||||||
|
} else { // Continuation byte
|
||||||
|
if (contBytes > 0) { // We're waiting for it.
|
||||||
|
acc = (acc << 6) | (curByte & 0x3f);
|
||||||
|
contBytes--; accBytes++;
|
||||||
|
if (contBytes === 0) {
|
||||||
|
// Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)
|
||||||
|
if (accBytes === 2 && acc < 0x80 && acc > 0)
|
||||||
|
res += this.defaultCharUnicode;
|
||||||
|
else if (accBytes === 3 && acc < 0x800)
|
||||||
|
res += this.defaultCharUnicode;
|
||||||
|
else
|
||||||
|
// Actually add character.
|
||||||
|
res += String.fromCharCode(acc);
|
||||||
|
}
|
||||||
|
} else { // Unexpected continuation byte
|
||||||
|
res += this.defaultCharUnicode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalDecoderCesu8.prototype.end = function() {
|
||||||
|
var res = 0;
|
||||||
|
if (this.contBytes > 0)
|
||||||
|
res += this.defaultCharUnicode;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
72
node_modules/iconv-lite/encodings/sbcs-codec.js
generated
vendored
Normal file
72
node_modules/iconv-lite/encodings/sbcs-codec.js
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
"use strict";
|
||||||
|
var Buffer = require("safer-buffer").Buffer;
|
||||||
|
|
||||||
|
// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that
|
||||||
|
// correspond to encoded bytes (if 128 - then lower half is ASCII).
|
||||||
|
|
||||||
|
exports._sbcs = SBCSCodec;
|
||||||
|
function SBCSCodec(codecOptions, iconv) {
|
||||||
|
if (!codecOptions)
|
||||||
|
throw new Error("SBCS codec is called without the data.")
|
||||||
|
|
||||||
|
// Prepare char buffer for decoding.
|
||||||
|
if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))
|
||||||
|
throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)");
|
||||||
|
|
||||||
|
if (codecOptions.chars.length === 128) {
|
||||||
|
var asciiString = "";
|
||||||
|
for (var i = 0; i < 128; i++)
|
||||||
|
asciiString += String.fromCharCode(i);
|
||||||
|
codecOptions.chars = asciiString + codecOptions.chars;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');
|
||||||
|
|
||||||
|
// Encoding buffer.
|
||||||
|
var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));
|
||||||
|
|
||||||
|
for (var i = 0; i < codecOptions.chars.length; i++)
|
||||||
|
encodeBuf[codecOptions.chars.charCodeAt(i)] = i;
|
||||||
|
|
||||||
|
this.encodeBuf = encodeBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
SBCSCodec.prototype.encoder = SBCSEncoder;
|
||||||
|
SBCSCodec.prototype.decoder = SBCSDecoder;
|
||||||
|
|
||||||
|
|
||||||
|
function SBCSEncoder(options, codec) {
|
||||||
|
this.encodeBuf = codec.encodeBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
SBCSEncoder.prototype.write = function(str) {
|
||||||
|
var buf = Buffer.alloc(str.length);
|
||||||
|
for (var i = 0; i < str.length; i++)
|
||||||
|
buf[i] = this.encodeBuf[str.charCodeAt(i)];
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
SBCSEncoder.prototype.end = function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function SBCSDecoder(options, codec) {
|
||||||
|
this.decodeBuf = codec.decodeBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
SBCSDecoder.prototype.write = function(buf) {
|
||||||
|
// Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
|
||||||
|
var decodeBuf = this.decodeBuf;
|
||||||
|
var newBuf = Buffer.alloc(buf.length*2);
|
||||||
|
var idx1 = 0, idx2 = 0;
|
||||||
|
for (var i = 0; i < buf.length; i++) {
|
||||||
|
idx1 = buf[i]*2; idx2 = i*2;
|
||||||
|
newBuf[idx2] = decodeBuf[idx1];
|
||||||
|
newBuf[idx2+1] = decodeBuf[idx1+1];
|
||||||
|
}
|
||||||
|
return newBuf.toString('ucs2');
|
||||||
|
}
|
||||||
|
|
||||||
|
SBCSDecoder.prototype.end = function() {
|
||||||
|
}
|
||||||
451
node_modules/iconv-lite/encodings/sbcs-data-generated.js
generated
vendored
Normal file
451
node_modules/iconv-lite/encodings/sbcs-data-generated.js
generated
vendored
Normal file
@@ -0,0 +1,451 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.
|
||||||
|
module.exports = {
|
||||||
|
"437": "cp437",
|
||||||
|
"737": "cp737",
|
||||||
|
"775": "cp775",
|
||||||
|
"850": "cp850",
|
||||||
|
"852": "cp852",
|
||||||
|
"855": "cp855",
|
||||||
|
"856": "cp856",
|
||||||
|
"857": "cp857",
|
||||||
|
"858": "cp858",
|
||||||
|
"860": "cp860",
|
||||||
|
"861": "cp861",
|
||||||
|
"862": "cp862",
|
||||||
|
"863": "cp863",
|
||||||
|
"864": "cp864",
|
||||||
|
"865": "cp865",
|
||||||
|
"866": "cp866",
|
||||||
|
"869": "cp869",
|
||||||
|
"874": "windows874",
|
||||||
|
"922": "cp922",
|
||||||
|
"1046": "cp1046",
|
||||||
|
"1124": "cp1124",
|
||||||
|
"1125": "cp1125",
|
||||||
|
"1129": "cp1129",
|
||||||
|
"1133": "cp1133",
|
||||||
|
"1161": "cp1161",
|
||||||
|
"1162": "cp1162",
|
||||||
|
"1163": "cp1163",
|
||||||
|
"1250": "windows1250",
|
||||||
|
"1251": "windows1251",
|
||||||
|
"1252": "windows1252",
|
||||||
|
"1253": "windows1253",
|
||||||
|
"1254": "windows1254",
|
||||||
|
"1255": "windows1255",
|
||||||
|
"1256": "windows1256",
|
||||||
|
"1257": "windows1257",
|
||||||
|
"1258": "windows1258",
|
||||||
|
"28591": "iso88591",
|
||||||
|
"28592": "iso88592",
|
||||||
|
"28593": "iso88593",
|
||||||
|
"28594": "iso88594",
|
||||||
|
"28595": "iso88595",
|
||||||
|
"28596": "iso88596",
|
||||||
|
"28597": "iso88597",
|
||||||
|
"28598": "iso88598",
|
||||||
|
"28599": "iso88599",
|
||||||
|
"28600": "iso885910",
|
||||||
|
"28601": "iso885911",
|
||||||
|
"28603": "iso885913",
|
||||||
|
"28604": "iso885914",
|
||||||
|
"28605": "iso885915",
|
||||||
|
"28606": "iso885916",
|
||||||
|
"windows874": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<><E282AC><EFBFBD><EFBFBD>…<EFBFBD><E280A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>‘’“”•–—<E28093><E28094><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู<E0B8B9><E0B8BA><EFBFBD><EFBFBD>฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛<E0B99A><E0B99B><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"win874": "windows874",
|
||||||
|
"cp874": "windows874",
|
||||||
|
"windows1250": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<>‚<EFBFBD>„…†‡<E280A0>‰Š‹ŚŤŽŹ<C5BD>‘’“”•–—<E28093>™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
|
||||||
|
},
|
||||||
|
"win1250": "windows1250",
|
||||||
|
"cp1250": "windows1250",
|
||||||
|
"windows1251": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—<E28093>™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
|
||||||
|
},
|
||||||
|
"win1251": "windows1251",
|
||||||
|
"cp1251": "windows1251",
|
||||||
|
"windows1252": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<>‚ƒ„…†‡ˆ‰Š‹Œ<E280B9>Ž<EFBFBD><C5BD>‘’“”•–—˜™š›œ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
|
||||||
|
},
|
||||||
|
"win1252": "windows1252",
|
||||||
|
"cp1252": "windows1252",
|
||||||
|
"windows1253": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<>‚ƒ„…†‡<E280A0>‰<EFBFBD>‹<EFBFBD><E280B9><EFBFBD><EFBFBD><EFBFBD>‘’“”•–—<E28093>™<EFBFBD>›<EFBFBD><E280BA><EFBFBD><EFBFBD> ΅Ά£¤¥¦§¨©<C2A8>«¬®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ<CEA0>ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ<CF8D>"
|
||||||
|
},
|
||||||
|
"win1253": "windows1253",
|
||||||
|
"cp1253": "windows1253",
|
||||||
|
"windows1254": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<>‚ƒ„…†‡ˆ‰Š‹Œ<E280B9><C592><EFBFBD><EFBFBD>‘’“”•–—˜™š›œ<E280BA><C593>Ÿ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
|
||||||
|
},
|
||||||
|
"win1254": "windows1254",
|
||||||
|
"cp1254": "windows1254",
|
||||||
|
"windows1255": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<>‚ƒ„…†‡ˆ‰<CB86>‹<EFBFBD><E280B9><EFBFBD><EFBFBD><EFBFBD>‘’“”•–—˜™<CB9C>›<EFBFBD><E280BA><EFBFBD><EFBFBD> ¡¢£₪¥¦§¨©×«¬®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״<D7B3><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>אבגדהוזחטיךכלםמןנסעףפץצקרשת<D7A9><D7AA><E2808E>"
|
||||||
|
},
|
||||||
|
"win1255": "windows1255",
|
||||||
|
"cp1255": "windows1255",
|
||||||
|
"windows1256": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œں ،¢£¤¥¦§¨©ھ«¬®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûüے"
|
||||||
|
},
|
||||||
|
"win1256": "windows1256",
|
||||||
|
"cp1256": "windows1256",
|
||||||
|
"windows1257": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<>‚<EFBFBD>„…†‡<E280A0>‰<EFBFBD>‹<EFBFBD>¨ˇ¸<CB87>‘’“”•–—<E28093>™<EFBFBD>›<EFBFBD>¯˛<C2AF> <EFBFBD>¢£¤<C2A3>¦§Ø©Ŗ«¬®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙"
|
||||||
|
},
|
||||||
|
"win1257": "windows1257",
|
||||||
|
"cp1257": "windows1257",
|
||||||
|
"windows1258": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€<>‚ƒ„…†‡ˆ‰<CB86>‹Œ<E280B9><C592><EFBFBD><EFBFBD>‘’“”•–—˜™<CB9C>›œ<E280BA><C593>Ÿ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
|
||||||
|
},
|
||||||
|
"win1258": "windows1258",
|
||||||
|
"cp1258": "windows1258",
|
||||||
|
"iso88591": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
|
||||||
|
},
|
||||||
|
"cp28591": "iso88591",
|
||||||
|
"iso88592": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
Ą˘Ł¤ĽŚ§¨ŠŞŤŹŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
|
||||||
|
},
|
||||||
|
"cp28592": "iso88592",
|
||||||
|
"iso88593": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
Ħ˘£¤<C2A3>Ĥ§¨İŞĞĴ<C4B4>ݰħ²³´µĥ·¸ışğĵ½<C4B5>żÀÁÂ<C381>ÄĊĈÇÈÉÊËÌÍÎÏ<C38E>ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ<C3A1>äċĉçèéêëìíîï<C3AE>ñòóôġö÷ĝùúûüŭŝ˙"
|
||||||
|
},
|
||||||
|
"cp28593": "iso88593",
|
||||||
|
"iso88594": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
ĄĸŖ¤Ĩϧ¨ŠĒĢŦޝ°ą˛ŗ´ĩšēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖרŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙"
|
||||||
|
},
|
||||||
|
"cp28594": "iso88594",
|
||||||
|
"iso88595": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
ЁЂЃЄЅІЇЈЉЊЋЌЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ"
|
||||||
|
},
|
||||||
|
"cp28595": "iso88595",
|
||||||
|
"iso88596": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
<C29F><C2A0><EFBFBD>¤<EFBFBD><C2A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>،<D88C><C2AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>؛<EFBFBD><D89B><EFBFBD>؟<EFBFBD>ءآأؤإئابةتثجحخدذرزسشصضطظعغ<D8B9><D8BA><EFBFBD><EFBFBD><EFBFBD>ـفقكلمنهوىيًٌٍَُِّْ<D991><D992><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"cp28596": "iso88596",
|
||||||
|
"iso88597": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
‘’£€₯¦§¨©ͺ«¬<C2AC>―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ<CEA0>ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ<CF8D>"
|
||||||
|
},
|
||||||
|
"cp28597": "iso88597",
|
||||||
|
"iso88598": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
<C29F>¢£¤¥¦§¨©×«¬®¯°±²³´µ¶·¸¹÷»¼½¾<C2BD><C2BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>‗אבגדהוזחטיךכלםמןנסעףפץצקרשת<D7A9><D7AA><E2808E>"
|
||||||
|
},
|
||||||
|
"cp28598": "iso88598",
|
||||||
|
"iso88599": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
|
||||||
|
},
|
||||||
|
"cp28599": "iso88599",
|
||||||
|
"iso885910": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
ĄĒĢĪĨͧĻĐŠŦŽŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ"
|
||||||
|
},
|
||||||
|
"cp28600": "iso885910",
|
||||||
|
"iso885911": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู<E0B8B9><E0B8BA><EFBFBD><EFBFBD>฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛<E0B99A><E0B99B><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"cp28601": "iso885911",
|
||||||
|
"iso885913": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
”¢£¤„¦§Ø©Ŗ«¬®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’"
|
||||||
|
},
|
||||||
|
"cp28603": "iso885913",
|
||||||
|
"iso885914": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ"
|
||||||
|
},
|
||||||
|
"cp28604": "iso885914",
|
||||||
|
"iso885915": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
¡¢£€¥Š§š©ª«¬®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
|
||||||
|
},
|
||||||
|
"cp28605": "iso885915",
|
||||||
|
"iso885916": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
ĄąŁ€„Чš©Ș«ŹźŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ"
|
||||||
|
},
|
||||||
|
"cp28606": "iso885916",
|
||||||
|
"cp437": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
"ibm437": "cp437",
|
||||||
|
"csibm437": "cp437",
|
||||||
|
"cp737": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
"ibm737": "cp737",
|
||||||
|
"csibm737": "cp737",
|
||||||
|
"cp775": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’±“¾¶§÷„°∙·¹³²■ "
|
||||||
|
},
|
||||||
|
"ibm775": "cp775",
|
||||||
|
"csibm775": "cp775",
|
||||||
|
"cp850": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´±‗¾¶§÷¸°¨·¹³²■ "
|
||||||
|
},
|
||||||
|
"ibm850": "cp850",
|
||||||
|
"csibm850": "cp850",
|
||||||
|
"cp852": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´˝˛ˇ˘§÷¸°¨˙űŘř■ "
|
||||||
|
},
|
||||||
|
"ibm852": "cp852",
|
||||||
|
"csibm852": "cp852",
|
||||||
|
"cp855": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№ыЫзЗшШэЭщЩчЧ§■ "
|
||||||
|
},
|
||||||
|
"ibm855": "cp855",
|
||||||
|
"csibm855": "cp855",
|
||||||
|
"cp856": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת<D7A9>£<EFBFBD>×<EFBFBD><C397><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>®¬½¼<C2BD>«»░▒▓│┤<E29482><E294A4><EFBFBD>©╣║╗╝¢¥┐└┴┬├─┼<E29480><E294BC>╚╔╩╦╠═╬¤<E295AC><C2A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>┘┌█▄¦<E29684>▀<EFBFBD><E29680><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¯´±‗¾¶§÷¸°¨·¹³²■ "
|
||||||
|
},
|
||||||
|
"ibm856": "cp856",
|
||||||
|
"csibm856": "cp856",
|
||||||
|
"cp857": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ<C38B>ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ<C395>×ÚÛÙìÿ¯´±<C2AD>¾¶§÷¸°¨·¹³²■ "
|
||||||
|
},
|
||||||
|
"ibm857": "cp857",
|
||||||
|
"csibm857": "cp857",
|
||||||
|
"cp858": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´±‗¾¶§÷¸°¨·¹³²■ "
|
||||||
|
},
|
||||||
|
"ibm858": "cp858",
|
||||||
|
"csibm858": "cp858",
|
||||||
|
"cp860": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
"ibm860": "cp860",
|
||||||
|
"csibm860": "cp860",
|
||||||
|
"cp861": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
"ibm861": "cp861",
|
||||||
|
"csibm861": "cp861",
|
||||||
|
"cp862": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
"ibm862": "cp862",
|
||||||
|
"csibm862": "cp862",
|
||||||
|
"cp863": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
"ibm863": "cp863",
|
||||||
|
"csibm863": "cp863",
|
||||||
|
"cp864": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ<EFBBB7><EFBBB8>ﻻﻼ<EFBBBB> ﺂ£¤ﺄ<C2A4><EFBA84>ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■<EFBBB1>"
|
||||||
|
},
|
||||||
|
"ibm864": "cp864",
|
||||||
|
"csibm864": "cp864",
|
||||||
|
"cp865": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
"ibm865": "cp865",
|
||||||
|
"csibm865": "cp865",
|
||||||
|
"cp866": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ "
|
||||||
|
},
|
||||||
|
"ibm866": "cp866",
|
||||||
|
"csibm866": "cp866",
|
||||||
|
"cp869": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ά<EFBFBD>·¬¦‘’Έ―ΉΊΪΌ<CEAA><CE8C>ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄±υφχ§ψ΅°¨ωϋΰώ■ "
|
||||||
|
},
|
||||||
|
"ibm869": "cp869",
|
||||||
|
"csibm869": "cp869",
|
||||||
|
"cp922": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
¡¢£¤¥¦§¨©ª«¬®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖרÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ"
|
||||||
|
},
|
||||||
|
"ibm922": "cp922",
|
||||||
|
"csibm922": "cp922",
|
||||||
|
"cp1046": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ﺈ×÷ﹱ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ<EFBBAC>"
|
||||||
|
},
|
||||||
|
"ibm1046": "cp1046",
|
||||||
|
"csibm1046": "cp1046",
|
||||||
|
"cp1124": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
ЁЂҐЄЅІЇЈЉЊЋЌЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ"
|
||||||
|
},
|
||||||
|
"ibm1124": "cp1124",
|
||||||
|
"csibm1124": "cp1124",
|
||||||
|
"cp1125": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ "
|
||||||
|
},
|
||||||
|
"ibm1125": "cp1125",
|
||||||
|
"csibm1125": "cp1125",
|
||||||
|
"cp1129": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
¡¢£¤¥¦§œ©ª«¬®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
|
||||||
|
},
|
||||||
|
"ibm1129": "cp1129",
|
||||||
|
"csibm1129": "cp1129",
|
||||||
|
"cp1133": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ<E0BAAD><E0BAAE><EFBFBD>ຯະາຳິີຶືຸູຼັົຽ<E0BABB><E0BABD><EFBFBD>ເແໂໃໄ່້໊໋໌ໍໆ<E0BB8D>ໜໝ₭<E0BB9D><E282AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>໐໑໒໓໔໕໖໗໘໙<E0BB98><E0BB99>¢¬¦<C2AC>"
|
||||||
|
},
|
||||||
|
"ibm1133": "cp1133",
|
||||||
|
"csibm1133": "cp1133",
|
||||||
|
"cp1161": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ "
|
||||||
|
},
|
||||||
|
"ibm1161": "cp1161",
|
||||||
|
"csibm1161": "cp1161",
|
||||||
|
"cp1162": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "€…‘’“”•–— กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู<E0B8B9><E0B8BA><EFBFBD><EFBFBD>฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛<E0B99A><E0B99B><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"ibm1162": "cp1162",
|
||||||
|
"csibm1162": "cp1162",
|
||||||
|
"cp1163": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
¡¢£€¥¦§œ©ª«¬®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
|
||||||
|
},
|
||||||
|
"ibm1163": "cp1163",
|
||||||
|
"csibm1163": "cp1163",
|
||||||
|
"maccroatian": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈ƫȅ ÀÃÕŒœĐ—“”‘’÷◊<C3B7>©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ"
|
||||||
|
},
|
||||||
|
"maccyrillic": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
|
||||||
|
},
|
||||||
|
"macgreek": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ<CE90>"
|
||||||
|
},
|
||||||
|
"maciceland": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
|
||||||
|
},
|
||||||
|
"macroman": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
|
||||||
|
},
|
||||||
|
"macromania": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
|
||||||
|
},
|
||||||
|
"macthai": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "«»…“”<E2809D>•‘’<E28098> กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©<C2AE><C2A9><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"macturkish": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙ<C39B>ˆ˜¯˘˙˚¸˝˛ˇ"
|
||||||
|
},
|
||||||
|
"macukraine": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
|
||||||
|
},
|
||||||
|
"koi8r": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
|
||||||
|
},
|
||||||
|
"koi8u": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
|
||||||
|
},
|
||||||
|
"koi8ru": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
|
||||||
|
},
|
||||||
|
"koi8t": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "қғ‚Ғ„…†‡<E280A0>‰ҳ‹ҲҷҶ<D2B7>Қ‘’“”•–—<E28093>™<EFBFBD>›<EFBFBD><E280BA><EFBFBD><EFBFBD><EFBFBD>ӯӮё¤ӣ¦§<C2A6><C2A7><EFBFBD>«¬®<C2AD>°±²Ё<C2B2>Ӣ¶·<C2B6>№<EFBFBD>»<EFBFBD><C2BB><EFBFBD>©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
|
||||||
|
},
|
||||||
|
"armscii8": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
<C29F>և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚<D686>"
|
||||||
|
},
|
||||||
|
"rk1048": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—<E28093>™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
|
||||||
|
},
|
||||||
|
"tcvn": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÝỴ\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ"
|
||||||
|
},
|
||||||
|
"georgianacademy": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
|
||||||
|
},
|
||||||
|
"georgianps": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
|
||||||
|
},
|
||||||
|
"pt154": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
|
||||||
|
},
|
||||||
|
"viscii": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013Ỷ\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dỴ\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ"
|
||||||
|
},
|
||||||
|
"iso646cn": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾<E280BE><7F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"iso646jp": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾<E280BE><7F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"hproman8": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "
ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±<C2BB>"
|
||||||
|
},
|
||||||
|
"macintosh": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ<C393>ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
|
||||||
|
},
|
||||||
|
"ascii": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||||||
|
},
|
||||||
|
"tis620": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู<E0B8B9><E0B8BA><EFBFBD><EFBFBD>฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛<E0B99A><E0B99B><EFBFBD><EFBFBD>"
|
||||||
|
}
|
||||||
|
}
|
||||||
174
node_modules/iconv-lite/encodings/sbcs-data.js
generated
vendored
Normal file
174
node_modules/iconv-lite/encodings/sbcs-data.js
generated
vendored
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Manually added data to be used by sbcs codec in addition to generated one.
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// Not supported by iconv, not sure why.
|
||||||
|
"10029": "maccenteuro",
|
||||||
|
"maccenteuro": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ"
|
||||||
|
},
|
||||||
|
|
||||||
|
"808": "cp808",
|
||||||
|
"ibm808": "cp808",
|
||||||
|
"cp808": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ "
|
||||||
|
},
|
||||||
|
|
||||||
|
"mik": {
|
||||||
|
"type": "_sbcs",
|
||||||
|
"chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя└┴┬├─┼╣║╚╔╩╦╠═╬┐░▒▓│┤№§╗╝┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
|
||||||
|
},
|
||||||
|
|
||||||
|
// Aliases of generated encodings.
|
||||||
|
"ascii8bit": "ascii",
|
||||||
|
"usascii": "ascii",
|
||||||
|
"ansix34": "ascii",
|
||||||
|
"ansix341968": "ascii",
|
||||||
|
"ansix341986": "ascii",
|
||||||
|
"csascii": "ascii",
|
||||||
|
"cp367": "ascii",
|
||||||
|
"ibm367": "ascii",
|
||||||
|
"isoir6": "ascii",
|
||||||
|
"iso646us": "ascii",
|
||||||
|
"iso646irv": "ascii",
|
||||||
|
"us": "ascii",
|
||||||
|
|
||||||
|
"latin1": "iso88591",
|
||||||
|
"latin2": "iso88592",
|
||||||
|
"latin3": "iso88593",
|
||||||
|
"latin4": "iso88594",
|
||||||
|
"latin5": "iso88599",
|
||||||
|
"latin6": "iso885910",
|
||||||
|
"latin7": "iso885913",
|
||||||
|
"latin8": "iso885914",
|
||||||
|
"latin9": "iso885915",
|
||||||
|
"latin10": "iso885916",
|
||||||
|
|
||||||
|
"csisolatin1": "iso88591",
|
||||||
|
"csisolatin2": "iso88592",
|
||||||
|
"csisolatin3": "iso88593",
|
||||||
|
"csisolatin4": "iso88594",
|
||||||
|
"csisolatincyrillic": "iso88595",
|
||||||
|
"csisolatinarabic": "iso88596",
|
||||||
|
"csisolatingreek" : "iso88597",
|
||||||
|
"csisolatinhebrew": "iso88598",
|
||||||
|
"csisolatin5": "iso88599",
|
||||||
|
"csisolatin6": "iso885910",
|
||||||
|
|
||||||
|
"l1": "iso88591",
|
||||||
|
"l2": "iso88592",
|
||||||
|
"l3": "iso88593",
|
||||||
|
"l4": "iso88594",
|
||||||
|
"l5": "iso88599",
|
||||||
|
"l6": "iso885910",
|
||||||
|
"l7": "iso885913",
|
||||||
|
"l8": "iso885914",
|
||||||
|
"l9": "iso885915",
|
||||||
|
"l10": "iso885916",
|
||||||
|
|
||||||
|
"isoir14": "iso646jp",
|
||||||
|
"isoir57": "iso646cn",
|
||||||
|
"isoir100": "iso88591",
|
||||||
|
"isoir101": "iso88592",
|
||||||
|
"isoir109": "iso88593",
|
||||||
|
"isoir110": "iso88594",
|
||||||
|
"isoir144": "iso88595",
|
||||||
|
"isoir127": "iso88596",
|
||||||
|
"isoir126": "iso88597",
|
||||||
|
"isoir138": "iso88598",
|
||||||
|
"isoir148": "iso88599",
|
||||||
|
"isoir157": "iso885910",
|
||||||
|
"isoir166": "tis620",
|
||||||
|
"isoir179": "iso885913",
|
||||||
|
"isoir199": "iso885914",
|
||||||
|
"isoir203": "iso885915",
|
||||||
|
"isoir226": "iso885916",
|
||||||
|
|
||||||
|
"cp819": "iso88591",
|
||||||
|
"ibm819": "iso88591",
|
||||||
|
|
||||||
|
"cyrillic": "iso88595",
|
||||||
|
|
||||||
|
"arabic": "iso88596",
|
||||||
|
"arabic8": "iso88596",
|
||||||
|
"ecma114": "iso88596",
|
||||||
|
"asmo708": "iso88596",
|
||||||
|
|
||||||
|
"greek" : "iso88597",
|
||||||
|
"greek8" : "iso88597",
|
||||||
|
"ecma118" : "iso88597",
|
||||||
|
"elot928" : "iso88597",
|
||||||
|
|
||||||
|
"hebrew": "iso88598",
|
||||||
|
"hebrew8": "iso88598",
|
||||||
|
|
||||||
|
"turkish": "iso88599",
|
||||||
|
"turkish8": "iso88599",
|
||||||
|
|
||||||
|
"thai": "iso885911",
|
||||||
|
"thai8": "iso885911",
|
||||||
|
|
||||||
|
"celtic": "iso885914",
|
||||||
|
"celtic8": "iso885914",
|
||||||
|
"isoceltic": "iso885914",
|
||||||
|
|
||||||
|
"tis6200": "tis620",
|
||||||
|
"tis62025291": "tis620",
|
||||||
|
"tis62025330": "tis620",
|
||||||
|
|
||||||
|
"10000": "macroman",
|
||||||
|
"10006": "macgreek",
|
||||||
|
"10007": "maccyrillic",
|
||||||
|
"10079": "maciceland",
|
||||||
|
"10081": "macturkish",
|
||||||
|
|
||||||
|
"cspc8codepage437": "cp437",
|
||||||
|
"cspc775baltic": "cp775",
|
||||||
|
"cspc850multilingual": "cp850",
|
||||||
|
"cspcp852": "cp852",
|
||||||
|
"cspc862latinhebrew": "cp862",
|
||||||
|
"cpgr": "cp869",
|
||||||
|
|
||||||
|
"msee": "cp1250",
|
||||||
|
"mscyrl": "cp1251",
|
||||||
|
"msansi": "cp1252",
|
||||||
|
"msgreek": "cp1253",
|
||||||
|
"msturk": "cp1254",
|
||||||
|
"mshebr": "cp1255",
|
||||||
|
"msarab": "cp1256",
|
||||||
|
"winbaltrim": "cp1257",
|
||||||
|
|
||||||
|
"cp20866": "koi8r",
|
||||||
|
"20866": "koi8r",
|
||||||
|
"ibm878": "koi8r",
|
||||||
|
"cskoi8r": "koi8r",
|
||||||
|
|
||||||
|
"cp21866": "koi8u",
|
||||||
|
"21866": "koi8u",
|
||||||
|
"ibm1168": "koi8u",
|
||||||
|
|
||||||
|
"strk10482002": "rk1048",
|
||||||
|
|
||||||
|
"tcvn5712": "tcvn",
|
||||||
|
"tcvn57121": "tcvn",
|
||||||
|
|
||||||
|
"gb198880": "iso646cn",
|
||||||
|
"cn": "iso646cn",
|
||||||
|
|
||||||
|
"csiso14jisc6220ro": "iso646jp",
|
||||||
|
"jisc62201969ro": "iso646jp",
|
||||||
|
"jp": "iso646jp",
|
||||||
|
|
||||||
|
"cshproman8": "hproman8",
|
||||||
|
"r8": "hproman8",
|
||||||
|
"roman8": "hproman8",
|
||||||
|
"xroman8": "hproman8",
|
||||||
|
"ibm1051": "hproman8",
|
||||||
|
|
||||||
|
"mac": "macintosh",
|
||||||
|
"csmacintosh": "macintosh",
|
||||||
|
};
|
||||||
|
|
||||||
177
node_modules/iconv-lite/encodings/utf16.js
generated
vendored
Normal file
177
node_modules/iconv-lite/encodings/utf16.js
generated
vendored
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
"use strict";
|
||||||
|
var Buffer = require("safer-buffer").Buffer;
|
||||||
|
|
||||||
|
// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js
|
||||||
|
|
||||||
|
// == UTF16-BE codec. ==========================================================
|
||||||
|
|
||||||
|
exports.utf16be = Utf16BECodec;
|
||||||
|
function Utf16BECodec() {
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16BECodec.prototype.encoder = Utf16BEEncoder;
|
||||||
|
Utf16BECodec.prototype.decoder = Utf16BEDecoder;
|
||||||
|
Utf16BECodec.prototype.bomAware = true;
|
||||||
|
|
||||||
|
|
||||||
|
// -- Encoding
|
||||||
|
|
||||||
|
function Utf16BEEncoder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16BEEncoder.prototype.write = function(str) {
|
||||||
|
var buf = Buffer.from(str, 'ucs2');
|
||||||
|
for (var i = 0; i < buf.length; i += 2) {
|
||||||
|
var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16BEEncoder.prototype.end = function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- Decoding
|
||||||
|
|
||||||
|
function Utf16BEDecoder() {
|
||||||
|
this.overflowByte = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16BEDecoder.prototype.write = function(buf) {
|
||||||
|
if (buf.length == 0)
|
||||||
|
return '';
|
||||||
|
|
||||||
|
var buf2 = Buffer.alloc(buf.length + 1),
|
||||||
|
i = 0, j = 0;
|
||||||
|
|
||||||
|
if (this.overflowByte !== -1) {
|
||||||
|
buf2[0] = buf[0];
|
||||||
|
buf2[1] = this.overflowByte;
|
||||||
|
i = 1; j = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i < buf.length-1; i += 2, j+= 2) {
|
||||||
|
buf2[j] = buf[i+1];
|
||||||
|
buf2[j+1] = buf[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;
|
||||||
|
|
||||||
|
return buf2.slice(0, j).toString('ucs2');
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16BEDecoder.prototype.end = function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// == UTF-16 codec =============================================================
|
||||||
|
// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.
|
||||||
|
// Defaults to UTF-16LE, as it's prevalent and default in Node.
|
||||||
|
// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le
|
||||||
|
// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});
|
||||||
|
|
||||||
|
// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).
|
||||||
|
|
||||||
|
exports.utf16 = Utf16Codec;
|
||||||
|
function Utf16Codec(codecOptions, iconv) {
|
||||||
|
this.iconv = iconv;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16Codec.prototype.encoder = Utf16Encoder;
|
||||||
|
Utf16Codec.prototype.decoder = Utf16Decoder;
|
||||||
|
|
||||||
|
|
||||||
|
// -- Encoding (pass-through)
|
||||||
|
|
||||||
|
function Utf16Encoder(options, codec) {
|
||||||
|
options = options || {};
|
||||||
|
if (options.addBOM === undefined)
|
||||||
|
options.addBOM = true;
|
||||||
|
this.encoder = codec.iconv.getEncoder('utf-16le', options);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16Encoder.prototype.write = function(str) {
|
||||||
|
return this.encoder.write(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16Encoder.prototype.end = function() {
|
||||||
|
return this.encoder.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- Decoding
|
||||||
|
|
||||||
|
function Utf16Decoder(options, codec) {
|
||||||
|
this.decoder = null;
|
||||||
|
this.initialBytes = [];
|
||||||
|
this.initialBytesLen = 0;
|
||||||
|
|
||||||
|
this.options = options || {};
|
||||||
|
this.iconv = codec.iconv;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16Decoder.prototype.write = function(buf) {
|
||||||
|
if (!this.decoder) {
|
||||||
|
// Codec is not chosen yet. Accumulate initial bytes.
|
||||||
|
this.initialBytes.push(buf);
|
||||||
|
this.initialBytesLen += buf.length;
|
||||||
|
|
||||||
|
if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)
|
||||||
|
return '';
|
||||||
|
|
||||||
|
// We have enough bytes -> detect endianness.
|
||||||
|
var buf = Buffer.concat(this.initialBytes),
|
||||||
|
encoding = detectEncoding(buf, this.options.defaultEncoding);
|
||||||
|
this.decoder = this.iconv.getDecoder(encoding, this.options);
|
||||||
|
this.initialBytes.length = this.initialBytesLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.decoder.write(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf16Decoder.prototype.end = function() {
|
||||||
|
if (!this.decoder) {
|
||||||
|
var buf = Buffer.concat(this.initialBytes),
|
||||||
|
encoding = detectEncoding(buf, this.options.defaultEncoding);
|
||||||
|
this.decoder = this.iconv.getDecoder(encoding, this.options);
|
||||||
|
|
||||||
|
var res = this.decoder.write(buf),
|
||||||
|
trail = this.decoder.end();
|
||||||
|
|
||||||
|
return trail ? (res + trail) : res;
|
||||||
|
}
|
||||||
|
return this.decoder.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
function detectEncoding(buf, defaultEncoding) {
|
||||||
|
var enc = defaultEncoding || 'utf-16le';
|
||||||
|
|
||||||
|
if (buf.length >= 2) {
|
||||||
|
// Check BOM.
|
||||||
|
if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM
|
||||||
|
enc = 'utf-16be';
|
||||||
|
else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM
|
||||||
|
enc = 'utf-16le';
|
||||||
|
else {
|
||||||
|
// No BOM found. Try to deduce encoding from initial content.
|
||||||
|
// Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.
|
||||||
|
// So, we count ASCII as if it was LE or BE, and decide from that.
|
||||||
|
var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions
|
||||||
|
_len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.
|
||||||
|
|
||||||
|
for (var i = 0; i < _len; i += 2) {
|
||||||
|
if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;
|
||||||
|
if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asciiCharsBE > asciiCharsLE)
|
||||||
|
enc = 'utf-16be';
|
||||||
|
else if (asciiCharsBE < asciiCharsLE)
|
||||||
|
enc = 'utf-16le';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return enc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
290
node_modules/iconv-lite/encodings/utf7.js
generated
vendored
Normal file
290
node_modules/iconv-lite/encodings/utf7.js
generated
vendored
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
"use strict";
|
||||||
|
var Buffer = require("safer-buffer").Buffer;
|
||||||
|
|
||||||
|
// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152
|
||||||
|
// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3
|
||||||
|
|
||||||
|
exports.utf7 = Utf7Codec;
|
||||||
|
exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7
|
||||||
|
function Utf7Codec(codecOptions, iconv) {
|
||||||
|
this.iconv = iconv;
|
||||||
|
};
|
||||||
|
|
||||||
|
Utf7Codec.prototype.encoder = Utf7Encoder;
|
||||||
|
Utf7Codec.prototype.decoder = Utf7Decoder;
|
||||||
|
Utf7Codec.prototype.bomAware = true;
|
||||||
|
|
||||||
|
|
||||||
|
// -- Encoding
|
||||||
|
|
||||||
|
var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;
|
||||||
|
|
||||||
|
function Utf7Encoder(options, codec) {
|
||||||
|
this.iconv = codec.iconv;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf7Encoder.prototype.write = function(str) {
|
||||||
|
// Naive implementation.
|
||||||
|
// Non-direct chars are encoded as "+<base64>-"; single "+" char is encoded as "+-".
|
||||||
|
return Buffer.from(str.replace(nonDirectChars, function(chunk) {
|
||||||
|
return "+" + (chunk === '+' ? '' :
|
||||||
|
this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, ''))
|
||||||
|
+ "-";
|
||||||
|
}.bind(this)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf7Encoder.prototype.end = function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- Decoding
|
||||||
|
|
||||||
|
function Utf7Decoder(options, codec) {
|
||||||
|
this.iconv = codec.iconv;
|
||||||
|
this.inBase64 = false;
|
||||||
|
this.base64Accum = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
var base64Regex = /[A-Za-z0-9\/+]/;
|
||||||
|
var base64Chars = [];
|
||||||
|
for (var i = 0; i < 256; i++)
|
||||||
|
base64Chars[i] = base64Regex.test(String.fromCharCode(i));
|
||||||
|
|
||||||
|
var plusChar = '+'.charCodeAt(0),
|
||||||
|
minusChar = '-'.charCodeAt(0),
|
||||||
|
andChar = '&'.charCodeAt(0);
|
||||||
|
|
||||||
|
Utf7Decoder.prototype.write = function(buf) {
|
||||||
|
var res = "", lastI = 0,
|
||||||
|
inBase64 = this.inBase64,
|
||||||
|
base64Accum = this.base64Accum;
|
||||||
|
|
||||||
|
// The decoder is more involved as we must handle chunks in stream.
|
||||||
|
|
||||||
|
for (var i = 0; i < buf.length; i++) {
|
||||||
|
if (!inBase64) { // We're in direct mode.
|
||||||
|
// Write direct chars until '+'
|
||||||
|
if (buf[i] == plusChar) {
|
||||||
|
res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
|
||||||
|
lastI = i+1;
|
||||||
|
inBase64 = true;
|
||||||
|
}
|
||||||
|
} else { // We decode base64.
|
||||||
|
if (!base64Chars[buf[i]]) { // Base64 ended.
|
||||||
|
if (i == lastI && buf[i] == minusChar) {// "+-" -> "+"
|
||||||
|
res += "+";
|
||||||
|
} else {
|
||||||
|
var b64str = base64Accum + buf.slice(lastI, i).toString();
|
||||||
|
res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] != minusChar) // Minus is absorbed after base64.
|
||||||
|
i--;
|
||||||
|
|
||||||
|
lastI = i+1;
|
||||||
|
inBase64 = false;
|
||||||
|
base64Accum = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inBase64) {
|
||||||
|
res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
|
||||||
|
} else {
|
||||||
|
var b64str = base64Accum + buf.slice(lastI).toString();
|
||||||
|
|
||||||
|
var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
|
||||||
|
base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
|
||||||
|
b64str = b64str.slice(0, canBeDecoded);
|
||||||
|
|
||||||
|
res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inBase64 = inBase64;
|
||||||
|
this.base64Accum = base64Accum;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf7Decoder.prototype.end = function() {
|
||||||
|
var res = "";
|
||||||
|
if (this.inBase64 && this.base64Accum.length > 0)
|
||||||
|
res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");
|
||||||
|
|
||||||
|
this.inBase64 = false;
|
||||||
|
this.base64Accum = '';
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// UTF-7-IMAP codec.
|
||||||
|
// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)
|
||||||
|
// Differences:
|
||||||
|
// * Base64 part is started by "&" instead of "+"
|
||||||
|
// * Direct characters are 0x20-0x7E, except "&" (0x26)
|
||||||
|
// * In Base64, "," is used instead of "/"
|
||||||
|
// * Base64 must not be used to represent direct characters.
|
||||||
|
// * No implicit shift back from Base64 (should always end with '-')
|
||||||
|
// * String must end in non-shifted position.
|
||||||
|
// * "-&" while in base64 is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
exports.utf7imap = Utf7IMAPCodec;
|
||||||
|
function Utf7IMAPCodec(codecOptions, iconv) {
|
||||||
|
this.iconv = iconv;
|
||||||
|
};
|
||||||
|
|
||||||
|
Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;
|
||||||
|
Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;
|
||||||
|
Utf7IMAPCodec.prototype.bomAware = true;
|
||||||
|
|
||||||
|
|
||||||
|
// -- Encoding
|
||||||
|
|
||||||
|
function Utf7IMAPEncoder(options, codec) {
|
||||||
|
this.iconv = codec.iconv;
|
||||||
|
this.inBase64 = false;
|
||||||
|
this.base64Accum = Buffer.alloc(6);
|
||||||
|
this.base64AccumIdx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf7IMAPEncoder.prototype.write = function(str) {
|
||||||
|
var inBase64 = this.inBase64,
|
||||||
|
base64Accum = this.base64Accum,
|
||||||
|
base64AccumIdx = this.base64AccumIdx,
|
||||||
|
buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < str.length; i++) {
|
||||||
|
var uChar = str.charCodeAt(i);
|
||||||
|
if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.
|
||||||
|
if (inBase64) {
|
||||||
|
if (base64AccumIdx > 0) {
|
||||||
|
bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
|
||||||
|
base64AccumIdx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
|
||||||
|
inBase64 = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inBase64) {
|
||||||
|
buf[bufIdx++] = uChar; // Write direct character
|
||||||
|
|
||||||
|
if (uChar === andChar) // Ampersand -> '&-'
|
||||||
|
buf[bufIdx++] = minusChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else { // Non-direct character
|
||||||
|
if (!inBase64) {
|
||||||
|
buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.
|
||||||
|
inBase64 = true;
|
||||||
|
}
|
||||||
|
if (inBase64) {
|
||||||
|
base64Accum[base64AccumIdx++] = uChar >> 8;
|
||||||
|
base64Accum[base64AccumIdx++] = uChar & 0xFF;
|
||||||
|
|
||||||
|
if (base64AccumIdx == base64Accum.length) {
|
||||||
|
bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx);
|
||||||
|
base64AccumIdx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inBase64 = inBase64;
|
||||||
|
this.base64AccumIdx = base64AccumIdx;
|
||||||
|
|
||||||
|
return buf.slice(0, bufIdx);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf7IMAPEncoder.prototype.end = function() {
|
||||||
|
var buf = Buffer.alloc(10), bufIdx = 0;
|
||||||
|
if (this.inBase64) {
|
||||||
|
if (this.base64AccumIdx > 0) {
|
||||||
|
bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
|
||||||
|
this.base64AccumIdx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
|
||||||
|
this.inBase64 = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.slice(0, bufIdx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- Decoding
|
||||||
|
|
||||||
|
function Utf7IMAPDecoder(options, codec) {
|
||||||
|
this.iconv = codec.iconv;
|
||||||
|
this.inBase64 = false;
|
||||||
|
this.base64Accum = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
var base64IMAPChars = base64Chars.slice();
|
||||||
|
base64IMAPChars[','.charCodeAt(0)] = true;
|
||||||
|
|
||||||
|
Utf7IMAPDecoder.prototype.write = function(buf) {
|
||||||
|
var res = "", lastI = 0,
|
||||||
|
inBase64 = this.inBase64,
|
||||||
|
base64Accum = this.base64Accum;
|
||||||
|
|
||||||
|
// The decoder is more involved as we must handle chunks in stream.
|
||||||
|
// It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).
|
||||||
|
|
||||||
|
for (var i = 0; i < buf.length; i++) {
|
||||||
|
if (!inBase64) { // We're in direct mode.
|
||||||
|
// Write direct chars until '&'
|
||||||
|
if (buf[i] == andChar) {
|
||||||
|
res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
|
||||||
|
lastI = i+1;
|
||||||
|
inBase64 = true;
|
||||||
|
}
|
||||||
|
} else { // We decode base64.
|
||||||
|
if (!base64IMAPChars[buf[i]]) { // Base64 ended.
|
||||||
|
if (i == lastI && buf[i] == minusChar) { // "&-" -> "&"
|
||||||
|
res += "&";
|
||||||
|
} else {
|
||||||
|
var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');
|
||||||
|
res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] != minusChar) // Minus may be absorbed after base64.
|
||||||
|
i--;
|
||||||
|
|
||||||
|
lastI = i+1;
|
||||||
|
inBase64 = false;
|
||||||
|
base64Accum = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inBase64) {
|
||||||
|
res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
|
||||||
|
} else {
|
||||||
|
var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');
|
||||||
|
|
||||||
|
var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
|
||||||
|
base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
|
||||||
|
b64str = b64str.slice(0, canBeDecoded);
|
||||||
|
|
||||||
|
res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inBase64 = inBase64;
|
||||||
|
this.base64Accum = base64Accum;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utf7IMAPDecoder.prototype.end = function() {
|
||||||
|
var res = "";
|
||||||
|
if (this.inBase64 && this.base64Accum.length > 0)
|
||||||
|
res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");
|
||||||
|
|
||||||
|
this.inBase64 = false;
|
||||||
|
this.base64Accum = '';
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
52
node_modules/iconv-lite/lib/bom-handling.js
generated
vendored
Normal file
52
node_modules/iconv-lite/lib/bom-handling.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
var BOMChar = '\uFEFF';
|
||||||
|
|
||||||
|
exports.PrependBOM = PrependBOMWrapper
|
||||||
|
function PrependBOMWrapper(encoder, options) {
|
||||||
|
this.encoder = encoder;
|
||||||
|
this.addBOM = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrependBOMWrapper.prototype.write = function(str) {
|
||||||
|
if (this.addBOM) {
|
||||||
|
str = BOMChar + str;
|
||||||
|
this.addBOM = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.encoder.write(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
PrependBOMWrapper.prototype.end = function() {
|
||||||
|
return this.encoder.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
exports.StripBOM = StripBOMWrapper;
|
||||||
|
function StripBOMWrapper(decoder, options) {
|
||||||
|
this.decoder = decoder;
|
||||||
|
this.pass = false;
|
||||||
|
this.options = options || {};
|
||||||
|
}
|
||||||
|
|
||||||
|
StripBOMWrapper.prototype.write = function(buf) {
|
||||||
|
var res = this.decoder.write(buf);
|
||||||
|
if (this.pass || !res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
if (res[0] === BOMChar) {
|
||||||
|
res = res.slice(1);
|
||||||
|
if (typeof this.options.stripBOM === 'function')
|
||||||
|
this.options.stripBOM();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.pass = true;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
StripBOMWrapper.prototype.end = function() {
|
||||||
|
return this.decoder.end();
|
||||||
|
}
|
||||||
|
|
||||||
217
node_modules/iconv-lite/lib/extend-node.js
generated
vendored
Normal file
217
node_modules/iconv-lite/lib/extend-node.js
generated
vendored
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
"use strict";
|
||||||
|
var Buffer = require("buffer").Buffer;
|
||||||
|
// Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer
|
||||||
|
|
||||||
|
// == Extend Node primitives to use iconv-lite =================================
|
||||||
|
|
||||||
|
module.exports = function (iconv) {
|
||||||
|
var original = undefined; // Place to keep original methods.
|
||||||
|
|
||||||
|
// Node authors rewrote Buffer internals to make it compatible with
|
||||||
|
// Uint8Array and we cannot patch key functions since then.
|
||||||
|
// Note: this does use older Buffer API on a purpose
|
||||||
|
iconv.supportsNodeEncodingsExtension = !(Buffer.from || new Buffer(0) instanceof Uint8Array);
|
||||||
|
|
||||||
|
iconv.extendNodeEncodings = function extendNodeEncodings() {
|
||||||
|
if (original) return;
|
||||||
|
original = {};
|
||||||
|
|
||||||
|
if (!iconv.supportsNodeEncodingsExtension) {
|
||||||
|
console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node");
|
||||||
|
console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var nodeNativeEncodings = {
|
||||||
|
'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true,
|
||||||
|
'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,
|
||||||
|
};
|
||||||
|
|
||||||
|
Buffer.isNativeEncoding = function(enc) {
|
||||||
|
return enc && nodeNativeEncodings[enc.toLowerCase()];
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- SlowBuffer -----------------------------------------------------------
|
||||||
|
var SlowBuffer = require('buffer').SlowBuffer;
|
||||||
|
|
||||||
|
original.SlowBufferToString = SlowBuffer.prototype.toString;
|
||||||
|
SlowBuffer.prototype.toString = function(encoding, start, end) {
|
||||||
|
encoding = String(encoding || 'utf8').toLowerCase();
|
||||||
|
|
||||||
|
// Use native conversion when possible
|
||||||
|
if (Buffer.isNativeEncoding(encoding))
|
||||||
|
return original.SlowBufferToString.call(this, encoding, start, end);
|
||||||
|
|
||||||
|
// Otherwise, use our decoding method.
|
||||||
|
if (typeof start == 'undefined') start = 0;
|
||||||
|
if (typeof end == 'undefined') end = this.length;
|
||||||
|
return iconv.decode(this.slice(start, end), encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
original.SlowBufferWrite = SlowBuffer.prototype.write;
|
||||||
|
SlowBuffer.prototype.write = function(string, offset, length, encoding) {
|
||||||
|
// Support both (string, offset, length, encoding)
|
||||||
|
// and the legacy (string, encoding, offset, length)
|
||||||
|
if (isFinite(offset)) {
|
||||||
|
if (!isFinite(length)) {
|
||||||
|
encoding = length;
|
||||||
|
length = undefined;
|
||||||
|
}
|
||||||
|
} else { // legacy
|
||||||
|
var swap = encoding;
|
||||||
|
encoding = offset;
|
||||||
|
offset = length;
|
||||||
|
length = swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = +offset || 0;
|
||||||
|
var remaining = this.length - offset;
|
||||||
|
if (!length) {
|
||||||
|
length = remaining;
|
||||||
|
} else {
|
||||||
|
length = +length;
|
||||||
|
if (length > remaining) {
|
||||||
|
length = remaining;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
encoding = String(encoding || 'utf8').toLowerCase();
|
||||||
|
|
||||||
|
// Use native conversion when possible
|
||||||
|
if (Buffer.isNativeEncoding(encoding))
|
||||||
|
return original.SlowBufferWrite.call(this, string, offset, length, encoding);
|
||||||
|
|
||||||
|
if (string.length > 0 && (length < 0 || offset < 0))
|
||||||
|
throw new RangeError('attempt to write beyond buffer bounds');
|
||||||
|
|
||||||
|
// Otherwise, use our encoding method.
|
||||||
|
var buf = iconv.encode(string, encoding);
|
||||||
|
if (buf.length < length) length = buf.length;
|
||||||
|
buf.copy(this, offset, 0, length);
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Buffer ---------------------------------------------------------------
|
||||||
|
|
||||||
|
original.BufferIsEncoding = Buffer.isEncoding;
|
||||||
|
Buffer.isEncoding = function(encoding) {
|
||||||
|
return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
original.BufferByteLength = Buffer.byteLength;
|
||||||
|
Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {
|
||||||
|
encoding = String(encoding || 'utf8').toLowerCase();
|
||||||
|
|
||||||
|
// Use native conversion when possible
|
||||||
|
if (Buffer.isNativeEncoding(encoding))
|
||||||
|
return original.BufferByteLength.call(this, str, encoding);
|
||||||
|
|
||||||
|
// Slow, I know, but we don't have a better way yet.
|
||||||
|
return iconv.encode(str, encoding).length;
|
||||||
|
}
|
||||||
|
|
||||||
|
original.BufferToString = Buffer.prototype.toString;
|
||||||
|
Buffer.prototype.toString = function(encoding, start, end) {
|
||||||
|
encoding = String(encoding || 'utf8').toLowerCase();
|
||||||
|
|
||||||
|
// Use native conversion when possible
|
||||||
|
if (Buffer.isNativeEncoding(encoding))
|
||||||
|
return original.BufferToString.call(this, encoding, start, end);
|
||||||
|
|
||||||
|
// Otherwise, use our decoding method.
|
||||||
|
if (typeof start == 'undefined') start = 0;
|
||||||
|
if (typeof end == 'undefined') end = this.length;
|
||||||
|
return iconv.decode(this.slice(start, end), encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
original.BufferWrite = Buffer.prototype.write;
|
||||||
|
Buffer.prototype.write = function(string, offset, length, encoding) {
|
||||||
|
var _offset = offset, _length = length, _encoding = encoding;
|
||||||
|
// Support both (string, offset, length, encoding)
|
||||||
|
// and the legacy (string, encoding, offset, length)
|
||||||
|
if (isFinite(offset)) {
|
||||||
|
if (!isFinite(length)) {
|
||||||
|
encoding = length;
|
||||||
|
length = undefined;
|
||||||
|
}
|
||||||
|
} else { // legacy
|
||||||
|
var swap = encoding;
|
||||||
|
encoding = offset;
|
||||||
|
offset = length;
|
||||||
|
length = swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
encoding = String(encoding || 'utf8').toLowerCase();
|
||||||
|
|
||||||
|
// Use native conversion when possible
|
||||||
|
if (Buffer.isNativeEncoding(encoding))
|
||||||
|
return original.BufferWrite.call(this, string, _offset, _length, _encoding);
|
||||||
|
|
||||||
|
offset = +offset || 0;
|
||||||
|
var remaining = this.length - offset;
|
||||||
|
if (!length) {
|
||||||
|
length = remaining;
|
||||||
|
} else {
|
||||||
|
length = +length;
|
||||||
|
if (length > remaining) {
|
||||||
|
length = remaining;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.length > 0 && (length < 0 || offset < 0))
|
||||||
|
throw new RangeError('attempt to write beyond buffer bounds');
|
||||||
|
|
||||||
|
// Otherwise, use our encoding method.
|
||||||
|
var buf = iconv.encode(string, encoding);
|
||||||
|
if (buf.length < length) length = buf.length;
|
||||||
|
buf.copy(this, offset, 0, length);
|
||||||
|
return length;
|
||||||
|
|
||||||
|
// TODO: Set _charsWritten.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- Readable -------------------------------------------------------------
|
||||||
|
if (iconv.supportsStreams) {
|
||||||
|
var Readable = require('stream').Readable;
|
||||||
|
|
||||||
|
original.ReadableSetEncoding = Readable.prototype.setEncoding;
|
||||||
|
Readable.prototype.setEncoding = function setEncoding(enc, options) {
|
||||||
|
// Use our own decoder, it has the same interface.
|
||||||
|
// We cannot use original function as it doesn't handle BOM-s.
|
||||||
|
this._readableState.decoder = iconv.getDecoder(enc, options);
|
||||||
|
this._readableState.encoding = enc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Readable.prototype.collect = iconv._collect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove iconv-lite Node primitive extensions.
|
||||||
|
iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {
|
||||||
|
if (!iconv.supportsNodeEncodingsExtension)
|
||||||
|
return;
|
||||||
|
if (!original)
|
||||||
|
throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.")
|
||||||
|
|
||||||
|
delete Buffer.isNativeEncoding;
|
||||||
|
|
||||||
|
var SlowBuffer = require('buffer').SlowBuffer;
|
||||||
|
|
||||||
|
SlowBuffer.prototype.toString = original.SlowBufferToString;
|
||||||
|
SlowBuffer.prototype.write = original.SlowBufferWrite;
|
||||||
|
|
||||||
|
Buffer.isEncoding = original.BufferIsEncoding;
|
||||||
|
Buffer.byteLength = original.BufferByteLength;
|
||||||
|
Buffer.prototype.toString = original.BufferToString;
|
||||||
|
Buffer.prototype.write = original.BufferWrite;
|
||||||
|
|
||||||
|
if (iconv.supportsStreams) {
|
||||||
|
var Readable = require('stream').Readable;
|
||||||
|
|
||||||
|
Readable.prototype.setEncoding = original.ReadableSetEncoding;
|
||||||
|
delete Readable.prototype.collect;
|
||||||
|
}
|
||||||
|
|
||||||
|
original = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
153
node_modules/iconv-lite/lib/index.js
generated
vendored
Normal file
153
node_modules/iconv-lite/lib/index.js
generated
vendored
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Some environments don't have global Buffer (e.g. React Native).
|
||||||
|
// Solution would be installing npm modules "buffer" and "stream" explicitly.
|
||||||
|
var Buffer = require("safer-buffer").Buffer;
|
||||||
|
|
||||||
|
var bomHandling = require("./bom-handling"),
|
||||||
|
iconv = module.exports;
|
||||||
|
|
||||||
|
// All codecs and aliases are kept here, keyed by encoding name/alias.
|
||||||
|
// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
|
||||||
|
iconv.encodings = null;
|
||||||
|
|
||||||
|
// Characters emitted in case of error.
|
||||||
|
iconv.defaultCharUnicode = '<27>';
|
||||||
|
iconv.defaultCharSingleByte = '?';
|
||||||
|
|
||||||
|
// Public API.
|
||||||
|
iconv.encode = function encode(str, encoding, options) {
|
||||||
|
str = "" + (str || ""); // Ensure string.
|
||||||
|
|
||||||
|
var encoder = iconv.getEncoder(encoding, options);
|
||||||
|
|
||||||
|
var res = encoder.write(str);
|
||||||
|
var trail = encoder.end();
|
||||||
|
|
||||||
|
return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv.decode = function decode(buf, encoding, options) {
|
||||||
|
if (typeof buf === 'string') {
|
||||||
|
if (!iconv.skipDecodeWarning) {
|
||||||
|
console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
|
||||||
|
iconv.skipDecodeWarning = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = Buffer.from("" + (buf || ""), "binary"); // Ensure buffer.
|
||||||
|
}
|
||||||
|
|
||||||
|
var decoder = iconv.getDecoder(encoding, options);
|
||||||
|
|
||||||
|
var res = decoder.write(buf);
|
||||||
|
var trail = decoder.end();
|
||||||
|
|
||||||
|
return trail ? (res + trail) : res;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv.encodingExists = function encodingExists(enc) {
|
||||||
|
try {
|
||||||
|
iconv.getCodec(enc);
|
||||||
|
return true;
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Legacy aliases to convert functions
|
||||||
|
iconv.toEncoding = iconv.encode;
|
||||||
|
iconv.fromEncoding = iconv.decode;
|
||||||
|
|
||||||
|
// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
|
||||||
|
iconv._codecDataCache = {};
|
||||||
|
iconv.getCodec = function getCodec(encoding) {
|
||||||
|
if (!iconv.encodings)
|
||||||
|
iconv.encodings = require("../encodings"); // Lazy load all encoding definitions.
|
||||||
|
|
||||||
|
// Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
|
||||||
|
var enc = iconv._canonicalizeEncoding(encoding);
|
||||||
|
|
||||||
|
// Traverse iconv.encodings to find actual codec.
|
||||||
|
var codecOptions = {};
|
||||||
|
while (true) {
|
||||||
|
var codec = iconv._codecDataCache[enc];
|
||||||
|
if (codec)
|
||||||
|
return codec;
|
||||||
|
|
||||||
|
var codecDef = iconv.encodings[enc];
|
||||||
|
|
||||||
|
switch (typeof codecDef) {
|
||||||
|
case "string": // Direct alias to other encoding.
|
||||||
|
enc = codecDef;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "object": // Alias with options. Can be layered.
|
||||||
|
for (var key in codecDef)
|
||||||
|
codecOptions[key] = codecDef[key];
|
||||||
|
|
||||||
|
if (!codecOptions.encodingName)
|
||||||
|
codecOptions.encodingName = enc;
|
||||||
|
|
||||||
|
enc = codecDef.type;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "function": // Codec itself.
|
||||||
|
if (!codecOptions.encodingName)
|
||||||
|
codecOptions.encodingName = enc;
|
||||||
|
|
||||||
|
// The codec function must load all tables and return object with .encoder and .decoder methods.
|
||||||
|
// It'll be called only once (for each different options object).
|
||||||
|
codec = new codecDef(codecOptions, iconv);
|
||||||
|
|
||||||
|
iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.
|
||||||
|
return codec;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv._canonicalizeEncoding = function(encoding) {
|
||||||
|
// Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
|
||||||
|
return (''+encoding).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv.getEncoder = function getEncoder(encoding, options) {
|
||||||
|
var codec = iconv.getCodec(encoding),
|
||||||
|
encoder = new codec.encoder(options, codec);
|
||||||
|
|
||||||
|
if (codec.bomAware && options && options.addBOM)
|
||||||
|
encoder = new bomHandling.PrependBOM(encoder, options);
|
||||||
|
|
||||||
|
return encoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv.getDecoder = function getDecoder(encoding, options) {
|
||||||
|
var codec = iconv.getCodec(encoding),
|
||||||
|
decoder = new codec.decoder(options, codec);
|
||||||
|
|
||||||
|
if (codec.bomAware && !(options && options.stripBOM === false))
|
||||||
|
decoder = new bomHandling.StripBOM(decoder, options);
|
||||||
|
|
||||||
|
return decoder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
|
||||||
|
var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
|
||||||
|
if (nodeVer) {
|
||||||
|
|
||||||
|
// Load streaming support in Node v0.10+
|
||||||
|
var nodeVerArr = nodeVer.split(".").map(Number);
|
||||||
|
if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
|
||||||
|
require("./streams")(iconv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load Node primitive extensions.
|
||||||
|
require("./extend-node")(iconv);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("Ā" != "\u0100") {
|
||||||
|
console.error("iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.");
|
||||||
|
}
|
||||||
121
node_modules/iconv-lite/lib/streams.js
generated
vendored
Normal file
121
node_modules/iconv-lite/lib/streams.js
generated
vendored
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Buffer = require("buffer").Buffer,
|
||||||
|
Transform = require("stream").Transform;
|
||||||
|
|
||||||
|
|
||||||
|
// == Exports ==================================================================
|
||||||
|
module.exports = function(iconv) {
|
||||||
|
|
||||||
|
// Additional Public API.
|
||||||
|
iconv.encodeStream = function encodeStream(encoding, options) {
|
||||||
|
return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv.decodeStream = function decodeStream(encoding, options) {
|
||||||
|
return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv.supportsStreams = true;
|
||||||
|
|
||||||
|
|
||||||
|
// Not published yet.
|
||||||
|
iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;
|
||||||
|
iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;
|
||||||
|
iconv._collect = IconvLiteDecoderStream.prototype.collect;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// == Encoder stream =======================================================
|
||||||
|
function IconvLiteEncoderStream(conv, options) {
|
||||||
|
this.conv = conv;
|
||||||
|
options = options || {};
|
||||||
|
options.decodeStrings = false; // We accept only strings, so we don't need to decode them.
|
||||||
|
Transform.call(this, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {
|
||||||
|
constructor: { value: IconvLiteEncoderStream }
|
||||||
|
});
|
||||||
|
|
||||||
|
IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {
|
||||||
|
if (typeof chunk != 'string')
|
||||||
|
return done(new Error("Iconv encoding stream needs strings as its input."));
|
||||||
|
try {
|
||||||
|
var res = this.conv.write(chunk);
|
||||||
|
if (res && res.length) this.push(res);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
done(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IconvLiteEncoderStream.prototype._flush = function(done) {
|
||||||
|
try {
|
||||||
|
var res = this.conv.end();
|
||||||
|
if (res && res.length) this.push(res);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
done(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IconvLiteEncoderStream.prototype.collect = function(cb) {
|
||||||
|
var chunks = [];
|
||||||
|
this.on('error', cb);
|
||||||
|
this.on('data', function(chunk) { chunks.push(chunk); });
|
||||||
|
this.on('end', function() {
|
||||||
|
cb(null, Buffer.concat(chunks));
|
||||||
|
});
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// == Decoder stream =======================================================
|
||||||
|
function IconvLiteDecoderStream(conv, options) {
|
||||||
|
this.conv = conv;
|
||||||
|
options = options || {};
|
||||||
|
options.encoding = this.encoding = 'utf8'; // We output strings.
|
||||||
|
Transform.call(this, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {
|
||||||
|
constructor: { value: IconvLiteDecoderStream }
|
||||||
|
});
|
||||||
|
|
||||||
|
IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {
|
||||||
|
if (!Buffer.isBuffer(chunk))
|
||||||
|
return done(new Error("Iconv decoding stream needs buffers as its input."));
|
||||||
|
try {
|
||||||
|
var res = this.conv.write(chunk);
|
||||||
|
if (res && res.length) this.push(res, this.encoding);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
done(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IconvLiteDecoderStream.prototype._flush = function(done) {
|
||||||
|
try {
|
||||||
|
var res = this.conv.end();
|
||||||
|
if (res && res.length) this.push(res, this.encoding);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
done(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IconvLiteDecoderStream.prototype.collect = function(cb) {
|
||||||
|
var res = '';
|
||||||
|
this.on('error', cb);
|
||||||
|
this.on('data', function(chunk) { res += chunk; });
|
||||||
|
this.on('end', function() {
|
||||||
|
cb(null, res);
|
||||||
|
});
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
9
node_modules/inherits/inherits.js
generated
vendored
Normal file
9
node_modules/inherits/inherits.js
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
try {
|
||||||
|
var util = require('util');
|
||||||
|
/* istanbul ignore next */
|
||||||
|
if (typeof util.inherits !== 'function') throw '';
|
||||||
|
module.exports = util.inherits;
|
||||||
|
} catch (e) {
|
||||||
|
/* istanbul ignore next */
|
||||||
|
module.exports = require('./inherits_browser.js');
|
||||||
|
}
|
||||||
27
node_modules/inherits/inherits_browser.js
generated
vendored
Normal file
27
node_modules/inherits/inherits_browser.js
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
if (typeof Object.create === 'function') {
|
||||||
|
// implementation from standard node.js 'util' module
|
||||||
|
module.exports = function inherits(ctor, superCtor) {
|
||||||
|
if (superCtor) {
|
||||||
|
ctor.super_ = superCtor
|
||||||
|
ctor.prototype = Object.create(superCtor.prototype, {
|
||||||
|
constructor: {
|
||||||
|
value: ctor,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
configurable: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// old school shim for old browsers
|
||||||
|
module.exports = function inherits(ctor, superCtor) {
|
||||||
|
if (superCtor) {
|
||||||
|
ctor.super_ = superCtor
|
||||||
|
var TempCtor = function () {}
|
||||||
|
TempCtor.prototype = superCtor.prototype
|
||||||
|
ctor.prototype = new TempCtor()
|
||||||
|
ctor.prototype.constructor = ctor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
node_modules/ipaddr.js/ipaddr.min.js
generated
vendored
Normal file
1
node_modules/ipaddr.js/ipaddr.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
673
node_modules/ipaddr.js/lib/ipaddr.js
generated
vendored
Normal file
673
node_modules/ipaddr.js/lib/ipaddr.js
generated
vendored
Normal file
@@ -0,0 +1,673 @@
|
|||||||
|
(function() {
|
||||||
|
var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;
|
||||||
|
|
||||||
|
ipaddr = {};
|
||||||
|
|
||||||
|
root = this;
|
||||||
|
|
||||||
|
if ((typeof module !== "undefined" && module !== null) && module.exports) {
|
||||||
|
module.exports = ipaddr;
|
||||||
|
} else {
|
||||||
|
root['ipaddr'] = ipaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
matchCIDR = function(first, second, partSize, cidrBits) {
|
||||||
|
var part, shift;
|
||||||
|
if (first.length !== second.length) {
|
||||||
|
throw new Error("ipaddr: cannot match CIDR for objects with different lengths");
|
||||||
|
}
|
||||||
|
part = 0;
|
||||||
|
while (cidrBits > 0) {
|
||||||
|
shift = partSize - cidrBits;
|
||||||
|
if (shift < 0) {
|
||||||
|
shift = 0;
|
||||||
|
}
|
||||||
|
if (first[part] >> shift !== second[part] >> shift) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
cidrBits -= partSize;
|
||||||
|
part += 1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.subnetMatch = function(address, rangeList, defaultName) {
|
||||||
|
var k, len, rangeName, rangeSubnets, subnet;
|
||||||
|
if (defaultName == null) {
|
||||||
|
defaultName = 'unicast';
|
||||||
|
}
|
||||||
|
for (rangeName in rangeList) {
|
||||||
|
rangeSubnets = rangeList[rangeName];
|
||||||
|
if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {
|
||||||
|
rangeSubnets = [rangeSubnets];
|
||||||
|
}
|
||||||
|
for (k = 0, len = rangeSubnets.length; k < len; k++) {
|
||||||
|
subnet = rangeSubnets[k];
|
||||||
|
if (address.kind() === subnet[0].kind()) {
|
||||||
|
if (address.match.apply(address, subnet)) {
|
||||||
|
return rangeName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return defaultName;
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4 = (function() {
|
||||||
|
function IPv4(octets) {
|
||||||
|
var k, len, octet;
|
||||||
|
if (octets.length !== 4) {
|
||||||
|
throw new Error("ipaddr: ipv4 octet count should be 4");
|
||||||
|
}
|
||||||
|
for (k = 0, len = octets.length; k < len; k++) {
|
||||||
|
octet = octets[k];
|
||||||
|
if (!((0 <= octet && octet <= 255))) {
|
||||||
|
throw new Error("ipaddr: ipv4 octet should fit in 8 bits");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.octets = octets;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPv4.prototype.kind = function() {
|
||||||
|
return 'ipv4';
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.toString = function() {
|
||||||
|
return this.octets.join(".");
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.toNormalizedString = function() {
|
||||||
|
return this.toString();
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.toByteArray = function() {
|
||||||
|
return this.octets.slice(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.match = function(other, cidrRange) {
|
||||||
|
var ref;
|
||||||
|
if (cidrRange === void 0) {
|
||||||
|
ref = other, other = ref[0], cidrRange = ref[1];
|
||||||
|
}
|
||||||
|
if (other.kind() !== 'ipv4') {
|
||||||
|
throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");
|
||||||
|
}
|
||||||
|
return matchCIDR(this.octets, other.octets, 8, cidrRange);
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.SpecialRanges = {
|
||||||
|
unspecified: [[new IPv4([0, 0, 0, 0]), 8]],
|
||||||
|
broadcast: [[new IPv4([255, 255, 255, 255]), 32]],
|
||||||
|
multicast: [[new IPv4([224, 0, 0, 0]), 4]],
|
||||||
|
linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],
|
||||||
|
loopback: [[new IPv4([127, 0, 0, 0]), 8]],
|
||||||
|
carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],
|
||||||
|
"private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],
|
||||||
|
reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.range = function() {
|
||||||
|
return ipaddr.subnetMatch(this, this.SpecialRanges);
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.toIPv4MappedAddress = function() {
|
||||||
|
return ipaddr.IPv6.parse("::ffff:" + (this.toString()));
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv4.prototype.prefixLengthFromSubnetMask = function() {
|
||||||
|
var cidr, i, k, octet, stop, zeros, zerotable;
|
||||||
|
zerotable = {
|
||||||
|
0: 8,
|
||||||
|
128: 7,
|
||||||
|
192: 6,
|
||||||
|
224: 5,
|
||||||
|
240: 4,
|
||||||
|
248: 3,
|
||||||
|
252: 2,
|
||||||
|
254: 1,
|
||||||
|
255: 0
|
||||||
|
};
|
||||||
|
cidr = 0;
|
||||||
|
stop = false;
|
||||||
|
for (i = k = 3; k >= 0; i = k += -1) {
|
||||||
|
octet = this.octets[i];
|
||||||
|
if (octet in zerotable) {
|
||||||
|
zeros = zerotable[octet];
|
||||||
|
if (stop && zeros !== 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (zeros !== 8) {
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
cidr += zeros;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 32 - cidr;
|
||||||
|
};
|
||||||
|
|
||||||
|
return IPv4;
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
||||||
|
ipv4Part = "(0?\\d+|0x[a-f0-9]+)";
|
||||||
|
|
||||||
|
ipv4Regexes = {
|
||||||
|
fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'),
|
||||||
|
longValue: new RegExp("^" + ipv4Part + "$", 'i')
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.parser = function(string) {
|
||||||
|
var match, parseIntAuto, part, shift, value;
|
||||||
|
parseIntAuto = function(string) {
|
||||||
|
if (string[0] === "0" && string[1] !== "x") {
|
||||||
|
return parseInt(string, 8);
|
||||||
|
} else {
|
||||||
|
return parseInt(string);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (match = string.match(ipv4Regexes.fourOctet)) {
|
||||||
|
return (function() {
|
||||||
|
var k, len, ref, results;
|
||||||
|
ref = match.slice(1, 6);
|
||||||
|
results = [];
|
||||||
|
for (k = 0, len = ref.length; k < len; k++) {
|
||||||
|
part = ref[k];
|
||||||
|
results.push(parseIntAuto(part));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
})();
|
||||||
|
} else if (match = string.match(ipv4Regexes.longValue)) {
|
||||||
|
value = parseIntAuto(match[1]);
|
||||||
|
if (value > 0xffffffff || value < 0) {
|
||||||
|
throw new Error("ipaddr: address outside defined range");
|
||||||
|
}
|
||||||
|
return ((function() {
|
||||||
|
var k, results;
|
||||||
|
results = [];
|
||||||
|
for (shift = k = 0; k <= 24; shift = k += 8) {
|
||||||
|
results.push((value >> shift) & 0xff);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
})()).reverse();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv6 = (function() {
|
||||||
|
function IPv6(parts, zoneId) {
|
||||||
|
var i, k, l, len, part, ref;
|
||||||
|
if (parts.length === 16) {
|
||||||
|
this.parts = [];
|
||||||
|
for (i = k = 0; k <= 14; i = k += 2) {
|
||||||
|
this.parts.push((parts[i] << 8) | parts[i + 1]);
|
||||||
|
}
|
||||||
|
} else if (parts.length === 8) {
|
||||||
|
this.parts = parts;
|
||||||
|
} else {
|
||||||
|
throw new Error("ipaddr: ipv6 part count should be 8 or 16");
|
||||||
|
}
|
||||||
|
ref = this.parts;
|
||||||
|
for (l = 0, len = ref.length; l < len; l++) {
|
||||||
|
part = ref[l];
|
||||||
|
if (!((0 <= part && part <= 0xffff))) {
|
||||||
|
throw new Error("ipaddr: ipv6 part should fit in 16 bits");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (zoneId) {
|
||||||
|
this.zoneId = zoneId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IPv6.prototype.kind = function() {
|
||||||
|
return 'ipv6';
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.toString = function() {
|
||||||
|
return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.toRFC5952String = function() {
|
||||||
|
var bestMatchIndex, bestMatchLength, match, regex, string;
|
||||||
|
regex = /((^|:)(0(:|$)){2,})/g;
|
||||||
|
string = this.toNormalizedString();
|
||||||
|
bestMatchIndex = 0;
|
||||||
|
bestMatchLength = -1;
|
||||||
|
while ((match = regex.exec(string))) {
|
||||||
|
if (match[0].length > bestMatchLength) {
|
||||||
|
bestMatchIndex = match.index;
|
||||||
|
bestMatchLength = match[0].length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bestMatchLength < 0) {
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.toByteArray = function() {
|
||||||
|
var bytes, k, len, part, ref;
|
||||||
|
bytes = [];
|
||||||
|
ref = this.parts;
|
||||||
|
for (k = 0, len = ref.length; k < len; k++) {
|
||||||
|
part = ref[k];
|
||||||
|
bytes.push(part >> 8);
|
||||||
|
bytes.push(part & 0xff);
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.toNormalizedString = function() {
|
||||||
|
var addr, part, suffix;
|
||||||
|
addr = ((function() {
|
||||||
|
var k, len, ref, results;
|
||||||
|
ref = this.parts;
|
||||||
|
results = [];
|
||||||
|
for (k = 0, len = ref.length; k < len; k++) {
|
||||||
|
part = ref[k];
|
||||||
|
results.push(part.toString(16));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}).call(this)).join(":");
|
||||||
|
suffix = '';
|
||||||
|
if (this.zoneId) {
|
||||||
|
suffix = '%' + this.zoneId;
|
||||||
|
}
|
||||||
|
return addr + suffix;
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.toFixedLengthString = function() {
|
||||||
|
var addr, part, suffix;
|
||||||
|
addr = ((function() {
|
||||||
|
var k, len, ref, results;
|
||||||
|
ref = this.parts;
|
||||||
|
results = [];
|
||||||
|
for (k = 0, len = ref.length; k < len; k++) {
|
||||||
|
part = ref[k];
|
||||||
|
results.push(part.toString(16).padStart(4, '0'));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}).call(this)).join(":");
|
||||||
|
suffix = '';
|
||||||
|
if (this.zoneId) {
|
||||||
|
suffix = '%' + this.zoneId;
|
||||||
|
}
|
||||||
|
return addr + suffix;
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.match = function(other, cidrRange) {
|
||||||
|
var ref;
|
||||||
|
if (cidrRange === void 0) {
|
||||||
|
ref = other, other = ref[0], cidrRange = ref[1];
|
||||||
|
}
|
||||||
|
if (other.kind() !== 'ipv6') {
|
||||||
|
throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");
|
||||||
|
}
|
||||||
|
return matchCIDR(this.parts, other.parts, 16, cidrRange);
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.SpecialRanges = {
|
||||||
|
unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],
|
||||||
|
linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],
|
||||||
|
multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],
|
||||||
|
loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],
|
||||||
|
uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],
|
||||||
|
ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],
|
||||||
|
rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],
|
||||||
|
rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],
|
||||||
|
'6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],
|
||||||
|
teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],
|
||||||
|
reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.range = function() {
|
||||||
|
return ipaddr.subnetMatch(this, this.SpecialRanges);
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.isIPv4MappedAddress = function() {
|
||||||
|
return this.range() === 'ipv4Mapped';
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.toIPv4Address = function() {
|
||||||
|
var high, low, ref;
|
||||||
|
if (!this.isIPv4MappedAddress()) {
|
||||||
|
throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");
|
||||||
|
}
|
||||||
|
ref = this.parts.slice(-2), high = ref[0], low = ref[1];
|
||||||
|
return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);
|
||||||
|
};
|
||||||
|
|
||||||
|
IPv6.prototype.prefixLengthFromSubnetMask = function() {
|
||||||
|
var cidr, i, k, part, stop, zeros, zerotable;
|
||||||
|
zerotable = {
|
||||||
|
0: 16,
|
||||||
|
32768: 15,
|
||||||
|
49152: 14,
|
||||||
|
57344: 13,
|
||||||
|
61440: 12,
|
||||||
|
63488: 11,
|
||||||
|
64512: 10,
|
||||||
|
65024: 9,
|
||||||
|
65280: 8,
|
||||||
|
65408: 7,
|
||||||
|
65472: 6,
|
||||||
|
65504: 5,
|
||||||
|
65520: 4,
|
||||||
|
65528: 3,
|
||||||
|
65532: 2,
|
||||||
|
65534: 1,
|
||||||
|
65535: 0
|
||||||
|
};
|
||||||
|
cidr = 0;
|
||||||
|
stop = false;
|
||||||
|
for (i = k = 7; k >= 0; i = k += -1) {
|
||||||
|
part = this.parts[i];
|
||||||
|
if (part in zerotable) {
|
||||||
|
zeros = zerotable[part];
|
||||||
|
if (stop && zeros !== 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (zeros !== 16) {
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
cidr += zeros;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 128 - cidr;
|
||||||
|
};
|
||||||
|
|
||||||
|
return IPv6;
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
||||||
|
ipv6Part = "(?:[0-9a-f]+::?)+";
|
||||||
|
|
||||||
|
zoneIndex = "%[0-9a-z]{1,}";
|
||||||
|
|
||||||
|
ipv6Regexes = {
|
||||||
|
zoneIndex: new RegExp(zoneIndex, 'i'),
|
||||||
|
"native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'),
|
||||||
|
transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i')
|
||||||
|
};
|
||||||
|
|
||||||
|
expandIPv6 = function(string, parts) {
|
||||||
|
var colonCount, lastColon, part, replacement, replacementCount, zoneId;
|
||||||
|
if (string.indexOf('::') !== string.lastIndexOf('::')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];
|
||||||
|
if (zoneId) {
|
||||||
|
zoneId = zoneId.substring(1);
|
||||||
|
string = string.replace(/%.+$/, '');
|
||||||
|
}
|
||||||
|
colonCount = 0;
|
||||||
|
lastColon = -1;
|
||||||
|
while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {
|
||||||
|
colonCount++;
|
||||||
|
}
|
||||||
|
if (string.substr(0, 2) === '::') {
|
||||||
|
colonCount--;
|
||||||
|
}
|
||||||
|
if (string.substr(-2, 2) === '::') {
|
||||||
|
colonCount--;
|
||||||
|
}
|
||||||
|
if (colonCount > parts) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
replacementCount = parts - colonCount;
|
||||||
|
replacement = ':';
|
||||||
|
while (replacementCount--) {
|
||||||
|
replacement += '0:';
|
||||||
|
}
|
||||||
|
string = string.replace('::', replacement);
|
||||||
|
if (string[0] === ':') {
|
||||||
|
string = string.slice(1);
|
||||||
|
}
|
||||||
|
if (string[string.length - 1] === ':') {
|
||||||
|
string = string.slice(0, -1);
|
||||||
|
}
|
||||||
|
parts = (function() {
|
||||||
|
var k, len, ref, results;
|
||||||
|
ref = string.split(":");
|
||||||
|
results = [];
|
||||||
|
for (k = 0, len = ref.length; k < len; k++) {
|
||||||
|
part = ref[k];
|
||||||
|
results.push(parseInt(part, 16));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
})();
|
||||||
|
return {
|
||||||
|
parts: parts,
|
||||||
|
zoneId: zoneId
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv6.parser = function(string) {
|
||||||
|
var addr, k, len, match, octet, octets, zoneId;
|
||||||
|
if (ipv6Regexes['native'].test(string)) {
|
||||||
|
return expandIPv6(string, 8);
|
||||||
|
} else if (match = string.match(ipv6Regexes['transitional'])) {
|
||||||
|
zoneId = match[6] || '';
|
||||||
|
addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);
|
||||||
|
if (addr.parts) {
|
||||||
|
octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];
|
||||||
|
for (k = 0, len = octets.length; k < len; k++) {
|
||||||
|
octet = octets[k];
|
||||||
|
if (!((0 <= octet && octet <= 255))) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addr.parts.push(octets[0] << 8 | octets[1]);
|
||||||
|
addr.parts.push(octets[2] << 8 | octets[3]);
|
||||||
|
return {
|
||||||
|
parts: addr.parts,
|
||||||
|
zoneId: addr.zoneId
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {
|
||||||
|
return this.parser(string) !== null;
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.isValid = function(string) {
|
||||||
|
var e;
|
||||||
|
try {
|
||||||
|
new this(this.parser(string));
|
||||||
|
return true;
|
||||||
|
} catch (error1) {
|
||||||
|
e = error1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.isValidFourPartDecimal = function(string) {
|
||||||
|
if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv6.isValid = function(string) {
|
||||||
|
var addr, e;
|
||||||
|
if (typeof string === "string" && string.indexOf(":") === -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
addr = this.parser(string);
|
||||||
|
new this(addr.parts, addr.zoneId);
|
||||||
|
return true;
|
||||||
|
} catch (error1) {
|
||||||
|
e = error1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.parse = function(string) {
|
||||||
|
var parts;
|
||||||
|
parts = this.parser(string);
|
||||||
|
if (parts === null) {
|
||||||
|
throw new Error("ipaddr: string is not formatted like ip address");
|
||||||
|
}
|
||||||
|
return new this(parts);
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv6.parse = function(string) {
|
||||||
|
var addr;
|
||||||
|
addr = this.parser(string);
|
||||||
|
if (addr.parts === null) {
|
||||||
|
throw new Error("ipaddr: string is not formatted like ip address");
|
||||||
|
}
|
||||||
|
return new this(addr.parts, addr.zoneId);
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.parseCIDR = function(string) {
|
||||||
|
var maskLength, match, parsed;
|
||||||
|
if (match = string.match(/^(.+)\/(\d+)$/)) {
|
||||||
|
maskLength = parseInt(match[2]);
|
||||||
|
if (maskLength >= 0 && maskLength <= 32) {
|
||||||
|
parsed = [this.parse(match[1]), maskLength];
|
||||||
|
Object.defineProperty(parsed, 'toString', {
|
||||||
|
value: function() {
|
||||||
|
return this.join('/');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range");
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {
|
||||||
|
var filledOctetCount, j, octets;
|
||||||
|
prefix = parseInt(prefix);
|
||||||
|
if (prefix < 0 || prefix > 32) {
|
||||||
|
throw new Error('ipaddr: invalid IPv4 prefix length');
|
||||||
|
}
|
||||||
|
octets = [0, 0, 0, 0];
|
||||||
|
j = 0;
|
||||||
|
filledOctetCount = Math.floor(prefix / 8);
|
||||||
|
while (j < filledOctetCount) {
|
||||||
|
octets[j] = 255;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
if (filledOctetCount < 4) {
|
||||||
|
octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);
|
||||||
|
}
|
||||||
|
return new this(octets);
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {
|
||||||
|
var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
|
||||||
|
try {
|
||||||
|
cidr = this.parseCIDR(string);
|
||||||
|
ipInterfaceOctets = cidr[0].toByteArray();
|
||||||
|
subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
|
||||||
|
octets = [];
|
||||||
|
i = 0;
|
||||||
|
while (i < 4) {
|
||||||
|
octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return new this(octets);
|
||||||
|
} catch (error1) {
|
||||||
|
error = error1;
|
||||||
|
throw new Error('ipaddr: the address does not have IPv4 CIDR format');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv4.networkAddressFromCIDR = function(string) {
|
||||||
|
var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
|
||||||
|
try {
|
||||||
|
cidr = this.parseCIDR(string);
|
||||||
|
ipInterfaceOctets = cidr[0].toByteArray();
|
||||||
|
subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
|
||||||
|
octets = [];
|
||||||
|
i = 0;
|
||||||
|
while (i < 4) {
|
||||||
|
octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return new this(octets);
|
||||||
|
} catch (error1) {
|
||||||
|
error = error1;
|
||||||
|
throw new Error('ipaddr: the address does not have IPv4 CIDR format');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.IPv6.parseCIDR = function(string) {
|
||||||
|
var maskLength, match, parsed;
|
||||||
|
if (match = string.match(/^(.+)\/(\d+)$/)) {
|
||||||
|
maskLength = parseInt(match[2]);
|
||||||
|
if (maskLength >= 0 && maskLength <= 128) {
|
||||||
|
parsed = [this.parse(match[1]), maskLength];
|
||||||
|
Object.defineProperty(parsed, 'toString', {
|
||||||
|
value: function() {
|
||||||
|
return this.join('/');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range");
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.isValid = function(string) {
|
||||||
|
return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.parse = function(string) {
|
||||||
|
if (ipaddr.IPv6.isValid(string)) {
|
||||||
|
return ipaddr.IPv6.parse(string);
|
||||||
|
} else if (ipaddr.IPv4.isValid(string)) {
|
||||||
|
return ipaddr.IPv4.parse(string);
|
||||||
|
} else {
|
||||||
|
throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.parseCIDR = function(string) {
|
||||||
|
var e;
|
||||||
|
try {
|
||||||
|
return ipaddr.IPv6.parseCIDR(string);
|
||||||
|
} catch (error1) {
|
||||||
|
e = error1;
|
||||||
|
try {
|
||||||
|
return ipaddr.IPv4.parseCIDR(string);
|
||||||
|
} catch (error1) {
|
||||||
|
e = error1;
|
||||||
|
throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.fromByteArray = function(bytes) {
|
||||||
|
var length;
|
||||||
|
length = bytes.length;
|
||||||
|
if (length === 4) {
|
||||||
|
return new ipaddr.IPv4(bytes);
|
||||||
|
} else if (length === 16) {
|
||||||
|
return new ipaddr.IPv6(bytes);
|
||||||
|
} else {
|
||||||
|
throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ipaddr.process = function(string) {
|
||||||
|
var addr;
|
||||||
|
addr = this.parse(string);
|
||||||
|
if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {
|
||||||
|
return addr.toIPv4Address();
|
||||||
|
} else {
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(this);
|
||||||
270
node_modules/media-typer/index.js
generated
vendored
Normal file
270
node_modules/media-typer/index.js
generated
vendored
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
/*!
|
||||||
|
* media-typer
|
||||||
|
* Copyright(c) 2014 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7
|
||||||
|
*
|
||||||
|
* 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)>
|
||||||
|
* SHT = <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 paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g;
|
||||||
|
var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/
|
||||||
|
var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match quoted-pair in RFC 2616
|
||||||
|
*
|
||||||
|
* quoted-pair = "\" CHAR
|
||||||
|
* CHAR = <any US-ASCII character (octets 0 - 127)>
|
||||||
|
*/
|
||||||
|
var qescRegExp = /\\([\u0000-\u007f])/g;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match chars that must be quoted-pair in RFC 2616
|
||||||
|
*/
|
||||||
|
var quoteRegExp = /([\\"])/g;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RegExp to match type in RFC 6838
|
||||||
|
*
|
||||||
|
* type-name = restricted-name
|
||||||
|
* subtype-name = restricted-name
|
||||||
|
* restricted-name = restricted-name-first *126restricted-name-chars
|
||||||
|
* restricted-name-first = ALPHA / DIGIT
|
||||||
|
* restricted-name-chars = ALPHA / DIGIT / "!" / "#" /
|
||||||
|
* "$" / "&" / "-" / "^" / "_"
|
||||||
|
* restricted-name-chars =/ "." ; Characters before first dot always
|
||||||
|
* ; specify a facet name
|
||||||
|
* restricted-name-chars =/ "+" ; Characters after last plus always
|
||||||
|
* ; specify a structured syntax suffix
|
||||||
|
* ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
|
||||||
|
* DIGIT = %x30-39 ; 0-9
|
||||||
|
*/
|
||||||
|
var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/
|
||||||
|
var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/
|
||||||
|
var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.format = format
|
||||||
|
exports.parse = parse
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format object to media type.
|
||||||
|
*
|
||||||
|
* @param {object} obj
|
||||||
|
* @return {string}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function format(obj) {
|
||||||
|
if (!obj || typeof obj !== 'object') {
|
||||||
|
throw new TypeError('argument obj is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
var parameters = obj.parameters
|
||||||
|
var subtype = obj.subtype
|
||||||
|
var suffix = obj.suffix
|
||||||
|
var type = obj.type
|
||||||
|
|
||||||
|
if (!type || !typeNameRegExp.test(type)) {
|
||||||
|
throw new TypeError('invalid type')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!subtype || !subtypeNameRegExp.test(subtype)) {
|
||||||
|
throw new TypeError('invalid subtype')
|
||||||
|
}
|
||||||
|
|
||||||
|
// format as type/subtype
|
||||||
|
var string = type + '/' + subtype
|
||||||
|
|
||||||
|
// append +suffix
|
||||||
|
if (suffix) {
|
||||||
|
if (!typeNameRegExp.test(suffix)) {
|
||||||
|
throw new TypeError('invalid suffix')
|
||||||
|
}
|
||||||
|
|
||||||
|
string += '+' + suffix
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 (!tokenRegExp.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}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parse(string) {
|
||||||
|
if (!string) {
|
||||||
|
throw new TypeError('argument string is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
// support req/res-like objects as argument
|
||||||
|
if (typeof string === 'object') {
|
||||||
|
string = getcontenttype(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof string !== 'string') {
|
||||||
|
throw new TypeError('argument string is required to be a string')
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = string.indexOf(';')
|
||||||
|
var type = index !== -1
|
||||||
|
? string.substr(0, index)
|
||||||
|
: string
|
||||||
|
|
||||||
|
var key
|
||||||
|
var match
|
||||||
|
var obj = splitType(type)
|
||||||
|
var params = {}
|
||||||
|
var value
|
||||||
|
|
||||||
|
paramRegExp.lastIndex = index
|
||||||
|
|
||||||
|
while (match = paramRegExp.exec(string)) {
|
||||||
|
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(qescRegExp, '$1')
|
||||||
|
}
|
||||||
|
|
||||||
|
params[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index !== -1 && index !== string.length) {
|
||||||
|
throw new TypeError('invalid parameter format')
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.parameters = params
|
||||||
|
|
||||||
|
return obj
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get content-type from req/res objects.
|
||||||
|
*
|
||||||
|
* @param {object}
|
||||||
|
* @return {Object}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getcontenttype(obj) {
|
||||||
|
if (typeof obj.getHeader === 'function') {
|
||||||
|
// res-like
|
||||||
|
return obj.getHeader('content-type')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof obj.headers === 'object') {
|
||||||
|
// req-like
|
||||||
|
return obj.headers && obj.headers['content-type']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quote a string if necessary.
|
||||||
|
*
|
||||||
|
* @param {string} val
|
||||||
|
* @return {string}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function qstring(val) {
|
||||||
|
var str = String(val)
|
||||||
|
|
||||||
|
// no need to quote tokens
|
||||||
|
if (tokenRegExp.test(str)) {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str.length > 0 && !textRegExp.test(str)) {
|
||||||
|
throw new TypeError('invalid parameter value')
|
||||||
|
}
|
||||||
|
|
||||||
|
return '"' + str.replace(quoteRegExp, '\\$1') + '"'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simply "type/subtype+siffx" into parts.
|
||||||
|
*
|
||||||
|
* @param {string} string
|
||||||
|
* @return {Object}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function splitType(string) {
|
||||||
|
var match = typeRegExp.exec(string.toLowerCase())
|
||||||
|
|
||||||
|
if (!match) {
|
||||||
|
throw new TypeError('invalid media type')
|
||||||
|
}
|
||||||
|
|
||||||
|
var type = match[1]
|
||||||
|
var subtype = match[2]
|
||||||
|
var suffix
|
||||||
|
|
||||||
|
// suffix after last +
|
||||||
|
var index = subtype.lastIndexOf('+')
|
||||||
|
if (index !== -1) {
|
||||||
|
suffix = subtype.substr(index + 1)
|
||||||
|
subtype = subtype.substr(0, index)
|
||||||
|
}
|
||||||
|
|
||||||
|
var obj = {
|
||||||
|
type: type,
|
||||||
|
subtype: subtype,
|
||||||
|
suffix: suffix
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj
|
||||||
|
}
|
||||||
60
node_modules/merge-descriptors/index.js
generated
vendored
Normal file
60
node_modules/merge-descriptors/index.js
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*!
|
||||||
|
* merge-descriptors
|
||||||
|
* Copyright(c) 2014 Jonathan Ong
|
||||||
|
* Copyright(c) 2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = merge
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var hasOwnProperty = Object.prototype.hasOwnProperty
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge the property descriptors of `src` into `dest`
|
||||||
|
*
|
||||||
|
* @param {object} dest Object to add descriptors to
|
||||||
|
* @param {object} src Object to clone descriptors from
|
||||||
|
* @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties
|
||||||
|
* @returns {object} Reference to dest
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function merge(dest, src, redefine) {
|
||||||
|
if (!dest) {
|
||||||
|
throw new TypeError('argument dest is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!src) {
|
||||||
|
throw new TypeError('argument src is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (redefine === undefined) {
|
||||||
|
// Default to true
|
||||||
|
redefine = true
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) {
|
||||||
|
if (!redefine && hasOwnProperty.call(dest, name)) {
|
||||||
|
// Skip desriptor
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy descriptor
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(src, name)
|
||||||
|
Object.defineProperty(dest, name, descriptor)
|
||||||
|
})
|
||||||
|
|
||||||
|
return dest
|
||||||
|
}
|
||||||
69
node_modules/methods/index.js
generated
vendored
Normal file
69
node_modules/methods/index.js
generated
vendored
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*!
|
||||||
|
* methods
|
||||||
|
* Copyright(c) 2013-2014 TJ Holowaychuk
|
||||||
|
* Copyright(c) 2015-2016 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var http = require('http');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = getCurrentNodeMethods() || getBasicNodeMethods();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current Node.js methods.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getCurrentNodeMethods() {
|
||||||
|
return http.METHODS && http.METHODS.map(function lowerCaseMethod(method) {
|
||||||
|
return method.toLowerCase();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the "basic" Node.js methods, a snapshot from Node.js 0.10.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getBasicNodeMethods() {
|
||||||
|
return [
|
||||||
|
'get',
|
||||||
|
'post',
|
||||||
|
'put',
|
||||||
|
'head',
|
||||||
|
'delete',
|
||||||
|
'options',
|
||||||
|
'trace',
|
||||||
|
'copy',
|
||||||
|
'lock',
|
||||||
|
'mkcol',
|
||||||
|
'move',
|
||||||
|
'purge',
|
||||||
|
'propfind',
|
||||||
|
'proppatch',
|
||||||
|
'unlock',
|
||||||
|
'report',
|
||||||
|
'mkactivity',
|
||||||
|
'checkout',
|
||||||
|
'merge',
|
||||||
|
'm-search',
|
||||||
|
'notify',
|
||||||
|
'subscribe',
|
||||||
|
'unsubscribe',
|
||||||
|
'patch',
|
||||||
|
'search',
|
||||||
|
'connect'
|
||||||
|
];
|
||||||
|
}
|
||||||
12
node_modules/mime-db/index.js
generated
vendored
Normal file
12
node_modules/mime-db/index.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/*!
|
||||||
|
* mime-db
|
||||||
|
* Copyright(c) 2014 Jonathan Ong
|
||||||
|
* Copyright(c) 2015-2022 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = require('./db.json')
|
||||||
188
node_modules/mime-types/index.js
generated
vendored
Normal file
188
node_modules/mime-types/index.js
generated
vendored
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
/*!
|
||||||
|
* mime-types
|
||||||
|
* Copyright(c) 2014 Jonathan Ong
|
||||||
|
* Copyright(c) 2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var db = require('mime-db')
|
||||||
|
var extname = require('path').extname
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
|
||||||
|
var TEXT_TYPE_REGEXP = /^text\//i
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.charset = charset
|
||||||
|
exports.charsets = { lookup: charset }
|
||||||
|
exports.contentType = contentType
|
||||||
|
exports.extension = extension
|
||||||
|
exports.extensions = Object.create(null)
|
||||||
|
exports.lookup = lookup
|
||||||
|
exports.types = Object.create(null)
|
||||||
|
|
||||||
|
// Populate the extensions/types maps
|
||||||
|
populateMaps(exports.extensions, exports.types)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the default charset for a MIME type.
|
||||||
|
*
|
||||||
|
* @param {string} type
|
||||||
|
* @return {boolean|string}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function charset (type) {
|
||||||
|
if (!type || typeof type !== 'string') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: use media-typer
|
||||||
|
var match = EXTRACT_TYPE_REGEXP.exec(type)
|
||||||
|
var mime = match && db[match[1].toLowerCase()]
|
||||||
|
|
||||||
|
if (mime && mime.charset) {
|
||||||
|
return mime.charset
|
||||||
|
}
|
||||||
|
|
||||||
|
// default text/* to utf-8
|
||||||
|
if (match && TEXT_TYPE_REGEXP.test(match[1])) {
|
||||||
|
return 'UTF-8'
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a full Content-Type header given a MIME type or extension.
|
||||||
|
*
|
||||||
|
* @param {string} str
|
||||||
|
* @return {boolean|string}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function contentType (str) {
|
||||||
|
// TODO: should this even be in this module?
|
||||||
|
if (!str || typeof str !== 'string') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var mime = str.indexOf('/') === -1
|
||||||
|
? exports.lookup(str)
|
||||||
|
: str
|
||||||
|
|
||||||
|
if (!mime) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: use content-type or other module
|
||||||
|
if (mime.indexOf('charset') === -1) {
|
||||||
|
var charset = exports.charset(mime)
|
||||||
|
if (charset) mime += '; charset=' + charset.toLowerCase()
|
||||||
|
}
|
||||||
|
|
||||||
|
return mime
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the default extension for a MIME type.
|
||||||
|
*
|
||||||
|
* @param {string} type
|
||||||
|
* @return {boolean|string}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function extension (type) {
|
||||||
|
if (!type || typeof type !== 'string') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: use media-typer
|
||||||
|
var match = EXTRACT_TYPE_REGEXP.exec(type)
|
||||||
|
|
||||||
|
// get extensions
|
||||||
|
var exts = match && exports.extensions[match[1].toLowerCase()]
|
||||||
|
|
||||||
|
if (!exts || !exts.length) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return exts[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup the MIME type for a file path/extension.
|
||||||
|
*
|
||||||
|
* @param {string} path
|
||||||
|
* @return {boolean|string}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function lookup (path) {
|
||||||
|
if (!path || typeof path !== 'string') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the extension ("ext" or ".ext" or full path)
|
||||||
|
var extension = extname('x.' + path)
|
||||||
|
.toLowerCase()
|
||||||
|
.substr(1)
|
||||||
|
|
||||||
|
if (!extension) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return exports.types[extension] || false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Populate the extensions and types maps.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function populateMaps (extensions, types) {
|
||||||
|
// source preference (least -> most)
|
||||||
|
var preference = ['nginx', 'apache', undefined, 'iana']
|
||||||
|
|
||||||
|
Object.keys(db).forEach(function forEachMimeType (type) {
|
||||||
|
var mime = db[type]
|
||||||
|
var exts = mime.extensions
|
||||||
|
|
||||||
|
if (!exts || !exts.length) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// mime -> extensions
|
||||||
|
extensions[type] = exts
|
||||||
|
|
||||||
|
// extension -> mime
|
||||||
|
for (var i = 0; i < exts.length; i++) {
|
||||||
|
var extension = exts[i]
|
||||||
|
|
||||||
|
if (types[extension]) {
|
||||||
|
var from = preference.indexOf(db[types[extension]].source)
|
||||||
|
var to = preference.indexOf(mime.source)
|
||||||
|
|
||||||
|
if (types[extension] !== 'application/octet-stream' &&
|
||||||
|
(from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {
|
||||||
|
// skip the remapping
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the extension -> mime
|
||||||
|
types[extension] = type
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
8
node_modules/mime/cli.js
generated
vendored
Normal file
8
node_modules/mime/cli.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
var mime = require('./mime.js');
|
||||||
|
var file = process.argv[2];
|
||||||
|
var type = mime.lookup(file);
|
||||||
|
|
||||||
|
process.stdout.write(type + '\n');
|
||||||
|
|
||||||
108
node_modules/mime/mime.js
generated
vendored
Normal file
108
node_modules/mime/mime.js
generated
vendored
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
function Mime() {
|
||||||
|
// Map of extension -> mime type
|
||||||
|
this.types = Object.create(null);
|
||||||
|
|
||||||
|
// Map of mime type -> extension
|
||||||
|
this.extensions = Object.create(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define mimetype -> extension mappings. Each key is a mime-type that maps
|
||||||
|
* to an array of extensions associated with the type. The first extension is
|
||||||
|
* used as the default extension for the type.
|
||||||
|
*
|
||||||
|
* e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
|
||||||
|
*
|
||||||
|
* @param map (Object) type definitions
|
||||||
|
*/
|
||||||
|
Mime.prototype.define = function (map) {
|
||||||
|
for (var type in map) {
|
||||||
|
var exts = map[type];
|
||||||
|
for (var i = 0; i < exts.length; i++) {
|
||||||
|
if (process.env.DEBUG_MIME && this.types[exts[i]]) {
|
||||||
|
console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' +
|
||||||
|
this.types[exts[i]] + ' to ' + type);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.types[exts[i]] = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default extension is the first one we encounter
|
||||||
|
if (!this.extensions[type]) {
|
||||||
|
this.extensions[type] = exts[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load an Apache2-style ".types" file
|
||||||
|
*
|
||||||
|
* This may be called multiple times (it's expected). Where files declare
|
||||||
|
* overlapping types/extensions, the last file wins.
|
||||||
|
*
|
||||||
|
* @param file (String) path of file to load.
|
||||||
|
*/
|
||||||
|
Mime.prototype.load = function(file) {
|
||||||
|
this._loading = file;
|
||||||
|
// Read file and split into lines
|
||||||
|
var map = {},
|
||||||
|
content = fs.readFileSync(file, 'ascii'),
|
||||||
|
lines = content.split(/[\r\n]+/);
|
||||||
|
|
||||||
|
lines.forEach(function(line) {
|
||||||
|
// Clean up whitespace/comments, and split into fields
|
||||||
|
var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
|
||||||
|
map[fields.shift()] = fields;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.define(map);
|
||||||
|
|
||||||
|
this._loading = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup a mime type based on extension
|
||||||
|
*/
|
||||||
|
Mime.prototype.lookup = function(path, fallback) {
|
||||||
|
var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase();
|
||||||
|
|
||||||
|
return this.types[ext] || fallback || this.default_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return file extension associated with a mime type
|
||||||
|
*/
|
||||||
|
Mime.prototype.extension = function(mimeType) {
|
||||||
|
var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase();
|
||||||
|
return this.extensions[type];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default instance
|
||||||
|
var mime = new Mime();
|
||||||
|
|
||||||
|
// Define built-in types
|
||||||
|
mime.define(require('./types.json'));
|
||||||
|
|
||||||
|
// Default type
|
||||||
|
mime.default_type = mime.lookup('bin');
|
||||||
|
|
||||||
|
//
|
||||||
|
// Additional API specific to the default instance
|
||||||
|
//
|
||||||
|
|
||||||
|
mime.Mime = Mime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup a charset based on mime type.
|
||||||
|
*/
|
||||||
|
mime.charsets = {
|
||||||
|
lookup: function(mimeType, fallback) {
|
||||||
|
// Assume text types are utf8
|
||||||
|
return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = mime;
|
||||||
53
node_modules/mime/src/build.js
generated
vendored
Normal file
53
node_modules/mime/src/build.js
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const mimeScore = require('mime-score');
|
||||||
|
|
||||||
|
let db = require('mime-db');
|
||||||
|
let chalk = require('chalk');
|
||||||
|
|
||||||
|
const STANDARD_FACET_SCORE = 900;
|
||||||
|
|
||||||
|
const byExtension = {};
|
||||||
|
|
||||||
|
// Clear out any conflict extensions in mime-db
|
||||||
|
for (let type in db) {
|
||||||
|
let entry = db[type];
|
||||||
|
entry.type = type;
|
||||||
|
|
||||||
|
if (!entry.extensions) continue;
|
||||||
|
|
||||||
|
entry.extensions.forEach(ext => {
|
||||||
|
if (ext in byExtension) {
|
||||||
|
const e0 = entry;
|
||||||
|
const e1 = byExtension[ext];
|
||||||
|
e0.pri = mimeScore(e0.type, e0.source);
|
||||||
|
e1.pri = mimeScore(e1.type, e1.source);
|
||||||
|
|
||||||
|
let drop = e0.pri < e1.pri ? e0 : e1;
|
||||||
|
let keep = e0.pri >= e1.pri ? e0 : e1;
|
||||||
|
drop.extensions = drop.extensions.filter(e => e !== ext);
|
||||||
|
|
||||||
|
console.log(`${ext}: Keeping ${chalk.green(keep.type)} (${keep.pri}), dropping ${chalk.red(drop.type)} (${drop.pri})`);
|
||||||
|
}
|
||||||
|
byExtension[ext] = entry;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeTypesFile(types, path) {
|
||||||
|
fs.writeFileSync(path, JSON.stringify(types));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Segregate into standard and non-standard types based on facet per
|
||||||
|
// https://tools.ietf.org/html/rfc6838#section-3.1
|
||||||
|
const types = {};
|
||||||
|
|
||||||
|
Object.keys(db).sort().forEach(k => {
|
||||||
|
const entry = db[k];
|
||||||
|
types[entry.type] = entry.extensions;
|
||||||
|
});
|
||||||
|
|
||||||
|
writeTypesFile(types, path.join(__dirname, '..', 'types.json'));
|
||||||
60
node_modules/mime/src/test.js
generated
vendored
Normal file
60
node_modules/mime/src/test.js
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/**
|
||||||
|
* Usage: node test.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
var mime = require('../mime');
|
||||||
|
var assert = require('assert');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
|
//
|
||||||
|
// Test mime lookups
|
||||||
|
//
|
||||||
|
|
||||||
|
assert.equal('text/plain', mime.lookup('text.txt')); // normal file
|
||||||
|
assert.equal('text/plain', mime.lookup('TEXT.TXT')); // uppercase
|
||||||
|
assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file
|
||||||
|
assert.equal('text/plain', mime.lookup('.text.txt')); // hidden file
|
||||||
|
assert.equal('text/plain', mime.lookup('.txt')); // nameless
|
||||||
|
assert.equal('text/plain', mime.lookup('txt')); // extension-only
|
||||||
|
assert.equal('text/plain', mime.lookup('/txt')); // extension-less ()
|
||||||
|
assert.equal('text/plain', mime.lookup('\\txt')); // Windows, extension-less
|
||||||
|
assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized
|
||||||
|
assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default
|
||||||
|
|
||||||
|
//
|
||||||
|
// Test extensions
|
||||||
|
//
|
||||||
|
|
||||||
|
assert.equal('txt', mime.extension(mime.types.text));
|
||||||
|
assert.equal('html', mime.extension(mime.types.htm));
|
||||||
|
assert.equal('bin', mime.extension('application/octet-stream'));
|
||||||
|
assert.equal('bin', mime.extension('application/octet-stream '));
|
||||||
|
assert.equal('html', mime.extension(' text/html; charset=UTF-8'));
|
||||||
|
assert.equal('html', mime.extension('text/html; charset=UTF-8 '));
|
||||||
|
assert.equal('html', mime.extension('text/html; charset=UTF-8'));
|
||||||
|
assert.equal('html', mime.extension('text/html ; charset=UTF-8'));
|
||||||
|
assert.equal('html', mime.extension('text/html;charset=UTF-8'));
|
||||||
|
assert.equal('html', mime.extension('text/Html;charset=UTF-8'));
|
||||||
|
assert.equal(undefined, mime.extension('unrecognized'));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Test node.types lookups
|
||||||
|
//
|
||||||
|
|
||||||
|
assert.equal('font/woff', mime.lookup('file.woff'));
|
||||||
|
assert.equal('application/octet-stream', mime.lookup('file.buffer'));
|
||||||
|
// TODO: Uncomment once #157 is resolved
|
||||||
|
// assert.equal('audio/mp4', mime.lookup('file.m4a'));
|
||||||
|
assert.equal('font/otf', mime.lookup('file.otf'));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Test charsets
|
||||||
|
//
|
||||||
|
|
||||||
|
assert.equal('UTF-8', mime.charsets.lookup('text/plain'));
|
||||||
|
assert.equal('UTF-8', mime.charsets.lookup(mime.types.js));
|
||||||
|
assert.equal('UTF-8', mime.charsets.lookup(mime.types.json));
|
||||||
|
assert.equal(undefined, mime.charsets.lookup(mime.types.bin));
|
||||||
|
assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));
|
||||||
|
|
||||||
|
console.log('\nAll tests passed');
|
||||||
152
node_modules/ms/index.js
generated
vendored
Normal file
152
node_modules/ms/index.js
generated
vendored
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
/**
|
||||||
|
* Helpers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var s = 1000;
|
||||||
|
var m = s * 60;
|
||||||
|
var h = m * 60;
|
||||||
|
var d = h * 24;
|
||||||
|
var y = d * 365.25;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse or format the given `val`.
|
||||||
|
*
|
||||||
|
* Options:
|
||||||
|
*
|
||||||
|
* - `long` verbose formatting [false]
|
||||||
|
*
|
||||||
|
* @param {String|Number} val
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @throws {Error} throw an error if val is not a non-empty string or a number
|
||||||
|
* @return {String|Number}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function(val, options) {
|
||||||
|
options = options || {};
|
||||||
|
var type = typeof val;
|
||||||
|
if (type === 'string' && val.length > 0) {
|
||||||
|
return parse(val);
|
||||||
|
} else if (type === 'number' && isNaN(val) === false) {
|
||||||
|
return options.long ? fmtLong(val) : fmtShort(val);
|
||||||
|
}
|
||||||
|
throw new Error(
|
||||||
|
'val is not a non-empty string or a valid number. val=' +
|
||||||
|
JSON.stringify(val)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the given `str` and return milliseconds.
|
||||||
|
*
|
||||||
|
* @param {String} str
|
||||||
|
* @return {Number}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parse(str) {
|
||||||
|
str = String(str);
|
||||||
|
if (str.length > 100) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
|
||||||
|
str
|
||||||
|
);
|
||||||
|
if (!match) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var n = parseFloat(match[1]);
|
||||||
|
var type = (match[2] || 'ms').toLowerCase();
|
||||||
|
switch (type) {
|
||||||
|
case 'years':
|
||||||
|
case 'year':
|
||||||
|
case 'yrs':
|
||||||
|
case 'yr':
|
||||||
|
case 'y':
|
||||||
|
return n * y;
|
||||||
|
case 'days':
|
||||||
|
case 'day':
|
||||||
|
case 'd':
|
||||||
|
return n * d;
|
||||||
|
case 'hours':
|
||||||
|
case 'hour':
|
||||||
|
case 'hrs':
|
||||||
|
case 'hr':
|
||||||
|
case 'h':
|
||||||
|
return n * h;
|
||||||
|
case 'minutes':
|
||||||
|
case 'minute':
|
||||||
|
case 'mins':
|
||||||
|
case 'min':
|
||||||
|
case 'm':
|
||||||
|
return n * m;
|
||||||
|
case 'seconds':
|
||||||
|
case 'second':
|
||||||
|
case 'secs':
|
||||||
|
case 'sec':
|
||||||
|
case 's':
|
||||||
|
return n * s;
|
||||||
|
case 'milliseconds':
|
||||||
|
case 'millisecond':
|
||||||
|
case 'msecs':
|
||||||
|
case 'msec':
|
||||||
|
case 'ms':
|
||||||
|
return n;
|
||||||
|
default:
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short format for `ms`.
|
||||||
|
*
|
||||||
|
* @param {Number} ms
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fmtShort(ms) {
|
||||||
|
if (ms >= d) {
|
||||||
|
return Math.round(ms / d) + 'd';
|
||||||
|
}
|
||||||
|
if (ms >= h) {
|
||||||
|
return Math.round(ms / h) + 'h';
|
||||||
|
}
|
||||||
|
if (ms >= m) {
|
||||||
|
return Math.round(ms / m) + 'm';
|
||||||
|
}
|
||||||
|
if (ms >= s) {
|
||||||
|
return Math.round(ms / s) + 's';
|
||||||
|
}
|
||||||
|
return ms + 'ms';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Long format for `ms`.
|
||||||
|
*
|
||||||
|
* @param {Number} ms
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fmtLong(ms) {
|
||||||
|
return plural(ms, d, 'day') ||
|
||||||
|
plural(ms, h, 'hour') ||
|
||||||
|
plural(ms, m, 'minute') ||
|
||||||
|
plural(ms, s, 'second') ||
|
||||||
|
ms + ' ms';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pluralization helper.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function plural(ms, n, name) {
|
||||||
|
if (ms < n) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ms < n * 1.5) {
|
||||||
|
return Math.floor(ms / n) + ' ' + name;
|
||||||
|
}
|
||||||
|
return Math.ceil(ms / n) + ' ' + name + 's';
|
||||||
|
}
|
||||||
82
node_modules/negotiator/index.js
generated
vendored
Normal file
82
node_modules/negotiator/index.js
generated
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/*!
|
||||||
|
* negotiator
|
||||||
|
* Copyright(c) 2012 Federico Romero
|
||||||
|
* Copyright(c) 2012-2014 Isaac Z. Schlueter
|
||||||
|
* Copyright(c) 2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var preferredCharsets = require('./lib/charset')
|
||||||
|
var preferredEncodings = require('./lib/encoding')
|
||||||
|
var preferredLanguages = require('./lib/language')
|
||||||
|
var preferredMediaTypes = require('./lib/mediaType')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = Negotiator;
|
||||||
|
module.exports.Negotiator = Negotiator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a Negotiator instance from a request.
|
||||||
|
* @param {object} request
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function Negotiator(request) {
|
||||||
|
if (!(this instanceof Negotiator)) {
|
||||||
|
return new Negotiator(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.request = request;
|
||||||
|
}
|
||||||
|
|
||||||
|
Negotiator.prototype.charset = function charset(available) {
|
||||||
|
var set = this.charsets(available);
|
||||||
|
return set && set[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
Negotiator.prototype.charsets = function charsets(available) {
|
||||||
|
return preferredCharsets(this.request.headers['accept-charset'], available);
|
||||||
|
};
|
||||||
|
|
||||||
|
Negotiator.prototype.encoding = function encoding(available) {
|
||||||
|
var set = this.encodings(available);
|
||||||
|
return set && set[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
Negotiator.prototype.encodings = function encodings(available) {
|
||||||
|
return preferredEncodings(this.request.headers['accept-encoding'], available);
|
||||||
|
};
|
||||||
|
|
||||||
|
Negotiator.prototype.language = function language(available) {
|
||||||
|
var set = this.languages(available);
|
||||||
|
return set && set[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
Negotiator.prototype.languages = function languages(available) {
|
||||||
|
return preferredLanguages(this.request.headers['accept-language'], available);
|
||||||
|
};
|
||||||
|
|
||||||
|
Negotiator.prototype.mediaType = function mediaType(available) {
|
||||||
|
var set = this.mediaTypes(available);
|
||||||
|
return set && set[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
Negotiator.prototype.mediaTypes = function mediaTypes(available) {
|
||||||
|
return preferredMediaTypes(this.request.headers.accept, available);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Backwards compatibility
|
||||||
|
Negotiator.prototype.preferredCharset = Negotiator.prototype.charset;
|
||||||
|
Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets;
|
||||||
|
Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding;
|
||||||
|
Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings;
|
||||||
|
Negotiator.prototype.preferredLanguage = Negotiator.prototype.language;
|
||||||
|
Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages;
|
||||||
|
Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType;
|
||||||
|
Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes;
|
||||||
169
node_modules/negotiator/lib/charset.js
generated
vendored
Normal file
169
node_modules/negotiator/lib/charset.js
generated
vendored
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/**
|
||||||
|
* negotiator
|
||||||
|
* Copyright(c) 2012 Isaac Z. Schlueter
|
||||||
|
* Copyright(c) 2014 Federico Romero
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = preferredCharsets;
|
||||||
|
module.exports.preferredCharsets = preferredCharsets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the Accept-Charset header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseAcceptCharset(accept) {
|
||||||
|
var accepts = accept.split(',');
|
||||||
|
|
||||||
|
for (var i = 0, j = 0; i < accepts.length; i++) {
|
||||||
|
var charset = parseCharset(accepts[i].trim(), i);
|
||||||
|
|
||||||
|
if (charset) {
|
||||||
|
accepts[j++] = charset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim accepts
|
||||||
|
accepts.length = j;
|
||||||
|
|
||||||
|
return accepts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a charset from the Accept-Charset header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseCharset(str, i) {
|
||||||
|
var match = simpleCharsetRegExp.exec(str);
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
var charset = match[1];
|
||||||
|
var q = 1;
|
||||||
|
if (match[2]) {
|
||||||
|
var params = match[2].split(';')
|
||||||
|
for (var j = 0; j < params.length; j++) {
|
||||||
|
var p = params[j].trim().split('=');
|
||||||
|
if (p[0] === 'q') {
|
||||||
|
q = parseFloat(p[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
charset: charset,
|
||||||
|
q: q,
|
||||||
|
i: i
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the priority of a charset.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getCharsetPriority(charset, accepted, index) {
|
||||||
|
var priority = {o: -1, q: 0, s: 0};
|
||||||
|
|
||||||
|
for (var i = 0; i < accepted.length; i++) {
|
||||||
|
var spec = specify(charset, accepted[i], index);
|
||||||
|
|
||||||
|
if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
|
||||||
|
priority = spec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the specificity of the charset.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function specify(charset, spec, index) {
|
||||||
|
var s = 0;
|
||||||
|
if(spec.charset.toLowerCase() === charset.toLowerCase()){
|
||||||
|
s |= 1;
|
||||||
|
} else if (spec.charset !== '*' ) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
i: index,
|
||||||
|
o: spec.i,
|
||||||
|
q: spec.q,
|
||||||
|
s: s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the preferred charsets from an Accept-Charset header.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function preferredCharsets(accept, provided) {
|
||||||
|
// RFC 2616 sec 14.2: no header = *
|
||||||
|
var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || '');
|
||||||
|
|
||||||
|
if (!provided) {
|
||||||
|
// sorted list of all charsets
|
||||||
|
return accepts
|
||||||
|
.filter(isQuality)
|
||||||
|
.sort(compareSpecs)
|
||||||
|
.map(getFullCharset);
|
||||||
|
}
|
||||||
|
|
||||||
|
var priorities = provided.map(function getPriority(type, index) {
|
||||||
|
return getCharsetPriority(type, accepts, index);
|
||||||
|
});
|
||||||
|
|
||||||
|
// sorted list of accepted charsets
|
||||||
|
return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) {
|
||||||
|
return provided[priorities.indexOf(priority)];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two specs.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function compareSpecs(a, b) {
|
||||||
|
return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get full charset string.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getFullCharset(spec) {
|
||||||
|
return spec.charset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a spec has any quality.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isQuality(spec) {
|
||||||
|
return spec.q > 0;
|
||||||
|
}
|
||||||
184
node_modules/negotiator/lib/encoding.js
generated
vendored
Normal file
184
node_modules/negotiator/lib/encoding.js
generated
vendored
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
/**
|
||||||
|
* negotiator
|
||||||
|
* Copyright(c) 2012 Isaac Z. Schlueter
|
||||||
|
* Copyright(c) 2014 Federico Romero
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = preferredEncodings;
|
||||||
|
module.exports.preferredEncodings = preferredEncodings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the Accept-Encoding header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseAcceptEncoding(accept) {
|
||||||
|
var accepts = accept.split(',');
|
||||||
|
var hasIdentity = false;
|
||||||
|
var minQuality = 1;
|
||||||
|
|
||||||
|
for (var i = 0, j = 0; i < accepts.length; i++) {
|
||||||
|
var encoding = parseEncoding(accepts[i].trim(), i);
|
||||||
|
|
||||||
|
if (encoding) {
|
||||||
|
accepts[j++] = encoding;
|
||||||
|
hasIdentity = hasIdentity || specify('identity', encoding);
|
||||||
|
minQuality = Math.min(minQuality, encoding.q || 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasIdentity) {
|
||||||
|
/*
|
||||||
|
* If identity doesn't explicitly appear in the accept-encoding header,
|
||||||
|
* it's added to the list of acceptable encoding with the lowest q
|
||||||
|
*/
|
||||||
|
accepts[j++] = {
|
||||||
|
encoding: 'identity',
|
||||||
|
q: minQuality,
|
||||||
|
i: i
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim accepts
|
||||||
|
accepts.length = j;
|
||||||
|
|
||||||
|
return accepts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse an encoding from the Accept-Encoding header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseEncoding(str, i) {
|
||||||
|
var match = simpleEncodingRegExp.exec(str);
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
var encoding = match[1];
|
||||||
|
var q = 1;
|
||||||
|
if (match[2]) {
|
||||||
|
var params = match[2].split(';');
|
||||||
|
for (var j = 0; j < params.length; j++) {
|
||||||
|
var p = params[j].trim().split('=');
|
||||||
|
if (p[0] === 'q') {
|
||||||
|
q = parseFloat(p[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
encoding: encoding,
|
||||||
|
q: q,
|
||||||
|
i: i
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the priority of an encoding.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getEncodingPriority(encoding, accepted, index) {
|
||||||
|
var priority = {o: -1, q: 0, s: 0};
|
||||||
|
|
||||||
|
for (var i = 0; i < accepted.length; i++) {
|
||||||
|
var spec = specify(encoding, accepted[i], index);
|
||||||
|
|
||||||
|
if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
|
||||||
|
priority = spec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the specificity of the encoding.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function specify(encoding, spec, index) {
|
||||||
|
var s = 0;
|
||||||
|
if(spec.encoding.toLowerCase() === encoding.toLowerCase()){
|
||||||
|
s |= 1;
|
||||||
|
} else if (spec.encoding !== '*' ) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
i: index,
|
||||||
|
o: spec.i,
|
||||||
|
q: spec.q,
|
||||||
|
s: s
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the preferred encodings from an Accept-Encoding header.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function preferredEncodings(accept, provided) {
|
||||||
|
var accepts = parseAcceptEncoding(accept || '');
|
||||||
|
|
||||||
|
if (!provided) {
|
||||||
|
// sorted list of all encodings
|
||||||
|
return accepts
|
||||||
|
.filter(isQuality)
|
||||||
|
.sort(compareSpecs)
|
||||||
|
.map(getFullEncoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
var priorities = provided.map(function getPriority(type, index) {
|
||||||
|
return getEncodingPriority(type, accepts, index);
|
||||||
|
});
|
||||||
|
|
||||||
|
// sorted list of accepted encodings
|
||||||
|
return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) {
|
||||||
|
return provided[priorities.indexOf(priority)];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two specs.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function compareSpecs(a, b) {
|
||||||
|
return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get full encoding string.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getFullEncoding(spec) {
|
||||||
|
return spec.encoding;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a spec has any quality.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isQuality(spec) {
|
||||||
|
return spec.q > 0;
|
||||||
|
}
|
||||||
179
node_modules/negotiator/lib/language.js
generated
vendored
Normal file
179
node_modules/negotiator/lib/language.js
generated
vendored
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
/**
|
||||||
|
* negotiator
|
||||||
|
* Copyright(c) 2012 Isaac Z. Schlueter
|
||||||
|
* Copyright(c) 2014 Federico Romero
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = preferredLanguages;
|
||||||
|
module.exports.preferredLanguages = preferredLanguages;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the Accept-Language header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseAcceptLanguage(accept) {
|
||||||
|
var accepts = accept.split(',');
|
||||||
|
|
||||||
|
for (var i = 0, j = 0; i < accepts.length; i++) {
|
||||||
|
var language = parseLanguage(accepts[i].trim(), i);
|
||||||
|
|
||||||
|
if (language) {
|
||||||
|
accepts[j++] = language;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim accepts
|
||||||
|
accepts.length = j;
|
||||||
|
|
||||||
|
return accepts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a language from the Accept-Language header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseLanguage(str, i) {
|
||||||
|
var match = simpleLanguageRegExp.exec(str);
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
var prefix = match[1]
|
||||||
|
var suffix = match[2]
|
||||||
|
var full = prefix
|
||||||
|
|
||||||
|
if (suffix) full += "-" + suffix;
|
||||||
|
|
||||||
|
var q = 1;
|
||||||
|
if (match[3]) {
|
||||||
|
var params = match[3].split(';')
|
||||||
|
for (var j = 0; j < params.length; j++) {
|
||||||
|
var p = params[j].split('=');
|
||||||
|
if (p[0] === 'q') q = parseFloat(p[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
prefix: prefix,
|
||||||
|
suffix: suffix,
|
||||||
|
q: q,
|
||||||
|
i: i,
|
||||||
|
full: full
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the priority of a language.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getLanguagePriority(language, accepted, index) {
|
||||||
|
var priority = {o: -1, q: 0, s: 0};
|
||||||
|
|
||||||
|
for (var i = 0; i < accepted.length; i++) {
|
||||||
|
var spec = specify(language, accepted[i], index);
|
||||||
|
|
||||||
|
if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
|
||||||
|
priority = spec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the specificity of the language.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function specify(language, spec, index) {
|
||||||
|
var p = parseLanguage(language)
|
||||||
|
if (!p) return null;
|
||||||
|
var s = 0;
|
||||||
|
if(spec.full.toLowerCase() === p.full.toLowerCase()){
|
||||||
|
s |= 4;
|
||||||
|
} else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) {
|
||||||
|
s |= 2;
|
||||||
|
} else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) {
|
||||||
|
s |= 1;
|
||||||
|
} else if (spec.full !== '*' ) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
i: index,
|
||||||
|
o: spec.i,
|
||||||
|
q: spec.q,
|
||||||
|
s: s
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the preferred languages from an Accept-Language header.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function preferredLanguages(accept, provided) {
|
||||||
|
// RFC 2616 sec 14.4: no header = *
|
||||||
|
var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || '');
|
||||||
|
|
||||||
|
if (!provided) {
|
||||||
|
// sorted list of all languages
|
||||||
|
return accepts
|
||||||
|
.filter(isQuality)
|
||||||
|
.sort(compareSpecs)
|
||||||
|
.map(getFullLanguage);
|
||||||
|
}
|
||||||
|
|
||||||
|
var priorities = provided.map(function getPriority(type, index) {
|
||||||
|
return getLanguagePriority(type, accepts, index);
|
||||||
|
});
|
||||||
|
|
||||||
|
// sorted list of accepted languages
|
||||||
|
return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) {
|
||||||
|
return provided[priorities.indexOf(priority)];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two specs.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function compareSpecs(a, b) {
|
||||||
|
return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get full language string.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getFullLanguage(spec) {
|
||||||
|
return spec.full;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a spec has any quality.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isQuality(spec) {
|
||||||
|
return spec.q > 0;
|
||||||
|
}
|
||||||
294
node_modules/negotiator/lib/mediaType.js
generated
vendored
Normal file
294
node_modules/negotiator/lib/mediaType.js
generated
vendored
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
/**
|
||||||
|
* negotiator
|
||||||
|
* Copyright(c) 2012 Isaac Z. Schlueter
|
||||||
|
* Copyright(c) 2014 Federico Romero
|
||||||
|
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module exports.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = preferredMediaTypes;
|
||||||
|
module.exports.preferredMediaTypes = preferredMediaTypes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module variables.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the Accept header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseAccept(accept) {
|
||||||
|
var accepts = splitMediaTypes(accept);
|
||||||
|
|
||||||
|
for (var i = 0, j = 0; i < accepts.length; i++) {
|
||||||
|
var mediaType = parseMediaType(accepts[i].trim(), i);
|
||||||
|
|
||||||
|
if (mediaType) {
|
||||||
|
accepts[j++] = mediaType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim accepts
|
||||||
|
accepts.length = j;
|
||||||
|
|
||||||
|
return accepts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a media type from the Accept header.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parseMediaType(str, i) {
|
||||||
|
var match = simpleMediaTypeRegExp.exec(str);
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
var params = Object.create(null);
|
||||||
|
var q = 1;
|
||||||
|
var subtype = match[2];
|
||||||
|
var type = match[1];
|
||||||
|
|
||||||
|
if (match[3]) {
|
||||||
|
var kvps = splitParameters(match[3]).map(splitKeyValuePair);
|
||||||
|
|
||||||
|
for (var j = 0; j < kvps.length; j++) {
|
||||||
|
var pair = kvps[j];
|
||||||
|
var key = pair[0].toLowerCase();
|
||||||
|
var val = pair[1];
|
||||||
|
|
||||||
|
// get the value, unwrapping quotes
|
||||||
|
var value = val && val[0] === '"' && val[val.length - 1] === '"'
|
||||||
|
? val.substr(1, val.length - 2)
|
||||||
|
: val;
|
||||||
|
|
||||||
|
if (key === 'q') {
|
||||||
|
q = parseFloat(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store parameter
|
||||||
|
params[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: type,
|
||||||
|
subtype: subtype,
|
||||||
|
params: params,
|
||||||
|
q: q,
|
||||||
|
i: i
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the priority of a media type.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getMediaTypePriority(type, accepted, index) {
|
||||||
|
var priority = {o: -1, q: 0, s: 0};
|
||||||
|
|
||||||
|
for (var i = 0; i < accepted.length; i++) {
|
||||||
|
var spec = specify(type, accepted[i], index);
|
||||||
|
|
||||||
|
if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
|
||||||
|
priority = spec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the specificity of the media type.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function specify(type, spec, index) {
|
||||||
|
var p = parseMediaType(type);
|
||||||
|
var s = 0;
|
||||||
|
|
||||||
|
if (!p) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(spec.type.toLowerCase() == p.type.toLowerCase()) {
|
||||||
|
s |= 4
|
||||||
|
} else if(spec.type != '*') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {
|
||||||
|
s |= 2
|
||||||
|
} else if(spec.subtype != '*') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var keys = Object.keys(spec.params);
|
||||||
|
if (keys.length > 0) {
|
||||||
|
if (keys.every(function (k) {
|
||||||
|
return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase();
|
||||||
|
})) {
|
||||||
|
s |= 1
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
i: index,
|
||||||
|
o: spec.i,
|
||||||
|
q: spec.q,
|
||||||
|
s: s,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the preferred media types from an Accept header.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function preferredMediaTypes(accept, provided) {
|
||||||
|
// RFC 2616 sec 14.2: no header = */*
|
||||||
|
var accepts = parseAccept(accept === undefined ? '*/*' : accept || '');
|
||||||
|
|
||||||
|
if (!provided) {
|
||||||
|
// sorted list of all types
|
||||||
|
return accepts
|
||||||
|
.filter(isQuality)
|
||||||
|
.sort(compareSpecs)
|
||||||
|
.map(getFullType);
|
||||||
|
}
|
||||||
|
|
||||||
|
var priorities = provided.map(function getPriority(type, index) {
|
||||||
|
return getMediaTypePriority(type, accepts, index);
|
||||||
|
});
|
||||||
|
|
||||||
|
// sorted list of accepted types
|
||||||
|
return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) {
|
||||||
|
return provided[priorities.indexOf(priority)];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two specs.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function compareSpecs(a, b) {
|
||||||
|
return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get full type string.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getFullType(spec) {
|
||||||
|
return spec.type + '/' + spec.subtype;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a spec has any quality.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isQuality(spec) {
|
||||||
|
return spec.q > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count the number of quotes in a string.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function quoteCount(string) {
|
||||||
|
var count = 0;
|
||||||
|
var index = 0;
|
||||||
|
|
||||||
|
while ((index = string.indexOf('"', index)) !== -1) {
|
||||||
|
count++;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split a key value pair.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function splitKeyValuePair(str) {
|
||||||
|
var index = str.indexOf('=');
|
||||||
|
var key;
|
||||||
|
var val;
|
||||||
|
|
||||||
|
if (index === -1) {
|
||||||
|
key = str;
|
||||||
|
} else {
|
||||||
|
key = str.substr(0, index);
|
||||||
|
val = str.substr(index + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [key, val];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split an Accept header into media types.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function splitMediaTypes(accept) {
|
||||||
|
var accepts = accept.split(',');
|
||||||
|
|
||||||
|
for (var i = 1, j = 0; i < accepts.length; i++) {
|
||||||
|
if (quoteCount(accepts[j]) % 2 == 0) {
|
||||||
|
accepts[++j] = accepts[i];
|
||||||
|
} else {
|
||||||
|
accepts[j] += ',' + accepts[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim accepts
|
||||||
|
accepts.length = j + 1;
|
||||||
|
|
||||||
|
return accepts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split a string of parameters.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function splitParameters(str) {
|
||||||
|
var parameters = str.split(';');
|
||||||
|
|
||||||
|
for (var i = 1, j = 0; i < parameters.length; i++) {
|
||||||
|
if (quoteCount(parameters[j]) % 2 == 0) {
|
||||||
|
parameters[++j] = parameters[i];
|
||||||
|
} else {
|
||||||
|
parameters[j] += ';' + parameters[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trim parameters
|
||||||
|
parameters.length = j + 1;
|
||||||
|
|
||||||
|
for (var i = 0; i < parameters.length; i++) {
|
||||||
|
parameters[i] = parameters[i].trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
23
node_modules/object-inspect/example/all.js
generated
vendored
Normal file
23
node_modules/object-inspect/example/all.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var inspect = require('../');
|
||||||
|
var Buffer = require('safer-buffer').Buffer;
|
||||||
|
|
||||||
|
var holes = ['a', 'b'];
|
||||||
|
holes[4] = 'e';
|
||||||
|
holes[6] = 'g';
|
||||||
|
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: [3, 4, undefined, null],
|
||||||
|
c: undefined,
|
||||||
|
d: null,
|
||||||
|
e: {
|
||||||
|
regex: /^x/i,
|
||||||
|
buf: Buffer.from('abc'),
|
||||||
|
holes: holes
|
||||||
|
},
|
||||||
|
now: new Date()
|
||||||
|
};
|
||||||
|
obj.self = obj;
|
||||||
|
console.log(inspect(obj));
|
||||||
6
node_modules/object-inspect/example/circular.js
generated
vendored
Normal file
6
node_modules/object-inspect/example/circular.js
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var inspect = require('../');
|
||||||
|
var obj = { a: 1, b: [3, 4] };
|
||||||
|
obj.c = obj;
|
||||||
|
console.log(inspect(obj));
|
||||||
5
node_modules/object-inspect/example/fn.js
generated
vendored
Normal file
5
node_modules/object-inspect/example/fn.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var inspect = require('../');
|
||||||
|
var obj = [1, 2, function f(n) { return n + 5; }, 4];
|
||||||
|
console.log(inspect(obj));
|
||||||
10
node_modules/object-inspect/example/inspect.js
generated
vendored
Normal file
10
node_modules/object-inspect/example/inspect.js
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* eslint-env browser */
|
||||||
|
var inspect = require('../');
|
||||||
|
|
||||||
|
var d = document.createElement('div');
|
||||||
|
d.setAttribute('id', 'beep');
|
||||||
|
d.innerHTML = '<b>wooo</b><i>iiiii</i>';
|
||||||
|
|
||||||
|
console.log(inspect([d, { a: 3, b: 4, c: [5, 6, [7, [8, [9]]]] }]));
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user