parent
cbdf44c4d9
commit
82d8a93396
@ -1,17 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
||||||
|
|
||||||
case `uname` in
|
|
||||||
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -z "$NODE_PATH" ]; then
|
|
||||||
export NODE_PATH="$basedir/D:/edge/nodejs/random_select_system/node_modules/.store/xlsx@0.18.5/node_modules"
|
|
||||||
else
|
|
||||||
export NODE_PATH="$NODE_PATH:$basedir/D:/edge/nodejs/random_select_system/node_modules/.store/xlsx@0.18.5/node_modules"
|
|
||||||
fi
|
|
||||||
if [ -x "$basedir/node" ]; then
|
|
||||||
exec "$basedir/node" "$basedir/../.store/xlsx@0.18.5/node_modules/xlsx/bin/xlsx.njs" "$@"
|
|
||||||
else
|
|
||||||
exec node "$basedir/../.store/xlsx@0.18.5/node_modules/xlsx/bin/xlsx.njs" "$@"
|
|
||||||
fi
|
|
@ -1,12 +0,0 @@
|
|||||||
@SETLOCAL
|
|
||||||
@IF NOT DEFINED NODE_PATH (
|
|
||||||
@SET "NODE_PATH=%~dp0\D:\edge\nodejs\random_select_system\node_modules\.store\xlsx@0.18.5\node_modules"
|
|
||||||
) ELSE (
|
|
||||||
@SET "NODE_PATH=%NODE_PATH%;%~dp0\D:\edge\nodejs\random_select_system\node_modules\.store\xlsx@0.18.5\node_modules"
|
|
||||||
)
|
|
||||||
@IF EXIST "%~dp0\node.exe" (
|
|
||||||
"%~dp0\node.exe" "%~dp0\..\.store\xlsx@0.18.5\node_modules\xlsx\bin\xlsx.njs" %*
|
|
||||||
) ELSE (
|
|
||||||
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
|
||||||
node "%~dp0\..\.store\xlsx@0.18.5\node_modules\xlsx\bin\xlsx.njs" %*
|
|
||||||
)
|
|
@ -1,41 +0,0 @@
|
|||||||
#!/usr/bin/env pwsh
|
|
||||||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
||||||
|
|
||||||
$exe=""
|
|
||||||
$pathsep=":"
|
|
||||||
$env_node_path=$env:NODE_PATH
|
|
||||||
$new_node_path="$basedir\D:\edge\nodejs\random_select_system\node_modules\.store\xlsx@0.18.5\node_modules"
|
|
||||||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
||||||
# Fix case when both the Windows and Linux builds of Node
|
|
||||||
# are installed in the same directory
|
|
||||||
$exe=".exe"
|
|
||||||
$pathsep=";"
|
|
||||||
} else {
|
|
||||||
$new_node_path="$basedir/D:/edge/nodejs/random_select_system/node_modules/.store/xlsx@0.18.5/node_modules"
|
|
||||||
}
|
|
||||||
if ([string]::IsNullOrEmpty($env_node_path)) {
|
|
||||||
$env:NODE_PATH=$new_node_path
|
|
||||||
} else {
|
|
||||||
$env:NODE_PATH="$env_node_path$pathsep$new_node_path"
|
|
||||||
}
|
|
||||||
|
|
||||||
$ret=0
|
|
||||||
if (Test-Path "$basedir/node$exe") {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "$basedir/node$exe" "$basedir/../.store/xlsx@0.18.5/node_modules/xlsx/bin/xlsx.njs" $args
|
|
||||||
} else {
|
|
||||||
& "$basedir/node$exe" "$basedir/../.store/xlsx@0.18.5/node_modules/xlsx/bin/xlsx.njs" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
} else {
|
|
||||||
# Support pipeline input
|
|
||||||
if ($MyInvocation.ExpectingInput) {
|
|
||||||
$input | & "node$exe" "$basedir/../.store/xlsx@0.18.5/node_modules/xlsx/bin/xlsx.njs" $args
|
|
||||||
} else {
|
|
||||||
& "node$exe" "$basedir/../.store/xlsx@0.18.5/node_modules/xlsx/bin/xlsx.njs" $args
|
|
||||||
}
|
|
||||||
$ret=$LASTEXITCODE
|
|
||||||
}
|
|
||||||
$env:NODE_PATH=$env_node_path
|
|
||||||
exit $ret
|
|
@ -1,101 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "random_select_system",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"node_modules/bignumber.js": {
|
|
||||||
"version": "9.0.0",
|
|
||||||
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.0.0.tgz",
|
|
||||||
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/core-util-is": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/inherits": {
|
|
||||||
"version": "2.0.4",
|
|
||||||
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
|
|
||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
|
||||||
"license": "ISC"
|
|
||||||
},
|
|
||||||
"node_modules/isarray": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/mysql": {
|
|
||||||
"version": "2.18.1",
|
|
||||||
"resolved": "https://registry.npmmirror.com/mysql/-/mysql-2.18.1.tgz",
|
|
||||||
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"bignumber.js": "9.0.0",
|
|
||||||
"readable-stream": "2.3.7",
|
|
||||||
"safe-buffer": "5.1.2",
|
|
||||||
"sqlstring": "2.3.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/process-nextick-args": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/readable-stream": {
|
|
||||||
"version": "2.3.7",
|
|
||||||
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz",
|
|
||||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"core-util-is": "~1.0.0",
|
|
||||||
"inherits": "~2.0.3",
|
|
||||||
"isarray": "~1.0.0",
|
|
||||||
"process-nextick-args": "~2.0.0",
|
|
||||||
"safe-buffer": "~5.1.1",
|
|
||||||
"string_decoder": "~1.1.1",
|
|
||||||
"util-deprecate": "~1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/safe-buffer": {
|
|
||||||
"version": "5.1.2",
|
|
||||||
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/sqlstring": {
|
|
||||||
"version": "2.3.1",
|
|
||||||
"resolved": "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.1.tgz",
|
|
||||||
"integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/string_decoder": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"safe-buffer": "~5.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/util-deprecate": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
|
||||||
"license": "MIT"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,243 +0,0 @@
|
|||||||
1.3.8 / 2022-02-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.34
|
|
||||||
- deps: mime-db@~1.51.0
|
|
||||||
* deps: negotiator@0.6.3
|
|
||||||
|
|
||||||
1.3.7 / 2019-04-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.6.2
|
|
||||||
- Fix sorting charset, encoding, and language with extra parameters
|
|
||||||
|
|
||||||
1.3.6 / 2019-04-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.24
|
|
||||||
- deps: mime-db@~1.40.0
|
|
||||||
|
|
||||||
1.3.5 / 2018-02-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.18
|
|
||||||
- deps: mime-db@~1.33.0
|
|
||||||
|
|
||||||
1.3.4 / 2017-08-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.16
|
|
||||||
- deps: mime-db@~1.29.0
|
|
||||||
|
|
||||||
1.3.3 / 2016-05-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.11
|
|
||||||
- deps: mime-db@~1.23.0
|
|
||||||
* deps: negotiator@0.6.1
|
|
||||||
- perf: improve `Accept` parsing speed
|
|
||||||
- perf: improve `Accept-Charset` parsing speed
|
|
||||||
- perf: improve `Accept-Encoding` parsing speed
|
|
||||||
- perf: improve `Accept-Language` parsing speed
|
|
||||||
|
|
||||||
1.3.2 / 2016-03-08
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.10
|
|
||||||
- Fix extension of `application/dash+xml`
|
|
||||||
- Update primary extension for `audio/mp4`
|
|
||||||
- deps: mime-db@~1.22.0
|
|
||||||
|
|
||||||
1.3.1 / 2016-01-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.9
|
|
||||||
- deps: mime-db@~1.21.0
|
|
||||||
|
|
||||||
1.3.0 / 2015-09-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.7
|
|
||||||
- deps: mime-db@~1.19.0
|
|
||||||
* deps: negotiator@0.6.0
|
|
||||||
- Fix including type extensions in parameters in `Accept` parsing
|
|
||||||
- Fix parsing `Accept` parameters with quoted equals
|
|
||||||
- Fix parsing `Accept` parameters with quoted semicolons
|
|
||||||
- Lazy-load modules from main entry point
|
|
||||||
- perf: delay type concatenation until needed
|
|
||||||
- perf: enable strict mode
|
|
||||||
- perf: hoist regular expressions
|
|
||||||
- perf: remove closures getting spec properties
|
|
||||||
- perf: remove a closure from media type parsing
|
|
||||||
- perf: remove property delete from media type parsing
|
|
||||||
|
|
||||||
1.2.13 / 2015-09-06
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.6
|
|
||||||
- deps: mime-db@~1.18.0
|
|
||||||
|
|
||||||
1.2.12 / 2015-07-30
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.4
|
|
||||||
- deps: mime-db@~1.16.0
|
|
||||||
|
|
||||||
1.2.11 / 2015-07-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.3
|
|
||||||
- deps: mime-db@~1.15.0
|
|
||||||
|
|
||||||
1.2.10 / 2015-07-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.2
|
|
||||||
- deps: mime-db@~1.14.0
|
|
||||||
|
|
||||||
1.2.9 / 2015-06-08
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.1
|
|
||||||
- perf: fix deopt during mapping
|
|
||||||
|
|
||||||
1.2.8 / 2015-06-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.0
|
|
||||||
- deps: mime-db@~1.13.0
|
|
||||||
* perf: avoid argument reassignment & argument slice
|
|
||||||
* perf: avoid negotiator recursive construction
|
|
||||||
* perf: enable strict mode
|
|
||||||
* perf: remove unnecessary bitwise operator
|
|
||||||
|
|
||||||
1.2.7 / 2015-05-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.5.3
|
|
||||||
- Fix media type parameter matching to be case-insensitive
|
|
||||||
|
|
||||||
1.2.6 / 2015-05-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.11
|
|
||||||
- deps: mime-db@~1.9.1
|
|
||||||
* deps: negotiator@0.5.2
|
|
||||||
- Fix comparing media types with quoted values
|
|
||||||
- Fix splitting media types with quoted commas
|
|
||||||
|
|
||||||
1.2.5 / 2015-03-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.10
|
|
||||||
- deps: mime-db@~1.8.0
|
|
||||||
|
|
||||||
1.2.4 / 2015-02-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Support Node.js 0.6
|
|
||||||
* deps: mime-types@~2.0.9
|
|
||||||
- deps: mime-db@~1.7.0
|
|
||||||
* deps: negotiator@0.5.1
|
|
||||||
- Fix preference sorting to be stable for long acceptable lists
|
|
||||||
|
|
||||||
1.2.3 / 2015-01-31
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.8
|
|
||||||
- deps: mime-db@~1.6.0
|
|
||||||
|
|
||||||
1.2.2 / 2014-12-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.7
|
|
||||||
- deps: mime-db@~1.5.0
|
|
||||||
|
|
||||||
1.2.1 / 2014-12-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.5
|
|
||||||
- deps: mime-db@~1.3.1
|
|
||||||
|
|
||||||
1.2.0 / 2014-12-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.5.0
|
|
||||||
- Fix list return order when large accepted list
|
|
||||||
- Fix missing identity encoding when q=0 exists
|
|
||||||
- Remove dynamic building of Negotiator class
|
|
||||||
|
|
||||||
1.1.4 / 2014-12-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.4
|
|
||||||
- deps: mime-db@~1.3.0
|
|
||||||
|
|
||||||
1.1.3 / 2014-11-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.3
|
|
||||||
- deps: mime-db@~1.2.0
|
|
||||||
|
|
||||||
1.1.2 / 2014-10-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.4.9
|
|
||||||
- Fix error when media type has invalid parameter
|
|
||||||
|
|
||||||
1.1.1 / 2014-09-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.2
|
|
||||||
- deps: mime-db@~1.1.0
|
|
||||||
* deps: negotiator@0.4.8
|
|
||||||
- Fix all negotiations to be case-insensitive
|
|
||||||
- Stable sort preferences of same quality according to client order
|
|
||||||
|
|
||||||
1.1.0 / 2014-09-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* update `mime-types`
|
|
||||||
|
|
||||||
1.0.7 / 2014-07-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix wrong type returned from `type` when match after unknown extension
|
|
||||||
|
|
||||||
1.0.6 / 2014-06-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.4.7
|
|
||||||
|
|
||||||
1.0.5 / 2014-06-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix crash when unknown extension given
|
|
||||||
|
|
||||||
1.0.4 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* use `mime-types`
|
|
||||||
|
|
||||||
1.0.3 / 2014-06-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.4.6
|
|
||||||
- Order by specificity when quality is the same
|
|
||||||
|
|
||||||
1.0.2 / 2014-05-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix interpretation when header not in request
|
|
||||||
* deps: pin negotiator@0.4.5
|
|
||||||
|
|
||||||
1.0.1 / 2014-01-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Identity encoding isn't always acceptable
|
|
||||||
* deps: negotiator@~0.4.0
|
|
||||||
|
|
||||||
1.0.0 / 2013-12-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Genesis
|
|
@ -1,23 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
|
||||||
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,140 +0,0 @@
|
|||||||
# accepts
|
|
||||||
|
|
||||||
[![NPM Version][npm-version-image]][npm-url]
|
|
||||||
[![NPM Downloads][npm-downloads-image]][npm-url]
|
|
||||||
[![Node.js Version][node-version-image]][node-version-url]
|
|
||||||
[![Build Status][github-actions-ci-image]][github-actions-ci-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator).
|
|
||||||
Extracted from [koa](https://www.npmjs.com/package/koa) for general use.
|
|
||||||
|
|
||||||
In addition to negotiator, it allows:
|
|
||||||
|
|
||||||
- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])`
|
|
||||||
as well as `('text/html', 'application/json')`.
|
|
||||||
- Allows type shorthands such as `json`.
|
|
||||||
- Returns `false` when no types match
|
|
||||||
- Treats non-existent headers as `*`
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
This is a [Node.js](https://nodejs.org/en/) module available through the
|
|
||||||
[npm registry](https://www.npmjs.com/). Installation is done using the
|
|
||||||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install accepts
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```js
|
|
||||||
var accepts = require('accepts')
|
|
||||||
```
|
|
||||||
|
|
||||||
### accepts(req)
|
|
||||||
|
|
||||||
Create a new `Accepts` object for the given `req`.
|
|
||||||
|
|
||||||
#### .charset(charsets)
|
|
||||||
|
|
||||||
Return the first accepted charset. If nothing in `charsets` is accepted,
|
|
||||||
then `false` is returned.
|
|
||||||
|
|
||||||
#### .charsets()
|
|
||||||
|
|
||||||
Return the charsets that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
#### .encoding(encodings)
|
|
||||||
|
|
||||||
Return the first accepted encoding. If nothing in `encodings` is accepted,
|
|
||||||
then `false` is returned.
|
|
||||||
|
|
||||||
#### .encodings()
|
|
||||||
|
|
||||||
Return the encodings that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
#### .language(languages)
|
|
||||||
|
|
||||||
Return the first accepted language. If nothing in `languages` is accepted,
|
|
||||||
then `false` is returned.
|
|
||||||
|
|
||||||
#### .languages()
|
|
||||||
|
|
||||||
Return the languages that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
#### .type(types)
|
|
||||||
|
|
||||||
Return the first accepted type (and it is returned as the same text as what
|
|
||||||
appears in the `types` array). If nothing in `types` is accepted, then `false`
|
|
||||||
is returned.
|
|
||||||
|
|
||||||
The `types` array can contain full MIME types or file extensions. Any value
|
|
||||||
that is not a full MIME types is passed to `require('mime-types').lookup`.
|
|
||||||
|
|
||||||
#### .types()
|
|
||||||
|
|
||||||
Return the types that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Simple type negotiation
|
|
||||||
|
|
||||||
This simple example shows how to use `accepts` to return a different typed
|
|
||||||
respond body based on what the client wants to accept. The server lists it's
|
|
||||||
preferences in order and will get back the best match between the client and
|
|
||||||
server.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var accepts = require('accepts')
|
|
||||||
var http = require('http')
|
|
||||||
|
|
||||||
function app (req, res) {
|
|
||||||
var accept = accepts(req)
|
|
||||||
|
|
||||||
// the order of this list is significant; should be server preferred order
|
|
||||||
switch (accept.type(['json', 'html'])) {
|
|
||||||
case 'json':
|
|
||||||
res.setHeader('Content-Type', 'application/json')
|
|
||||||
res.write('{"hello":"world!"}')
|
|
||||||
break
|
|
||||||
case 'html':
|
|
||||||
res.setHeader('Content-Type', 'text/html')
|
|
||||||
res.write('<b>hello, world!</b>')
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
// the fallback is text/plain, so no need to specify it above
|
|
||||||
res.setHeader('Content-Type', 'text/plain')
|
|
||||||
res.write('hello, world!')
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
res.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
http.createServer(app).listen(3000)
|
|
||||||
```
|
|
||||||
|
|
||||||
You can test this out with the cURL program:
|
|
||||||
```sh
|
|
||||||
curl -I -H'Accept: text/html' http://localhost:3000/
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master
|
|
||||||
[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci
|
|
||||||
[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml
|
|
||||||
[node-version-image]: https://badgen.net/npm/node/accepts
|
|
||||||
[node-version-url]: https://nodejs.org/en/download
|
|
||||||
[npm-downloads-image]: https://badgen.net/npm/dm/accepts
|
|
||||||
[npm-url]: https://npmjs.org/package/accepts
|
|
||||||
[npm-version-image]: https://badgen.net/npm/v/accepts
|
|
@ -1,238 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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'
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "accepts",
|
|
||||||
"description": "Higher-level content negotiation",
|
|
||||||
"version": "1.3.8",
|
|
||||||
"contributors": [
|
|
||||||
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
|
||||||
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "jshttp/accepts",
|
|
||||||
"dependencies": {
|
|
||||||
"mime-types": "~2.1.34",
|
|
||||||
"negotiator": "0.6.3"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"deep-equal": "1.0.1",
|
|
||||||
"eslint": "7.32.0",
|
|
||||||
"eslint-config-standard": "14.1.1",
|
|
||||||
"eslint-plugin-import": "2.25.4",
|
|
||||||
"eslint-plugin-markdown": "2.2.1",
|
|
||||||
"eslint-plugin-node": "11.1.0",
|
|
||||||
"eslint-plugin-promise": "4.3.1",
|
|
||||||
"eslint-plugin-standard": "4.1.0",
|
|
||||||
"mocha": "9.2.0",
|
|
||||||
"nyc": "15.1.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"LICENSE",
|
|
||||||
"HISTORY.md",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint .",
|
|
||||||
"test": "mocha --reporter spec --check-leaks --bail test/",
|
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
|
||||||
},
|
|
||||||
"keywords": [
|
|
||||||
"content",
|
|
||||||
"negotiation",
|
|
||||||
"accept",
|
|
||||||
"accepts"
|
|
||||||
],
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "accepts@1.3.8",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz"
|
|
||||||
}
|
|
@ -1,397 +0,0 @@
|
|||||||
2.1.35 / 2022-03-12
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.52.0
|
|
||||||
- Add extensions from IANA for more `image/*` types
|
|
||||||
- Add extension `.asc` to `application/pgp-keys`
|
|
||||||
- Add extensions to various XML types
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.34 / 2021-11-08
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.51.0
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.33 / 2021-10-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.50.0
|
|
||||||
- Add deprecated iWorks mime types and extensions
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.32 / 2021-07-27
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.49.0
|
|
||||||
- Add extension `.trig` to `application/trig`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.31 / 2021-06-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.48.0
|
|
||||||
- Add extension `.mvt` to `application/vnd.mapbox-vector-tile`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.30 / 2021-04-02
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.47.0
|
|
||||||
- Add extension `.amr` to `audio/amr`
|
|
||||||
- Remove ambigious extensions from IANA for `application/*+xml` types
|
|
||||||
- Update primary extension to `.es` for `application/ecmascript`
|
|
||||||
|
|
||||||
2.1.29 / 2021-02-17
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.46.0
|
|
||||||
- Add extension `.amr` to `audio/amr`
|
|
||||||
- Add extension `.m4s` to `video/iso.segment`
|
|
||||||
- Add extension `.opus` to `audio/ogg`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.28 / 2021-01-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.45.0
|
|
||||||
- Add `application/ubjson` with extension `.ubj`
|
|
||||||
- Add `image/avif` with extension `.avif`
|
|
||||||
- Add `image/ktx2` with extension `.ktx2`
|
|
||||||
- Add extension `.dbf` to `application/vnd.dbf`
|
|
||||||
- Add extension `.rar` to `application/vnd.rar`
|
|
||||||
- Add extension `.td` to `application/urc-targetdesc+xml`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
- Fix extension of `application/vnd.apple.keynote` to be `.key`
|
|
||||||
|
|
||||||
2.1.27 / 2020-04-23
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.44.0
|
|
||||||
- Add charsets from IANA
|
|
||||||
- Add extension `.cjs` to `application/node`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.26 / 2020-01-05
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.43.0
|
|
||||||
- Add `application/x-keepass2` with extension `.kdbx`
|
|
||||||
- Add extension `.mxmf` to `audio/mobile-xmf`
|
|
||||||
- Add extensions from IANA for `application/*+xml` types
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.25 / 2019-11-12
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.42.0
|
|
||||||
- Add new upstream MIME types
|
|
||||||
- Add `application/toml` with extension `.toml`
|
|
||||||
- Add `image/vnd.ms-dds` with extension `.dds`
|
|
||||||
|
|
||||||
2.1.24 / 2019-04-20
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@1.40.0
|
|
||||||
- Add extensions from IANA for `model/*` types
|
|
||||||
- Add `text/mdx` with extension `.mdx`
|
|
||||||
|
|
||||||
2.1.23 / 2019-04-17
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.39.0
|
|
||||||
- Add extensions `.siv` and `.sieve` to `application/sieve`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.22 / 2019-02-14
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.38.0
|
|
||||||
- Add extension `.nq` to `application/n-quads`
|
|
||||||
- Add extension `.nt` to `application/n-triples`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.21 / 2018-10-19
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.37.0
|
|
||||||
- Add extensions to HEIC image types
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.20 / 2018-08-26
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.36.0
|
|
||||||
- Add Apple file extensions from IANA
|
|
||||||
- Add extensions from IANA for `image/*` types
|
|
||||||
- Add new upstream MIME types
|
|
||||||
|
|
||||||
2.1.19 / 2018-07-17
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.35.0
|
|
||||||
- Add extension `.csl` to `application/vnd.citationstyles.style+xml`
|
|
||||||
- Add extension `.es` to `application/ecmascript`
|
|
||||||
- Add extension `.owl` to `application/rdf+xml`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
- Add UTF-8 as default charset for `text/turtle`
|
|
||||||
|
|
||||||
2.1.18 / 2018-02-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.33.0
|
|
||||||
- Add `application/raml+yaml` with extension `.raml`
|
|
||||||
- Add `application/wasm` with extension `.wasm`
|
|
||||||
- Add `text/shex` with extension `.shex`
|
|
||||||
- Add extensions for JPEG-2000 images
|
|
||||||
- Add extensions from IANA for `message/*` types
|
|
||||||
- Add new upstream MIME types
|
|
||||||
- Update font MIME types
|
|
||||||
- Update `text/hjson` to registered `application/hjson`
|
|
||||||
|
|
||||||
2.1.17 / 2017-09-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.30.0
|
|
||||||
- Add `application/vnd.ms-outlook`
|
|
||||||
- Add `application/x-arj`
|
|
||||||
- Add extension `.mjs` to `application/javascript`
|
|
||||||
- Add glTF types and extensions
|
|
||||||
- Add new upstream MIME types
|
|
||||||
- Add `text/x-org`
|
|
||||||
- Add VirtualBox MIME types
|
|
||||||
- Fix `source` records for `video/*` types that are IANA
|
|
||||||
- Update `font/opentype` to registered `font/otf`
|
|
||||||
|
|
||||||
2.1.16 / 2017-07-24
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.29.0
|
|
||||||
- Add `application/fido.trusted-apps+json`
|
|
||||||
- Add extension `.wadl` to `application/vnd.sun.wadl+xml`
|
|
||||||
- Add extension `.gz` to `application/gzip`
|
|
||||||
- Add new upstream MIME types
|
|
||||||
- Update extensions `.md` and `.markdown` to be `text/markdown`
|
|
||||||
|
|
||||||
2.1.15 / 2017-03-23
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.27.0
|
|
||||||
- Add new mime types
|
|
||||||
- Add `image/apng`
|
|
||||||
|
|
||||||
2.1.14 / 2017-01-14
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.26.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.13 / 2016-11-18
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.25.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.12 / 2016-09-18
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.24.0
|
|
||||||
- Add new mime types
|
|
||||||
- Add `audio/mp3`
|
|
||||||
|
|
||||||
2.1.11 / 2016-05-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.23.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.10 / 2016-02-15
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.22.0
|
|
||||||
- Add new mime types
|
|
||||||
- Fix extension of `application/dash+xml`
|
|
||||||
- Update primary extension for `audio/mp4`
|
|
||||||
|
|
||||||
2.1.9 / 2016-01-06
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.21.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.8 / 2015-11-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.20.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.7 / 2015-09-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.19.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.6 / 2015-09-03
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.18.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.5 / 2015-08-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.17.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.4 / 2015-07-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.16.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.3 / 2015-07-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.15.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.2 / 2015-06-25
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.14.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.1.1 / 2015-06-08
|
|
||||||
==================
|
|
||||||
|
|
||||||
* perf: fix deopt during mapping
|
|
||||||
|
|
||||||
2.1.0 / 2015-06-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix incorrectly treating extension-less file name as extension
|
|
||||||
- i.e. `'path/to/json'` will no longer return `application/json`
|
|
||||||
* Fix `.charset(type)` to accept parameters
|
|
||||||
* Fix `.charset(type)` to match case-insensitive
|
|
||||||
* Improve generation of extension to MIME mapping
|
|
||||||
* Refactor internals for readability and no argument reassignment
|
|
||||||
* Prefer `application/*` MIME types from the same source
|
|
||||||
* Prefer any type over `application/octet-stream`
|
|
||||||
* deps: mime-db@~1.13.0
|
|
||||||
- Add nginx as a source
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.14 / 2015-06-06
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.12.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.13 / 2015-05-31
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.11.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.12 / 2015-05-19
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.10.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.11 / 2015-05-05
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.9.1
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.10 / 2015-03-13
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.8.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.9 / 2015-02-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.7.0
|
|
||||||
- Add new mime types
|
|
||||||
- Community extensions ownership transferred from `node-mime`
|
|
||||||
|
|
||||||
2.0.8 / 2015-01-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.6.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.7 / 2014-12-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.5.0
|
|
||||||
- Add new mime types
|
|
||||||
- Fix various invalid MIME type entries
|
|
||||||
|
|
||||||
2.0.6 / 2014-12-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.4.0
|
|
||||||
- Add new mime types
|
|
||||||
- Fix various invalid MIME type entries
|
|
||||||
- Remove example template MIME types
|
|
||||||
|
|
||||||
2.0.5 / 2014-12-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.3.1
|
|
||||||
- Fix missing extensions
|
|
||||||
|
|
||||||
2.0.4 / 2014-12-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.3.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.3 / 2014-11-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.2.0
|
|
||||||
- Add new mime types
|
|
||||||
|
|
||||||
2.0.2 / 2014-09-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-db@~1.1.0
|
|
||||||
- Add new mime types
|
|
||||||
- Update charsets
|
|
||||||
|
|
||||||
2.0.1 / 2014-09-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Support Node.js 0.6
|
|
||||||
|
|
||||||
2.0.0 / 2014-09-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Use `mime-db`
|
|
||||||
* Remove `.define()`
|
|
||||||
|
|
||||||
1.0.2 / 2014-08-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Set charset=utf-8 for `text/javascript`
|
|
||||||
|
|
||||||
1.0.1 / 2014-06-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `text/jsx` type
|
|
||||||
|
|
||||||
1.0.0 / 2014-05-12
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Return `false` for unknown types
|
|
||||||
* Set charset=utf-8 for `application/json`
|
|
||||||
|
|
||||||
0.1.0 / 2014-05-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Initial release
|
|
@ -1,23 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
|
||||||
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,113 +0,0 @@
|
|||||||
# mime-types
|
|
||||||
|
|
||||||
[![NPM Version][npm-version-image]][npm-url]
|
|
||||||
[![NPM Downloads][npm-downloads-image]][npm-url]
|
|
||||||
[![Node.js Version][node-version-image]][node-version-url]
|
|
||||||
[![Build Status][ci-image]][ci-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
The ultimate javascript content-type utility.
|
|
||||||
|
|
||||||
Similar to [the `mime@1.x` module](https://www.npmjs.com/package/mime), except:
|
|
||||||
|
|
||||||
- __No fallbacks.__ Instead of naively returning the first available type,
|
|
||||||
`mime-types` simply returns `false`, so do
|
|
||||||
`var type = mime.lookup('unrecognized') || 'application/octet-stream'`.
|
|
||||||
- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`.
|
|
||||||
- No `.define()` functionality
|
|
||||||
- Bug fixes for `.lookup(path)`
|
|
||||||
|
|
||||||
Otherwise, the API is compatible with `mime` 1.x.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
This is a [Node.js](https://nodejs.org/en/) module available through the
|
|
||||||
[npm registry](https://www.npmjs.com/). Installation is done using the
|
|
||||||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install mime-types
|
|
||||||
```
|
|
||||||
|
|
||||||
## Adding Types
|
|
||||||
|
|
||||||
All mime types are based on [mime-db](https://www.npmjs.com/package/mime-db),
|
|
||||||
so open a PR there if you'd like to add mime types.
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```js
|
|
||||||
var mime = require('mime-types')
|
|
||||||
```
|
|
||||||
|
|
||||||
All functions return `false` if input is invalid or not found.
|
|
||||||
|
|
||||||
### mime.lookup(path)
|
|
||||||
|
|
||||||
Lookup the content-type associated with a file.
|
|
||||||
|
|
||||||
```js
|
|
||||||
mime.lookup('json') // 'application/json'
|
|
||||||
mime.lookup('.md') // 'text/markdown'
|
|
||||||
mime.lookup('file.html') // 'text/html'
|
|
||||||
mime.lookup('folder/file.js') // 'application/javascript'
|
|
||||||
mime.lookup('folder/.htaccess') // false
|
|
||||||
|
|
||||||
mime.lookup('cats') // false
|
|
||||||
```
|
|
||||||
|
|
||||||
### mime.contentType(type)
|
|
||||||
|
|
||||||
Create a full content-type header given a content-type or extension.
|
|
||||||
When given an extension, `mime.lookup` is used to get the matching
|
|
||||||
content-type, otherwise the given content-type is used. Then if the
|
|
||||||
content-type does not already have a `charset` parameter, `mime.charset`
|
|
||||||
is used to get the default charset and add to the returned content-type.
|
|
||||||
|
|
||||||
```js
|
|
||||||
mime.contentType('markdown') // 'text/x-markdown; charset=utf-8'
|
|
||||||
mime.contentType('file.json') // 'application/json; charset=utf-8'
|
|
||||||
mime.contentType('text/html') // 'text/html; charset=utf-8'
|
|
||||||
mime.contentType('text/html; charset=iso-8859-1') // 'text/html; charset=iso-8859-1'
|
|
||||||
|
|
||||||
// from a full path
|
|
||||||
mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8'
|
|
||||||
```
|
|
||||||
|
|
||||||
### mime.extension(type)
|
|
||||||
|
|
||||||
Get the default extension for a content-type.
|
|
||||||
|
|
||||||
```js
|
|
||||||
mime.extension('application/octet-stream') // 'bin'
|
|
||||||
```
|
|
||||||
|
|
||||||
### mime.charset(type)
|
|
||||||
|
|
||||||
Lookup the implied default charset of a content-type.
|
|
||||||
|
|
||||||
```js
|
|
||||||
mime.charset('text/markdown') // 'UTF-8'
|
|
||||||
```
|
|
||||||
|
|
||||||
### var type = mime.types[extension]
|
|
||||||
|
|
||||||
A map of content-types by extension.
|
|
||||||
|
|
||||||
### [extensions...] = mime.extensions[type]
|
|
||||||
|
|
||||||
A map of extensions by content-type.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[ci-image]: https://badgen.net/github/checks/jshttp/mime-types/master?label=ci
|
|
||||||
[ci-url]: https://github.com/jshttp/mime-types/actions/workflows/ci.yml
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/mime-types/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/jshttp/mime-types?branch=master
|
|
||||||
[node-version-image]: https://badgen.net/npm/node/mime-types
|
|
||||||
[node-version-url]: https://nodejs.org/en/download
|
|
||||||
[npm-downloads-image]: https://badgen.net/npm/dm/mime-types
|
|
||||||
[npm-url]: https://npmjs.org/package/mime-types
|
|
||||||
[npm-version-image]: https://badgen.net/npm/v/mime-types
|
|
@ -1,188 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "mime-types",
|
|
||||||
"description": "The ultimate javascript content-type utility.",
|
|
||||||
"version": "2.1.35",
|
|
||||||
"contributors": [
|
|
||||||
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
|
||||||
"Jeremiah Senkpiel <fishrock123@rocketmail.com> (https://searchbeam.jit.su)",
|
|
||||||
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"mime",
|
|
||||||
"types"
|
|
||||||
],
|
|
||||||
"repository": "jshttp/mime-types",
|
|
||||||
"dependencies": {
|
|
||||||
"mime-db": "1.52.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "7.32.0",
|
|
||||||
"eslint-config-standard": "14.1.1",
|
|
||||||
"eslint-plugin-import": "2.25.4",
|
|
||||||
"eslint-plugin-markdown": "2.2.1",
|
|
||||||
"eslint-plugin-node": "11.1.0",
|
|
||||||
"eslint-plugin-promise": "5.2.0",
|
|
||||||
"eslint-plugin-standard": "4.1.0",
|
|
||||||
"mocha": "9.2.2",
|
|
||||||
"nyc": "15.1.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"HISTORY.md",
|
|
||||||
"LICENSE",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint .",
|
|
||||||
"test": "mocha --reporter spec test/test.js",
|
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "mime-types@2.1.35",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz"
|
|
||||||
}
|
|
@ -1,108 +0,0 @@
|
|||||||
0.6.3 / 2022-01-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Revert "Lazy-load modules from main entry point"
|
|
||||||
|
|
||||||
0.6.2 / 2019-04-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix sorting charset, encoding, and language with extra parameters
|
|
||||||
|
|
||||||
0.6.1 / 2016-05-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* perf: improve `Accept` parsing speed
|
|
||||||
* perf: improve `Accept-Charset` parsing speed
|
|
||||||
* perf: improve `Accept-Encoding` parsing speed
|
|
||||||
* perf: improve `Accept-Language` parsing speed
|
|
||||||
|
|
||||||
0.6.0 / 2015-09-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix including type extensions in parameters in `Accept` parsing
|
|
||||||
* Fix parsing `Accept` parameters with quoted equals
|
|
||||||
* Fix parsing `Accept` parameters with quoted semicolons
|
|
||||||
* Lazy-load modules from main entry point
|
|
||||||
* perf: delay type concatenation until needed
|
|
||||||
* perf: enable strict mode
|
|
||||||
* perf: hoist regular expressions
|
|
||||||
* perf: remove closures getting spec properties
|
|
||||||
* perf: remove a closure from media type parsing
|
|
||||||
* perf: remove property delete from media type parsing
|
|
||||||
|
|
||||||
0.5.3 / 2015-05-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix media type parameter matching to be case-insensitive
|
|
||||||
|
|
||||||
0.5.2 / 2015-05-06
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix comparing media types with quoted values
|
|
||||||
* Fix splitting media types with quoted commas
|
|
||||||
|
|
||||||
0.5.1 / 2015-02-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix preference sorting to be stable for long acceptable lists
|
|
||||||
|
|
||||||
0.5.0 / 2014-12-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix list return order when large accepted list
|
|
||||||
* Fix missing identity encoding when q=0 exists
|
|
||||||
* Remove dynamic building of Negotiator class
|
|
||||||
|
|
||||||
0.4.9 / 2014-10-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix error when media type has invalid parameter
|
|
||||||
|
|
||||||
0.4.8 / 2014-09-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix all negotiations to be case-insensitive
|
|
||||||
* Stable sort preferences of same quality according to client order
|
|
||||||
* Support Node.js 0.6
|
|
||||||
|
|
||||||
0.4.7 / 2014-06-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Handle invalid provided languages
|
|
||||||
* Handle invalid provided media types
|
|
||||||
|
|
||||||
0.4.6 / 2014-06-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Order by specificity when quality is the same
|
|
||||||
|
|
||||||
0.4.5 / 2014-05-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix regression in empty header handling
|
|
||||||
|
|
||||||
0.4.4 / 2014-05-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix behaviors when headers are not present
|
|
||||||
|
|
||||||
0.4.3 / 2014-04-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Handle slashes on media params correctly
|
|
||||||
|
|
||||||
0.4.2 / 2014-02-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix media type sorting
|
|
||||||
* Handle media types params strictly
|
|
||||||
|
|
||||||
0.4.1 / 2014-01-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Use most specific matches
|
|
||||||
|
|
||||||
0.4.0 / 2014-01-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Remove preferred prefix from methods
|
|
@ -1,24 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2012-2014 Federico Romero
|
|
||||||
Copyright (c) 2012-2014 Isaac Z. Schlueter
|
|
||||||
Copyright (c) 2014-2015 Douglas Christopher Wilson
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,203 +0,0 @@
|
|||||||
# negotiator
|
|
||||||
|
|
||||||
[![NPM Version][npm-image]][npm-url]
|
|
||||||
[![NPM Downloads][downloads-image]][downloads-url]
|
|
||||||
[![Node.js Version][node-version-image]][node-version-url]
|
|
||||||
[![Build Status][github-actions-ci-image]][github-actions-ci-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
An HTTP content negotiator for Node.js
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install negotiator
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```js
|
|
||||||
var Negotiator = require('negotiator')
|
|
||||||
```
|
|
||||||
|
|
||||||
### Accept Negotiation
|
|
||||||
|
|
||||||
```js
|
|
||||||
availableMediaTypes = ['text/html', 'text/plain', 'application/json']
|
|
||||||
|
|
||||||
// The negotiator constructor receives a request object
|
|
||||||
negotiator = new Negotiator(request)
|
|
||||||
|
|
||||||
// Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8'
|
|
||||||
|
|
||||||
negotiator.mediaTypes()
|
|
||||||
// -> ['text/html', 'image/jpeg', 'application/*']
|
|
||||||
|
|
||||||
negotiator.mediaTypes(availableMediaTypes)
|
|
||||||
// -> ['text/html', 'application/json']
|
|
||||||
|
|
||||||
negotiator.mediaType(availableMediaTypes)
|
|
||||||
// -> 'text/html'
|
|
||||||
```
|
|
||||||
|
|
||||||
You can check a working example at `examples/accept.js`.
|
|
||||||
|
|
||||||
#### Methods
|
|
||||||
|
|
||||||
##### mediaType()
|
|
||||||
|
|
||||||
Returns the most preferred media type from the client.
|
|
||||||
|
|
||||||
##### mediaType(availableMediaType)
|
|
||||||
|
|
||||||
Returns the most preferred media type from a list of available media types.
|
|
||||||
|
|
||||||
##### mediaTypes()
|
|
||||||
|
|
||||||
Returns an array of preferred media types ordered by the client preference.
|
|
||||||
|
|
||||||
##### mediaTypes(availableMediaTypes)
|
|
||||||
|
|
||||||
Returns an array of preferred media types ordered by priority from a list of
|
|
||||||
available media types.
|
|
||||||
|
|
||||||
### Accept-Language Negotiation
|
|
||||||
|
|
||||||
```js
|
|
||||||
negotiator = new Negotiator(request)
|
|
||||||
|
|
||||||
availableLanguages = ['en', 'es', 'fr']
|
|
||||||
|
|
||||||
// Let's say Accept-Language header is 'en;q=0.8, es, pt'
|
|
||||||
|
|
||||||
negotiator.languages()
|
|
||||||
// -> ['es', 'pt', 'en']
|
|
||||||
|
|
||||||
negotiator.languages(availableLanguages)
|
|
||||||
// -> ['es', 'en']
|
|
||||||
|
|
||||||
language = negotiator.language(availableLanguages)
|
|
||||||
// -> 'es'
|
|
||||||
```
|
|
||||||
|
|
||||||
You can check a working example at `examples/language.js`.
|
|
||||||
|
|
||||||
#### Methods
|
|
||||||
|
|
||||||
##### language()
|
|
||||||
|
|
||||||
Returns the most preferred language from the client.
|
|
||||||
|
|
||||||
##### language(availableLanguages)
|
|
||||||
|
|
||||||
Returns the most preferred language from a list of available languages.
|
|
||||||
|
|
||||||
##### languages()
|
|
||||||
|
|
||||||
Returns an array of preferred languages ordered by the client preference.
|
|
||||||
|
|
||||||
##### languages(availableLanguages)
|
|
||||||
|
|
||||||
Returns an array of preferred languages ordered by priority from a list of
|
|
||||||
available languages.
|
|
||||||
|
|
||||||
### Accept-Charset Negotiation
|
|
||||||
|
|
||||||
```js
|
|
||||||
availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5']
|
|
||||||
|
|
||||||
negotiator = new Negotiator(request)
|
|
||||||
|
|
||||||
// Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2'
|
|
||||||
|
|
||||||
negotiator.charsets()
|
|
||||||
// -> ['utf-8', 'iso-8859-1', 'utf-7']
|
|
||||||
|
|
||||||
negotiator.charsets(availableCharsets)
|
|
||||||
// -> ['utf-8', 'iso-8859-1']
|
|
||||||
|
|
||||||
negotiator.charset(availableCharsets)
|
|
||||||
// -> 'utf-8'
|
|
||||||
```
|
|
||||||
|
|
||||||
You can check a working example at `examples/charset.js`.
|
|
||||||
|
|
||||||
#### Methods
|
|
||||||
|
|
||||||
##### charset()
|
|
||||||
|
|
||||||
Returns the most preferred charset from the client.
|
|
||||||
|
|
||||||
##### charset(availableCharsets)
|
|
||||||
|
|
||||||
Returns the most preferred charset from a list of available charsets.
|
|
||||||
|
|
||||||
##### charsets()
|
|
||||||
|
|
||||||
Returns an array of preferred charsets ordered by the client preference.
|
|
||||||
|
|
||||||
##### charsets(availableCharsets)
|
|
||||||
|
|
||||||
Returns an array of preferred charsets ordered by priority from a list of
|
|
||||||
available charsets.
|
|
||||||
|
|
||||||
### Accept-Encoding Negotiation
|
|
||||||
|
|
||||||
```js
|
|
||||||
availableEncodings = ['identity', 'gzip']
|
|
||||||
|
|
||||||
negotiator = new Negotiator(request)
|
|
||||||
|
|
||||||
// Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5'
|
|
||||||
|
|
||||||
negotiator.encodings()
|
|
||||||
// -> ['gzip', 'identity', 'compress']
|
|
||||||
|
|
||||||
negotiator.encodings(availableEncodings)
|
|
||||||
// -> ['gzip', 'identity']
|
|
||||||
|
|
||||||
negotiator.encoding(availableEncodings)
|
|
||||||
// -> 'gzip'
|
|
||||||
```
|
|
||||||
|
|
||||||
You can check a working example at `examples/encoding.js`.
|
|
||||||
|
|
||||||
#### Methods
|
|
||||||
|
|
||||||
##### encoding()
|
|
||||||
|
|
||||||
Returns the most preferred encoding from the client.
|
|
||||||
|
|
||||||
##### encoding(availableEncodings)
|
|
||||||
|
|
||||||
Returns the most preferred encoding from a list of available encodings.
|
|
||||||
|
|
||||||
##### encodings()
|
|
||||||
|
|
||||||
Returns an array of preferred encodings ordered by the client preference.
|
|
||||||
|
|
||||||
##### encodings(availableEncodings)
|
|
||||||
|
|
||||||
Returns an array of preferred encodings ordered by priority from a list of
|
|
||||||
available encodings.
|
|
||||||
|
|
||||||
## See Also
|
|
||||||
|
|
||||||
The [accepts](https://npmjs.org/package/accepts#readme) module builds on
|
|
||||||
this module and provides an alternative interface, mime type validation,
|
|
||||||
and more.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[npm-image]: https://img.shields.io/npm/v/negotiator.svg
|
|
||||||
[npm-url]: https://npmjs.org/package/negotiator
|
|
||||||
[node-version-image]: https://img.shields.io/node/v/negotiator.svg
|
|
||||||
[node-version-url]: https://nodejs.org/en/download/
|
|
||||||
[coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg
|
|
||||||
[coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master
|
|
||||||
[downloads-image]: https://img.shields.io/npm/dm/negotiator.svg
|
|
||||||
[downloads-url]: https://npmjs.org/package/negotiator
|
|
||||||
[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/negotiator/ci/master?label=ci
|
|
||||||
[github-actions-ci-url]: https://github.com/jshttp/negotiator/actions/workflows/ci.yml
|
|
@ -1,82 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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;
|
|
@ -1,169 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
@ -1,184 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
@ -1,179 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
@ -1,294 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "negotiator",
|
|
||||||
"description": "HTTP content negotiation",
|
|
||||||
"version": "0.6.3",
|
|
||||||
"contributors": [
|
|
||||||
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
|
||||||
"Federico Romero <federico.romero@outboxlabs.com>",
|
|
||||||
"Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"http",
|
|
||||||
"content negotiation",
|
|
||||||
"accept",
|
|
||||||
"accept-language",
|
|
||||||
"accept-encoding",
|
|
||||||
"accept-charset"
|
|
||||||
],
|
|
||||||
"repository": "jshttp/negotiator",
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "7.32.0",
|
|
||||||
"eslint-plugin-markdown": "2.2.1",
|
|
||||||
"mocha": "9.1.3",
|
|
||||||
"nyc": "15.1.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"lib/",
|
|
||||||
"HISTORY.md",
|
|
||||||
"LICENSE",
|
|
||||||
"index.js",
|
|
||||||
"README.md"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint .",
|
|
||||||
"test": "mocha --reporter spec --check-leaks --bail test/",
|
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "negotiator@0.6.3",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz"
|
|
||||||
}
|
|
@ -1,201 +0,0 @@
|
|||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright (C) 2014-present SheetJS LLC
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
@ -1,140 +0,0 @@
|
|||||||
# adler32
|
|
||||||
|
|
||||||
Signed ADLER-32 algorithm implementation in JS (for the browser and nodejs).
|
|
||||||
Emphasis on correctness, performance, and IE6+ support.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
With [npm](https://www.npmjs.org/package/adler-32):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ npm install adler-32
|
|
||||||
```
|
|
||||||
|
|
||||||
In the browser:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="adler32.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
The browser exposes a variable `ADLER32`.
|
|
||||||
|
|
||||||
When installed globally, npm installs a script `adler32` that computes the
|
|
||||||
checksum for a specified file or standard input.
|
|
||||||
|
|
||||||
The script will manipulate `module.exports` if available . This is not always
|
|
||||||
desirable. To prevent the behavior, define `DO_NOT_EXPORT_ADLER`.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
In all cases, the relevant function takes an argument representing data and an
|
|
||||||
optional second argument representing the starting "seed" (for running hash).
|
|
||||||
|
|
||||||
The return value is a signed 32-bit integer.
|
|
||||||
|
|
||||||
- `ADLER32.buf(byte array or buffer[, seed])` assumes the argument is a sequence
|
|
||||||
of 8-bit unsigned integers (nodejs `Buffer`, `Uint8Array` or array of bytes).
|
|
||||||
|
|
||||||
- `ADLER32.bstr(binary string[, seed])` assumes the argument is a binary string
|
|
||||||
where byte `i` is the low byte of the UCS-2 char: `str.charCodeAt(i) & 0xFF`
|
|
||||||
|
|
||||||
- `ADLER32.str(string)` assumes the argument is a standard JS string and
|
|
||||||
calculates the hash of the UTF-8 encoding.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
```js
|
|
||||||
// var ADLER32 = require('adler-32'); // uncomment if in node
|
|
||||||
ADLER32.str("SheetJS") // 176947863
|
|
||||||
ADLER32.bstr("SheetJS") // 176947863
|
|
||||||
ADLER32.buf([ 83, 104, 101, 101, 116, 74, 83 ]) // 176947863
|
|
||||||
|
|
||||||
adler32 = ADLER32.buf([83, 104]) // 17825980 "Sh"
|
|
||||||
adler32 = ADLER32.str("eet", adler32) // 95486458 "Sheet"
|
|
||||||
ADLER32.bstr("JS", adler32) // 176947863 "SheetJS"
|
|
||||||
|
|
||||||
[ADLER32.str("\u2603"), ADLER32.str("\u0003")] // [ 73138686, 262148 ]
|
|
||||||
[ADLER32.bstr("\u2603"), ADLER32.bstr("\u0003")] // [ 262148, 262148 ]
|
|
||||||
[ADLER32.buf([0x2603]), ADLER32.buf([0x0003])] // [ 262148, 262148 ]
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
`make test` will run the nodejs-based test.
|
|
||||||
|
|
||||||
To run the in-browser tests, run a local server and go to the `ctest` directory.
|
|
||||||
`make ctestserv` will start a python `SimpleHTTPServer` server on port 8000.
|
|
||||||
|
|
||||||
To update the browser artifacts, run `make ctest`.
|
|
||||||
|
|
||||||
To generate the bits file, use the `adler32` function from python `zlib`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
>>> from zlib import adler32
|
|
||||||
>>> x="foo bar baz٪☃🍣"
|
|
||||||
>>> adler32(x)
|
|
||||||
1543572022
|
|
||||||
>>> adler32(x+x)
|
|
||||||
-2076896149
|
|
||||||
>>> adler32(x+x+x)
|
|
||||||
2023497376
|
|
||||||
```
|
|
||||||
|
|
||||||
The [`adler32-cli`](https://www.npmjs.com/package/adler32-cli) package includes
|
|
||||||
scripts for processing files or text on standard input:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ echo "this is a test" > t.txt
|
|
||||||
$ adler32-cli t.txt
|
|
||||||
726861088
|
|
||||||
```
|
|
||||||
|
|
||||||
For comparison, the `adler32.py` script in the subdirectory uses python `zlib`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ packages/adler32-cli/bin/adler32.py t.txt
|
|
||||||
726861088
|
|
||||||
```
|
|
||||||
|
|
||||||
## Performance
|
|
||||||
|
|
||||||
`make perf` will run algorithmic performance tests (which should justify certain
|
|
||||||
decisions in the code).
|
|
||||||
|
|
||||||
Bit twiddling is much faster than taking the mod in Safari and Firefox browsers.
|
|
||||||
Instead of taking the literal mod 65521, it is faster to keep it in the integers
|
|
||||||
by bit-shifting: `65536 ~ 15 mod 65521` so for nonnegative integer `a`:
|
|
||||||
|
|
||||||
```
|
|
||||||
a = (a >>> 16) * 65536 + (a & 65535) [equality]
|
|
||||||
a ~ (a >>> 16) * 15 + (a & 65535) mod 65521
|
|
||||||
```
|
|
||||||
|
|
||||||
The mod is taken at the very end, since the intermediate result may exceed 65521
|
|
||||||
|
|
||||||
## Magic Number
|
|
||||||
|
|
||||||
The magic numbers were chosen so as to not overflow a 31-bit integer:
|
|
||||||
|
|
||||||
```mathematica
|
|
||||||
F[n_] := Reduce[x*(x + 1)*n/2 + (x + 1)*(65521) < (2^31 - 1) && x > 0, x, Integers]
|
|
||||||
F[255] (* bstr: x \[Element] Integers && 1 <= x <= 3854 *)
|
|
||||||
F[127] (* ascii: x \[Element] Integers && 1 <= x <= 5321 *)
|
|
||||||
```
|
|
||||||
|
|
||||||
Subtract up to 4 elements for the Unicode case.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Please consult the attached LICENSE file for details. All rights not explicitly
|
|
||||||
granted by the Apache 2.0 license are reserved by the Original Author.
|
|
||||||
|
|
||||||
## Badges
|
|
||||||
|
|
||||||
[![Sauce Test Status](https://saucelabs.com/browser-matrix/adler32.svg)](https://saucelabs.com/u/adler32)
|
|
||||||
|
|
||||||
[![Build Status](https://img.shields.io/github/workflow/status/sheetjs/js-adler32/Tests:%20node.js)](https://github.com/SheetJS/js-adler32/actions)
|
|
||||||
|
|
||||||
[![Coverage Status](http://img.shields.io/coveralls/SheetJS/js-adler32/master.svg)](https://coveralls.io/r/SheetJS/js-adler32?branch=master)
|
|
||||||
|
|
||||||
[![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/js-adler32?pixel)](https://github.com/SheetJS/js-adler32)
|
|
@ -1,92 +0,0 @@
|
|||||||
/* adler32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
|
||||||
/* vim: set ts=2: */
|
|
||||||
/*exported ADLER32 */
|
|
||||||
var ADLER32;
|
|
||||||
(function (factory) {
|
|
||||||
/*jshint ignore:start */
|
|
||||||
/*eslint-disable */
|
|
||||||
if(typeof DO_NOT_EXPORT_ADLER === 'undefined') {
|
|
||||||
if('object' === typeof exports) {
|
|
||||||
factory(exports);
|
|
||||||
} else if ('function' === typeof define && define.amd) {
|
|
||||||
define(function () {
|
|
||||||
var module = {};
|
|
||||||
factory(module);
|
|
||||||
return module;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
factory(ADLER32 = {});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
factory(ADLER32 = {});
|
|
||||||
}
|
|
||||||
/*eslint-enable */
|
|
||||||
/*jshint ignore:end */
|
|
||||||
}(function(ADLER32) {
|
|
||||||
ADLER32.version = '1.3.1';
|
|
||||||
function adler32_bstr(bstr, seed) {
|
|
||||||
var a = 1, b = 0, L = bstr.length, M = 0;
|
|
||||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
|
||||||
for(var i = 0; i < L;) {
|
|
||||||
M = Math.min(L-i, 2654)+i;
|
|
||||||
for(;i<M;i++) {
|
|
||||||
a += bstr.charCodeAt(i)&0xFF;
|
|
||||||
b += a;
|
|
||||||
}
|
|
||||||
a = (15*(a>>>16)+(a&65535));
|
|
||||||
b = (15*(b>>>16)+(b&65535));
|
|
||||||
}
|
|
||||||
return ((b%65521) << 16) | (a%65521);
|
|
||||||
}
|
|
||||||
|
|
||||||
function adler32_buf(buf, seed) {
|
|
||||||
var a = 1, b = 0, L = buf.length, M = 0;
|
|
||||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = (seed >>> 16) & 0xFFFF; }
|
|
||||||
for(var i = 0; i < L;) {
|
|
||||||
M = Math.min(L-i, 2654)+i;
|
|
||||||
for(;i<M;i++) {
|
|
||||||
a += buf[i]&0xFF;
|
|
||||||
b += a;
|
|
||||||
}
|
|
||||||
a = (15*(a>>>16)+(a&65535));
|
|
||||||
b = (15*(b>>>16)+(b&65535));
|
|
||||||
}
|
|
||||||
return ((b%65521) << 16) | (a%65521);
|
|
||||||
}
|
|
||||||
|
|
||||||
function adler32_str(str, seed) {
|
|
||||||
var a = 1, b = 0, L = str.length, M = 0, c = 0, d = 0;
|
|
||||||
if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; }
|
|
||||||
for(var i = 0; i < L;) {
|
|
||||||
M = Math.min(L-i, 2918);
|
|
||||||
while(M>0) {
|
|
||||||
c = str.charCodeAt(i++);
|
|
||||||
if(c < 0x80) { a += c; }
|
|
||||||
else if(c < 0x800) {
|
|
||||||
a += 192|((c>>6)&31); b += a; --M;
|
|
||||||
a += 128|(c&63);
|
|
||||||
} else if(c >= 0xD800 && c < 0xE000) {
|
|
||||||
c = (c&1023)+64; d = str.charCodeAt(i++) & 1023;
|
|
||||||
a += 240|((c>>8)&7); b += a; --M;
|
|
||||||
a += 128|((c>>2)&63); b += a; --M;
|
|
||||||
a += 128|((d>>6)&15)|((c&3)<<4); b += a; --M;
|
|
||||||
a += 128|(d&63);
|
|
||||||
} else {
|
|
||||||
a += 224|((c>>12)&15); b += a; --M;
|
|
||||||
a += 128|((c>>6)&63); b += a; --M;
|
|
||||||
a += 128|(c&63);
|
|
||||||
}
|
|
||||||
b += a; --M;
|
|
||||||
}
|
|
||||||
a = (15*(a>>>16)+(a&65535));
|
|
||||||
b = (15*(b>>>16)+(b&65535));
|
|
||||||
}
|
|
||||||
return ((b%65521) << 16) | (a%65521);
|
|
||||||
}
|
|
||||||
// $FlowIgnore
|
|
||||||
ADLER32.bstr = adler32_bstr;
|
|
||||||
// $FlowIgnore
|
|
||||||
ADLER32.buf = adler32_buf;
|
|
||||||
// $FlowIgnore
|
|
||||||
ADLER32.str = adler32_str;
|
|
||||||
}));
|
|
@ -1,54 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "adler-32",
|
|
||||||
"version": "1.3.1",
|
|
||||||
"author": "sheetjs",
|
|
||||||
"description": "Pure-JS ADLER-32",
|
|
||||||
"keywords": [
|
|
||||||
"adler32",
|
|
||||||
"checksum"
|
|
||||||
],
|
|
||||||
"main": "./adler32",
|
|
||||||
"types": "types/index.d.ts",
|
|
||||||
"devDependencies": {
|
|
||||||
"mocha": "~2.5.3",
|
|
||||||
"blanket": "~1.2.3",
|
|
||||||
"codepage": "~1.10.0",
|
|
||||||
"@sheetjs/uglify-js": "~2.7.3",
|
|
||||||
"@types/node": "^8.0.7",
|
|
||||||
"dtslint": "^0.1.2",
|
|
||||||
"typescript": "2.2.0"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/SheetJS/js-adler32.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "make test",
|
|
||||||
"build": "make",
|
|
||||||
"lint": "make fullint",
|
|
||||||
"dtslint": "dtslint types"
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"blanket": {
|
|
||||||
"pattern": "adler32.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"homepage": "http://sheetjs.com/opensource",
|
|
||||||
"files": [
|
|
||||||
"adler32.js",
|
|
||||||
"LICENSE",
|
|
||||||
"README.md",
|
|
||||||
"types/index.d.ts",
|
|
||||||
"types/*.json"
|
|
||||||
],
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/SheetJS/js-adler32/issues"
|
|
||||||
},
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.8"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "adler-32@1.3.1",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz"
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
/* adler32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
|
||||||
// TypeScript Version: 2.2
|
|
||||||
|
|
||||||
/** Version string */
|
|
||||||
export const version: string;
|
|
||||||
|
|
||||||
/** Process a node buffer or byte array */
|
|
||||||
export function buf(data: number[] | Uint8Array, seed?: number): number;
|
|
||||||
|
|
||||||
/** Process a binary string */
|
|
||||||
export function bstr(data: string, seed?: number): number;
|
|
||||||
|
|
||||||
/** Process a JS string based on the UTF8 encoding */
|
|
||||||
export function str(data: string, seed?: number): number;
|
|
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"module": "commonjs",
|
|
||||||
"lib": [ "es5" ],
|
|
||||||
"noImplicitAny": true,
|
|
||||||
"noImplicitThis": true,
|
|
||||||
"strictNullChecks": false,
|
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": { "adler-32": ["."] },
|
|
||||||
"types": [],
|
|
||||||
"noEmit": true,
|
|
||||||
"strictFunctionTypes": true,
|
|
||||||
"forceConsistentCasingInFileNames": true
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "dtslint/dtslint.json",
|
|
||||||
"rules": {
|
|
||||||
"no-implicit-dependencies": false,
|
|
||||||
"whitespace": false,
|
|
||||||
"no-sparse-arrays": false,
|
|
||||||
"only-arrow-functions": false,
|
|
||||||
"no-consecutive-blank-lines": false,
|
|
||||||
"prefer-conditional-expression": false,
|
|
||||||
"one-variable-per-declaration": false,
|
|
||||||
"strict-export-declare-modifiers": false,
|
|
||||||
"prefer-template": false
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
node_modules/
|
|
@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Linus Unnebäck
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
@ -1,44 +0,0 @@
|
|||||||
# `append-field`
|
|
||||||
|
|
||||||
A [W3C HTML JSON forms spec](http://www.w3.org/TR/html-json-forms/) compliant
|
|
||||||
field appender (for lack of a better name). Useful for people implementing
|
|
||||||
`application/x-www-form-urlencoded` and `multipart/form-data` parsers.
|
|
||||||
|
|
||||||
It works best on objects created with `Object.create(null)`. Otherwise it might
|
|
||||||
conflict with variables from the prototype (e.g. `hasOwnProperty`).
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save append-field
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var appendField = require('append-field')
|
|
||||||
var obj = Object.create(null)
|
|
||||||
|
|
||||||
appendField(obj, 'pets[0][species]', 'Dahut')
|
|
||||||
appendField(obj, 'pets[0][name]', 'Hypatia')
|
|
||||||
appendField(obj, 'pets[1][species]', 'Felis Stultus')
|
|
||||||
appendField(obj, 'pets[1][name]', 'Billie')
|
|
||||||
|
|
||||||
console.log(obj)
|
|
||||||
```
|
|
||||||
|
|
||||||
```text
|
|
||||||
{ pets:
|
|
||||||
[ { species: 'Dahut', name: 'Hypatia' },
|
|
||||||
{ species: 'Felis Stultus', name: 'Billie' } ] }
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
### `appendField(store, key, value)`
|
|
||||||
|
|
||||||
Adds the field named `key` with the value `value` to the object `store`.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
@ -1,12 +0,0 @@
|
|||||||
var parsePath = require('./lib/parse-path')
|
|
||||||
var setValue = require('./lib/set-value')
|
|
||||||
|
|
||||||
function appendField (store, key, value) {
|
|
||||||
var steps = parsePath(key)
|
|
||||||
|
|
||||||
steps.reduce(function (context, step) {
|
|
||||||
return setValue(context, step, context[step.key], value)
|
|
||||||
}, store)
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = appendField
|
|
53
node_modules/.store/append-field@1.0.0/node_modules/append-field/lib/parse-path.js
generated
vendored
53
node_modules/.store/append-field@1.0.0/node_modules/append-field/lib/parse-path.js
generated
vendored
@ -1,53 +0,0 @@
|
|||||||
var reFirstKey = /^[^\[]*/
|
|
||||||
var reDigitPath = /^\[(\d+)\]/
|
|
||||||
var reNormalPath = /^\[([^\]]+)\]/
|
|
||||||
|
|
||||||
function parsePath (key) {
|
|
||||||
function failure () {
|
|
||||||
return [{ type: 'object', key: key, last: true }]
|
|
||||||
}
|
|
||||||
|
|
||||||
var firstKey = reFirstKey.exec(key)[0]
|
|
||||||
if (!firstKey) return failure()
|
|
||||||
|
|
||||||
var len = key.length
|
|
||||||
var pos = firstKey.length
|
|
||||||
var tail = { type: 'object', key: firstKey }
|
|
||||||
var steps = [tail]
|
|
||||||
|
|
||||||
while (pos < len) {
|
|
||||||
var m
|
|
||||||
|
|
||||||
if (key[pos] === '[' && key[pos + 1] === ']') {
|
|
||||||
pos += 2
|
|
||||||
tail.append = true
|
|
||||||
if (pos !== len) return failure()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
m = reDigitPath.exec(key.substring(pos))
|
|
||||||
if (m !== null) {
|
|
||||||
pos += m[0].length
|
|
||||||
tail.nextType = 'array'
|
|
||||||
tail = { type: 'array', key: parseInt(m[1], 10) }
|
|
||||||
steps.push(tail)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
m = reNormalPath.exec(key.substring(pos))
|
|
||||||
if (m !== null) {
|
|
||||||
pos += m[0].length
|
|
||||||
tail.nextType = 'object'
|
|
||||||
tail = { type: 'object', key: m[1] }
|
|
||||||
steps.push(tail)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
return failure()
|
|
||||||
}
|
|
||||||
|
|
||||||
tail.last = true
|
|
||||||
return steps
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = parsePath
|
|
64
node_modules/.store/append-field@1.0.0/node_modules/append-field/lib/set-value.js
generated
vendored
64
node_modules/.store/append-field@1.0.0/node_modules/append-field/lib/set-value.js
generated
vendored
@ -1,64 +0,0 @@
|
|||||||
function valueType (value) {
|
|
||||||
if (value === undefined) return 'undefined'
|
|
||||||
if (Array.isArray(value)) return 'array'
|
|
||||||
if (typeof value === 'object') return 'object'
|
|
||||||
return 'scalar'
|
|
||||||
}
|
|
||||||
|
|
||||||
function setLastValue (context, step, currentValue, entryValue) {
|
|
||||||
switch (valueType(currentValue)) {
|
|
||||||
case 'undefined':
|
|
||||||
if (step.append) {
|
|
||||||
context[step.key] = [entryValue]
|
|
||||||
} else {
|
|
||||||
context[step.key] = entryValue
|
|
||||||
}
|
|
||||||
break
|
|
||||||
case 'array':
|
|
||||||
context[step.key].push(entryValue)
|
|
||||||
break
|
|
||||||
case 'object':
|
|
||||||
return setLastValue(currentValue, { type: 'object', key: '', last: true }, currentValue[''], entryValue)
|
|
||||||
case 'scalar':
|
|
||||||
context[step.key] = [context[step.key], entryValue]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
return context
|
|
||||||
}
|
|
||||||
|
|
||||||
function setValue (context, step, currentValue, entryValue) {
|
|
||||||
if (step.last) return setLastValue(context, step, currentValue, entryValue)
|
|
||||||
|
|
||||||
var obj
|
|
||||||
switch (valueType(currentValue)) {
|
|
||||||
case 'undefined':
|
|
||||||
if (step.nextType === 'array') {
|
|
||||||
context[step.key] = []
|
|
||||||
} else {
|
|
||||||
context[step.key] = Object.create(null)
|
|
||||||
}
|
|
||||||
return context[step.key]
|
|
||||||
case 'object':
|
|
||||||
return context[step.key]
|
|
||||||
case 'array':
|
|
||||||
if (step.nextType === 'array') {
|
|
||||||
return currentValue
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = Object.create(null)
|
|
||||||
context[step.key] = obj
|
|
||||||
currentValue.forEach(function (item, i) {
|
|
||||||
if (item !== undefined) obj['' + i] = item
|
|
||||||
})
|
|
||||||
|
|
||||||
return obj
|
|
||||||
case 'scalar':
|
|
||||||
obj = Object.create(null)
|
|
||||||
obj[''] = currentValue
|
|
||||||
context[step.key] = obj
|
|
||||||
return obj
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = setValue
|
|
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "append-field",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"license": "MIT",
|
|
||||||
"author": "Linus Unnebäck <linus@folkdatorn.se>",
|
|
||||||
"main": "index.js",
|
|
||||||
"devDependencies": {
|
|
||||||
"mocha": "^2.2.4",
|
|
||||||
"standard": "^6.0.5",
|
|
||||||
"testdata-w3c-json-form": "^0.2.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "standard && mocha"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "http://github.com/LinusU/node-append-field.git"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "append-field@1.0.0",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/append-field/-/append-field-1.0.0.tgz"
|
|
||||||
}
|
|
19
node_modules/.store/append-field@1.0.0/node_modules/append-field/test/forms.js
generated
vendored
19
node_modules/.store/append-field@1.0.0/node_modules/append-field/test/forms.js
generated
vendored
@ -1,19 +0,0 @@
|
|||||||
/* eslint-env mocha */
|
|
||||||
|
|
||||||
var assert = require('assert')
|
|
||||||
var appendField = require('../')
|
|
||||||
var testData = require('testdata-w3c-json-form')
|
|
||||||
|
|
||||||
describe('Append Field', function () {
|
|
||||||
for (var test of testData) {
|
|
||||||
it('handles ' + test.name, function () {
|
|
||||||
var store = Object.create(null)
|
|
||||||
|
|
||||||
for (var field of test.fields) {
|
|
||||||
appendField(store, field.key, field.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert.deepEqual(store, test.expected)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
@ -1,43 +0,0 @@
|
|||||||
# Array Flatten
|
|
||||||
|
|
||||||
[![NPM version][npm-image]][npm-url]
|
|
||||||
[![NPM downloads][downloads-image]][downloads-url]
|
|
||||||
[![Build status][travis-image]][travis-url]
|
|
||||||
[![Test coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
> Flatten an array of nested arrays into a single flat array. Accepts an optional depth.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```
|
|
||||||
npm install array-flatten --save
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var flatten = require('array-flatten')
|
|
||||||
|
|
||||||
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9])
|
|
||||||
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
||||||
|
|
||||||
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2)
|
|
||||||
//=> [1, 2, 3, [4, [5], 6], 7, 8, 9]
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
flatten(arguments) //=> [1, 2, 3]
|
|
||||||
})(1, [2, 3])
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
||||||
|
|
||||||
[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat
|
|
||||||
[npm-url]: https://npmjs.org/package/array-flatten
|
|
||||||
[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat
|
|
||||||
[downloads-url]: https://npmjs.org/package/array-flatten
|
|
||||||
[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat
|
|
||||||
[travis-url]: https://travis-ci.org/blakeembrey/array-flatten
|
|
||||||
[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat
|
|
||||||
[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master
|
|
64
node_modules/.store/array-flatten@1.1.1/node_modules/array-flatten/array-flatten.js
generated
vendored
64
node_modules/.store/array-flatten@1.1.1/node_modules/array-flatten/array-flatten.js
generated
vendored
@ -1,64 +0,0 @@
|
|||||||
'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)
|
|
||||||
}
|
|
42
node_modules/.store/array-flatten@1.1.1/node_modules/array-flatten/package.json
generated
vendored
42
node_modules/.store/array-flatten@1.1.1/node_modules/array-flatten/package.json
generated
vendored
@ -1,42 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "array-flatten",
|
|
||||||
"version": "1.1.1",
|
|
||||||
"description": "Flatten an array of nested arrays into a single flat array",
|
|
||||||
"main": "array-flatten.js",
|
|
||||||
"files": [
|
|
||||||
"array-flatten.js",
|
|
||||||
"LICENSE"
|
|
||||||
],
|
|
||||||
"scripts": {
|
|
||||||
"test": "istanbul cover _mocha -- -R spec"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/blakeembrey/array-flatten.git"
|
|
||||||
},
|
|
||||||
"keywords": [
|
|
||||||
"array",
|
|
||||||
"flatten",
|
|
||||||
"arguments",
|
|
||||||
"depth"
|
|
||||||
],
|
|
||||||
"author": {
|
|
||||||
"name": "Blake Embrey",
|
|
||||||
"email": "hello@blakeembrey.com",
|
|
||||||
"url": "http://blakeembrey.me"
|
|
||||||
},
|
|
||||||
"license": "MIT",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/blakeembrey/array-flatten/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/blakeembrey/array-flatten",
|
|
||||||
"devDependencies": {
|
|
||||||
"istanbul": "^0.3.13",
|
|
||||||
"mocha": "^2.2.4",
|
|
||||||
"pre-commit": "^1.0.7",
|
|
||||||
"standard": "^3.7.3"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "array-flatten@1.1.1",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz"
|
|
||||||
}
|
|
@ -1,672 +0,0 @@
|
|||||||
1.20.3 / 2024-09-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@6.13.0
|
|
||||||
* add `depth` option to customize the depth level in the parser
|
|
||||||
* IMPORTANT: The default `depth` level for parsing URL-encoded data is now `32` (previously was `Infinity`)
|
|
||||||
|
|
||||||
1.20.2 / 2023-02-21
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix strict json error message on Node.js 19+
|
|
||||||
* deps: content-type@~1.0.5
|
|
||||||
- perf: skip value escaping when unnecessary
|
|
||||||
* deps: raw-body@2.5.2
|
|
||||||
|
|
||||||
1.20.1 / 2022-10-06
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@6.11.0
|
|
||||||
* perf: remove unnecessary object clone
|
|
||||||
|
|
||||||
1.20.0 / 2022-04-02
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix error message for json parse whitespace in `strict`
|
|
||||||
* Fix internal error when inflated body exceeds limit
|
|
||||||
* Prevent loss of async hooks context
|
|
||||||
* Prevent hanging when request already read
|
|
||||||
* deps: depd@2.0.0
|
|
||||||
- Replace internal `eval` usage with `Function` constructor
|
|
||||||
- Use instance methods on `process` to check for listeners
|
|
||||||
* deps: http-errors@2.0.0
|
|
||||||
- deps: depd@2.0.0
|
|
||||||
- deps: statuses@2.0.1
|
|
||||||
* deps: on-finished@2.4.1
|
|
||||||
* deps: qs@6.10.3
|
|
||||||
* deps: raw-body@2.5.1
|
|
||||||
- deps: http-errors@2.0.0
|
|
||||||
|
|
||||||
1.19.2 / 2022-02-15
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@3.1.2
|
|
||||||
* deps: qs@6.9.7
|
|
||||||
* Fix handling of `__proto__` keys
|
|
||||||
* deps: raw-body@2.4.3
|
|
||||||
- deps: bytes@3.1.2
|
|
||||||
|
|
||||||
1.19.1 / 2021-12-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@3.1.1
|
|
||||||
* deps: http-errors@1.8.1
|
|
||||||
- deps: inherits@2.0.4
|
|
||||||
- deps: toidentifier@1.0.1
|
|
||||||
- deps: setprototypeof@1.2.0
|
|
||||||
* deps: qs@6.9.6
|
|
||||||
* deps: raw-body@2.4.2
|
|
||||||
- deps: bytes@3.1.1
|
|
||||||
- deps: http-errors@1.8.1
|
|
||||||
* deps: safe-buffer@5.2.1
|
|
||||||
* deps: type-is@~1.6.18
|
|
||||||
|
|
||||||
1.19.0 / 2019-04-25
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@3.1.0
|
|
||||||
- Add petabyte (`pb`) support
|
|
||||||
* deps: http-errors@1.7.2
|
|
||||||
- Set constructor name when possible
|
|
||||||
- deps: setprototypeof@1.1.1
|
|
||||||
- deps: statuses@'>= 1.5.0 < 2'
|
|
||||||
* deps: iconv-lite@0.4.24
|
|
||||||
- Added encoding MIK
|
|
||||||
* deps: qs@6.7.0
|
|
||||||
- Fix parsing array brackets after index
|
|
||||||
* deps: raw-body@2.4.0
|
|
||||||
- deps: bytes@3.1.0
|
|
||||||
- deps: http-errors@1.7.2
|
|
||||||
- deps: iconv-lite@0.4.24
|
|
||||||
* deps: type-is@~1.6.17
|
|
||||||
- deps: mime-types@~2.1.24
|
|
||||||
- perf: prevent internal `throw` on invalid type
|
|
||||||
|
|
||||||
1.18.3 / 2018-05-14
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix stack trace for strict json parse error
|
|
||||||
* deps: depd@~1.1.2
|
|
||||||
- perf: remove argument reassignment
|
|
||||||
* deps: http-errors@~1.6.3
|
|
||||||
- deps: depd@~1.1.2
|
|
||||||
- deps: setprototypeof@1.1.0
|
|
||||||
- deps: statuses@'>= 1.3.1 < 2'
|
|
||||||
* deps: iconv-lite@0.4.23
|
|
||||||
- Fix loading encoding with year appended
|
|
||||||
- Fix deprecation warnings on Node.js 10+
|
|
||||||
* deps: qs@6.5.2
|
|
||||||
* deps: raw-body@2.3.3
|
|
||||||
- deps: http-errors@1.6.3
|
|
||||||
- deps: iconv-lite@0.4.23
|
|
||||||
* deps: type-is@~1.6.16
|
|
||||||
- deps: mime-types@~2.1.18
|
|
||||||
|
|
||||||
1.18.2 / 2017-09-22
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.9
|
|
||||||
* perf: remove argument reassignment
|
|
||||||
|
|
||||||
1.18.1 / 2017-09-12
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: content-type@~1.0.4
|
|
||||||
- perf: remove argument reassignment
|
|
||||||
- perf: skip parameter parsing when no parameters
|
|
||||||
* deps: iconv-lite@0.4.19
|
|
||||||
- Fix ISO-8859-1 regression
|
|
||||||
- Update Windows-1255
|
|
||||||
* deps: qs@6.5.1
|
|
||||||
- Fix parsing & compacting very deep objects
|
|
||||||
* deps: raw-body@2.3.2
|
|
||||||
- deps: iconv-lite@0.4.19
|
|
||||||
|
|
||||||
1.18.0 / 2017-09-08
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix JSON strict violation error to match native parse error
|
|
||||||
* Include the `body` property on verify errors
|
|
||||||
* Include the `type` property on all generated errors
|
|
||||||
* Use `http-errors` to set status code on errors
|
|
||||||
* deps: bytes@3.0.0
|
|
||||||
* deps: debug@2.6.8
|
|
||||||
* deps: depd@~1.1.1
|
|
||||||
- Remove unnecessary `Buffer` loading
|
|
||||||
* deps: http-errors@~1.6.2
|
|
||||||
- deps: depd@1.1.1
|
|
||||||
* deps: iconv-lite@0.4.18
|
|
||||||
- Add support for React Native
|
|
||||||
- Add a warning if not loaded as utf-8
|
|
||||||
- Fix CESU-8 decoding in Node.js 8
|
|
||||||
- Improve speed of ISO-8859-1 encoding
|
|
||||||
* deps: qs@6.5.0
|
|
||||||
* deps: raw-body@2.3.1
|
|
||||||
- Use `http-errors` for standard emitted errors
|
|
||||||
- deps: bytes@3.0.0
|
|
||||||
- deps: iconv-lite@0.4.18
|
|
||||||
- perf: skip buffer decoding on overage chunk
|
|
||||||
* perf: prevent internal `throw` when missing charset
|
|
||||||
|
|
||||||
1.17.2 / 2017-05-17
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.7
|
|
||||||
- Fix `DEBUG_MAX_ARRAY_LENGTH`
|
|
||||||
- deps: ms@2.0.0
|
|
||||||
* deps: type-is@~1.6.15
|
|
||||||
- deps: mime-types@~2.1.15
|
|
||||||
|
|
||||||
1.17.1 / 2017-03-06
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@6.4.0
|
|
||||||
- Fix regression parsing keys starting with `[`
|
|
||||||
|
|
||||||
1.17.0 / 2017-03-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: http-errors@~1.6.1
|
|
||||||
- Make `message` property enumerable for `HttpError`s
|
|
||||||
- deps: setprototypeof@1.0.3
|
|
||||||
* deps: qs@6.3.1
|
|
||||||
- Fix compacting nested arrays
|
|
||||||
|
|
||||||
1.16.1 / 2017-02-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.1
|
|
||||||
- Fix deprecation messages in WebStorm and other editors
|
|
||||||
- Undeprecate `DEBUG_FD` set to `1` or `2`
|
|
||||||
|
|
||||||
1.16.0 / 2017-01-17
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.0
|
|
||||||
- Allow colors in workers
|
|
||||||
- Deprecated `DEBUG_FD` environment variable
|
|
||||||
- Fix error when running under React Native
|
|
||||||
- Use same color for same namespace
|
|
||||||
- deps: ms@0.7.2
|
|
||||||
* deps: http-errors@~1.5.1
|
|
||||||
- deps: inherits@2.0.3
|
|
||||||
- deps: setprototypeof@1.0.2
|
|
||||||
- deps: statuses@'>= 1.3.1 < 2'
|
|
||||||
* deps: iconv-lite@0.4.15
|
|
||||||
- Added encoding MS-31J
|
|
||||||
- Added encoding MS-932
|
|
||||||
- Added encoding MS-936
|
|
||||||
- Added encoding MS-949
|
|
||||||
- Added encoding MS-950
|
|
||||||
- Fix GBK/GB18030 handling of Euro character
|
|
||||||
* deps: qs@6.2.1
|
|
||||||
- Fix array parsing from skipping empty values
|
|
||||||
* deps: raw-body@~2.2.0
|
|
||||||
- deps: iconv-lite@0.4.15
|
|
||||||
* deps: type-is@~1.6.14
|
|
||||||
- deps: mime-types@~2.1.13
|
|
||||||
|
|
||||||
1.15.2 / 2016-06-19
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@2.4.0
|
|
||||||
* deps: content-type@~1.0.2
|
|
||||||
- perf: enable strict mode
|
|
||||||
* deps: http-errors@~1.5.0
|
|
||||||
- Use `setprototypeof` module to replace `__proto__` setting
|
|
||||||
- deps: statuses@'>= 1.3.0 < 2'
|
|
||||||
- perf: enable strict mode
|
|
||||||
* deps: qs@6.2.0
|
|
||||||
* deps: raw-body@~2.1.7
|
|
||||||
- deps: bytes@2.4.0
|
|
||||||
- perf: remove double-cleanup on happy path
|
|
||||||
* deps: type-is@~1.6.13
|
|
||||||
- deps: mime-types@~2.1.11
|
|
||||||
|
|
||||||
1.15.1 / 2016-05-05
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@2.3.0
|
|
||||||
- Drop partial bytes on all parsed units
|
|
||||||
- Fix parsing byte string that looks like hex
|
|
||||||
* deps: raw-body@~2.1.6
|
|
||||||
- deps: bytes@2.3.0
|
|
||||||
* deps: type-is@~1.6.12
|
|
||||||
- deps: mime-types@~2.1.10
|
|
||||||
|
|
||||||
1.15.0 / 2016-02-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: http-errors@~1.4.0
|
|
||||||
- Add `HttpError` export, for `err instanceof createError.HttpError`
|
|
||||||
- deps: inherits@2.0.1
|
|
||||||
- deps: statuses@'>= 1.2.1 < 2'
|
|
||||||
* deps: qs@6.1.0
|
|
||||||
* deps: type-is@~1.6.11
|
|
||||||
- deps: mime-types@~2.1.9
|
|
||||||
|
|
||||||
1.14.2 / 2015-12-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@2.2.0
|
|
||||||
* deps: iconv-lite@0.4.13
|
|
||||||
* deps: qs@5.2.0
|
|
||||||
* deps: raw-body@~2.1.5
|
|
||||||
- deps: bytes@2.2.0
|
|
||||||
- deps: iconv-lite@0.4.13
|
|
||||||
* deps: type-is@~1.6.10
|
|
||||||
- deps: mime-types@~2.1.8
|
|
||||||
|
|
||||||
1.14.1 / 2015-09-27
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix issue where invalid charset results in 400 when `verify` used
|
|
||||||
* deps: iconv-lite@0.4.12
|
|
||||||
- Fix CESU-8 decoding in Node.js 4.x
|
|
||||||
* deps: raw-body@~2.1.4
|
|
||||||
- Fix masking critical errors from `iconv-lite`
|
|
||||||
- deps: iconv-lite@0.4.12
|
|
||||||
* deps: type-is@~1.6.9
|
|
||||||
- deps: mime-types@~2.1.7
|
|
||||||
|
|
||||||
1.14.0 / 2015-09-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix JSON strict parse error to match syntax errors
|
|
||||||
* Provide static `require` analysis in `urlencoded` parser
|
|
||||||
* deps: depd@~1.1.0
|
|
||||||
- Support web browser loading
|
|
||||||
* deps: qs@5.1.0
|
|
||||||
* deps: raw-body@~2.1.3
|
|
||||||
- Fix sync callback when attaching data listener causes sync read
|
|
||||||
* deps: type-is@~1.6.8
|
|
||||||
- Fix type error when given invalid type to match against
|
|
||||||
- deps: mime-types@~2.1.6
|
|
||||||
|
|
||||||
1.13.3 / 2015-07-31
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: type-is@~1.6.6
|
|
||||||
- deps: mime-types@~2.1.4
|
|
||||||
|
|
||||||
1.13.2 / 2015-07-05
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: iconv-lite@0.4.11
|
|
||||||
* deps: qs@4.0.0
|
|
||||||
- Fix dropping parameters like `hasOwnProperty`
|
|
||||||
- Fix user-visible incompatibilities from 3.1.0
|
|
||||||
- Fix various parsing edge cases
|
|
||||||
* deps: raw-body@~2.1.2
|
|
||||||
- Fix error stack traces to skip `makeError`
|
|
||||||
- deps: iconv-lite@0.4.11
|
|
||||||
* deps: type-is@~1.6.4
|
|
||||||
- deps: mime-types@~2.1.2
|
|
||||||
- perf: enable strict mode
|
|
||||||
- perf: remove argument reassignment
|
|
||||||
|
|
||||||
1.13.1 / 2015-06-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@2.4.2
|
|
||||||
- Downgraded from 3.1.0 because of user-visible incompatibilities
|
|
||||||
|
|
||||||
1.13.0 / 2015-06-14
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Add `statusCode` property on `Error`s, in addition to `status`
|
|
||||||
* Change `type` default to `application/json` for JSON parser
|
|
||||||
* Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser
|
|
||||||
* Provide static `require` analysis
|
|
||||||
* Use the `http-errors` module to generate errors
|
|
||||||
* deps: bytes@2.1.0
|
|
||||||
- Slight optimizations
|
|
||||||
* deps: iconv-lite@0.4.10
|
|
||||||
- The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails
|
|
||||||
- Leading BOM is now removed when decoding
|
|
||||||
* deps: on-finished@~2.3.0
|
|
||||||
- Add defined behavior for HTTP `CONNECT` requests
|
|
||||||
- Add defined behavior for HTTP `Upgrade` requests
|
|
||||||
- deps: ee-first@1.1.1
|
|
||||||
* deps: qs@3.1.0
|
|
||||||
- Fix dropping parameters like `hasOwnProperty`
|
|
||||||
- Fix various parsing edge cases
|
|
||||||
- Parsed object now has `null` prototype
|
|
||||||
* deps: raw-body@~2.1.1
|
|
||||||
- Use `unpipe` module for unpiping requests
|
|
||||||
- deps: iconv-lite@0.4.10
|
|
||||||
* deps: type-is@~1.6.3
|
|
||||||
- deps: mime-types@~2.1.1
|
|
||||||
- perf: reduce try block size
|
|
||||||
- perf: remove bitwise operations
|
|
||||||
* perf: enable strict mode
|
|
||||||
* perf: remove argument reassignment
|
|
||||||
* perf: remove delete call
|
|
||||||
|
|
||||||
1.12.4 / 2015-05-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@~2.2.0
|
|
||||||
* deps: qs@2.4.2
|
|
||||||
- Fix allowing parameters like `constructor`
|
|
||||||
* deps: on-finished@~2.2.1
|
|
||||||
* deps: raw-body@~2.0.1
|
|
||||||
- Fix a false-positive when unpiping in Node.js 0.8
|
|
||||||
- deps: bytes@2.0.1
|
|
||||||
* deps: type-is@~1.6.2
|
|
||||||
- deps: mime-types@~2.0.11
|
|
||||||
|
|
||||||
1.12.3 / 2015-04-15
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Slight efficiency improvement when not debugging
|
|
||||||
* deps: depd@~1.0.1
|
|
||||||
* deps: iconv-lite@0.4.8
|
|
||||||
- Add encoding alias UNICODE-1-1-UTF-7
|
|
||||||
* deps: raw-body@1.3.4
|
|
||||||
- Fix hanging callback if request aborts during read
|
|
||||||
- deps: iconv-lite@0.4.8
|
|
||||||
|
|
||||||
1.12.2 / 2015-03-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@2.4.1
|
|
||||||
- Fix error when parameter `hasOwnProperty` is present
|
|
||||||
|
|
||||||
1.12.1 / 2015-03-15
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@~2.1.3
|
|
||||||
- Fix high intensity foreground color for bold
|
|
||||||
- deps: ms@0.7.0
|
|
||||||
* deps: type-is@~1.6.1
|
|
||||||
- deps: mime-types@~2.0.10
|
|
||||||
|
|
||||||
1.12.0 / 2015-02-13
|
|
||||||
===================
|
|
||||||
|
|
||||||
* add `debug` messages
|
|
||||||
* accept a function for the `type` option
|
|
||||||
* use `content-type` to parse `Content-Type` headers
|
|
||||||
* deps: iconv-lite@0.4.7
|
|
||||||
- Gracefully support enumerables on `Object.prototype`
|
|
||||||
* deps: raw-body@1.3.3
|
|
||||||
- deps: iconv-lite@0.4.7
|
|
||||||
* deps: type-is@~1.6.0
|
|
||||||
- fix argument reassignment
|
|
||||||
- fix false-positives in `hasBody` `Transfer-Encoding` check
|
|
||||||
- support wildcard for both type and subtype (`*/*`)
|
|
||||||
- deps: mime-types@~2.0.9
|
|
||||||
|
|
||||||
1.11.0 / 2015-01-30
|
|
||||||
===================
|
|
||||||
|
|
||||||
* make internal `extended: true` depth limit infinity
|
|
||||||
* deps: type-is@~1.5.6
|
|
||||||
- deps: mime-types@~2.0.8
|
|
||||||
|
|
||||||
1.10.2 / 2015-01-20
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: iconv-lite@0.4.6
|
|
||||||
- Fix rare aliases of single-byte encodings
|
|
||||||
* deps: raw-body@1.3.2
|
|
||||||
- deps: iconv-lite@0.4.6
|
|
||||||
|
|
||||||
1.10.1 / 2015-01-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: on-finished@~2.2.0
|
|
||||||
* deps: type-is@~1.5.5
|
|
||||||
- deps: mime-types@~2.0.7
|
|
||||||
|
|
||||||
1.10.0 / 2014-12-02
|
|
||||||
===================
|
|
||||||
|
|
||||||
* make internal `extended: true` array limit dynamic
|
|
||||||
|
|
||||||
1.9.3 / 2014-11-21
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: iconv-lite@0.4.5
|
|
||||||
- Fix Windows-31J and X-SJIS encoding support
|
|
||||||
* deps: qs@2.3.3
|
|
||||||
- Fix `arrayLimit` behavior
|
|
||||||
* deps: raw-body@1.3.1
|
|
||||||
- deps: iconv-lite@0.4.5
|
|
||||||
* deps: type-is@~1.5.3
|
|
||||||
- deps: mime-types@~2.0.3
|
|
||||||
|
|
||||||
1.9.2 / 2014-10-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.3.2
|
|
||||||
- Fix parsing of mixed objects and values
|
|
||||||
|
|
||||||
1.9.1 / 2014-10-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: on-finished@~2.1.1
|
|
||||||
- Fix handling of pipelined requests
|
|
||||||
* deps: qs@2.3.0
|
|
||||||
- Fix parsing of mixed implicit and explicit arrays
|
|
||||||
* deps: type-is@~1.5.2
|
|
||||||
- deps: mime-types@~2.0.2
|
|
||||||
|
|
||||||
1.9.0 / 2014-09-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* include the charset in "unsupported charset" error message
|
|
||||||
* include the encoding in "unsupported content encoding" error message
|
|
||||||
* deps: depd@~1.0.0
|
|
||||||
|
|
||||||
1.8.4 / 2014-09-23
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix content encoding to be case-insensitive
|
|
||||||
|
|
||||||
1.8.3 / 2014-09-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.2.4
|
|
||||||
- Fix issue with object keys starting with numbers truncated
|
|
||||||
|
|
||||||
1.8.2 / 2014-09-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.5
|
|
||||||
|
|
||||||
1.8.1 / 2014-09-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: media-typer@0.3.0
|
|
||||||
* deps: type-is@~1.5.1
|
|
||||||
|
|
||||||
1.8.0 / 2014-09-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* make empty-body-handling consistent between chunked requests
|
|
||||||
- empty `json` produces `{}`
|
|
||||||
- empty `raw` produces `new Buffer(0)`
|
|
||||||
- empty `text` produces `''`
|
|
||||||
- empty `urlencoded` produces `{}`
|
|
||||||
* deps: qs@2.2.3
|
|
||||||
- Fix issue where first empty value in array is discarded
|
|
||||||
* deps: type-is@~1.5.0
|
|
||||||
- fix `hasbody` to be true for `content-length: 0`
|
|
||||||
|
|
||||||
1.7.0 / 2014-09-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `parameterLimit` option to `urlencoded` parser
|
|
||||||
* change `urlencoded` extended array limit to 100
|
|
||||||
* respond with 413 when over `parameterLimit` in `urlencoded`
|
|
||||||
|
|
||||||
1.6.7 / 2014-08-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.2.2
|
|
||||||
- Remove unnecessary cloning
|
|
||||||
|
|
||||||
1.6.6 / 2014-08-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.2.0
|
|
||||||
- Array parsing fix
|
|
||||||
- Performance improvements
|
|
||||||
|
|
||||||
1.6.5 / 2014-08-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: on-finished@2.1.0
|
|
||||||
|
|
||||||
1.6.4 / 2014-08-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.2.2
|
|
||||||
|
|
||||||
1.6.3 / 2014-08-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.2.1
|
|
||||||
|
|
||||||
1.6.2 / 2014-08-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.2.0
|
|
||||||
- Fix parsing array of objects
|
|
||||||
|
|
||||||
1.6.1 / 2014-08-06
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.1.0
|
|
||||||
- Accept urlencoded square brackets
|
|
||||||
- Accept empty values in implicit array notation
|
|
||||||
|
|
||||||
1.6.0 / 2014-08-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.0.2
|
|
||||||
- Complete rewrite
|
|
||||||
- Limits array length to 20
|
|
||||||
- Limits object depth to 5
|
|
||||||
- Limits parameters to 1,000
|
|
||||||
|
|
||||||
1.5.2 / 2014-07-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.4
|
|
||||||
- Work-around v8 generating empty stack traces
|
|
||||||
|
|
||||||
1.5.1 / 2014-07-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.3
|
|
||||||
- Fix exception when global `Error.stackTraceLimit` is too low
|
|
||||||
|
|
||||||
1.5.0 / 2014-07-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.2
|
|
||||||
- Add `TRACE_DEPRECATION` environment variable
|
|
||||||
- Remove non-standard grey color from color output
|
|
||||||
- Support `--no-deprecation` argument
|
|
||||||
- Support `--trace-deprecation` argument
|
|
||||||
* deps: iconv-lite@0.4.4
|
|
||||||
- Added encoding UTF-7
|
|
||||||
* deps: raw-body@1.3.0
|
|
||||||
- deps: iconv-lite@0.4.4
|
|
||||||
- Added encoding UTF-7
|
|
||||||
- Fix `Cannot switch to old mode now` error on Node.js 0.10+
|
|
||||||
* deps: type-is@~1.3.2
|
|
||||||
|
|
||||||
1.4.3 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: type-is@1.3.1
|
|
||||||
- fix global variable leak
|
|
||||||
|
|
||||||
1.4.2 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: type-is@1.3.0
|
|
||||||
- improve type parsing
|
|
||||||
|
|
||||||
1.4.1 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix urlencoded extended deprecation message
|
|
||||||
|
|
||||||
1.4.0 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `text` parser
|
|
||||||
* add `raw` parser
|
|
||||||
* check accepted charset in content-type (accepts utf-8)
|
|
||||||
* check accepted encoding in content-encoding (accepts identity)
|
|
||||||
* deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed
|
|
||||||
* deprecate `urlencoded()` without provided `extended` option
|
|
||||||
* lazy-load urlencoded parsers
|
|
||||||
* parsers split into files for reduced mem usage
|
|
||||||
* support gzip and deflate bodies
|
|
||||||
- set `inflate: false` to turn off
|
|
||||||
* deps: raw-body@1.2.2
|
|
||||||
- Support all encodings from `iconv-lite`
|
|
||||||
|
|
||||||
1.3.1 / 2014-06-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: type-is@1.2.1
|
|
||||||
- Switch dependency from mime to mime-types@1.0.0
|
|
||||||
|
|
||||||
1.3.0 / 2014-05-31
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `extended` option to urlencoded parser
|
|
||||||
|
|
||||||
1.2.2 / 2014-05-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: raw-body@1.1.6
|
|
||||||
- assert stream encoding on node.js 0.8
|
|
||||||
- assert stream encoding on node.js < 0.10.6
|
|
||||||
- deps: bytes@1
|
|
||||||
|
|
||||||
1.2.1 / 2014-05-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* invoke `next(err)` after request fully read
|
|
||||||
- prevents hung responses and socket hang ups
|
|
||||||
|
|
||||||
1.2.0 / 2014-05-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `verify` option
|
|
||||||
* deps: type-is@1.2.0
|
|
||||||
- support suffix matching
|
|
||||||
|
|
||||||
1.1.2 / 2014-05-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* improve json parser speed
|
|
||||||
|
|
||||||
1.1.1 / 2014-05-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix repeated limit parsing with every request
|
|
||||||
|
|
||||||
1.1.0 / 2014-05-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `type` option
|
|
||||||
* deps: pin for safety and consistency
|
|
||||||
|
|
||||||
1.0.2 / 2014-04-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* use `type-is` module
|
|
||||||
|
|
||||||
1.0.1 / 2014-03-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* lower default limits to 100kb
|
|
@ -1,23 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
|
||||||
Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,476 +0,0 @@
|
|||||||
# body-parser
|
|
||||||
|
|
||||||
[![NPM Version][npm-version-image]][npm-url]
|
|
||||||
[![NPM Downloads][npm-downloads-image]][npm-url]
|
|
||||||
[![Build Status][ci-image]][ci-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
[![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer]
|
|
||||||
|
|
||||||
Node.js body parsing middleware.
|
|
||||||
|
|
||||||
Parse incoming request bodies in a middleware before your handlers, available
|
|
||||||
under the `req.body` property.
|
|
||||||
|
|
||||||
**Note** As `req.body`'s shape is based on user-controlled input, all
|
|
||||||
properties and values in this object are untrusted and should be validated
|
|
||||||
before trusting. For example, `req.body.foo.toString()` may fail in multiple
|
|
||||||
ways, for example the `foo` property may not be there or may not be a string,
|
|
||||||
and `toString` may not be a function and instead a string or other user input.
|
|
||||||
|
|
||||||
[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/).
|
|
||||||
|
|
||||||
_This does not handle multipart bodies_, due to their complex and typically
|
|
||||||
large nature. For multipart bodies, you may be interested in the following
|
|
||||||
modules:
|
|
||||||
|
|
||||||
* [busboy](https://www.npmjs.org/package/busboy#readme) and
|
|
||||||
[connect-busboy](https://www.npmjs.org/package/connect-busboy#readme)
|
|
||||||
* [multiparty](https://www.npmjs.org/package/multiparty#readme) and
|
|
||||||
[connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme)
|
|
||||||
* [formidable](https://www.npmjs.org/package/formidable#readme)
|
|
||||||
* [multer](https://www.npmjs.org/package/multer#readme)
|
|
||||||
|
|
||||||
This module provides the following parsers:
|
|
||||||
|
|
||||||
* [JSON body parser](#bodyparserjsonoptions)
|
|
||||||
* [Raw body parser](#bodyparserrawoptions)
|
|
||||||
* [Text body parser](#bodyparsertextoptions)
|
|
||||||
* [URL-encoded form body parser](#bodyparserurlencodedoptions)
|
|
||||||
|
|
||||||
Other body parsers you might be interested in:
|
|
||||||
|
|
||||||
- [body](https://www.npmjs.org/package/body#readme)
|
|
||||||
- [co-body](https://www.npmjs.org/package/co-body#readme)
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install body-parser
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```js
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
```
|
|
||||||
|
|
||||||
The `bodyParser` object exposes various factories to create middlewares. All
|
|
||||||
middlewares will populate the `req.body` property with the parsed body when
|
|
||||||
the `Content-Type` request header matches the `type` option, or an empty
|
|
||||||
object (`{}`) if there was no body to parse, the `Content-Type` was not matched,
|
|
||||||
or an error occurred.
|
|
||||||
|
|
||||||
The various errors returned by this module are described in the
|
|
||||||
[errors section](#errors).
|
|
||||||
|
|
||||||
### bodyParser.json([options])
|
|
||||||
|
|
||||||
Returns middleware that only parses `json` and only looks at requests where
|
|
||||||
the `Content-Type` header matches the `type` option. This parser accepts any
|
|
||||||
Unicode encoding of the body and supports automatic inflation of `gzip` and
|
|
||||||
`deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` object containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`).
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `json` function takes an optional `options` object that may contain any of
|
|
||||||
the following keys:
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### reviver
|
|
||||||
|
|
||||||
The `reviver` option is passed directly to `JSON.parse` as the second
|
|
||||||
argument. You can find more information on this argument
|
|
||||||
[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter).
|
|
||||||
|
|
||||||
##### strict
|
|
||||||
|
|
||||||
When set to `true`, will only accept arrays and objects; when `false` will
|
|
||||||
accept anything `JSON.parse` accepts. Defaults to `true`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function. If not a
|
|
||||||
function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
|
|
||||||
be an extension name (like `json`), a mime type (like `application/json`), or
|
|
||||||
a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type`
|
|
||||||
option is called as `fn(req)` and the request is parsed if it returns a truthy
|
|
||||||
value. Defaults to `application/json`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
### bodyParser.raw([options])
|
|
||||||
|
|
||||||
Returns middleware that parses all bodies as a `Buffer` and only looks at
|
|
||||||
requests where the `Content-Type` header matches the `type` option. This
|
|
||||||
parser supports automatic inflation of `gzip` and `deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` object containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`). This will be a `Buffer` object
|
|
||||||
of the body.
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `raw` function takes an optional `options` object that may contain any of
|
|
||||||
the following keys:
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function.
|
|
||||||
If not a function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this
|
|
||||||
can be an extension name (like `bin`), a mime type (like
|
|
||||||
`application/octet-stream`), or a mime type with a wildcard (like `*/*` or
|
|
||||||
`application/*`). If a function, the `type` option is called as `fn(req)`
|
|
||||||
and the request is parsed if it returns a truthy value. Defaults to
|
|
||||||
`application/octet-stream`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
### bodyParser.text([options])
|
|
||||||
|
|
||||||
Returns middleware that parses all bodies as a string and only looks at
|
|
||||||
requests where the `Content-Type` header matches the `type` option. This
|
|
||||||
parser supports automatic inflation of `gzip` and `deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` string containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`). This will be a string of the
|
|
||||||
body.
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `text` function takes an optional `options` object that may contain any of
|
|
||||||
the following keys:
|
|
||||||
|
|
||||||
##### defaultCharset
|
|
||||||
|
|
||||||
Specify the default character set for the text content if the charset is not
|
|
||||||
specified in the `Content-Type` header of the request. Defaults to `utf-8`.
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function. If not
|
|
||||||
a function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
|
|
||||||
be an extension name (like `txt`), a mime type (like `text/plain`), or a mime
|
|
||||||
type with a wildcard (like `*/*` or `text/*`). If a function, the `type`
|
|
||||||
option is called as `fn(req)` and the request is parsed if it returns a
|
|
||||||
truthy value. Defaults to `text/plain`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
### bodyParser.urlencoded([options])
|
|
||||||
|
|
||||||
Returns middleware that only parses `urlencoded` bodies and only looks at
|
|
||||||
requests where the `Content-Type` header matches the `type` option. This
|
|
||||||
parser accepts only UTF-8 encoding of the body and supports automatic
|
|
||||||
inflation of `gzip` and `deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` object containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`). This object will contain
|
|
||||||
key-value pairs, where the value can be a string or array (when `extended` is
|
|
||||||
`false`), or any type (when `extended` is `true`).
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `urlencoded` function takes an optional `options` object that may contain
|
|
||||||
any of the following keys:
|
|
||||||
|
|
||||||
##### extended
|
|
||||||
|
|
||||||
The `extended` option allows to choose between parsing the URL-encoded data
|
|
||||||
with the `querystring` library (when `false`) or the `qs` library (when
|
|
||||||
`true`). The "extended" syntax allows for rich objects and arrays to be
|
|
||||||
encoded into the URL-encoded format, allowing for a JSON-like experience
|
|
||||||
with URL-encoded. For more information, please
|
|
||||||
[see the qs library](https://www.npmjs.org/package/qs#readme).
|
|
||||||
|
|
||||||
Defaults to `true`, but using the default has been deprecated. Please
|
|
||||||
research into the difference between `qs` and `querystring` and choose the
|
|
||||||
appropriate setting.
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### parameterLimit
|
|
||||||
|
|
||||||
The `parameterLimit` option controls the maximum number of parameters that
|
|
||||||
are allowed in the URL-encoded data. If a request contains more parameters
|
|
||||||
than this value, a 413 will be returned to the client. Defaults to `1000`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function. If not
|
|
||||||
a function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
|
|
||||||
be an extension name (like `urlencoded`), a mime type (like
|
|
||||||
`application/x-www-form-urlencoded`), or a mime type with a wildcard (like
|
|
||||||
`*/x-www-form-urlencoded`). If a function, the `type` option is called as
|
|
||||||
`fn(req)` and the request is parsed if it returns a truthy value. Defaults
|
|
||||||
to `application/x-www-form-urlencoded`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
#### depth
|
|
||||||
|
|
||||||
The `depth` option is used to configure the maximum depth of the `qs` library when `extended` is `true`. This allows you to limit the amount of keys that are parsed and can be useful to prevent certain types of abuse. Defaults to `32`. It is recommended to keep this value as low as possible.
|
|
||||||
|
|
||||||
## Errors
|
|
||||||
|
|
||||||
The middlewares provided by this module create errors using the
|
|
||||||
[`http-errors` module](https://www.npmjs.com/package/http-errors). The errors
|
|
||||||
will typically have a `status`/`statusCode` property that contains the suggested
|
|
||||||
HTTP response code, an `expose` property to determine if the `message` property
|
|
||||||
should be displayed to the client, a `type` property to determine the type of
|
|
||||||
error without matching against the `message`, and a `body` property containing
|
|
||||||
the read body, if available.
|
|
||||||
|
|
||||||
The following are the common errors created, though any error can come through
|
|
||||||
for various reasons.
|
|
||||||
|
|
||||||
### content encoding unsupported
|
|
||||||
|
|
||||||
This error will occur when the request had a `Content-Encoding` header that
|
|
||||||
contained an encoding but the "inflation" option was set to `false`. The
|
|
||||||
`status` property is set to `415`, the `type` property is set to
|
|
||||||
`'encoding.unsupported'`, and the `charset` property will be set to the
|
|
||||||
encoding that is unsupported.
|
|
||||||
|
|
||||||
### entity parse failed
|
|
||||||
|
|
||||||
This error will occur when the request contained an entity that could not be
|
|
||||||
parsed by the middleware. The `status` property is set to `400`, the `type`
|
|
||||||
property is set to `'entity.parse.failed'`, and the `body` property is set to
|
|
||||||
the entity value that failed parsing.
|
|
||||||
|
|
||||||
### entity verify failed
|
|
||||||
|
|
||||||
This error will occur when the request contained an entity that could not be
|
|
||||||
failed verification by the defined `verify` option. The `status` property is
|
|
||||||
set to `403`, the `type` property is set to `'entity.verify.failed'`, and the
|
|
||||||
`body` property is set to the entity value that failed verification.
|
|
||||||
|
|
||||||
### request aborted
|
|
||||||
|
|
||||||
This error will occur when the request is aborted by the client before reading
|
|
||||||
the body has finished. The `received` property will be set to the number of
|
|
||||||
bytes received before the request was aborted and the `expected` property is
|
|
||||||
set to the number of expected bytes. The `status` property is set to `400`
|
|
||||||
and `type` property is set to `'request.aborted'`.
|
|
||||||
|
|
||||||
### request entity too large
|
|
||||||
|
|
||||||
This error will occur when the request body's size is larger than the "limit"
|
|
||||||
option. The `limit` property will be set to the byte limit and the `length`
|
|
||||||
property will be set to the request body's length. The `status` property is
|
|
||||||
set to `413` and the `type` property is set to `'entity.too.large'`.
|
|
||||||
|
|
||||||
### request size did not match content length
|
|
||||||
|
|
||||||
This error will occur when the request's length did not match the length from
|
|
||||||
the `Content-Length` header. This typically occurs when the request is malformed,
|
|
||||||
typically when the `Content-Length` header was calculated based on characters
|
|
||||||
instead of bytes. The `status` property is set to `400` and the `type` property
|
|
||||||
is set to `'request.size.invalid'`.
|
|
||||||
|
|
||||||
### stream encoding should not be set
|
|
||||||
|
|
||||||
This error will occur when something called the `req.setEncoding` method prior
|
|
||||||
to this middleware. This module operates directly on bytes only and you cannot
|
|
||||||
call `req.setEncoding` when using this module. The `status` property is set to
|
|
||||||
`500` and the `type` property is set to `'stream.encoding.set'`.
|
|
||||||
|
|
||||||
### stream is not readable
|
|
||||||
|
|
||||||
This error will occur when the request is no longer readable when this middleware
|
|
||||||
attempts to read it. This typically means something other than a middleware from
|
|
||||||
this module read the request body already and the middleware was also configured to
|
|
||||||
read the same request. The `status` property is set to `500` and the `type`
|
|
||||||
property is set to `'stream.not.readable'`.
|
|
||||||
|
|
||||||
### too many parameters
|
|
||||||
|
|
||||||
This error will occur when the content of the request exceeds the configured
|
|
||||||
`parameterLimit` for the `urlencoded` parser. The `status` property is set to
|
|
||||||
`413` and the `type` property is set to `'parameters.too.many'`.
|
|
||||||
|
|
||||||
### unsupported charset "BOGUS"
|
|
||||||
|
|
||||||
This error will occur when the request had a charset parameter in the
|
|
||||||
`Content-Type` header, but the `iconv-lite` module does not support it OR the
|
|
||||||
parser does not support it. The charset is contained in the message as well
|
|
||||||
as in the `charset` property. The `status` property is set to `415`, the
|
|
||||||
`type` property is set to `'charset.unsupported'`, and the `charset` property
|
|
||||||
is set to the charset that is unsupported.
|
|
||||||
|
|
||||||
### unsupported content encoding "bogus"
|
|
||||||
|
|
||||||
This error will occur when the request had a `Content-Encoding` header that
|
|
||||||
contained an unsupported encoding. The encoding is contained in the message
|
|
||||||
as well as in the `encoding` property. The `status` property is set to `415`,
|
|
||||||
the `type` property is set to `'encoding.unsupported'`, and the `encoding`
|
|
||||||
property is set to the encoding that is unsupported.
|
|
||||||
|
|
||||||
### The input exceeded the depth
|
|
||||||
|
|
||||||
This error occurs when using `bodyParser.urlencoded` with the `extended` property set to `true` and the input exceeds the configured `depth` option. The `status` property is set to `400`. It is recommended to review the `depth` option and evaluate if it requires a higher value. When the `depth` option is set to `32` (default value), the error will not be thrown.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Express/Connect top-level generic
|
|
||||||
|
|
||||||
This example demonstrates adding a generic JSON and URL-encoded parser as a
|
|
||||||
top-level middleware, which will parse the bodies of all incoming requests.
|
|
||||||
This is the simplest setup.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var express = require('express')
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
|
|
||||||
var app = express()
|
|
||||||
|
|
||||||
// parse application/x-www-form-urlencoded
|
|
||||||
app.use(bodyParser.urlencoded({ extended: false }))
|
|
||||||
|
|
||||||
// parse application/json
|
|
||||||
app.use(bodyParser.json())
|
|
||||||
|
|
||||||
app.use(function (req, res) {
|
|
||||||
res.setHeader('Content-Type', 'text/plain')
|
|
||||||
res.write('you posted:\n')
|
|
||||||
res.end(JSON.stringify(req.body, null, 2))
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Express route-specific
|
|
||||||
|
|
||||||
This example demonstrates adding body parsers specifically to the routes that
|
|
||||||
need them. In general, this is the most recommended way to use body-parser with
|
|
||||||
Express.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var express = require('express')
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
|
|
||||||
var app = express()
|
|
||||||
|
|
||||||
// create application/json parser
|
|
||||||
var jsonParser = bodyParser.json()
|
|
||||||
|
|
||||||
// create application/x-www-form-urlencoded parser
|
|
||||||
var urlencodedParser = bodyParser.urlencoded({ extended: false })
|
|
||||||
|
|
||||||
// POST /login gets urlencoded bodies
|
|
||||||
app.post('/login', urlencodedParser, function (req, res) {
|
|
||||||
res.send('welcome, ' + req.body.username)
|
|
||||||
})
|
|
||||||
|
|
||||||
// POST /api/users gets JSON bodies
|
|
||||||
app.post('/api/users', jsonParser, function (req, res) {
|
|
||||||
// create user in req.body
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Change accepted type for parsers
|
|
||||||
|
|
||||||
All the parsers accept a `type` option which allows you to change the
|
|
||||||
`Content-Type` that the middleware will parse.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var express = require('express')
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
|
|
||||||
var app = express()
|
|
||||||
|
|
||||||
// parse various different custom JSON types as JSON
|
|
||||||
app.use(bodyParser.json({ type: 'application/*+json' }))
|
|
||||||
|
|
||||||
// parse some custom thing into a Buffer
|
|
||||||
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
|
|
||||||
|
|
||||||
// parse an HTML body into a string
|
|
||||||
app.use(bodyParser.text({ type: 'text/html' }))
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[ci-image]: https://badgen.net/github/checks/expressjs/body-parser/master?label=ci
|
|
||||||
[ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/body-parser/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master
|
|
||||||
[node-version-image]: https://badgen.net/npm/node/body-parser
|
|
||||||
[node-version-url]: https://nodejs.org/en/download
|
|
||||||
[npm-downloads-image]: https://badgen.net/npm/dm/body-parser
|
|
||||||
[npm-url]: https://npmjs.org/package/body-parser
|
|
||||||
[npm-version-image]: https://badgen.net/npm/v/body-parser
|
|
||||||
[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/body-parser/badge
|
|
||||||
[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/body-parser
|
|
@ -1,25 +0,0 @@
|
|||||||
# Security Policies and Procedures
|
|
||||||
|
|
||||||
## Reporting a Bug
|
|
||||||
|
|
||||||
The Express team and community take all security bugs seriously. Thank you
|
|
||||||
for improving the security of Express. We appreciate your efforts and
|
|
||||||
responsible disclosure and will make every effort to acknowledge your
|
|
||||||
contributions.
|
|
||||||
|
|
||||||
Report security bugs by emailing the current owner(s) of `body-parser`. This
|
|
||||||
information can be found in the npm registry using the command
|
|
||||||
`npm owner ls body-parser`.
|
|
||||||
If unsure or unable to get the information from the above, open an issue
|
|
||||||
in the [project issue tracker](https://github.com/expressjs/body-parser/issues)
|
|
||||||
asking for the current contact information.
|
|
||||||
|
|
||||||
To ensure the timely response to your report, please ensure that the entirety
|
|
||||||
of the report is contained within the email body and not solely behind a web
|
|
||||||
link or an attachment.
|
|
||||||
|
|
||||||
At least one owner will acknowledge your email within 48 hours, and will send a
|
|
||||||
more detailed response within 48 hours indicating the next steps in handling
|
|
||||||
your report. After the initial reply to your report, the owners will
|
|
||||||
endeavor to keep you informed of the progress towards a fix and full
|
|
||||||
announcement, and may ask for additional information or guidance.
|
|
@ -1,156 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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)
|
|
||||||
}
|
|
@ -1,205 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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()
|
|
||||||
}
|
|
||||||
}
|
|
247
node_modules/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/json.js
generated
vendored
247
node_modules/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/json.js
generated
vendored
@ -1,247 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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
|
|
||||||
|
|
||||||
var JSON_SYNTAX_CHAR = '#'
|
|
||||||
var JSON_SYNTAX_REGEXP = /#+/g
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 = ''
|
|
||||||
|
|
||||||
if (index !== -1) {
|
|
||||||
partial = str.substring(0, index) + JSON_SYNTAX_CHAR
|
|
||||||
|
|
||||||
for (var i = index + 1; i < str.length; i++) {
|
|
||||||
partial += JSON_SYNTAX_CHAR
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation')
|
|
||||||
} catch (e) {
|
|
||||||
return normalizeJsonSyntaxError(e, {
|
|
||||||
message: e.message.replace(JSON_SYNTAX_REGEXP, function (placeholder) {
|
|
||||||
return str.substring(index, index + placeholder.length)
|
|
||||||
}),
|
|
||||||
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/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/raw.js
generated
vendored
101
node_modules/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/raw.js
generated
vendored
@ -1,101 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/text.js
generated
vendored
121
node_modules/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/text.js
generated
vendored
@ -1,121 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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))
|
|
||||||
}
|
|
||||||
}
|
|
307
node_modules/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/urlencoded.js
generated
vendored
307
node_modules/.store/body-parser@1.20.3/node_modules/body-parser/lib/types/urlencoded.js
generated
vendored
@ -1,307 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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
|
|
||||||
var depth = typeof opts.depth !== 'number'
|
|
||||||
? Number(opts.depth || 32)
|
|
||||||
: opts.depth
|
|
||||||
|
|
||||||
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,
|
|
||||||
depth: depth
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the extended query parser.
|
|
||||||
*
|
|
||||||
* @param {object} options
|
|
||||||
*/
|
|
||||||
|
|
||||||
function extendedparser (options) {
|
|
||||||
var parameterLimit = options.parameterLimit !== undefined
|
|
||||||
? options.parameterLimit
|
|
||||||
: 1000
|
|
||||||
|
|
||||||
var depth = typeof options.depth !== 'number'
|
|
||||||
? Number(options.depth || 32)
|
|
||||||
: options.depth
|
|
||||||
var parse = parser('qs')
|
|
||||||
|
|
||||||
if (isNaN(parameterLimit) || parameterLimit < 1) {
|
|
||||||
throw new TypeError('option parameterLimit must be a positive number')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNaN(depth) || depth < 0) {
|
|
||||||
throw new TypeError('option depth must be a zero or 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')
|
|
||||||
try {
|
|
||||||
return parse(body, {
|
|
||||||
allowPrototypes: true,
|
|
||||||
arrayLimit: arrayLimit,
|
|
||||||
depth: depth,
|
|
||||||
strictDepth: true,
|
|
||||||
parameterLimit: parameterLimit
|
|
||||||
})
|
|
||||||
} catch (err) {
|
|
||||||
if (err instanceof RangeError) {
|
|
||||||
throw createError(400, 'The input exceeded the depth', {
|
|
||||||
type: 'querystring.parse.rangeError'
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "body-parser",
|
|
||||||
"description": "Node.js body parsing middleware",
|
|
||||||
"version": "1.20.3",
|
|
||||||
"contributors": [
|
|
||||||
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
|
||||||
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "expressjs/body-parser",
|
|
||||||
"dependencies": {
|
|
||||||
"bytes": "3.1.2",
|
|
||||||
"content-type": "~1.0.5",
|
|
||||||
"debug": "2.6.9",
|
|
||||||
"depd": "2.0.0",
|
|
||||||
"destroy": "1.2.0",
|
|
||||||
"http-errors": "2.0.0",
|
|
||||||
"iconv-lite": "0.4.24",
|
|
||||||
"on-finished": "2.4.1",
|
|
||||||
"qs": "6.13.0",
|
|
||||||
"raw-body": "2.5.2",
|
|
||||||
"type-is": "~1.6.18",
|
|
||||||
"unpipe": "1.0.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "8.34.0",
|
|
||||||
"eslint-config-standard": "14.1.1",
|
|
||||||
"eslint-plugin-import": "2.27.5",
|
|
||||||
"eslint-plugin-markdown": "3.0.0",
|
|
||||||
"eslint-plugin-node": "11.1.0",
|
|
||||||
"eslint-plugin-promise": "6.1.1",
|
|
||||||
"eslint-plugin-standard": "4.1.0",
|
|
||||||
"methods": "1.1.2",
|
|
||||||
"mocha": "10.2.0",
|
|
||||||
"nyc": "15.1.0",
|
|
||||||
"safe-buffer": "5.2.1",
|
|
||||||
"supertest": "6.3.3"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"lib/",
|
|
||||||
"LICENSE",
|
|
||||||
"HISTORY.md",
|
|
||||||
"SECURITY.md",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8",
|
|
||||||
"npm": "1.2.8000 || >= 1.4.16"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint .",
|
|
||||||
"test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/",
|
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "body-parser@1.20.3",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz"
|
|
||||||
}
|
|
@ -1,97 +0,0 @@
|
|||||||
3.1.2 / 2022-01-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix return value for un-parsable strings
|
|
||||||
|
|
||||||
3.1.1 / 2021-11-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix "thousandsSeparator" incorrecting formatting fractional part
|
|
||||||
|
|
||||||
3.1.0 / 2019-01-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add petabyte (`pb`) support
|
|
||||||
|
|
||||||
3.0.0 / 2017-08-31
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Change "kB" to "KB" in format output
|
|
||||||
* Remove support for Node.js 0.6
|
|
||||||
* Remove support for ComponentJS
|
|
||||||
|
|
||||||
2.5.0 / 2017-03-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add option "unit"
|
|
||||||
|
|
||||||
2.4.0 / 2016-06-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add option "unitSeparator"
|
|
||||||
|
|
||||||
2.3.0 / 2016-02-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Drop partial bytes on all parsed units
|
|
||||||
* Fix non-finite numbers to `.format` to return `null`
|
|
||||||
* Fix parsing byte string that looks like hex
|
|
||||||
* perf: hoist regular expressions
|
|
||||||
|
|
||||||
2.2.0 / 2015-11-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add option "decimalPlaces"
|
|
||||||
* add option "fixedDecimals"
|
|
||||||
|
|
||||||
2.1.0 / 2015-05-21
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `.format` export
|
|
||||||
* add `.parse` export
|
|
||||||
|
|
||||||
2.0.2 / 2015-05-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* remove map recreation
|
|
||||||
* remove unnecessary object construction
|
|
||||||
|
|
||||||
2.0.1 / 2015-05-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix browserify require
|
|
||||||
* remove node.extend dependency
|
|
||||||
|
|
||||||
2.0.0 / 2015-04-12
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add option "case"
|
|
||||||
* add option "thousandsSeparator"
|
|
||||||
* return "null" on invalid parse input
|
|
||||||
* support proper round-trip: bytes(bytes(num)) === num
|
|
||||||
* units no longer case sensitive when parsing
|
|
||||||
|
|
||||||
1.0.0 / 2014-05-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add negative support. fixes #6
|
|
||||||
|
|
||||||
0.3.0 / 2014-03-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* added terabyte support
|
|
||||||
|
|
||||||
0.2.1 / 2013-04-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add .component
|
|
||||||
|
|
||||||
0.2.0 / 2012-10-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* bytes(200).should.eql('200b')
|
|
||||||
|
|
||||||
0.1.0 / 2012-07-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add bytes to string conversion [yields]
|
|
@ -1,23 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>
|
|
||||||
Copyright (c) 2015 Jed Watson <jed.watson@me.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,170 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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);
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "bytes",
|
|
||||||
"description": "Utility to parse a string bytes to bytes and vice-versa",
|
|
||||||
"version": "3.1.2",
|
|
||||||
"author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
|
|
||||||
"contributors": [
|
|
||||||
"Jed Watson <jed.watson@me.com>",
|
|
||||||
"Théo FIDRY <theo.fidry@gmail.com>"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"byte",
|
|
||||||
"bytes",
|
|
||||||
"utility",
|
|
||||||
"parse",
|
|
||||||
"parser",
|
|
||||||
"convert",
|
|
||||||
"converter"
|
|
||||||
],
|
|
||||||
"repository": "visionmedia/bytes.js",
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "7.32.0",
|
|
||||||
"eslint-plugin-markdown": "2.2.1",
|
|
||||||
"mocha": "9.2.0",
|
|
||||||
"nyc": "15.1.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"History.md",
|
|
||||||
"LICENSE",
|
|
||||||
"Readme.md",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint .",
|
|
||||||
"test": "mocha --check-leaks --reporter spec",
|
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "bytes@3.1.2",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz"
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
1.0.5 / 2023-01-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* perf: skip value escaping when unnecessary
|
|
||||||
|
|
||||||
1.0.4 / 2017-09-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* perf: skip parameter parsing when no parameters
|
|
||||||
|
|
||||||
1.0.3 / 2017-09-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* perf: remove argument reassignment
|
|
||||||
|
|
||||||
1.0.2 / 2016-05-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* perf: enable strict mode
|
|
||||||
|
|
||||||
1.0.1 / 2015-02-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Improve missing `Content-Type` header error message
|
|
||||||
|
|
||||||
1.0.0 / 2015-02-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Initial implementation, derived from `media-typer@0.3.0`
|
|
@ -1,22 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Douglas Christopher Wilson
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,94 +0,0 @@
|
|||||||
# content-type
|
|
||||||
|
|
||||||
[![NPM Version][npm-version-image]][npm-url]
|
|
||||||
[![NPM Downloads][npm-downloads-image]][npm-url]
|
|
||||||
[![Node.js Version][node-image]][node-url]
|
|
||||||
[![Build Status][ci-image]][ci-url]
|
|
||||||
[![Coverage Status][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
Create and parse HTTP Content-Type header according to RFC 7231
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install content-type
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```js
|
|
||||||
var contentType = require('content-type')
|
|
||||||
```
|
|
||||||
|
|
||||||
### contentType.parse(string)
|
|
||||||
|
|
||||||
```js
|
|
||||||
var obj = contentType.parse('image/svg+xml; charset=utf-8')
|
|
||||||
```
|
|
||||||
|
|
||||||
Parse a `Content-Type` header. This will return an object with the following
|
|
||||||
properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`):
|
|
||||||
|
|
||||||
- `type`: The media type (the type and subtype, always lower case).
|
|
||||||
Example: `'image/svg+xml'`
|
|
||||||
|
|
||||||
- `parameters`: An object of the parameters in the media type (name of parameter
|
|
||||||
always lower case). Example: `{charset: 'utf-8'}`
|
|
||||||
|
|
||||||
Throws a `TypeError` if the string is missing or invalid.
|
|
||||||
|
|
||||||
### contentType.parse(req)
|
|
||||||
|
|
||||||
```js
|
|
||||||
var obj = contentType.parse(req)
|
|
||||||
```
|
|
||||||
|
|
||||||
Parse the `Content-Type` header from the given `req`. Short-cut for
|
|
||||||
`contentType.parse(req.headers['content-type'])`.
|
|
||||||
|
|
||||||
Throws a `TypeError` if the `Content-Type` header is missing or invalid.
|
|
||||||
|
|
||||||
### contentType.parse(res)
|
|
||||||
|
|
||||||
```js
|
|
||||||
var obj = contentType.parse(res)
|
|
||||||
```
|
|
||||||
|
|
||||||
Parse the `Content-Type` header set on the given `res`. Short-cut for
|
|
||||||
`contentType.parse(res.getHeader('content-type'))`.
|
|
||||||
|
|
||||||
Throws a `TypeError` if the `Content-Type` header is missing or invalid.
|
|
||||||
|
|
||||||
### contentType.format(obj)
|
|
||||||
|
|
||||||
```js
|
|
||||||
var str = contentType.format({
|
|
||||||
type: 'image/svg+xml',
|
|
||||||
parameters: { charset: 'utf-8' }
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
Format an object into a `Content-Type` header. This will return a string of the
|
|
||||||
content type for the given object with the following properties (examples are
|
|
||||||
shown that produce the string `'image/svg+xml; charset=utf-8'`):
|
|
||||||
|
|
||||||
- `type`: The media type (will be lower-cased). Example: `'image/svg+xml'`
|
|
||||||
|
|
||||||
- `parameters`: An object of the parameters in the media type (name of the
|
|
||||||
parameter will be lower-cased). Example: `{charset: 'utf-8'}`
|
|
||||||
|
|
||||||
Throws a `TypeError` if the object contains an invalid type or parameter names.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[ci-image]: https://badgen.net/github/checks/jshttp/content-type/master?label=ci
|
|
||||||
[ci-url]: https://github.com/jshttp/content-type/actions/workflows/ci.yml
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/content-type/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/jshttp/content-type?branch=master
|
|
||||||
[node-image]: https://badgen.net/npm/node/content-type
|
|
||||||
[node-url]: https://nodejs.org/en/download
|
|
||||||
[npm-downloads-image]: https://badgen.net/npm/dm/content-type
|
|
||||||
[npm-url]: https://npmjs.org/package/content-type
|
|
||||||
[npm-version-image]: https://badgen.net/npm/v/content-type
|
|
@ -1,225 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "content-type",
|
|
||||||
"description": "Create and parse HTTP Content-Type header",
|
|
||||||
"version": "1.0.5",
|
|
||||||
"author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"content-type",
|
|
||||||
"http",
|
|
||||||
"req",
|
|
||||||
"res",
|
|
||||||
"rfc7231"
|
|
||||||
],
|
|
||||||
"repository": "jshttp/content-type",
|
|
||||||
"devDependencies": {
|
|
||||||
"deep-equal": "1.0.1",
|
|
||||||
"eslint": "8.32.0",
|
|
||||||
"eslint-config-standard": "15.0.1",
|
|
||||||
"eslint-plugin-import": "2.27.5",
|
|
||||||
"eslint-plugin-node": "11.1.0",
|
|
||||||
"eslint-plugin-promise": "6.1.1",
|
|
||||||
"eslint-plugin-standard": "4.1.0",
|
|
||||||
"mocha": "10.2.0",
|
|
||||||
"nyc": "15.1.0"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"LICENSE",
|
|
||||||
"HISTORY.md",
|
|
||||||
"README.md",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint .",
|
|
||||||
"test": "mocha --reporter spec --check-leaks --bail test/",
|
|
||||||
"test-ci": "nyc --reporter=lcovonly --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test",
|
|
||||||
"version": "node scripts/version-history.js && git add HISTORY.md"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "content-type@1.0.5",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz"
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve
|
|
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"browser": true,
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"no-console": 0,
|
|
||||||
"no-empty": [1, { "allowEmptyCatch": true }]
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended"
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
support
|
|
||||||
test
|
|
||||||
examples
|
|
||||||
example
|
|
||||||
*.sock
|
|
||||||
dist
|
|
||||||
yarn.lock
|
|
||||||
coverage
|
|
||||||
bower.json
|
|
@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
language: node_js
|
|
||||||
node_js:
|
|
||||||
- "6"
|
|
||||||
- "5"
|
|
||||||
- "4"
|
|
||||||
|
|
||||||
install:
|
|
||||||
- make node_modules
|
|
||||||
|
|
||||||
script:
|
|
||||||
- make lint
|
|
||||||
- make test
|
|
||||||
- make coveralls
|
|
@ -1,362 +0,0 @@
|
|||||||
|
|
||||||
2.6.9 / 2017-09-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* remove ReDoS regexp in %o formatter (#504)
|
|
||||||
|
|
||||||
2.6.8 / 2017-05-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: Check for undefined on browser globals (#462, @marbemac)
|
|
||||||
|
|
||||||
2.6.7 / 2017-05-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)
|
|
||||||
* Fix: Inline extend function in node implementation (#452, @dougwilson)
|
|
||||||
* Docs: Fix typo (#455, @msasad)
|
|
||||||
|
|
||||||
2.6.5 / 2017-04-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)
|
|
||||||
* Misc: clean up browser reference checks (#447, @thebigredgeek)
|
|
||||||
* Misc: add npm-debug.log to .gitignore (@thebigredgeek)
|
|
||||||
|
|
||||||
|
|
||||||
2.6.4 / 2017-04-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)
|
|
||||||
* Chore: ignore bower.json in npm installations. (#437, @joaovieira)
|
|
||||||
* Misc: update "ms" to v0.7.3 (@tootallnate)
|
|
||||||
|
|
||||||
2.6.3 / 2017-03-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)
|
|
||||||
* Docs: Changelog fix (@thebigredgeek)
|
|
||||||
|
|
||||||
2.6.2 / 2017-03-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)
|
|
||||||
* Docs: Add backers and sponsors from Open Collective (#422, @piamancini)
|
|
||||||
* Docs: Add Slackin invite badge (@tootallnate)
|
|
||||||
|
|
||||||
2.6.1 / 2017-02-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error
|
|
||||||
* Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)
|
|
||||||
* Fix: IE8 "Expected identifier" error (#414, @vgoma)
|
|
||||||
* Fix: Namespaces would not disable once enabled (#409, @musikov)
|
|
||||||
|
|
||||||
2.6.0 / 2016-12-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: added better null pointer checks for browser useColors (@thebigredgeek)
|
|
||||||
* Improvement: removed explicit `window.debug` export (#404, @tootallnate)
|
|
||||||
* Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)
|
|
||||||
|
|
||||||
2.5.2 / 2016-12-25
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: reference error on window within webworkers (#393, @KlausTrainer)
|
|
||||||
* Docs: fixed README typo (#391, @lurch)
|
|
||||||
* Docs: added notice about v3 api discussion (@thebigredgeek)
|
|
||||||
|
|
||||||
2.5.1 / 2016-12-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: babel-core compatibility
|
|
||||||
|
|
||||||
2.5.0 / 2016-12-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: wrong reference in bower file (@thebigredgeek)
|
|
||||||
* Fix: webworker compatibility (@thebigredgeek)
|
|
||||||
* Fix: output formatting issue (#388, @kribblo)
|
|
||||||
* Fix: babel-loader compatibility (#383, @escwald)
|
|
||||||
* Misc: removed built asset from repo and publications (@thebigredgeek)
|
|
||||||
* Misc: moved source files to /src (#378, @yamikuronue)
|
|
||||||
* Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)
|
|
||||||
* Test: coveralls integration (#378, @yamikuronue)
|
|
||||||
* Docs: simplified language in the opening paragraph (#373, @yamikuronue)
|
|
||||||
|
|
||||||
2.4.5 / 2016-12-17
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: `navigator` undefined in Rhino (#376, @jochenberger)
|
|
||||||
* Fix: custom log function (#379, @hsiliev)
|
|
||||||
* Improvement: bit of cleanup + linting fixes (@thebigredgeek)
|
|
||||||
* Improvement: rm non-maintainted `dist/` dir (#375, @freewil)
|
|
||||||
* Docs: simplified language in the opening paragraph. (#373, @yamikuronue)
|
|
||||||
|
|
||||||
2.4.4 / 2016-12-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)
|
|
||||||
|
|
||||||
2.4.3 / 2016-12-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: navigation.userAgent error for react native (#364, @escwald)
|
|
||||||
|
|
||||||
2.4.2 / 2016-12-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: browser colors (#367, @tootallnate)
|
|
||||||
* Misc: travis ci integration (@thebigredgeek)
|
|
||||||
* Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)
|
|
||||||
|
|
||||||
2.4.1 / 2016-12-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: typo that broke the package (#356)
|
|
||||||
|
|
||||||
2.4.0 / 2016-12-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: bower.json references unbuilt src entry point (#342, @justmatt)
|
|
||||||
* Fix: revert "handle regex special characters" (@tootallnate)
|
|
||||||
* Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)
|
|
||||||
* Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)
|
|
||||||
* Improvement: allow colors in workers (#335, @botverse)
|
|
||||||
* Improvement: use same color for same namespace. (#338, @lchenay)
|
|
||||||
|
|
||||||
2.3.3 / 2016-11-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)
|
|
||||||
* Fix: Returning `localStorage` saved values (#331, Levi Thomason)
|
|
||||||
* Improvement: Don't create an empty object when no `process` (Nathan Rajlich)
|
|
||||||
|
|
||||||
2.3.2 / 2016-11-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: be super-safe in index.js as well (@TooTallNate)
|
|
||||||
* Fix: should check whether process exists (Tom Newby)
|
|
||||||
|
|
||||||
2.3.1 / 2016-11-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: Added electron compatibility (#324, @paulcbetts)
|
|
||||||
* Improvement: Added performance optimizations (@tootallnate)
|
|
||||||
* Readme: Corrected PowerShell environment variable example (#252, @gimre)
|
|
||||||
* Misc: Removed yarn lock file from source control (#321, @fengmk2)
|
|
||||||
|
|
||||||
2.3.0 / 2016-11-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)
|
|
||||||
* Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)
|
|
||||||
* Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)
|
|
||||||
* Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)
|
|
||||||
* Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)
|
|
||||||
* Package: Update "ms" to 0.7.2 (#315, @DevSide)
|
|
||||||
* Package: removed superfluous version property from bower.json (#207 @kkirsche)
|
|
||||||
* Readme: fix USE_COLORS to DEBUG_COLORS
|
|
||||||
* Readme: Doc fixes for format string sugar (#269, @mlucool)
|
|
||||||
* Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)
|
|
||||||
* Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)
|
|
||||||
* Readme: better docs for browser support (#224, @matthewmueller)
|
|
||||||
* Tooling: Added yarn integration for development (#317, @thebigredgeek)
|
|
||||||
* Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)
|
|
||||||
* Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)
|
|
||||||
* Misc: Updated contributors (@thebigredgeek)
|
|
||||||
|
|
||||||
2.2.0 / 2015-05-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* package: update "ms" to v0.7.1 (#202, @dougwilson)
|
|
||||||
* README: add logging to file example (#193, @DanielOchoa)
|
|
||||||
* README: fixed a typo (#191, @amir-s)
|
|
||||||
* browser: expose `storage` (#190, @stephenmathieson)
|
|
||||||
* Makefile: add a `distclean` target (#189, @stephenmathieson)
|
|
||||||
|
|
||||||
2.1.3 / 2015-03-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Updated stdout/stderr example (#186)
|
|
||||||
* Updated example/stdout.js to match debug current behaviour
|
|
||||||
* Renamed example/stderr.js to stdout.js
|
|
||||||
* Update Readme.md (#184)
|
|
||||||
* replace high intensity foreground color for bold (#182, #183)
|
|
||||||
|
|
||||||
2.1.2 / 2015-03-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* dist: recompile
|
|
||||||
* update "ms" to v0.7.0
|
|
||||||
* package: update "browserify" to v9.0.3
|
|
||||||
* component: fix "ms.js" repo location
|
|
||||||
* changed bower package name
|
|
||||||
* updated documentation about using debug in a browser
|
|
||||||
* fix: security error on safari (#167, #168, @yields)
|
|
||||||
|
|
||||||
2.1.1 / 2014-12-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* browser: use `typeof` to check for `console` existence
|
|
||||||
* browser: check for `console.log` truthiness (fix IE 8/9)
|
|
||||||
* browser: add support for Chrome apps
|
|
||||||
* Readme: added Windows usage remarks
|
|
||||||
* Add `bower.json` to properly support bower install
|
|
||||||
|
|
||||||
2.1.0 / 2014-10-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* node: implement `DEBUG_FD` env variable support
|
|
||||||
* package: update "browserify" to v6.1.0
|
|
||||||
* package: add "license" field to package.json (#135, @panuhorsmalahti)
|
|
||||||
|
|
||||||
2.0.0 / 2014-09-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* package: update "browserify" to v5.11.0
|
|
||||||
* node: use stderr rather than stdout for logging (#29, @stephenmathieson)
|
|
||||||
|
|
||||||
1.0.4 / 2014-07-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* dist: recompile
|
|
||||||
* example: remove `console.info()` log usage
|
|
||||||
* example: add "Content-Type" UTF-8 header to browser example
|
|
||||||
* browser: place %c marker after the space character
|
|
||||||
* browser: reset the "content" color via `color: inherit`
|
|
||||||
* browser: add colors support for Firefox >= v31
|
|
||||||
* debug: prefer an instance `log()` function over the global one (#119)
|
|
||||||
* Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
|
|
||||||
|
|
||||||
1.0.3 / 2014-07-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add support for multiple wildcards in namespaces (#122, @seegno)
|
|
||||||
* browser: fix lint
|
|
||||||
|
|
||||||
1.0.2 / 2014-06-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* browser: update color palette (#113, @gscottolson)
|
|
||||||
* common: make console logging function configurable (#108, @timoxley)
|
|
||||||
* node: fix %o colors on old node <= 0.8.x
|
|
||||||
* Makefile: find node path using shell/which (#109, @timoxley)
|
|
||||||
|
|
||||||
1.0.1 / 2014-06-06
|
|
||||||
==================
|
|
||||||
|
|
||||||
* browser: use `removeItem()` to clear localStorage
|
|
||||||
* browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
|
|
||||||
* package: add "contributors" section
|
|
||||||
* node: fix comment typo
|
|
||||||
* README: list authors
|
|
||||||
|
|
||||||
1.0.0 / 2014-06-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* make ms diff be global, not be scope
|
|
||||||
* debug: ignore empty strings in enable()
|
|
||||||
* node: make DEBUG_COLORS able to disable coloring
|
|
||||||
* *: export the `colors` array
|
|
||||||
* npmignore: don't publish the `dist` dir
|
|
||||||
* Makefile: refactor to use browserify
|
|
||||||
* package: add "browserify" as a dev dependency
|
|
||||||
* Readme: add Web Inspector Colors section
|
|
||||||
* node: reset terminal color for the debug content
|
|
||||||
* node: map "%o" to `util.inspect()`
|
|
||||||
* browser: map "%j" to `JSON.stringify()`
|
|
||||||
* debug: add custom "formatters"
|
|
||||||
* debug: use "ms" module for humanizing the diff
|
|
||||||
* Readme: add "bash" syntax highlighting
|
|
||||||
* browser: add Firebug color support
|
|
||||||
* browser: add colors for WebKit browsers
|
|
||||||
* node: apply log to `console`
|
|
||||||
* rewrite: abstract common logic for Node & browsers
|
|
||||||
* add .jshintrc file
|
|
||||||
|
|
||||||
0.8.1 / 2014-04-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* package: re-add the "component" section
|
|
||||||
|
|
||||||
0.8.0 / 2014-03-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `enable()` method for nodejs. Closes #27
|
|
||||||
* change from stderr to stdout
|
|
||||||
* remove unnecessary index.js file
|
|
||||||
|
|
||||||
0.7.4 / 2013-11-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* remove "browserify" key from package.json (fixes something in browserify)
|
|
||||||
|
|
||||||
0.7.3 / 2013-10-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix: catch localStorage security error when cookies are blocked (Chrome)
|
|
||||||
* add debug(err) support. Closes #46
|
|
||||||
* add .browser prop to package.json. Closes #42
|
|
||||||
|
|
||||||
0.7.2 / 2013-02-06
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix package.json
|
|
||||||
* fix: Mobile Safari (private mode) is broken with debug
|
|
||||||
* fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
|
|
||||||
|
|
||||||
0.7.1 / 2013-02-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add repository URL to package.json
|
|
||||||
* add DEBUG_COLORED to force colored output
|
|
||||||
* add browserify support
|
|
||||||
* fix component. Closes #24
|
|
||||||
|
|
||||||
0.7.0 / 2012-05-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added .component to package.json
|
|
||||||
* Added debug.component.js build
|
|
||||||
|
|
||||||
0.6.0 / 2012-03-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added support for "-" prefix in DEBUG [Vinay Pulim]
|
|
||||||
* Added `.enabled` flag to the node version [TooTallNate]
|
|
||||||
|
|
||||||
0.5.0 / 2012-02-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added: humanize diffs. Closes #8
|
|
||||||
* Added `debug.disable()` to the CS variant
|
|
||||||
* Removed padding. Closes #10
|
|
||||||
* Fixed: persist client-side variant again. Closes #9
|
|
||||||
|
|
||||||
0.4.0 / 2012-02-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added browser variant support for older browsers [TooTallNate]
|
|
||||||
* Added `debug.enable('project:*')` to browser variant [TooTallNate]
|
|
||||||
* Added padding to diff (moved it to the right)
|
|
||||||
|
|
||||||
0.3.0 / 2012-01-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added millisecond diff when isatty, otherwise UTC string
|
|
||||||
|
|
||||||
0.2.0 / 2012-01-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added wildcard support
|
|
||||||
|
|
||||||
0.1.0 / 2011-12-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Added: remove colors unless stderr isatty [TooTallNate]
|
|
||||||
|
|
||||||
0.0.1 / 2010-01-03
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Initial release
|
|
@ -1,19 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
||||||
and associated documentation files (the 'Software'), to deal in the Software without restriction,
|
|
||||||
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
||||||
portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
|
||||||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
|||||||
# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
|
|
||||||
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
|
|
||||||
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
|
|
||||||
|
|
||||||
# BIN directory
|
|
||||||
BIN := $(THIS_DIR)/node_modules/.bin
|
|
||||||
|
|
||||||
# Path
|
|
||||||
PATH := node_modules/.bin:$(PATH)
|
|
||||||
SHELL := /bin/bash
|
|
||||||
|
|
||||||
# applications
|
|
||||||
NODE ?= $(shell which node)
|
|
||||||
YARN ?= $(shell which yarn)
|
|
||||||
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
|
|
||||||
BROWSERIFY ?= $(NODE) $(BIN)/browserify
|
|
||||||
|
|
||||||
.FORCE:
|
|
||||||
|
|
||||||
install: node_modules
|
|
||||||
|
|
||||||
node_modules: package.json
|
|
||||||
@NODE_ENV= $(PKG) install
|
|
||||||
@touch node_modules
|
|
||||||
|
|
||||||
lint: .FORCE
|
|
||||||
eslint browser.js debug.js index.js node.js
|
|
||||||
|
|
||||||
test-node: .FORCE
|
|
||||||
istanbul cover node_modules/mocha/bin/_mocha -- test/**.js
|
|
||||||
|
|
||||||
test-browser: .FORCE
|
|
||||||
mkdir -p dist
|
|
||||||
|
|
||||||
@$(BROWSERIFY) \
|
|
||||||
--standalone debug \
|
|
||||||
. > dist/debug.js
|
|
||||||
|
|
||||||
karma start --single-run
|
|
||||||
rimraf dist
|
|
||||||
|
|
||||||
test: .FORCE
|
|
||||||
concurrently \
|
|
||||||
"make test-node" \
|
|
||||||
"make test-browser"
|
|
||||||
|
|
||||||
coveralls:
|
|
||||||
cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
|
|
||||||
|
|
||||||
.PHONY: all install clean distclean
|
|
@ -1,312 +0,0 @@
|
|||||||
# debug
|
|
||||||
[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)
|
|
||||||
[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
A tiny node.js debugging utility modelled after node core's debugging technique.
|
|
||||||
|
|
||||||
**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)**
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ npm install debug
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
|
|
||||||
|
|
||||||
Example _app.js_:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var debug = require('debug')('http')
|
|
||||||
, http = require('http')
|
|
||||||
, name = 'My App';
|
|
||||||
|
|
||||||
// fake app
|
|
||||||
|
|
||||||
debug('booting %s', name);
|
|
||||||
|
|
||||||
http.createServer(function(req, res){
|
|
||||||
debug(req.method + ' ' + req.url);
|
|
||||||
res.end('hello\n');
|
|
||||||
}).listen(3000, function(){
|
|
||||||
debug('listening');
|
|
||||||
});
|
|
||||||
|
|
||||||
// fake worker of some kind
|
|
||||||
|
|
||||||
require('./worker');
|
|
||||||
```
|
|
||||||
|
|
||||||
Example _worker.js_:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var debug = require('debug')('worker');
|
|
||||||
|
|
||||||
setInterval(function(){
|
|
||||||
debug('doing some work');
|
|
||||||
}, 1000);
|
|
||||||
```
|
|
||||||
|
|
||||||
The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
|
|
||||||
|
|
||||||
![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
|
|
||||||
|
|
||||||
![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
|
|
||||||
|
|
||||||
#### Windows note
|
|
||||||
|
|
||||||
On Windows the environment variable is set using the `set` command.
|
|
||||||
|
|
||||||
```cmd
|
|
||||||
set DEBUG=*,-not_this
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that PowerShell uses different syntax to set environment variables.
|
|
||||||
|
|
||||||
```cmd
|
|
||||||
$env:DEBUG = "*,-not_this"
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, run the program to be debugged as usual.
|
|
||||||
|
|
||||||
## Millisecond diff
|
|
||||||
|
|
||||||
When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
|
|
||||||
|
|
||||||
![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
|
|
||||||
|
|
||||||
When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
|
|
||||||
|
|
||||||
![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
|
|
||||||
|
|
||||||
## Conventions
|
|
||||||
|
|
||||||
If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
|
|
||||||
|
|
||||||
## Wildcards
|
|
||||||
|
|
||||||
The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
|
|
||||||
|
|
||||||
You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
|
|
||||||
|
|
||||||
## Environment Variables
|
|
||||||
|
|
||||||
When running through Node.js, you can set a few environment variables that will
|
|
||||||
change the behavior of the debug logging:
|
|
||||||
|
|
||||||
| Name | Purpose |
|
|
||||||
|-----------|-------------------------------------------------|
|
|
||||||
| `DEBUG` | Enables/disables specific debugging namespaces. |
|
|
||||||
| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
|
|
||||||
| `DEBUG_DEPTH` | Object inspection depth. |
|
|
||||||
| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
|
|
||||||
|
|
||||||
|
|
||||||
__Note:__ The environment variables beginning with `DEBUG_` end up being
|
|
||||||
converted into an Options object that gets used with `%o`/`%O` formatters.
|
|
||||||
See the Node.js documentation for
|
|
||||||
[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
|
|
||||||
for the complete list.
|
|
||||||
|
|
||||||
## Formatters
|
|
||||||
|
|
||||||
|
|
||||||
Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters:
|
|
||||||
|
|
||||||
| Formatter | Representation |
|
|
||||||
|-----------|----------------|
|
|
||||||
| `%O` | Pretty-print an Object on multiple lines. |
|
|
||||||
| `%o` | Pretty-print an Object all on a single line. |
|
|
||||||
| `%s` | String. |
|
|
||||||
| `%d` | Number (both integer and float). |
|
|
||||||
| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
|
|
||||||
| `%%` | Single percent sign ('%'). This does not consume an argument. |
|
|
||||||
|
|
||||||
### Custom formatters
|
|
||||||
|
|
||||||
You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like:
|
|
||||||
|
|
||||||
```js
|
|
||||||
const createDebug = require('debug')
|
|
||||||
createDebug.formatters.h = (v) => {
|
|
||||||
return v.toString('hex')
|
|
||||||
}
|
|
||||||
|
|
||||||
// …elsewhere
|
|
||||||
const debug = createDebug('foo')
|
|
||||||
debug('this is hex: %h', new Buffer('hello world'))
|
|
||||||
// foo this is hex: 68656c6c6f20776f726c6421 +0ms
|
|
||||||
```
|
|
||||||
|
|
||||||
## Browser support
|
|
||||||
You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
|
|
||||||
or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
|
|
||||||
if you don't want to build it yourself.
|
|
||||||
|
|
||||||
Debug's enable state is currently persisted by `localStorage`.
|
|
||||||
Consider the situation shown below where you have `worker:a` and `worker:b`,
|
|
||||||
and wish to debug both. You can enable this using `localStorage.debug`:
|
|
||||||
|
|
||||||
```js
|
|
||||||
localStorage.debug = 'worker:*'
|
|
||||||
```
|
|
||||||
|
|
||||||
And then refresh the page.
|
|
||||||
|
|
||||||
```js
|
|
||||||
a = debug('worker:a');
|
|
||||||
b = debug('worker:b');
|
|
||||||
|
|
||||||
setInterval(function(){
|
|
||||||
a('doing some work');
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
setInterval(function(){
|
|
||||||
b('doing some work');
|
|
||||||
}, 1200);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Web Inspector Colors
|
|
||||||
|
|
||||||
Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
|
|
||||||
option. These are WebKit web inspectors, Firefox ([since version
|
|
||||||
31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
|
|
||||||
and the Firebug plugin for Firefox (any version).
|
|
||||||
|
|
||||||
Colored output looks something like:
|
|
||||||
|
|
||||||
![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
|
|
||||||
|
|
||||||
|
|
||||||
## Output streams
|
|
||||||
|
|
||||||
By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
|
|
||||||
|
|
||||||
Example _stdout.js_:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var debug = require('debug');
|
|
||||||
var error = debug('app:error');
|
|
||||||
|
|
||||||
// by default stderr is used
|
|
||||||
error('goes to stderr!');
|
|
||||||
|
|
||||||
var log = debug('app:log');
|
|
||||||
// set this namespace to log via console.log
|
|
||||||
log.log = console.log.bind(console); // don't forget to bind to console!
|
|
||||||
log('goes to stdout');
|
|
||||||
error('still goes to stderr!');
|
|
||||||
|
|
||||||
// set all output to go via console.info
|
|
||||||
// overrides all per-namespace log settings
|
|
||||||
debug.log = console.info.bind(console);
|
|
||||||
error('now goes to stdout via console.info');
|
|
||||||
log('still goes to stdout, but via console.info now');
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Authors
|
|
||||||
|
|
||||||
- TJ Holowaychuk
|
|
||||||
- Nathan Rajlich
|
|
||||||
- Andrew Rhyne
|
|
||||||
|
|
||||||
## Backers
|
|
||||||
|
|
||||||
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
|
|
||||||
|
|
||||||
|
|
||||||
## Sponsors
|
|
||||||
|
|
||||||
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "debug",
|
|
||||||
"repo": "visionmedia/debug",
|
|
||||||
"description": "small debugging utility",
|
|
||||||
"version": "2.6.9",
|
|
||||||
"keywords": [
|
|
||||||
"debug",
|
|
||||||
"log",
|
|
||||||
"debugger"
|
|
||||||
],
|
|
||||||
"main": "src/browser.js",
|
|
||||||
"scripts": [
|
|
||||||
"src/browser.js",
|
|
||||||
"src/debug.js"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"rauchg/ms.js": "0.7.1"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
// 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 +0,0 @@
|
|||||||
module.exports = require('./src/node');
|
|
@ -1,52 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "debug",
|
|
||||||
"version": "2.6.9",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/visionmedia/debug.git"
|
|
||||||
},
|
|
||||||
"description": "small debugging utility",
|
|
||||||
"keywords": [
|
|
||||||
"debug",
|
|
||||||
"log",
|
|
||||||
"debugger"
|
|
||||||
],
|
|
||||||
"author": "TJ Holowaychuk <tj@vision-media.ca>",
|
|
||||||
"contributors": [
|
|
||||||
"Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
|
|
||||||
"Andrew Rhyne <rhyneandrew@gmail.com>"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"ms": "2.0.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"browserify": "9.0.3",
|
|
||||||
"chai": "^3.5.0",
|
|
||||||
"concurrently": "^3.1.0",
|
|
||||||
"coveralls": "^2.11.15",
|
|
||||||
"eslint": "^3.12.1",
|
|
||||||
"istanbul": "^0.4.5",
|
|
||||||
"karma": "^1.3.0",
|
|
||||||
"karma-chai": "^0.1.0",
|
|
||||||
"karma-mocha": "^1.3.0",
|
|
||||||
"karma-phantomjs-launcher": "^1.0.2",
|
|
||||||
"karma-sinon": "^1.0.5",
|
|
||||||
"mocha": "^3.2.0",
|
|
||||||
"mocha-lcov-reporter": "^1.2.0",
|
|
||||||
"rimraf": "^2.5.4",
|
|
||||||
"sinon": "^1.17.6",
|
|
||||||
"sinon-chai": "^2.8.0"
|
|
||||||
},
|
|
||||||
"main": "./src/index.js",
|
|
||||||
"browser": "./src/browser.js",
|
|
||||||
"component": {
|
|
||||||
"scripts": {
|
|
||||||
"debug/index.js": "browser.js",
|
|
||||||
"debug/debug.js": "debug.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "debug@2.6.9",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz"
|
|
||||||
}
|
|
@ -1,185 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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) {}
|
|
||||||
}
|
|
@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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/.store/body-parser@1.20.3/node_modules/debug/src/inspector-log.js
generated
vendored
15
node_modules/.store/body-parser@1.20.3/node_modules/debug/src/inspector-log.js
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
@ -1,248 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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());
|
|
@ -1,103 +0,0 @@
|
|||||||
2.0.0 / 2018-10-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Drop support for Node.js 0.6
|
|
||||||
* Replace internal `eval` usage with `Function` constructor
|
|
||||||
* Use instance methods on `process` to check for listeners
|
|
||||||
|
|
||||||
1.1.2 / 2018-01-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* perf: remove argument reassignment
|
|
||||||
* Support Node.js 0.6 to 9.x
|
|
||||||
|
|
||||||
1.1.1 / 2017-07-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Remove unnecessary `Buffer` loading
|
|
||||||
* Support Node.js 0.6 to 8.x
|
|
||||||
|
|
||||||
1.1.0 / 2015-09-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Enable strict mode in more places
|
|
||||||
* Support io.js 3.x
|
|
||||||
* Support io.js 2.x
|
|
||||||
* Support web browser loading
|
|
||||||
- Requires bundler like Browserify or webpack
|
|
||||||
|
|
||||||
1.0.1 / 2015-04-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix `TypeError`s when under `'use strict'` code
|
|
||||||
* Fix useless type name on auto-generated messages
|
|
||||||
* Support io.js 1.x
|
|
||||||
* Support Node.js 0.12
|
|
||||||
|
|
||||||
1.0.0 / 2014-09-17
|
|
||||||
==================
|
|
||||||
|
|
||||||
* No changes
|
|
||||||
|
|
||||||
0.4.5 / 2014-09-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Improve call speed to functions using the function wrapper
|
|
||||||
* Support Node.js 0.6
|
|
||||||
|
|
||||||
0.4.4 / 2014-07-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Work-around v8 generating empty stack traces
|
|
||||||
|
|
||||||
0.4.3 / 2014-07-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix exception when global `Error.stackTraceLimit` is too low
|
|
||||||
|
|
||||||
0.4.2 / 2014-07-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Correct call site for wrapped functions and properties
|
|
||||||
|
|
||||||
0.4.1 / 2014-07-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Improve automatic message generation for function properties
|
|
||||||
|
|
||||||
0.4.0 / 2014-07-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `TRACE_DEPRECATION` environment variable
|
|
||||||
* Remove non-standard grey color from color output
|
|
||||||
* Support `--no-deprecation` argument
|
|
||||||
* Support `--trace-deprecation` argument
|
|
||||||
* Support `deprecate.property(fn, prop, message)`
|
|
||||||
|
|
||||||
0.3.0 / 2014-06-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `NO_DEPRECATION` environment variable
|
|
||||||
|
|
||||||
0.2.0 / 2014-06-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `deprecate.property(obj, prop, message)`
|
|
||||||
* Remove `supports-color` dependency for node.js 0.8
|
|
||||||
|
|
||||||
0.1.0 / 2014-06-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `deprecate.function(fn, message)`
|
|
||||||
* Add `process.on('deprecation', fn)` emitter
|
|
||||||
* Automatically generate message when omitted from `deprecate()`
|
|
||||||
|
|
||||||
0.0.1 / 2014-06-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix warning for dynamic calls at singe call site
|
|
||||||
|
|
||||||
0.0.0 / 2014-06-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Initial implementation
|
|
@ -1,22 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014-2018 Douglas Christopher Wilson
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,280 +0,0 @@
|
|||||||
# depd
|
|
||||||
|
|
||||||
[![NPM Version][npm-version-image]][npm-url]
|
|
||||||
[![NPM Downloads][npm-downloads-image]][npm-url]
|
|
||||||
[![Node.js Version][node-image]][node-url]
|
|
||||||
[![Linux Build][travis-image]][travis-url]
|
|
||||||
[![Windows Build][appveyor-image]][appveyor-url]
|
|
||||||
[![Coverage Status][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
Deprecate all the things
|
|
||||||
|
|
||||||
> With great modules comes great responsibility; mark things deprecated!
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
This module is installed directly using `npm`:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install depd
|
|
||||||
```
|
|
||||||
|
|
||||||
This module can also be bundled with systems like
|
|
||||||
[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/),
|
|
||||||
though by default this module will alter it's API to no longer display or
|
|
||||||
track deprecations.
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
<!-- eslint-disable no-unused-vars -->
|
|
||||||
|
|
||||||
```js
|
|
||||||
var deprecate = require('depd')('my-module')
|
|
||||||
```
|
|
||||||
|
|
||||||
This library allows you to display deprecation messages to your users.
|
|
||||||
This library goes above and beyond with deprecation warnings by
|
|
||||||
introspection of the call stack (but only the bits that it is interested
|
|
||||||
in).
|
|
||||||
|
|
||||||
Instead of just warning on the first invocation of a deprecated
|
|
||||||
function and never again, this module will warn on the first invocation
|
|
||||||
of a deprecated function per unique call site, making it ideal to alert
|
|
||||||
users of all deprecated uses across the code base, rather than just
|
|
||||||
whatever happens to execute first.
|
|
||||||
|
|
||||||
The deprecation warnings from this module also include the file and line
|
|
||||||
information for the call into the module that the deprecated function was
|
|
||||||
in.
|
|
||||||
|
|
||||||
**NOTE** this library has a similar interface to the `debug` module, and
|
|
||||||
this module uses the calling file to get the boundary for the call stacks,
|
|
||||||
so you should always create a new `deprecate` object in each file and not
|
|
||||||
within some central file.
|
|
||||||
|
|
||||||
### depd(namespace)
|
|
||||||
|
|
||||||
Create a new deprecate function that uses the given namespace name in the
|
|
||||||
messages and will display the call site prior to the stack entering the
|
|
||||||
file this function was called from. It is highly suggested you use the
|
|
||||||
name of your module as the namespace.
|
|
||||||
|
|
||||||
### deprecate(message)
|
|
||||||
|
|
||||||
Call this function from deprecated code to display a deprecation message.
|
|
||||||
This message will appear once per unique caller site. Caller site is the
|
|
||||||
first call site in the stack in a different file from the caller of this
|
|
||||||
function.
|
|
||||||
|
|
||||||
If the message is omitted, a message is generated for you based on the site
|
|
||||||
of the `deprecate()` call and will display the name of the function called,
|
|
||||||
similar to the name displayed in a stack trace.
|
|
||||||
|
|
||||||
### deprecate.function(fn, message)
|
|
||||||
|
|
||||||
Call this function to wrap a given function in a deprecation message on any
|
|
||||||
call to the function. An optional message can be supplied to provide a custom
|
|
||||||
message.
|
|
||||||
|
|
||||||
### deprecate.property(obj, prop, message)
|
|
||||||
|
|
||||||
Call this function to wrap a given property on object in a deprecation message
|
|
||||||
on any accessing or setting of the property. An optional message can be supplied
|
|
||||||
to provide a custom message.
|
|
||||||
|
|
||||||
The method must be called on the object where the property belongs (not
|
|
||||||
inherited from the prototype).
|
|
||||||
|
|
||||||
If the property is a data descriptor, it will be converted to an accessor
|
|
||||||
descriptor in order to display the deprecation message.
|
|
||||||
|
|
||||||
### process.on('deprecation', fn)
|
|
||||||
|
|
||||||
This module will allow easy capturing of deprecation errors by emitting the
|
|
||||||
errors as the type "deprecation" on the global `process`. If there are no
|
|
||||||
listeners for this type, the errors are written to STDERR as normal, but if
|
|
||||||
there are any listeners, nothing will be written to STDERR and instead only
|
|
||||||
emitted. From there, you can write the errors in a different format or to a
|
|
||||||
logging source.
|
|
||||||
|
|
||||||
The error represents the deprecation and is emitted only once with the same
|
|
||||||
rules as writing to STDERR. The error has the following properties:
|
|
||||||
|
|
||||||
- `message` - This is the message given by the library
|
|
||||||
- `name` - This is always `'DeprecationError'`
|
|
||||||
- `namespace` - This is the namespace the deprecation came from
|
|
||||||
- `stack` - This is the stack of the call to the deprecated thing
|
|
||||||
|
|
||||||
Example `error.stack` output:
|
|
||||||
|
|
||||||
```
|
|
||||||
DeprecationError: my-cool-module deprecated oldfunction
|
|
||||||
at Object.<anonymous> ([eval]-wrapper:6:22)
|
|
||||||
at Module._compile (module.js:456:26)
|
|
||||||
at evalScript (node.js:532:25)
|
|
||||||
at startup (node.js:80:7)
|
|
||||||
at node.js:902:3
|
|
||||||
```
|
|
||||||
|
|
||||||
### process.env.NO_DEPRECATION
|
|
||||||
|
|
||||||
As a user of modules that are deprecated, the environment variable `NO_DEPRECATION`
|
|
||||||
is provided as a quick solution to silencing deprecation warnings from being
|
|
||||||
output. The format of this is similar to that of `DEBUG`:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ NO_DEPRECATION=my-module,othermod node app.js
|
|
||||||
```
|
|
||||||
|
|
||||||
This will suppress deprecations from being output for "my-module" and "othermod".
|
|
||||||
The value is a list of comma-separated namespaces. To suppress every warning
|
|
||||||
across all namespaces, use the value `*` for a namespace.
|
|
||||||
|
|
||||||
Providing the argument `--no-deprecation` to the `node` executable will suppress
|
|
||||||
all deprecations (only available in Node.js 0.8 or higher).
|
|
||||||
|
|
||||||
**NOTE** This will not suppress the deperecations given to any "deprecation"
|
|
||||||
event listeners, just the output to STDERR.
|
|
||||||
|
|
||||||
### process.env.TRACE_DEPRECATION
|
|
||||||
|
|
||||||
As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION`
|
|
||||||
is provided as a solution to getting more detailed location information in deprecation
|
|
||||||
warnings by including the entire stack trace. The format of this is the same as
|
|
||||||
`NO_DEPRECATION`:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ TRACE_DEPRECATION=my-module,othermod node app.js
|
|
||||||
```
|
|
||||||
|
|
||||||
This will include stack traces for deprecations being output for "my-module" and
|
|
||||||
"othermod". The value is a list of comma-separated namespaces. To trace every
|
|
||||||
warning across all namespaces, use the value `*` for a namespace.
|
|
||||||
|
|
||||||
Providing the argument `--trace-deprecation` to the `node` executable will trace
|
|
||||||
all deprecations (only available in Node.js 0.8 or higher).
|
|
||||||
|
|
||||||
**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`.
|
|
||||||
|
|
||||||
## Display
|
|
||||||
|
|
||||||
![message](files/message.png)
|
|
||||||
|
|
||||||
When a user calls a function in your library that you mark deprecated, they
|
|
||||||
will see the following written to STDERR (in the given colors, similar colors
|
|
||||||
and layout to the `debug` module):
|
|
||||||
|
|
||||||
```
|
|
||||||
bright cyan bright yellow
|
|
||||||
| | reset cyan
|
|
||||||
| | | |
|
|
||||||
▼ ▼ ▼ ▼
|
|
||||||
my-cool-module deprecated oldfunction [eval]-wrapper:6:22
|
|
||||||
▲ ▲ ▲ ▲
|
|
||||||
| | | |
|
|
||||||
namespace | | location of mycoolmod.oldfunction() call
|
|
||||||
| deprecation message
|
|
||||||
the word "deprecated"
|
|
||||||
```
|
|
||||||
|
|
||||||
If the user redirects their STDERR to a file or somewhere that does not support
|
|
||||||
colors, they see (similar layout to the `debug` module):
|
|
||||||
|
|
||||||
```
|
|
||||||
Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22
|
|
||||||
▲ ▲ ▲ ▲ ▲
|
|
||||||
| | | | |
|
|
||||||
timestamp of message namespace | | location of mycoolmod.oldfunction() call
|
|
||||||
| deprecation message
|
|
||||||
the word "deprecated"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Deprecating all calls to a function
|
|
||||||
|
|
||||||
This will display a deprecated message about "oldfunction" being deprecated
|
|
||||||
from "my-module" on STDERR.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var deprecate = require('depd')('my-cool-module')
|
|
||||||
|
|
||||||
// message automatically derived from function name
|
|
||||||
// Object.oldfunction
|
|
||||||
exports.oldfunction = deprecate.function(function oldfunction () {
|
|
||||||
// all calls to function are deprecated
|
|
||||||
})
|
|
||||||
|
|
||||||
// specific message
|
|
||||||
exports.oldfunction = deprecate.function(function () {
|
|
||||||
// all calls to function are deprecated
|
|
||||||
}, 'oldfunction')
|
|
||||||
```
|
|
||||||
|
|
||||||
### Conditionally deprecating a function call
|
|
||||||
|
|
||||||
This will display a deprecated message about "weirdfunction" being deprecated
|
|
||||||
from "my-module" on STDERR when called with less than 2 arguments.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var deprecate = require('depd')('my-cool-module')
|
|
||||||
|
|
||||||
exports.weirdfunction = function () {
|
|
||||||
if (arguments.length < 2) {
|
|
||||||
// calls with 0 or 1 args are deprecated
|
|
||||||
deprecate('weirdfunction args < 2')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
When calling `deprecate` as a function, the warning is counted per call site
|
|
||||||
within your own module, so you can display different deprecations depending
|
|
||||||
on different situations and the users will still get all the warnings:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var deprecate = require('depd')('my-cool-module')
|
|
||||||
|
|
||||||
exports.weirdfunction = function () {
|
|
||||||
if (arguments.length < 2) {
|
|
||||||
// calls with 0 or 1 args are deprecated
|
|
||||||
deprecate('weirdfunction args < 2')
|
|
||||||
} else if (typeof arguments[0] !== 'string') {
|
|
||||||
// calls with non-string first argument are deprecated
|
|
||||||
deprecate('weirdfunction non-string first arg')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Deprecating property access
|
|
||||||
|
|
||||||
This will display a deprecated message about "oldprop" being deprecated
|
|
||||||
from "my-module" on STDERR when accessed. A deprecation will be displayed
|
|
||||||
when setting the value and when getting the value.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var deprecate = require('depd')('my-cool-module')
|
|
||||||
|
|
||||||
exports.oldprop = 'something'
|
|
||||||
|
|
||||||
// message automatically derives from property name
|
|
||||||
deprecate.property(exports, 'oldprop')
|
|
||||||
|
|
||||||
// explicit message
|
|
||||||
deprecate.property(exports, 'oldprop', 'oldprop >= 0.10')
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/nodejs-depd/master?label=windows
|
|
||||||
[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/dougwilson/nodejs-depd/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master
|
|
||||||
[node-image]: https://badgen.net/npm/node/depd
|
|
||||||
[node-url]: https://nodejs.org/en/download/
|
|
||||||
[npm-downloads-image]: https://badgen.net/npm/dm/depd
|
|
||||||
[npm-url]: https://npmjs.org/package/depd
|
|
||||||
[npm-version-image]: https://badgen.net/npm/v/depd
|
|
||||||
[travis-image]: https://badgen.net/travis/dougwilson/nodejs-depd/master?label=linux
|
|
||||||
[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd
|
|
@ -1,538 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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')
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "depd",
|
|
||||||
"description": "Deprecate all the things",
|
|
||||||
"version": "2.0.0",
|
|
||||||
"author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"deprecate",
|
|
||||||
"deprecated"
|
|
||||||
],
|
|
||||||
"repository": "dougwilson/nodejs-depd",
|
|
||||||
"browser": "lib/browser/index.js",
|
|
||||||
"devDependencies": {
|
|
||||||
"benchmark": "2.1.4",
|
|
||||||
"beautify-benchmark": "0.2.4",
|
|
||||||
"eslint": "5.7.0",
|
|
||||||
"eslint-config-standard": "12.0.0",
|
|
||||||
"eslint-plugin-import": "2.14.0",
|
|
||||||
"eslint-plugin-markdown": "1.0.0-beta.7",
|
|
||||||
"eslint-plugin-node": "7.0.1",
|
|
||||||
"eslint-plugin-promise": "4.0.1",
|
|
||||||
"eslint-plugin-standard": "4.0.0",
|
|
||||||
"istanbul": "0.4.5",
|
|
||||||
"mocha": "5.2.0",
|
|
||||||
"safe-buffer": "5.1.2",
|
|
||||||
"uid-safe": "2.1.5"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"lib/",
|
|
||||||
"History.md",
|
|
||||||
"LICENSE",
|
|
||||||
"index.js",
|
|
||||||
"Readme.md"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"bench": "node benchmark/index.js",
|
|
||||||
"lint": "eslint --plugin markdown --ext js,md .",
|
|
||||||
"test": "mocha --reporter spec --bail test/",
|
|
||||||
"test-ci": "istanbul cover --print=none node_modules/mocha/bin/_mocha -- --reporter spec test/ && istanbul report lcovonly text-summary",
|
|
||||||
"test-cov": "istanbul cover --print=none node_modules/mocha/bin/_mocha -- --reporter dot test/ && istanbul report lcov text-summary"
|
|
||||||
},
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "depd@2.0.0",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz"
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jonathan Ong me@jongleberry.com
|
|
||||||
Copyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
@ -1,63 +0,0 @@
|
|||||||
# destroy
|
|
||||||
|
|
||||||
[![NPM version][npm-image]][npm-url]
|
|
||||||
[![Build Status][github-actions-ci-image]][github-actions-ci-url]
|
|
||||||
[![Test coverage][coveralls-image]][coveralls-url]
|
|
||||||
[![License][license-image]][license-url]
|
|
||||||
[![Downloads][downloads-image]][downloads-url]
|
|
||||||
|
|
||||||
Destroy a stream.
|
|
||||||
|
|
||||||
This module is meant to ensure a stream gets destroyed, handling different APIs
|
|
||||||
and Node.js bugs.
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```js
|
|
||||||
var destroy = require('destroy')
|
|
||||||
```
|
|
||||||
|
|
||||||
### destroy(stream [, suppress])
|
|
||||||
|
|
||||||
Destroy the given stream, and optionally suppress any future `error` events.
|
|
||||||
|
|
||||||
In most cases, this is identical to a simple `stream.destroy()` call. The rules
|
|
||||||
are as follows for a given stream:
|
|
||||||
|
|
||||||
1. If the `stream` is an instance of `ReadStream`, then call `stream.destroy()`
|
|
||||||
and add a listener to the `open` event to call `stream.close()` if it is
|
|
||||||
fired. This is for a Node.js bug that will leak a file descriptor if
|
|
||||||
`.destroy()` is called before `open`.
|
|
||||||
2. If the `stream` is an instance of a zlib stream, then call `stream.destroy()`
|
|
||||||
and close the underlying zlib handle if open, otherwise call `stream.close()`.
|
|
||||||
This is for consistency across Node.js versions and a Node.js bug that will
|
|
||||||
leak a native zlib handle.
|
|
||||||
3. If the `stream` is not an instance of `Stream`, then nothing happens.
|
|
||||||
4. If the `stream` has a `.destroy()` method, then call it.
|
|
||||||
|
|
||||||
The function returns the `stream` passed in as the argument.
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var destroy = require('destroy')
|
|
||||||
|
|
||||||
var fs = require('fs')
|
|
||||||
var stream = fs.createReadStream('package.json')
|
|
||||||
|
|
||||||
// ... and later
|
|
||||||
destroy(stream)
|
|
||||||
```
|
|
||||||
|
|
||||||
[npm-image]: https://img.shields.io/npm/v/destroy.svg?style=flat-square
|
|
||||||
[npm-url]: https://npmjs.org/package/destroy
|
|
||||||
[github-tag]: http://img.shields.io/github/tag/stream-utils/destroy.svg?style=flat-square
|
|
||||||
[github-url]: https://github.com/stream-utils/destroy/tags
|
|
||||||
[coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square
|
|
||||||
[coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master
|
|
||||||
[license-image]: http://img.shields.io/npm/l/destroy.svg?style=flat-square
|
|
||||||
[license-url]: LICENSE.md
|
|
||||||
[downloads-image]: http://img.shields.io/npm/dm/destroy.svg?style=flat-square
|
|
||||||
[downloads-url]: https://npmjs.org/package/destroy
|
|
||||||
[github-actions-ci-image]: https://img.shields.io/github/workflow/status/stream-utils/destroy/ci/master?label=ci&style=flat-square
|
|
||||||
[github-actions-ci-url]: https://github.com/stream-utils/destroy/actions/workflows/ci.yml
|
|
@ -1,209 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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()
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "destroy",
|
|
||||||
"description": "destroy a stream if possible",
|
|
||||||
"version": "1.2.0",
|
|
||||||
"author": {
|
|
||||||
"name": "Jonathan Ong",
|
|
||||||
"email": "me@jongleberry.com",
|
|
||||||
"url": "http://jongleberry.com",
|
|
||||||
"twitter": "https://twitter.com/jongleberry"
|
|
||||||
},
|
|
||||||
"contributors": [
|
|
||||||
"Douglas Christopher Wilson <doug@somethingdoug.com>"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "stream-utils/destroy",
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "7.32.0",
|
|
||||||
"eslint-config-standard": "14.1.1",
|
|
||||||
"eslint-plugin-import": "2.25.4",
|
|
||||||
"eslint-plugin-node": "11.1.0",
|
|
||||||
"eslint-plugin-promise": "5.2.0",
|
|
||||||
"eslint-plugin-standard": "4.1.0",
|
|
||||||
"mocha": "9.2.2",
|
|
||||||
"nyc": "15.1.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8",
|
|
||||||
"npm": "1.2.8000 || >= 1.4.16"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint .",
|
|
||||||
"test": "mocha --reporter spec",
|
|
||||||
"test-ci": "nyc --reporter=lcovonly --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"index.js",
|
|
||||||
"LICENSE"
|
|
||||||
],
|
|
||||||
"keywords": [
|
|
||||||
"stream",
|
|
||||||
"streams",
|
|
||||||
"destroy",
|
|
||||||
"cleanup",
|
|
||||||
"leak",
|
|
||||||
"fd"
|
|
||||||
],
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "destroy@1.2.0",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz"
|
|
||||||
}
|
|
@ -1,180 +0,0 @@
|
|||||||
2.0.0 / 2021-12-17
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Drop support for Node.js 0.6
|
|
||||||
* Remove `I'mateapot` export; use `ImATeapot` instead
|
|
||||||
* Remove support for status being non-first argument
|
|
||||||
* Rename `UnorderedCollection` constructor to `TooEarly`
|
|
||||||
* deps: depd@2.0.0
|
|
||||||
- Replace internal `eval` usage with `Function` constructor
|
|
||||||
- Use instance methods on `process` to check for listeners
|
|
||||||
* deps: statuses@2.0.1
|
|
||||||
- Fix messaging casing of `418 I'm a Teapot`
|
|
||||||
- Remove code 306
|
|
||||||
- Rename `425 Unordered Collection` to standard `425 Too Early`
|
|
||||||
|
|
||||||
2021-11-14 / 1.8.1
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: toidentifier@1.0.1
|
|
||||||
|
|
||||||
2020-06-29 / 1.8.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `isHttpError` export to determine if value is an HTTP error
|
|
||||||
* deps: setprototypeof@1.2.0
|
|
||||||
|
|
||||||
2019-06-24 / 1.7.3
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: inherits@2.0.4
|
|
||||||
|
|
||||||
2019-02-18 / 1.7.2
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: setprototypeof@1.1.1
|
|
||||||
|
|
||||||
2018-09-08 / 1.7.1
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix error creating objects in some environments
|
|
||||||
|
|
||||||
2018-07-30 / 1.7.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Set constructor name when possible
|
|
||||||
* Use `toidentifier` module to make class names
|
|
||||||
* deps: statuses@'>= 1.5.0 < 2'
|
|
||||||
|
|
||||||
2018-03-29 / 1.6.3
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@~1.1.2
|
|
||||||
- perf: remove argument reassignment
|
|
||||||
* deps: setprototypeof@1.1.0
|
|
||||||
* deps: statuses@'>= 1.4.0 < 2'
|
|
||||||
|
|
||||||
2017-08-04 / 1.6.2
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@1.1.1
|
|
||||||
- Remove unnecessary `Buffer` loading
|
|
||||||
|
|
||||||
2017-02-20 / 1.6.1
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: setprototypeof@1.0.3
|
|
||||||
- Fix shim for old browsers
|
|
||||||
|
|
||||||
2017-02-14 / 1.6.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Accept custom 4xx and 5xx status codes in factory
|
|
||||||
* Add deprecation message to `"I'mateapot"` export
|
|
||||||
* Deprecate passing status code as anything except first argument in factory
|
|
||||||
* Deprecate using non-error status codes
|
|
||||||
* Make `message` property enumerable for `HttpError`s
|
|
||||||
|
|
||||||
2016-11-16 / 1.5.1
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: inherits@2.0.3
|
|
||||||
- Fix issue loading in browser
|
|
||||||
* deps: setprototypeof@1.0.2
|
|
||||||
* deps: statuses@'>= 1.3.1 < 2'
|
|
||||||
|
|
||||||
2016-05-18 / 1.5.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Support new code `421 Misdirected Request`
|
|
||||||
* Use `setprototypeof` module to replace `__proto__` setting
|
|
||||||
* deps: statuses@'>= 1.3.0 < 2'
|
|
||||||
- Add `421 Misdirected Request`
|
|
||||||
- perf: enable strict mode
|
|
||||||
* perf: enable strict mode
|
|
||||||
|
|
||||||
2016-01-28 / 1.4.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `HttpError` export, for `err instanceof createError.HttpError`
|
|
||||||
* deps: inherits@2.0.1
|
|
||||||
* deps: statuses@'>= 1.2.1 < 2'
|
|
||||||
- Fix message for status 451
|
|
||||||
- Remove incorrect nginx status code
|
|
||||||
|
|
||||||
2015-02-02 / 1.3.1
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix regression where status can be overwritten in `createError` `props`
|
|
||||||
|
|
||||||
2015-02-01 / 1.3.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Construct errors using defined constructors from `createError`
|
|
||||||
* Fix error names that are not identifiers
|
|
||||||
- `createError["I'mateapot"]` is now `createError.ImATeapot`
|
|
||||||
* Set a meaningful `name` property on constructed errors
|
|
||||||
|
|
||||||
2014-12-09 / 1.2.8
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix stack trace from exported function
|
|
||||||
* Remove `arguments.callee` usage
|
|
||||||
|
|
||||||
2014-10-14 / 1.2.7
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Remove duplicate line
|
|
||||||
|
|
||||||
2014-10-02 / 1.2.6
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix `expose` to be `true` for `ClientError` constructor
|
|
||||||
|
|
||||||
2014-09-28 / 1.2.5
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: statuses@1
|
|
||||||
|
|
||||||
2014-09-21 / 1.2.4
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix dependency version to work with old `npm`s
|
|
||||||
|
|
||||||
2014-09-21 / 1.2.3
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: statuses@~1.1.0
|
|
||||||
|
|
||||||
2014-09-21 / 1.2.2
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix publish error
|
|
||||||
|
|
||||||
2014-09-21 / 1.2.1
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Support Node.js 0.6
|
|
||||||
* Use `inherits` instead of `util`
|
|
||||||
|
|
||||||
2014-09-09 / 1.2.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix the way inheriting functions
|
|
||||||
* Support `expose` being provided in properties argument
|
|
||||||
|
|
||||||
2014-09-08 / 1.1.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Default status to 500
|
|
||||||
* Support provided `error` to extend
|
|
||||||
|
|
||||||
2014-09-08 / 1.0.1
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix accepting string message
|
|
||||||
|
|
||||||
2014-09-08 / 1.0.0
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Initial release
|
|
@ -1,23 +0,0 @@
|
|||||||
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jonathan Ong me@jongleberry.com
|
|
||||||
Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
@ -1,169 +0,0 @@
|
|||||||
# http-errors
|
|
||||||
|
|
||||||
[![NPM Version][npm-version-image]][npm-url]
|
|
||||||
[![NPM Downloads][npm-downloads-image]][node-url]
|
|
||||||
[![Node.js Version][node-image]][node-url]
|
|
||||||
[![Build Status][ci-image]][ci-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
Create HTTP errors for Express, Koa, Connect, etc. with ease.
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
This is a [Node.js](https://nodejs.org/en/) module available through the
|
|
||||||
[npm registry](https://www.npmjs.com/). Installation is done using the
|
|
||||||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ npm install http-errors
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var createError = require('http-errors')
|
|
||||||
var express = require('express')
|
|
||||||
var app = express()
|
|
||||||
|
|
||||||
app.use(function (req, res, next) {
|
|
||||||
if (!req.user) return next(createError(401, 'Please login to view this page.'))
|
|
||||||
next()
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
This is the current API, currently extracted from Koa and subject to change.
|
|
||||||
|
|
||||||
### Error Properties
|
|
||||||
|
|
||||||
- `expose` - can be used to signal if `message` should be sent to the client,
|
|
||||||
defaulting to `false` when `status` >= 500
|
|
||||||
- `headers` - can be an object of header names to values to be sent to the
|
|
||||||
client, defaulting to `undefined`. When defined, the key names should all
|
|
||||||
be lower-cased
|
|
||||||
- `message` - the traditional error message, which should be kept short and all
|
|
||||||
single line
|
|
||||||
- `status` - the status code of the error, mirroring `statusCode` for general
|
|
||||||
compatibility
|
|
||||||
- `statusCode` - the status code of the error, defaulting to `500`
|
|
||||||
|
|
||||||
### createError([status], [message], [properties])
|
|
||||||
|
|
||||||
Create a new error object with the given message `msg`.
|
|
||||||
The error object inherits from `createError.HttpError`.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var err = createError(404, 'This video does not exist!')
|
|
||||||
```
|
|
||||||
|
|
||||||
- `status: 500` - the status code as a number
|
|
||||||
- `message` - the message of the error, defaulting to node's text for that status code.
|
|
||||||
- `properties` - custom properties to attach to the object
|
|
||||||
|
|
||||||
### createError([status], [error], [properties])
|
|
||||||
|
|
||||||
Extend the given `error` object with `createError.HttpError`
|
|
||||||
properties. This will not alter the inheritance of the given
|
|
||||||
`error` object, and the modified `error` object is the
|
|
||||||
return value.
|
|
||||||
|
|
||||||
<!-- eslint-disable no-redeclare -->
|
|
||||||
|
|
||||||
```js
|
|
||||||
fs.readFile('foo.txt', function (err, buf) {
|
|
||||||
if (err) {
|
|
||||||
if (err.code === 'ENOENT') {
|
|
||||||
var httpError = createError(404, err, { expose: false })
|
|
||||||
} else {
|
|
||||||
var httpError = createError(500, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
- `status` - the status code as a number
|
|
||||||
- `error` - the error object to extend
|
|
||||||
- `properties` - custom properties to attach to the object
|
|
||||||
|
|
||||||
### createError.isHttpError(val)
|
|
||||||
|
|
||||||
Determine if the provided `val` is an `HttpError`. This will return `true`
|
|
||||||
if the error inherits from the `HttpError` constructor of this module or
|
|
||||||
matches the "duck type" for an error this module creates. All outputs from
|
|
||||||
the `createError` factory will return `true` for this function, including
|
|
||||||
if an non-`HttpError` was passed into the factory.
|
|
||||||
|
|
||||||
### new createError\[code || name\](\[msg]\))
|
|
||||||
|
|
||||||
Create a new error object with the given message `msg`.
|
|
||||||
The error object inherits from `createError.HttpError`.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var err = new createError.NotFound()
|
|
||||||
```
|
|
||||||
|
|
||||||
- `code` - the status code as a number
|
|
||||||
- `name` - the name of the error as a "bumpy case", i.e. `NotFound` or `InternalServerError`.
|
|
||||||
|
|
||||||
#### List of all constructors
|
|
||||||
|
|
||||||
|Status Code|Constructor Name |
|
|
||||||
|-----------|-----------------------------|
|
|
||||||
|400 |BadRequest |
|
|
||||||
|401 |Unauthorized |
|
|
||||||
|402 |PaymentRequired |
|
|
||||||
|403 |Forbidden |
|
|
||||||
|404 |NotFound |
|
|
||||||
|405 |MethodNotAllowed |
|
|
||||||
|406 |NotAcceptable |
|
|
||||||
|407 |ProxyAuthenticationRequired |
|
|
||||||
|408 |RequestTimeout |
|
|
||||||
|409 |Conflict |
|
|
||||||
|410 |Gone |
|
|
||||||
|411 |LengthRequired |
|
|
||||||
|412 |PreconditionFailed |
|
|
||||||
|413 |PayloadTooLarge |
|
|
||||||
|414 |URITooLong |
|
|
||||||
|415 |UnsupportedMediaType |
|
|
||||||
|416 |RangeNotSatisfiable |
|
|
||||||
|417 |ExpectationFailed |
|
|
||||||
|418 |ImATeapot |
|
|
||||||
|421 |MisdirectedRequest |
|
|
||||||
|422 |UnprocessableEntity |
|
|
||||||
|423 |Locked |
|
|
||||||
|424 |FailedDependency |
|
|
||||||
|425 |TooEarly |
|
|
||||||
|426 |UpgradeRequired |
|
|
||||||
|428 |PreconditionRequired |
|
|
||||||
|429 |TooManyRequests |
|
|
||||||
|431 |RequestHeaderFieldsTooLarge |
|
|
||||||
|451 |UnavailableForLegalReasons |
|
|
||||||
|500 |InternalServerError |
|
|
||||||
|501 |NotImplemented |
|
|
||||||
|502 |BadGateway |
|
|
||||||
|503 |ServiceUnavailable |
|
|
||||||
|504 |GatewayTimeout |
|
|
||||||
|505 |HTTPVersionNotSupported |
|
|
||||||
|506 |VariantAlsoNegotiates |
|
|
||||||
|507 |InsufficientStorage |
|
|
||||||
|508 |LoopDetected |
|
|
||||||
|509 |BandwidthLimitExceeded |
|
|
||||||
|510 |NotExtended |
|
|
||||||
|511 |NetworkAuthenticationRequired|
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[ci-image]: https://badgen.net/github/checks/jshttp/http-errors/master?label=ci
|
|
||||||
[ci-url]: https://github.com/jshttp/http-errors/actions?query=workflow%3Aci
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/http-errors/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/jshttp/http-errors?branch=master
|
|
||||||
[node-image]: https://badgen.net/npm/node/http-errors
|
|
||||||
[node-url]: https://nodejs.org/en/download
|
|
||||||
[npm-downloads-image]: https://badgen.net/npm/dm/http-errors
|
|
||||||
[npm-url]: https://npmjs.org/package/http-errors
|
|
||||||
[npm-version-image]: https://badgen.net/npm/v/http-errors
|
|
||||||
[travis-image]: https://badgen.net/travis/jshttp/http-errors/master
|
|
||||||
[travis-url]: https://travis-ci.org/jshttp/http-errors
|
|
@ -1,289 +0,0 @@
|
|||||||
/*!
|
|
||||||
* 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
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "http-errors",
|
|
||||||
"description": "Create HTTP error objects",
|
|
||||||
"version": "2.0.0",
|
|
||||||
"author": "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",
|
|
||||||
"contributors": [
|
|
||||||
"Alan Plum <me@pluma.io>",
|
|
||||||
"Douglas Christopher Wilson <doug@somethingdoug.com>"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "jshttp/http-errors",
|
|
||||||
"dependencies": {
|
|
||||||
"depd": "2.0.0",
|
|
||||||
"inherits": "2.0.4",
|
|
||||||
"setprototypeof": "1.2.0",
|
|
||||||
"statuses": "2.0.1",
|
|
||||||
"toidentifier": "1.0.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "7.32.0",
|
|
||||||
"eslint-config-standard": "14.1.1",
|
|
||||||
"eslint-plugin-import": "2.25.3",
|
|
||||||
"eslint-plugin-markdown": "2.2.1",
|
|
||||||
"eslint-plugin-node": "11.1.0",
|
|
||||||
"eslint-plugin-promise": "5.2.0",
|
|
||||||
"eslint-plugin-standard": "4.1.0",
|
|
||||||
"mocha": "9.1.3",
|
|
||||||
"nyc": "15.1.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint . && node ./scripts/lint-readme-list.js",
|
|
||||||
"test": "mocha --reporter spec --bail",
|
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test",
|
|
||||||
"version": "node scripts/version-history.js && git add HISTORY.md"
|
|
||||||
},
|
|
||||||
"keywords": [
|
|
||||||
"http",
|
|
||||||
"error"
|
|
||||||
],
|
|
||||||
"files": [
|
|
||||||
"index.js",
|
|
||||||
"HISTORY.md",
|
|
||||||
"LICENSE",
|
|
||||||
"README.md"
|
|
||||||
],
|
|
||||||
"__npminstall_done": true,
|
|
||||||
"_from": "http-errors@2.0.0",
|
|
||||||
"_resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz"
|
|
||||||
}
|
|
@ -1,162 +0,0 @@
|
|||||||
# 0.4.24 / 2018-08-22
|
|
||||||
|
|
||||||
* Added MIK encoding (#196, by @Ivan-Kalatchev)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.23 / 2018-05-07
|
|
||||||
|
|
||||||
* Fix deprecation warning in Node v10 due to the last usage of `new Buffer` (#185, by @felixbuenemann)
|
|
||||||
* Switched from NodeBuffer to Buffer in typings (#155 by @felixfbecker, #186 by @larssn)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.22 / 2018-05-05
|
|
||||||
|
|
||||||
* Use older semver style for dependencies to be compatible with Node version 0.10 (#182, by @dougwilson)
|
|
||||||
* Fix tests to accomodate fixes in Node v10 (#182, by @dougwilson)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.21 / 2018-04-06
|
|
||||||
|
|
||||||
* Fix encoding canonicalization (#156)
|
|
||||||
* Fix the paths in the "browser" field in package.json (#174 by @LMLB)
|
|
||||||
* Removed "contributors" section in package.json - see Git history instead.
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.20 / 2018-04-06
|
|
||||||
|
|
||||||
* Updated `new Buffer()` usages with recommended replacements as it's being deprecated in Node v10 (#176, #178 by @ChALkeR)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.19 / 2017-09-09
|
|
||||||
|
|
||||||
* Fixed iso8859-1 codec regression in handling untranslatable characters (#162, caused by #147)
|
|
||||||
* Re-generated windows1255 codec, because it was updated in iconv project
|
|
||||||
* Fixed grammar in error message when iconv-lite is loaded with encoding other than utf8
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.18 / 2017-06-13
|
|
||||||
|
|
||||||
* Fixed CESU-8 regression in Node v8.
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.17 / 2017-04-22
|
|
||||||
|
|
||||||
* Updated typescript definition file to support Angular 2 AoT mode (#153 by @larssn)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.16 / 2017-04-22
|
|
||||||
|
|
||||||
* Added support for React Native (#150)
|
|
||||||
* Changed iso8859-1 encoding to usine internal 'binary' encoding, as it's the same thing (#147 by @mscdex)
|
|
||||||
* Fixed typo in Readme (#138 by @jiangzhuo)
|
|
||||||
* Fixed build for Node v6.10+ by making correct version comparison
|
|
||||||
* Added a warning if iconv-lite is loaded not as utf-8 (see #142)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.15 / 2016-11-21
|
|
||||||
|
|
||||||
* Fixed typescript type definition (#137)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.14 / 2016-11-20
|
|
||||||
|
|
||||||
* Preparation for v1.0
|
|
||||||
* Added Node v6 and latest Node versions to Travis CI test rig
|
|
||||||
* Deprecated Node v0.8 support
|
|
||||||
* Typescript typings (@larssn)
|
|
||||||
* Fix encoding of Euro character in GB 18030 (inspired by @lygstate)
|
|
||||||
* Add ms prefix to dbcs windows encodings (@rokoroku)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.13 / 2015-10-01
|
|
||||||
|
|
||||||
* Fix silly mistake in deprecation notice.
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.12 / 2015-09-26
|
|
||||||
|
|
||||||
* Node v4 support:
|
|
||||||
* Added CESU-8 decoding (#106)
|
|
||||||
* Added deprecation notice for `extendNodeEncodings`
|
|
||||||
* Added Travis tests for Node v4 and io.js latest (#105 by @Mithgol)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.11 / 2015-07-03
|
|
||||||
|
|
||||||
* Added CESU-8 encoding.
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.10 / 2015-05-26
|
|
||||||
|
|
||||||
* Changed UTF-16 endianness heuristic to take into account any ASCII chars, not
|
|
||||||
just spaces. This should minimize the importance of "default" endianness.
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.9 / 2015-05-24
|
|
||||||
|
|
||||||
* Streamlined BOM handling: strip BOM by default, add BOM when encoding if
|
|
||||||
addBOM: true. Added docs to Readme.
|
|
||||||
* UTF16 now uses UTF16-LE by default.
|
|
||||||
* Fixed minor issue with big5 encoding.
|
|
||||||
* Added io.js testing on Travis; updated node-iconv version to test against.
|
|
||||||
Now we just skip testing SBCS encodings that node-iconv doesn't support.
|
|
||||||
* (internal refactoring) Updated codec interface to use classes.
|
|
||||||
* Use strict mode in all files.
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.8 / 2015-04-14
|
|
||||||
|
|
||||||
* added alias UNICODE-1-1-UTF-7 for UTF-7 encoding (#94)
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.7 / 2015-02-05
|
|
||||||
|
|
||||||
* stop official support of Node.js v0.8. Should still work, but no guarantees.
|
|
||||||
reason: Packages needed for testing are hard to get on Travis CI.
|
|
||||||
* work in environment where Object.prototype is monkey patched with enumerable
|
|
||||||
props (#89).
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.6 / 2015-01-12
|
|
||||||
|
|
||||||
* fix rare aliases of single-byte encodings (thanks @mscdex)
|
|
||||||
* double the timeout for dbcs tests to make them less flaky on travis
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.5 / 2014-11-20
|
|
||||||
|
|
||||||
* fix windows-31j and x-sjis encoding support (@nleush)
|
|
||||||
* minor fix: undefined variable reference when internal error happens
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.4 / 2014-07-16
|
|
||||||
|
|
||||||
* added encodings UTF-7 (RFC2152) and UTF-7-IMAP (RFC3501 Section 5.1.3)
|
|
||||||
* fixed streaming base64 encoding
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.3 / 2014-06-14
|
|
||||||
|
|
||||||
* added encodings UTF-16BE and UTF-16 with BOM
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.2 / 2014-06-12
|
|
||||||
|
|
||||||
* don't throw exception if `extendNodeEncodings()` is called more than once
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.1 / 2014-06-11
|
|
||||||
|
|
||||||
* codepage 808 added
|
|
||||||
|
|
||||||
|
|
||||||
# 0.4.0 / 2014-06-10
|
|
||||||
|
|
||||||
* code is rewritten from scratch
|
|
||||||
* all widespread encodings are supported
|
|
||||||
* streaming interface added
|
|
||||||
* browserify compatibility added
|
|
||||||
* (optional) extend core primitive encodings to make usage even simpler
|
|
||||||
* moved from vows to mocha as the testing framework
|
|
||||||
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
|||||||
Copyright (c) 2011 Alexander Shtuchkin
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
555
node_modules/.store/body-parser@1.20.3/node_modules/iconv-lite/encodings/dbcs-codec.js
generated
vendored
555
node_modules/.store/body-parser@1.20.3/node_modules/iconv-lite/encodings/dbcs-codec.js
generated
vendored
@ -1,555 +0,0 @@
|
|||||||
"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/.store/body-parser@1.20.3/node_modules/iconv-lite/encodings/dbcs-data.js
generated
vendored
176
node_modules/.store/body-parser@1.20.3/node_modules/iconv-lite/encodings/dbcs-data.js
generated
vendored
@ -1,176 +0,0 @@
|
|||||||
"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',
|
|
||||||
};
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue